Skip to main content
SocialAPI applies a rate limit of its own: a posting velocity cap per publish target. Each platform also applies its own limits. All of them answer HTTP 429. Read the Retry-After header when it is present and wait that many seconds before you send the request again. These limits are the same on every plan, and upgrading does not raise them. Post and interaction allowances per billing period are on Plans and usage. A 429 from SocialAPI’s own limits uses the standard error envelope. error.meta.retry_after_seconds holds the same number of seconds as the Retry-After header:

Every 429 code

A request refused by publishing.velocity_limit never reaches the platform and spends no credit.

Posting velocity caps

SocialAPI caps how fast one publish target can publish, on top of your plan’s post allowance. A publish target is one connected account, or one Facebook Page or Pinterest board when the account publishes to more than one Page or board. Each Facebook Page of a connection has its own counters. The hourly window opens with the first publish counted in it and lasts 1 hour. The 24-hour window opens the same way and lasts 24 hours. On TikTok, the 24-hour cap of 13 binds before the hourly cap of 25. On Instagram, SocialAPI’s cap of 45 sits below Instagram’s 50 posts per rolling 24 hours. On TikTok, SocialAPI’s cap of 13 sits below TikTok’s own limit of 15 posts per day per account. Reaching SocialAPI’s cap gives you publishing.velocity_limit and a Retry-After, instead of a platform rejection after the attempt. TikTok also limits publishing to 6 posts per minute per account. SocialAPI does not enforce the 6 per minute: when you send a 7th post within a minute, TikTok refuses it and the target fails with a platform.tiktok.* code.

What happens at a cap

  • Immediate publish (POST /v1/posts with publish_now: true, POST /v1/posts/{pid}/publish, POST /v1/posts/{pid}/retry): the request returns 429 publishing.velocity_limit and creates nothing. meta.window is hour or day, meta.limit is the cap reached, and meta.account_id is the connected account. A refused request spends no post credit.
  • More than one target in one request: the request is all or nothing. If one target is at a cap, the whole request is refused and no target’s counter moves.
  • Scheduled post: a scheduled post is never failed by a velocity cap. SocialAPI holds the target and publishes it once the window clears, so it goes out late. The wait does not count as a failed delivery.

Platform limits

Each platform limits what an app can do for an account. When the platform refuses a request for its own rate limit, SocialAPI returns 429 platform.{platform}.rate_limit, for example platform.instagram.rate_limit. Match on the platform.*.rate_limit pattern to handle every platform. When the platform reports how long to wait, SocialAPI passes it on as Retry-After and error.meta.retry_after_seconds. Without them, wait at least 60 seconds, then retry with exponential backoff.

Read a platform’s remaining quota

GET /v1/accounts/{id}/limits returns the quota the platform reports for one connected account, as an object of numbers. It needs the accounts:read scope and costs no credits.
Response (HTTP 200) for an Instagram account:
Zalo no longer reports its message quota: do not rely on remain and total. Every platform that is neither in the table nor Zalo returns 501 resource.not_supported.

Reads and platform limits

Reading comments, reviews, mentions, and posts costs no credits, and SocialAPI applies no rate limit of its own to ordinary reads. The two sync endpoints in the table above have their own cooldowns. Reads still count against the platform’s limit for the account. To detect new comments and messages, subscribe to webhook events instead of polling. If your interface fetches the same page of results repeatedly, cache it on your side.

Handling 429

1

Read Retry-After

When the response has a Retry-After header, wait that many seconds. The same value is in error.meta.retry_after_seconds.
2

Back off when there is no Retry-After

For platform.*.rate_limit without Retry-After, wait 60 seconds, then double the wait on each further 429.
3

Do not retry plan allowances

validation.post_limit_exhausted, validation.interaction_limit_exhausted, and the billing.* codes do not clear within minutes. Check GET /v1/usage and wait for period_end, or change your plan.

Use from an AI agent

Last modified on October 19, 2026