# PostEverywhere Rate Limits Reference > PostEverywhere API rate limits, headers, and best practices for handling 429 responses. **Source:** https://posteverywhere.ai/docs/rate-limits **Section:** Reference **API reference:** https://posteverywhere.ai/docs/api/reference --- The API enforces rate limits per minute and per hour to ensure fair usage. ## Rate limits per API key: 60 a minute, 1,000 an hour | Window | Limit | |--------|-------| | Per minute | 60 requests | | Per hour | 1,000 requests | Limits are applied per API key. ## Reading the rate limit headers When you are rate-limited (`429`), the response carries these headers. Successful responses do not include them: ``` 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 | ## What to do when you receive a 429 When you exceed the limit, the API returns `429 Too Many Requests`: ```json { "data": null, "error": { "code": "rate_limit_exceeded", "message": "API rate limit exceeded (60 requests/min). Please slow down.", "retryable": true, "details": { "limit": 60, "remaining": 0, "reset_at": "2026-04-01T10:01:00.000Z" } }, "meta": { "request_id": "a1b2c3d4", "timestamp": "2026-04-12T10:00:00Z" } } ``` The `Retry-After` header tells you how long to wait (in seconds). ## What bulk endpoints cost `POST /v1/posts/bulk` (create up to 50 posts) is one request from your side but **not** one rate-limit hit: the bulk endpoint charges your key once, then creates each post through the single-post path, which charges again per post. A 50-post bulk therefore uses 51 of your 60-per-minute budget. It is still the recommended path for high-volume scheduling because it validates and reports every item individually: ```bash # 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](/docs/bulk-operations). ## Rate limits on webhook delivery 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](/docs/webhooks). ## Staying inside the limits at volume - **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 ```javascript // 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 limits that apply on top of ours In addition to API rate limits, each plan caps how many social accounts you can connect and how many AI credits you can spend per month. Every plan starts with a 7-day trial (card required). Posting itself has separate publishing limits, described below. | Plan | Social Accounts | AI Credits / month | Team seats | |------|-----------------|--------------------|------------| | Lite | 2 | 10 | 1 | | Starter | 5 | 25 | 2 | | Growth | 10 | 100 | 3 | | Scale | 20 | 500 | 5 | Current prices are on the [pricing page](/pricing). The API rate limit itself (60 requests per minute, 1,000 per hour, per key) is the same on every plan. When a posting limit is exceeded, the API returns a `429` response with a specific error message: ```json { "data": null, "error": { "message": "You're posting too quickly (60 API calls/min). Please wait before trying again.", "code": "rate_limit_exceeded", "details": { "limit": 60, "remaining": 0, "reset_at": "2026-04-01T10:01:00.000Z", "publish_mode": "immediate" } } } ``` Bulk uploads are not pre-validated against plan limits: each post in the batch is created in turn and succeeds or fails on its own, and the bulk response reports the per-item result (see [Bulk operations](/docs/bulk-operations)). ## Related reliability pages - **[Quick Start](/docs/quick-start)** -- make your first API call - **[Authentication](/docs/authentication)** -- set up your API key and understand error codes - **[Create Post](/docs/api/create-post)** -- schedule content to any platform - **Platform guides:** [Instagram](/docs/platforms/instagram) | [TikTok](/docs/platforms/tiktok) | [YouTube](/docs/platforms/youtube) | [LinkedIn](/docs/platforms/linkedin) | [X (Twitter)](/docs/platforms/x-twitter) | [Facebook](/docs/platforms/facebook) | [Threads](/docs/platforms/threads) | [Pinterest](/docs/platforms/pinterest) **Related:** [the 429 error shape](/docs/errors) · [keeping test loops under the limit](/docs/testing) · [rate-limit changes](/docs/changelog) · [how every social media API rate-limits you](/blog/social-media-api-rate-limits)