Skip to main content
MADIAD Hub publishes to 22 channels. Not all of them are social networks — the list also covers blogs, team chat, the fediverse, a commerce platform and a mailing list. Each accepts a specific set of post kinds, and connects in one of two ways.

What each channel accepts

platforms is validated against this table before anything is sent. Asking a blog for a video, or YouTube for a text post, returns 400 invalid_request naming the offending channel — it does not half-publish and then fail.
Use the platform value exactly as written — x (not twitter), google_business (with an underscore), devto (no dot).
Threads, Reddit and Bluesky cannot be connected at the moment (Threads and Reddit checked 12 September 2026, Bluesky 13 September 2026). These channels are being upgraded, and retrying does not help, so their tiles on the connect page are greyed out with a note rather than letting a customer walk into a dead end. Starting a connection for any of them returns 503 platform_unavailable. Channels already connected keep working and keep publishing, and everything else in the table above is unaffected.

Two ways to connect

OAuth channels

Most channels connect by signing in on the connect page: you send the customer a link, they authorise MADIAD Hub on the platform’s own screen, and nothing sensitive passes through you. See Profiles for the connect-link flow.

Manual-credential channels

Slack, Mastodon, Nostr, Lemmy, dev.to, Hashnode, WordPress, Whop, listmonk, Telegram and Discord have no OAuth consent screen. Instead, the customer supplies a credential — a webhook URL, an API key, or an application password — which is validated against the platform and stored encrypted. Link one with POST /v1/connections/{platform}. Every request takes profile_id and an optional name, plus the platform’s own fields:
A successful call returns the profile’s refreshed connection status. instance_url and site_url must be https:// URLs. Every field is required except where marked optional — omit an optional field and the platform’s own default applies (Nostr falls back to a default relay list). Sending it as an empty string is not the same as omitting it.
A Nostr private key cannot be rotated or revoked. Unlike an API key or an application password, whoever holds it controls that identity permanently. Use a Nostr identity created for automated posting — never your personal key.
WordPress needs an application password, not your login password. Create one under Users → Profile → Application Passwords. The same applies in spirit to Lemmy and listmonk, which do take an account password: give them an account that exists only for publishing.

Choosing an endpoint

The three publish endpoints map onto the columns above: A single call may list any mix of channels that all accept that kind. To reach both a video platform and a blog, send two calls — they are two different kinds of post, and each counts as one upload.

Analytics coverage

Analytics covers ten channels: TikTok, Instagram, YouTube, Facebook, LinkedIn, X, Threads, Pinterest, Reddit and Bluesky. Google Business Profile and every manual-credential channel report no follower, reach or engagement metrics — a Discord webhook or a mailing list has no follower graph to read. Leave them out of the platforms list when requesting analytics.