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:
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry after 32 seconds.",
"retryAfter": 32
}
}
The Retry-After header tells you how long to wait (in seconds).
Best Practices
- Use bulk endpoints —
/posts/bulk-schedulehandles up to 100 posts in one request - Cache account data —
/accountsrarely changes, 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