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).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 withPOST /v1/connections/{platform}. Every request takes profile_id and an optional name, plus the platform’s own fields:
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.
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.
WordPress says the username or password is wrong although it is right
The Hub passes the three fields you entered (site URL, username, application password) for your site to confirm. When all three are right and the answer is still “Invalid WordPress username or application password”, the reason is usually on the site’s server, not in what you typed. Check it with one command, run on your own machine (never send the application password to anyone, MADIAD included):
Opening
/wp-json/ in a browser does not settle it: a browser sends no login, and bot protection
often lets a browser through while it blocks a call from a server.
Choosing an endpoint
The three publish endpoints map onto the columns above:POST /v1/posts/text— every channel with a ✅ in TextPOST /v1/posts/photos— every channel with a ✅ in PhotoPOST /v1/posts/video— every channel with a ✅ in Video
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 theplatforms list when requesting analytics.
