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

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 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
Lead capture URLPOST /api/leads/capture/{token} (per sending address)3030 / min