- In the dashboard — each brand appears under Connections as a profile. Most customers create and connect profiles here, with no code.
- Via the API — you reference that same profile by its
profile_id(9f2b4c17-…) on every post.
One profile holds multiple Facebook Pages — you don’t need a separate profile per Page.
Once connected, the dashboard lists every Page on that Facebook account, and each post picks
one with
facebook_page_id (auto-selected when the profile has only one Page). To publish the
same content to several Pages, send several posts, one per Page. See Discover Page & board
IDs. One exception: if a Page is pinned to the profile, the pin
wins over facebook_page_id — see Pin a Page to a profile.How many profiles you get
Each plan includes a fixed number of profiles:
When you reach your plan’s limit, upgrade to add more profiles.
Create a profile
In the dashboard
Go to Connections → Connect account and authorize each platform you want to publish to. The profile is created for you — noprofile_id to manage by hand.
Via the API
Starting a connection creates the profile and returns a branded, time-limited connect URL in one call:profile_id (9f2b4c17-…) whenever you publish a post.
Skip the platform picker
POST /v1/connections/start returns a link to a page where the user chooses which platform to
connect. If you would rather render that choice in your own UI, ask for one platform and get the
platform’s own authorization URL back:
/v1/connections/start, it creates the profile when profile_id is omitted, and accepts an
optional friendly_name.
Every platform can be started this way except Bluesky, which authenticates with an app
password rather than OAuth and returns 400 platform_not_startable — send those users to the
shared connect link instead.
List your profiles via API
Two endpoints return your profiles. Which one you want depends on whether you also need to know what each profile has connected.Just the list
GET /v1/profiles returns every profile on the account, and nothing else:
profile_id and friendly_name. Profiles come back
oldest first. The account is taken from your API key, so the call accepts no parameters and can
never return another account’s profiles. It is a GET: it consumes no uploads and no
FFmpeg minutes, only the per-minute rate limit.
This is the one to call for a profile picker, or any time you only need the profile_id that
every publish, connection and analytics call asks for. It reads MADIAD Hub’s own records and
nothing else, so it answers fast and it keeps answering when a social platform is unreachable.
The list with connection detail
GET /v1/connections/status, called with profile_id omitted, returns every profile and
the platforms each one has linked:
profiles array has profile_id and friendly_name as above, plus
connected and accounts (detailed under Check which platforms are
connected below). Assembling that detail needs a live
lookup of the linked accounts, so this call is slower than GET /v1/profiles and it can return
an error while that lookup is unavailable. When you only need the IDs, prefer GET /v1/profiles.
To see how many profile slots remain on your plan, call GET /v1/usage —
its profiles field returns used / limit / remaining.
Connect social accounts
Each profile starts empty. Open its connect page in a browser and sign in to every platform you want to publish to. MADIAD Hub stores the authorization, so you never handle platform tokens yourself.1
Open the connect page
In the dashboard, click Connect account. Via the API, send the user (or
yourself) to the
access_url returned by /v1/connections/start.2
Authorize each platform
Sign in to Instagram, Facebook, TikTok, and so on. Connections persist until revoked.
3
Publish
Reference the profile by its
profile_id in any post request.Supported channels
A profile can connect any of the 22 channels listed on Channels, which also records which kind of post each one accepts. A post only succeeds on channels the target profile has actually connected. Listing a channel that isn’t connected returns an error for that channel.Connect a manual-credential channel
The OAuth channels connect by signing in on the connect page. Eleven channels work differently — Telegram, Discord, Slack, Mastodon, Nostr, Lemmy, dev.to, Hashnode, WordPress, Whop and listmonk have no OAuth login, so instead you link your own bot, webhook, API key or application password withPOST /v1/connections/{channel}.
Channels lists the exact fields for all eleven. The two worked examples below show the shape; the others follow it exactly.
Telegram — bring your own bot
Telegram — bring your own bot
- Message @BotFather on Telegram and send
/newbotto create a bot. Copy its bot token. - Add the bot to your target channel or group as an administrator so it can post.
- In the dashboard, open Connections → Telegram, paste the bot token and the chat ID (
@yourchannelor a numeric id like-100123456789), then connect.
profile_id, bot_token, chat_id. name is an optional label. The bot must be an administrator of the target channel or group. chat_id is either @channelname or a numeric id like -100123456789. Returns 400 if any required field is missing.Discord — channel webhook
Discord — channel webhook
- In Discord, go to Server Settings → Integrations → Webhooks → New Webhook, pick the channel you want to post to, and click Copy Webhook URL.
- In the dashboard, open Connections → Discord, paste the webhook URL, then connect.
profile_id, webhook_url. name is an optional label. Returns 400 if either required field is missing.The manual-credential channels are not covered by Analytics — follower, reach, and engagement metrics aren’t available for any of them, and neither is Google Business Profile.
Discover Page & board IDs
Some platforms require an ID you need to look up before posting. Use these endpoints to retrieve those IDs for a given profile.Facebook Pages
If a profile has more than one connected Facebook Page, passfacebook_page_id in your post request to choose which Page to publish to. List the available Pages with:
id, name, and picture (avatar URL, may be null). Pass the chosen id as facebook_page_id when posting. If the profile has exactly one Page it is selected automatically — this endpoint is only needed when there are several. Returns 400 if profile_id is missing, 404 if the profile is not yours.
LinkedIn Pages
LinkedIn publishes either as the connected person or as an organization Page they administer. To publish as an organization, pass its ID astarget_linkedin_page_id (see Platform
options). List the organizations available to a profile with:
id is a full urn:li:organization:… URN, not a bare number — pass it verbatim as
target_linkedin_page_id. Omit that field and the post goes out as the connected person instead.
Only id and name are part of the contract; the other fields are extra detail and may change.
Returns 409 platform_not_connected when the profile has no LinkedIn account linked, and
404 not_found when the profile is not yours.
Pinterest boards
Pinterest requires a board ID on every pin. List the boards available to a profile with:id and name. Pass the chosen id as pinterest_board_id when posting — this field is always required for Pinterest. Returns 400 if profile_id is missing, 404 if the profile is not yours.
Pin a Page to a profile
Connecting Facebook links an account, and one account may administer several Pages; LinkedIn works the same way with organization Pages, and Google Business with locations. Pinning one Page (or location) to a profile fixes the destination: every post from that profile goes there, and nothing can fall back to whichever Page the connected account happens to treat as its default. You can also set and clear pins in the dashboard, under Connections. Everything below works forfacebook, linkedin and google_business; swap the platform in the path.
Read the current pin
pages is everything the connected account could publish to. selected_page_id and
selected_page_name are the pin itself, and both are null when nothing is pinned. On the
LinkedIn variant the ids are urn:li:organization:… URNs.
Set the pin
profile_id and page_id are required; a missing page_id returns 400 invalid_request.
The page_id must be one the connected account administers — pick it from pages above. The
answer is the same object as the read, with selected_page_id now set. The pin is a property of
the profile, read at the moment a post is published rather than when it is created — so it also
governs posts that were already scheduled.
Clear the pin
facebook_page_id on each post decides the destination again.
Google Business locations
google_business pins a location rather than a page. Its read answers with location fields in
place of pages:
name as page_id (or as location_id). When the connected
Google account manages several locations, a post must either go to a pinned location or carry
gbp_location_id; with a single location nothing is needed. The pinned location is also the
profile’s default location for reviews and analytics.
Check which platforms are connected
To see which social platforms a profile currently has linked, call:connected lists the platform slugs currently linked to the profile, and accounts carries the
connected account name/handle per platform. Omit profile_id to get the status of every profile on
your account. This is the on-demand way to check state; to be notified the moment a connection
changes, subscribe to the connection.connected / connection.disconnected
webhooks.
When to use multiple profiles
- Agencies — one profile per client.
- Multi-brand teams — one profile per brand.
- Environments — separate profiles for test vs production audiences.

