Skip to content

REST API v1 · Reference

Rate limits

Per-endpoint token buckets, the headers that say what is left, and what to do when a bucket is empty.

API reference · Rate limits

Last updated

How limits work

Limits are per-endpoint token buckets scoped to your workspace — not to your plan. Burst is how many requests you can fire back-to-back from a full bucket; sustained is how fast it refills. Separately, how fast WhatsApp actually delivers is governed by the messaging tier Meta assigns your phone number. When a workspace has more than one key, each key may use at most half of any bucket.

Every answer says what is left. Each response, a success or an error, carries three headers for the bucket the request used: RateLimit-Limit (the bucket’s burst size), RateLimit-Remaining (requests left) and RateLimit-Reset (seconds until the bucket is full again). When a request uses more than one bucket (your key’s half and the workspace’s), they describe the one closer to running out. A 401 has none (no bucket was used), and neither has an answer given while the limiter cannot be reached.

Response headers
# A success from POST /send (bucket: 200, refilling 50 a second)
HTTP/1.1 200 OK
RateLimit-Limit: 200
RateLimit-Remaining: 187
RateLimit-Reset: 1

# The bucket is empty
HTTP/1.1 429 Too Many Requests
Retry-After: 1
RateLimit-Limit: 200
RateLimit-Remaining: 0
RateLimit-Reset: 4

Handling Rate Limit Errors

A 429 Too Many Requests means the bucket is empty. It carries a Retry-After header in seconds: wait at least that long, then retry with exponential backoff — a burst of immediate retries will simply drain the bucket again. To avoid the 429 at all, slow down when RateLimit-Remaining gets low: spread what is left over RateLimit-Reset seconds, or pause until then.

A retry after a 429 or a dropped connection is safe with an Idempotency-Key: see Idempotency.

Every bucket

Each resource page lists the rows for its own endpoints.

BucketEndpointsBurstSustained
Reads/messages · /conversations · /contacts · /templates · /phone-numbers · GET /webhooks · Instagram, LinkedIn, ads and catalog reads · GET /payment-requests/{id}60060 / sec
Send/send20050 / sec
Media upload/media20050 / sec
Webhook adminPOST /webhooks6030 / sec
Webhook changesPATCH /webhooks/{id} · DELETE /webhooks/{id}601 / sec
Contact writesPOST /contacts · PATCH /contacts/{id}12010 / sec
Contact erasureDELETE /contacts/{id}201 / 3 sec
Inbox writesPATCH /conversations/{id} · POST /conversations/{id}/notes (each its own bucket)12010 / sec
Broadcast cancelDELETE /broadcasts/{id}301 / 2 sec
Webhook secret rotationPOST /webhooks/{id}/rotate55 / hour
Template createPOST /templates5050 / hour
Broadcast createPOST /broadcasts1010 / hour
CRM writesPOST /leads · PATCH /leads/{id} · notes · POST /tasks · PATCH /tasks/{id}12010 / sec
Instagram replyPOST /instagram/send12030 / sec
Instagram commentsPOST /instagram/comments/{id}/reply · /hide (each its own bucket)601 / sec
Instagram postsPOST /instagram/posts · POST /instagram/posts/{id}/cancel601 / sec
Instagram mediaPOST /instagram/media301 / 2 sec
Instagram live postsGET /instagram/posts/recent301 / 2 sec
WhatsApp PayPOST /payment-requests301 / 2 sec
LinkedIn postsPOST /linkedin/posts · PATCH and DELETE /linkedin/posts/{id} · POST /linkedin/posts/{id}/retry601 / sec
LinkedIn mediaPOST /linkedin/media (a video or document also draws from a large-upload bucket: 4, then 1 / 30 sec)301 / 2 sec
LinkedIn eventsPOST /linkedin/events · PATCH and DELETE /linkedin/events/{id} · POST /linkedin/events/{id}/share301 / sec
LinkedIn commentsPOST and DELETE /linkedin/comments2020 / min
LinkedIn ad results refreshPOST /linkedin/ads/refresh33 / 15 min
LinkedIn campaign pause and resumePOST /linkedin/ads/campaigns/{campaignId}/pause · /resume2020 / 10 min
LinkedIn draft adsPOST /linkedin/ads/message-ads · POST /linkedin/ads/sponsored-content (each its own bucket)1010 / hour
LinkedIn Ad LibraryGET /linkedin/ad-library2020 / min
LinkedIn boostsPOST /linkedin/boost/{id} · DELETE /linkedin/boost/{id} (preview and init: 30, then 1 / 2 sec)201 / 5 sec
LinkedIn audiencesPOST /linkedin/audiences (10 / 10 min) · DELETE /linkedin/audiences/{id} (20 / 10 min) · POST /linkedin/audiences/{id}/sync66 / hour
Ad budgetsPOST /ads/{id}/budget1212 / hour
Ad imagesPOST /ads/images301 / 2 sec
Ad suggestionsPOST /ads/recommendations/{id}/decision3030 / 10 min
Ad charges from MetaGET /ads/charges?fresh=131 / min
Lead Ads importPOST /lead-ads/forms/{formId}/import33 / 10 min
Catalog productsPOST /catalog/products · PATCH and DELETE /catalog/products/{id}601 / sec
Catalog picturesPOST /catalog/images301 / 2 sec
Catalog syncPOST /catalog/products/sync66 / 10 min
Catalog importPOST /catalog/import33 / 10 min
Product messagesPOST /catalog/send (the inbox's send bucket, shared with replies sent from the dashboard)12030 / sec
Lead capture URLPOST /api/leads/capture/{token} (per sending address)3030 / min