Social media scheduling API: one endpoint for all 10 networks

A social media scheduling API lets your app publish to many networks through one endpoint instead of integrating each platform’s API separately. You send one authenticated request with your caption, target accounts, and a scheduled time, and the API handles publishing to Facebook, Instagram, X, LinkedIn, and the rest, then hands back proof each one went live.

What is a social media scheduling API?

It is a single REST endpoint you call from your own code to publish or schedule a post across every network you have connected. You authenticate once with an API key, name the accounts you want to post to, and the service does the platform-specific work behind one stable contract. PostDodo exposes exactly this: a JSON-over-HTTPS API at https://postdodo.com/api/v1 that reaches all 10 networks.

Why use a scheduling API instead of each platform’s own API?

Because every network ships its own API, and wiring all of them yourself is a lot more than one HTTP call each. The real cost of the do-it-yourself path:

A scheduling API collapses all of that into one integration. You build against a single endpoint once, and adding a network becomes connecting an account, not writing a new client. See how to cross-post to all platforms for the same idea from the content side.

What should you look for in a scheduling API?

Not all posting APIs are equal. The four things that actually matter when you are trusting one with your publishing:

How do you schedule a post with the PostDodo API?

Three calls: list your accounts to get their ids, create the scheduled post, then poll to confirm it published. Authenticate every request with your key as a bearer token. A missing or invalid key returns 401 Unauthorized.

Step 1: List your connected accounts

Call GET /api/v1/accounts to get the id of each connected account. You will pass these ids when you create the post.

curl https://postdodo.com/api/v1/accounts \
  -H "Authorization: Bearer pd_live_YOUR_API_KEY"
{
  "accounts": [
    { "id": "acct_x9f2", "platform": "facebook",  "handle": "your-page", "status": "active", "connected": true },
    { "id": "acct_b3kp", "platform": "instagram", "handle": "yourbrand", "status": "active", "connected": true }
  ]
}

Step 2: Create and schedule the post

POST to /api/v1/posts with your content, the target accountIds, and a scheduledAt time. Attach media by url. Omit scheduledAt to publish immediately.

curl https://postdodo.com/api/v1/posts \
  -H "Authorization: Bearer pd_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Spring launch is live. Link in bio.",
    "accountIds": ["acct_x9f2", "acct_b3kp"],
    "scheduledAt": "2026-07-05T16:00:00+07:00",
    "media": [
      { "type": "image", "url": "https://cdn.example.com/launch.jpg" }
    ]
  }'

One rule to know: scheduledAt must carry a timezone offset, either a trailing Z for UTC or an offset like +07:00. An offset-less time would be read in the server’s timezone and silently shift by hours, so the API rejects it rather than guess:

{
  "error": "invalid_request",
  "message": "scheduledAt must include a timezone offset, e.g. 2026-07-05T09:00:00Z or 2026-07-05T16:00:00+07:00."
}

On success you get back the post id and its status. A scheduled post returns scheduled; an immediate one returns publishing with counts of how many targets posted versus failed.

{
  "id": "post_7Hq2Lp",
  "status": "scheduled"
}

Step 3: Confirm every target published

Poll GET /api/v1/posts to read each post back with its per-target status. A posted target includes the platform’s own live url, which is your receipt that it actually went out.

curl https://postdodo.com/api/v1/posts \
  -H "Authorization: Bearer pd_live_YOUR_API_KEY"
{
  "posts": [
    {
      "id": "post_7Hq2Lp",
      "body": "Spring launch is live. Link in bio.",
      "status": "published",
      "scheduledAt": "2026-07-05T16:00:00+07:00",
      "createdAt": "2026-07-02T09:12:04Z",
      "targets": [
        { "platform": "facebook",  "status": "posted", "url": "https://www.facebook.com/yourpage/posts/pfbid0abc123" },
        { "platform": "instagram", "status": "posted", "url": "https://www.instagram.com/p/Cy1AbCdEfGh/" }
      ]
    }
  ]
}

Each target reads queued, publishing, posted, or failed, and the parent post rolls up to published, partial, or failed. To cancel a scheduled post before it fires, call DELETE /api/v1/posts/:id. Full details are in the developer docs.

Build it yourself vs a scheduling API

The straight comparison between wiring every platform’s own API and calling one scheduling API.

ConcernBuild it yourself (per-platform APIs)A scheduling API (PostDodo)
Integrations to buildOne OAuth app per network, each reviewed and approved separatelyOne API key, one integration for all 10 networks
Auth to maintainStore and refresh a different token per platformOne bearer key; PostDodo keeps each connection live
Request shapeA different payload and media rule per networkOne JSON body, fanned out to every target
Rate limitsTrack and respect each platform’s own limitsOne documented limit (120 requests a minute per key, 429 with Retry-After)
Proof a post publishedYou poll each platform yourselfGET /api/v1/posts returns each target’s status and live url
Failure handlingYou build retries and backoff per platformTransient failures auto-retry with backoff
Time to first postGated behind each platform’s app reviewGenerate a key and post within minutes

How does the API confirm a post actually published?

This is the part most posting APIs skip. Accepting your request is not the same as the post going live. A token can be expired, media can be off-spec, or a platform can be rate-limiting, and a fire-and-forget API will still return a cheerful 200 while the post never appears. PostDodo treats a post as published only when the platform confirms it and returns a live link.

That confirmation shows up in GET /api/v1/posts: each target carries its own status and, once live, the platform’s own url. Transient failures retry automatically with backoff instead of being dropped, and a post that only partly went out rolls up as partial so you can see exactly which network failed. That is proof of delivery your code can act on. If silent failures have ever burned you, how to actually stop failed posts goes deeper on the pattern.

Want to wire confirmed multi-platform posting into your own app with one endpoint and one key? The PostDodo API reaches all 10 networks and returns a live-link receipt on every post, on flat pricing with no per-network or per-seat fee. Read the developer docs, start a free 7-day trial, and generate a key from Settings then API. See pricing first if you want.

Frequently asked questions

What is a social media scheduling API?

A social media scheduling API is one HTTP endpoint your app calls to publish or schedule a post across many networks at once. Instead of integrating Facebook, Instagram, X, and the rest one by one, you send a single authenticated request with your caption, target accounts, and time, and the API fans it out.

How do you authenticate with the PostDodo API?

Send your secret key as a bearer token: Authorization: Bearer pd_live_YOUR_API_KEY. Keys are issued per workspace, carry the same account access you have in the app, and must stay server-side. A missing or invalid key returns 401 Unauthorized. You can rotate a key anytime and the old one stops working immediately.

Does scheduledAt need a timezone?

Yes. scheduledAt must include a timezone offset, like 2026-07-05T09:00:00Z or 2026-07-05T16:00:00+07:00. An offset-less time would be read in the server's timezone and silently shift by hours, so the API rejects it with a 422 and a clear message. The time also has to be in the future.

How do you confirm a scheduled post actually published?

Poll GET /api/v1/posts. Each connected target reports its own status (posted, publishing, or failed), and once live it includes the platform's own url. The parent post rolls up to published, partial, or failed. Transient failures retry automatically, so you get proof of delivery instead of a fire-and-forget guess.

Which platforms does the scheduling API support?

All 10 PostDodo networks from one call: Bluesky, Mastodon, Facebook, Instagram, Threads, X, LinkedIn, TikTok, YouTube, and Pinterest. Instagram, TikTok, YouTube, and Pinterest require an image or video because they cannot post text alone. The API enforces that server-side and returns a clear error if media is missing.

How much does the API cost?

The API is available on PostDodo's paid plans, which are flat-priced with no per-network or per-seat fee. Start a 7-day free trial, pick a plan, then generate a key from Settings then API in your dashboard. The same key posts to all 10 networks, so your cost does not climb as you add channels.