Overview
Publish to 16 platforms with one request shape, and check what each platform's API exposes for analytics, the inbox, webhooks and ads before you build on it.
Publish to 16 platforms with POST /v1/posts and one platforms[] entry per account. Shopify connects as well, for blog articles only. Each platform page follows the same layout: connect, publish, platform fields, media requirements, analytics, inbox, what the platform's API does not expose, and common errors. The tables on this page say what each platform supports, so you can pick the platform page you need.
Platform quick reference
| Platform | Connect | Post | Analytics | Media Requirements |
|---|---|---|---|---|
| X | OAuth 2.0 | Text, Images, Videos, Threads | Yes | View |
| OAuth 2.0 | Feed, Stories, Reels, Carousels | Yes | View | |
| OAuth 2.0 | Text, Images, Videos, Reels | Yes | View | |
| OAuth 2.0 | Text, Images, Videos, Documents | Yes | View | |
| TikTok | OAuth 2.0 | Videos | Yes | View |
| YouTube | OAuth 2.0 | Videos, Shorts | Yes | View |
| OAuth 2.0 | Pins (Image/Video) | Yes | View | |
| OAuth 2.0 | Text, Images, Videos, Links | Limited | View | |
| Bluesky | App Password | Text, Images, Videos | Limited | View |
| Threads | OAuth 2.0 | Text, Images, Videos | Yes | View |
| Google Business Profile | OAuth 2.0 | Updates, Photos | Yes | View |
| Telegram | Bot Token | Text, Images, Videos, Albums | No | View |
| SnapchatClosed beta | OAuth 2.0 | Stories, Saved Stories, Spotlight | Yes | View |
| Redirect / Credentials | Templates, Text, Media, Broadcasts, Flows | No | View | |
| Discord | OAuth 2.0 (Bot) | Messages, Embeds, Polls, Forum Posts, Threads | No | View |
| Slack | OAuth 2.0 (Bot) | Messages, Thread Replies | No | View |
| Shopify | OAuth 2.0 / Admin token | Blog articles (no social posts) | No | — |
Connect and publish
Every platform except Shopify connects through GET /v1/connect/{platform} with profileId, where {platform} is twitter, instagram, facebook, linkedin, tiktok, youtube, pinterest, reddit, bluesky, threads, googlebusiness, telegram, snapchat, whatsapp, discord or slack. Bluesky and Telegram take credentials instead of OAuth, and 5 platforms add a selection step after OAuth; the connecting accounts guide covers every path. Shopify connects through GET /v1/connect/shopify, which also needs the store's shop domain; see the Shopify page.
One request publishes to several accounts at once. Each entry names its platform and account, and platformSpecificData on an entry carries that platform's fields:
import Zernio from '@zernio/node';
const zernio = new Zernio();
const { data: published } = await zernio.posts.createPost({
body: {
content: 'Our changelog for September is out',
platforms: [
{ platform: 'twitter', accountId: '66b2e19d8c3f5a7e9d0b1c2d' },
{ platform: 'linkedin', accountId: '66b2e19d8c3f5a7e9d0b1c2e' },
{ platform: 'bluesky', accountId: '66b2e19d8c3f5a7e9d0b1c2f' }
],
publishNow: true
}
});
console.log(published.post.status);Response (201):
{
"post": {
"_id": "65f1c0a9e2b5af0012ab34cd",
"status": "published",
"platforms": [
{ "platform": "twitter", "status": "published", "platformPostUrl": "https://x.com/..." },
{ "platform": "linkedin", "status": "published", "platformPostUrl": "https://www.linkedin.com/feed/update/..." },
{ "platform": "bluesky", "status": "published", "platformPostUrl": "https://bsky.app/profile/..." }
]
}
}Each platform entry succeeds or fails on its own; post lifecycle explains the statuses. The quickstart walks through the API key, the profile and the first scheduled post.
Platform-specific features
Each platform page documents these under Publish and Platform fields:
- X (
twitter): threads, polls, scheduled spaces - Instagram: Stories, Reels, carousels, collaborators
- Facebook: Reels, Stories, Page posts
- LinkedIn: documents (PDFs), company pages, personal profiles
- TikTok: privacy settings, duet and stitch controls
- YouTube: Shorts, playlists, visibility settings
- Pinterest: boards, rich pins
- Reddit: subreddits, flairs, NSFW tags, native video uploads with videogif and custom poster support
- Bluesky: custom feeds, app passwords
- Threads: reply controls
- Google Business Profile: location posts, offers, events, performance metrics, search keywords
- Telegram: channels, groups, silent messages, protected content
- Snapchat (closed beta): Stories, Saved Stories, Spotlight, public profiles. New connections return
403 PLATFORM_BETA_RESTRICTEDuntil the account is approved; there is no public release date yet. - WhatsApp: template messages, broadcasts, contacts, conversations, Flows (interactive forms)
- Discord: messages, embeds, native polls, forum posts, threads, crosspost
- Slack: channel messages, thread replies, file uploads, per-message bot identity
- Shopify (connect-only): storefront blogs and articles, HTML bodies, SEO fields, native scheduled publish
Analytics metrics
The Analytics API returns these metrics per platform:
| Platform | Impressions | Reach | Likes | Comments | Shares | Saves | Clicks | Views |
|---|---|---|---|---|---|---|---|---|
| X | ||||||||
| * | ** | *** | ||||||
| TikTok | ||||||||
| YouTube | **** | |||||||
| Threads | ||||||||
| Bluesky | ||||||||
| Snapchat | ||||||||
| Telegram | ||||||||
| Discord | ||||||||
| Slack | ||||||||
| Google Business Profile***** |
* LinkedIn saves: personal accounts only.
** LinkedIn clicks: organization accounts only.
*** LinkedIn views: video posts only.
**** YouTube shares come from the daily Analytics API, not the basic Data API.
***** Google deprecated per-post analytics with no replacement. Use the Performance API for location-level metrics (impressions, clicks, calls, directions, bookings).
Dedicated endpoints go further on 3 platforms: YouTube audience demographics (age, gender, country), Google Business Profile daily performance metrics and search keywords, and the Instagram account, follower and Story endpoints listed on the Instagram page.
Inbox
The Inbox API serves DMs, comments and reviews from every platform through Messages, Comments and Reviews.
DMs
| Platform | List | Fetch | Send text | Attachments | Quick replies | Buttons | Edit | Archive |
|---|---|---|---|---|---|---|---|---|
| X | ||||||||
| Bluesky | ||||||||
| Telegram | ||||||||
| SMS | ||||||||
| Slack | ||||||||
| TikTok |
Discord sends outbound DMs from the bot through POST /v1/discord/dms; replies do not arrive, so it is not part of the inbox. See the Discord page.
Comments
| Platform | List | Post | Reply | Delete | Like | Hide |
|---|---|---|---|---|---|---|
| Limited release | ||||||
| X | ||||||
| Bluesky | ||||||
| Threads | ||||||
| YouTube | ||||||
| TikTok |
Like comment covers Facebook, X, Bluesky, Reddit, LinkedIn and TikTok. On LinkedIn it takes the composite comment URN as commentId and an optional reactionType. On Instagram it is in limited release: it needs Meta's instagram_manage_engagement permission, which Zernio holds under Standard Access, so it works for admins, developers and testers of Zernio's Meta app and returns a 403 with code PLATFORM_BETA_RESTRICTED for every other account, and only on accounts connected through Facebook Login (Instagram comments).
Reviews
| Platform | List | Reply | Delete reply |
|---|---|---|---|
| Google Business Profile |
Webhooks
Message and comment events:
| Platform | comment.received | message.received | message.sent |
|---|---|---|---|
| X | |||
| YouTube | |||
| Bluesky | |||
| Telegram | |||
| TikTok |
Message lifecycle events (edits, unsends, delivery status):
| Platform | message.edited | message.deleted | message.delivered | message.read | message.failed |
|---|---|---|---|---|---|
| (business-side) | |||||
| Telegram | |||||
| X | |||||
| Bluesky | |||||
A "no" means the platform's API does not expose the event. Slack fires message.received for DMs and mentions (Slack page). reaction.received fires on Instagram, Facebook, WhatsApp, Telegram and Slack. The webhooks page has every payload.
Account settings
| Platform | Feature | Endpoint |
|---|---|---|
| Persistent menu | /v1/accounts/{accountId}/messenger-menu | |
| Ice breakers | /v1/accounts/{accountId}/instagram-ice-breakers | |
| Telegram | Bot commands | /v1/accounts/{accountId}/telegram-commands |
Account settings documents each endpoint.
No inbox
| Platform | Status | Notes |
|---|---|---|
| No API | Pinterest exposes no DMs or comments | |
| Snapchat | No API | Snapchat exposes no DMs or comments |
Platform limitations
| Platform | Limitation |
|---|---|
| Comment likes in limited release | |
| X | DMs require the dm.read and dm.write scopes, no archive or unarchive, reply search cached for 2 minutes |
| Bluesky | No DM attachments, liking a comment requires its cid |
| Threads | No DMs, no comment likes; a comment is a reply to the thread, hide and unhide supported |
| No DM attachments | |
| Telegram | Bot-based, media limits (photos 10 MB, videos 50 MB) |
| YouTube | No DMs, no comment likes |
| Organization accounts only, comment likes need the social-feed scopes | |
| Template messages required outside the 24-hour window, no comments | |
| TikTok | Accounts connected through TikTok's Business app only; DMs need a Business Account outside the EEA, Switzerland and the UK, and are replies only |
Ad platforms
The /v1/ads endpoints create campaigns, boost organic posts, manage audiences and read analytics on 7 ad networks:
| Platform | Key | Create | Boost | Audiences | Analytics |
|---|---|---|---|---|---|
| Meta Ads (Facebook and Instagram) | metaads | Yes | Yes | Customer list, website, lookalike, engagement | Yes |
| Google Ads | googleads | Search and Display | Yes (engagement, traffic, awareness, video_views) | Customer Match | Yes |
| LinkedIn Ads | linkedinads | Yes | Yes | Contact list, company list, engagement retargeting, website retargeting | Yes |
| TikTok Ads | tiktokads | Yes | Spark Ads | Customer list | Yes |
| Pinterest Ads | pinterestads | Yes | Yes | Customer list | Yes |
| X Ads | xads | Yes | Yes | Tailored Audiences | Yes |
| OpenAI Ads (ChatGPT) | openaiads | Yes | No | No | Yes |
Ad hierarchy
| Platform | Top level | Middle | Bottom |
|---|---|---|---|
| Meta Ads | Campaign | Ad Set | Ad |
| Google Ads | Campaign | Ad Group | Ad |
| LinkedIn Ads | Campaign Group | Campaign | Creative |
| TikTok Ads | Campaign | Ad Group | Ad |
| Pinterest Ads | Campaign | Ad Group | Pin |
| X Ads | Campaign | Line Item | Promoted Tweet |
| OpenAI Ads | Campaign | Ad Group | Chat Card Ad |
Each ad platform page has the create and boost calls in Node.js, Python and curl.
Common errors
One entry can fail while the others publish. The request above with a caption over Bluesky's 300-character limit returns 207 with post.status: "partial", the two published entries intact and the reason on the failing one:
{
"post": {
"_id": "65f1c0a9e2b5af0012ab34cd",
"status": "partial",
"platforms": [
{ "platform": "twitter", "status": "published", "platformPostUrl": "https://x.com/..." },
{ "platform": "linkedin", "status": "published", "platformPostUrl": "https://www.linkedin.com/feed/update/..." },
{ "platform": "bluesky", "status": "failed", "errorMessage": "Bluesky posts cannot exceed 300 characters" }
]
},
"platformResults": [
{ "platform": "twitter", "status": "published", "error": null },
{ "platform": "linkedin", "status": "published", "error": null },
{ "platform": "bluesky", "status": "failed", "error": "Bluesky posts cannot exceed 300 characters" }
]
}207 is a 2xx status, so fetch(...).ok is true; branch on the status code and on post.status, which post lifecycle defines. Send a shorter customContent on the entry that rejected the text. Error handling covers the envelope.
Related
- Connecting accounts: the OAuth flow, the selection step and the credential platforms.
- Create post: every field of the request.
- Media uploads: upload images and videos instead of hosting them.
- Analytics: post performance metrics.
- Ads: campaigns, boosts and ad analytics.
- Pricing: what connected accounts, analytics, the inbox, ads and outbound messages cost.