Rate Limits
The API enforces rate limits per minute and per hour to ensure fair usage.
Limits
| Window | Limit |
|---|---|
| Per minute | 60 requests |
| Per hour | 1,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
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the current window |
X-RateLimit-Remaining | Requests remaining in the current window |
X-RateLimit-Reset | Unix 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/bulkfor create,/v1/posts/retry-failedfor 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 —
/accountsand/merarely change, cache for 5-10 minutes - Implement exponential backoff — on 429 or 5xx responses
- Monitor headers — check
X-RateLimit-Remainingbefore 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.
| Plan | Daily Posts (X/Twitter) | AI Credits | Social Accounts |
|---|---|---|---|
| Trial | 10/day | 50/month | 10 |
| Starter | 50/day | 50/month | 10 |
| Growth | 150/day | 500/month | 25 |
| Pro | 500/day | 2,000/month | 40 |
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
- Quick Start -- make your first API call
- Authentication -- set up your API key and understand error codes
- Create Post -- schedule content to any platform
- Platform guides: Instagram | TikTok | YouTube | LinkedIn | X (Twitter) | Facebook | Threads | Pinterest