Skip to main content

Rate Limits

The API enforces rate limits per minute and per hour to ensure fair usage.

Limits

WindowLimit
Per minute60 requests
Per hour1,000 requests

Limits are applied per API key.

Response Headers

Every response includes rate limit headers:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
X-RateLimit-Reset: 1711929600
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

Handling 429 Responses

When you exceed the limit, the API returns 429 Too Many Requests:

{
"data": null,
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry after 32 seconds.",
"details": { "retry_after": 32 }
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-04-12T10:00:00Z"
}
}

The Retry-After header tells you how long to wait (in seconds).

Bulk endpoint exemption

POST /v1/posts/bulk (create up to 50 posts) counts as one API rate-limit hit instead of N. This is the recommended path for high-volume scheduling:

# Instead of 50 separate POST /v1/posts calls (eats your per-minute budget):
curl -X POST https://app.posteverywhere.ai/api/v1/posts/bulk \
-H "Authorization: Bearer $POSTEVERYWHERE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"posts": [ ... up to 50 ... ]}'

Per-post publishing-rate-limits (POSTS_PER_DAY etc.) still apply individually — the bulk endpoint just collapses the API-key budget. See Bulk Operations.

Webhooks

Webhook deliveries from PostEverywhere to your URL are not subject to your API rate limit (we're talking to you, not the other way around). The retry schedule + 20-failure auto-disable is documented in the Webhooks guide.

Best Practices

  • Use bulk endpoints when N > 5/v1/posts/bulk for create, /v1/posts/retry-failed for retries
  • Use webhooks instead of polling — saves you from burning the API budget on "is it done yet?" loops
  • Schedule in parallel — scheduled posts (with a future scheduled_for) bypass the per-minute posting limit
  • Cache account data/accounts and /me rarely change, cache for 5-10 minutes
  • Implement exponential backoff — on 429 or 5xx responses
  • Monitor headers — check X-RateLimit-Remaining before making requests
// Example: exponential backoff
async function fetchWithRetry(url, options, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const res = await fetch(url, options);
if (res.status === 429) {
const retryAfter = res.headers.get('Retry-After') || Math.pow(2, i);
await new Promise(r => setTimeout(r, retryAfter * 1000));
continue;
}
return res;
}
throw new Error('Max retries exceeded');
}

Platform & Plan Limits

In addition to API rate limits, posting volume is capped per plan. X (Twitter) has the most restrictive per-day limits due to platform API restrictions. Other platforms have higher or unlimited daily caps.

PlanDaily Posts (X/Twitter)AI CreditsSocial Accounts
Trial10/day50/month10
Starter50/day50/month10
Growth150/day500/month25
Pro500/day2,000/month40

When a posting limit is exceeded, the API returns a 429 response with a specific error message:

{
"data": null,
"error": {
"message": "Rate limit exceeded. Check Retry-After header for wait time.",
"code": "rate_limit_exceeded",
"details": {
"retry_after": 60,
"limit": 50,
"window": "day"
}
}
}

For bulk uploads, plan limits are validated before scheduling. If the batch would exceed your X daily limit or subscription limit, the response includes batchErrors describing which limits were hit.

Next Steps