Skip to main content

Rate Limits & Polling Best Practices

Upload-Post applies rate limits at multiple levels to protect the service and the social media platforms. This guide explains each limit and how to design your integration to work within them.

API Rate Limits​

Every authenticated API response includes rate limit headers:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the window resets

When you exceed the limit, the API returns HTTP 429 Too Many Requests. Wait until the X-RateLimit-Reset timestamp before retrying.

Limits per plan​

The per-minute window depends on your plan, and grows with the number of profiles on the account (+2 requests/min and +10 requests/10 min per profile), so multi-brand accounts are not capped like a single-profile one:

PlanRequests / minuteRequests / 10 minutes
Free60300
Professional100500
Advanced2001,000
Business5002,500

Example: an Advanced account with 100 profiles gets 200 + 100 × 2 = 400 requests/min. Hard ceiling: 1,000 requests/min and 5,000 requests/10 min. Requests made from the dashboard (web session) use a separate, higher allowance.

The exact limit that applies to your key is always in the X-RateLimit-Limit header of every response. The first request after a long idle period may report the Free tier while the API resolves your plan; the following requests apply your tier.

Upload Status Polling​

When using async_upload=true, you need to poll the Upload Status endpoint to get the result. Here are the recommended intervals:

Polling Strategy​

1. Submit upload → get request_id
2. Wait 5 seconds (initial delay)
3. Poll GET /api/uploadposts/status?request_id=<ID>
4. If status is "pending", "queued", or "processing" → wait 10 seconds → repeat step 3
5. If status is "completed" or "failed" → done
ScenarioPoll IntervalMax Wait
Photo uploadsEvery 5–10 seconds2 minutes
Video uploads (small, < 50 MB)Every 10 seconds5 minutes
Video uploads (large, > 50 MB)Every 15 seconds10 minutes
Scheduled posts (after scheduled time)Every 30 seconds10 minutes
Queued postsEvery 60 secondsUntil next queue slot

Status Cache TTLs​

The status endpoint uses internal caching. Here is how often the status value is refreshed:

StatusCache TTLMeaning
queued2 secondsThe upload is waiting for a worker
pending2 secondsAccepted but not yet started
processing3 secondsAt least one platform is actively uploading
completed5 minutesAll platforms finished successfully
failed5 minutesAll platforms failed

Key takeaway: Polling faster than every 5 seconds for non-terminal states is unnecessary — the cache refreshes every 2–3 seconds. For terminal states (completed/failed), the result is cached for 5 minutes, so subsequent polls are fast.

Alternative: Use Webhooks​

Instead of polling, configure a webhook to receive a POST notification when the upload completes. This is more efficient for high-volume integrations:

{
"channels": { "webhook": true },
"webhook_url": "https://your-server.com/webhook"
}

The webhook fires once per platform per upload, so you get immediate notification without polling.

Upload Rate Limits​

Per-Request Duplicate Protection​

The API prevents duplicate uploads using idempotency keys and rate limiting:

  • Same content to same platform: If you submit an identical upload (same user, platform, and content hash) within a short window, the API returns the existing request instead of creating a duplicate.
  • Idempotency-Key header: Send a unique Idempotency-Key or X-Idempotency-Key header to ensure exactly-once processing, even across retries.

Daily Upload Caps (per platform per account)​

Each social account has a daily hard cap based on platform limits. Exceeding these returns HTTP 429:

PlatformMax posts / 24h
Instagram50
TikTok15
LinkedIn150
YouTube10
Facebook25
X (Twitter)50
Threads50
Pinterest20
Redditunavailable (reddit_unavailable)
Bluesky25 videos / 10 GB (video quota)

These are rolling 24-hour windows per social account, not per API key.

Monthly API Usage​

Your plan determines how many API upload calls you can make per month:

PlanMonthly uploads
Free10
Paid plansSee pricing

Check your current usage with GET /api/uploadposts/me — the response includes api_usage.count.

API Key Brute-Force Protection​

Failed authentication attempts (invalid API keys) are rate-limited per IP:

  • After 10 consecutive failed attempts with the same invalid key, the IP is blocked for 5 minutes.
  • The API returns HTTP 429 during the block period.

Best Practices​

  1. Use webhooks instead of polling when possible — they're instant and don't consume rate limit budget.
  2. Respect X-RateLimit-Remaining — stop sending requests when it reaches 0.
  3. Use exponential backoff on 429 responses — don't hammer the API after hitting a limit.
  4. Set async_upload=true for all uploads — synchronous uploads timeout after 59 seconds anyway.
  5. Send Idempotency-Key for all upload requests — this protects you from duplicate posts if your HTTP client retries on timeout.
  6. Poll at the recommended intervals — faster polling just returns cached results and wastes your rate limit budget.