Skip to content

Errors

Every error the API can return, with its stable code and how to fix it. Branch on code; see the error shape.

HTTPCodeHow to fix
401api_key_missing

No API key

Send your key in the header Authorization: Bearer sk_live_… (or sk_test_…).
401api_key_invalid

Invalid API key

Copy the key again from Developers → API keys. Keys start with sk_live_ or sk_test_.
401api_key_revoked

Key revoked

Someone revoked this key. Create a new one in Developers → API keys.
401api_key_expired

Key expired

The key passed its expiry date. Create a new one.
402subscription_inactive

Subscription not active

Renew the workspace subscription in Billing. Reads keep working meanwhile.
402quota_exceeded

Allowance used up

The plan's allowance for this period is used. Upgrade or add an add-on in Billing. entitlement names the allowance.
403insufficient_scope

Missing permission

The key lacks the scope in required_scope. Create a key that has it.
403api_access_not_in_plan

API not in plan

Live API access needs a plan that includes it. Test keys work on every plan.
403workspace_suspended

Workspace suspended

Contact support to reactivate the workspace.
403capability_disabled

Capability turned off

This capability is turned off for the workspace. Contact support.
403test_mode_unsupported

Not in test mode

This request acts on real customer data and has no simulated version. Use a live key, or a separate workspace for staging.
400invalid_json

Invalid JSON

The body is not valid JSON. Check quotes and commas, and send Content-Type: application/json.
422parameter_missing

Missing parameter

param names the missing field; details lists all of them.
422parameter_invalid

Invalid parameter

param names the field; message says what is wrong with it.
404resource_missing

Not found

No object with that id in this workspace. Test-mode ids (msg_test_…) are readable only with a test key, and live ids only with a live key.
404route_not_found

Unknown URL

Check the path and method against the API reference. All paths start with /v1/.
405method_not_allowed

Wrong HTTP method

This URL exists but not with this method. See the API reference.
413payload_too_large

Body too large

Send a smaller request body.
422idempotency_key_reused

Idempotency-Key reused

A key belongs to one request. Use a new Idempotency-Key for a different body.
409idempotency_in_progress

Same request still running

The first request with this key has not finished. Retry in a second.
422window_closed

24-hour window closed

WhatsApp only delivers free-form messages within 24 hours of the customer's last message. Send an approved template instead; it reopens the conversation when they reply.
422template_not_found

Template not found

Check the template name and language, or use its tpl_… id.
422template_not_approved

Template not approved

Only templates WhatsApp approved can be sent. Wait for template.status_changed, or fix the rejection in Templates.
422template_variables_mismatch

Wrong template variables

Send exactly one non-empty value per {{n}} in template.variables.body, in order.
409recipient_not_consented

Recipient has not consented

This contact has not agreed to business messages. If you have their consent elsewhere, resend with "consent_confirmed": true (it is recorded).
422recipient_opted_out

Recipient opted out

The contact asked not to be messaged. Do not retry.
422sender_not_configured

No sending number

Connect a WhatsApp number in Settings → Channels, or pass a valid from.
422sender_not_sendable

Number cannot send

reason says why (e.g. disconnected, token expired). Fix the number in Settings → Channels.
422channel_error

WhatsApp rejected it

channel_error carries WhatsApp's own code and message. Look the code up in WhatsApp's error list.
409send_outcome_unknown

Earlier attempt may have been sent

A previous request with this Idempotency-Key got an unclear answer from WhatsApp. Check GET /v1/messages?reference=… before sending again.
422channel_not_connected

Channel not connected

Connect the channel (or reconnect it) in Settings → Channels. param names the field that chose the channel.
409resource_exists

Already exists

Another object already uses this unique value (a phone number, an email, a name). existing_id names it when we can: update that one instead, or use the upsert endpoint.
409resource_in_use

Still in use

Something still depends on this object (a running campaign uses the template, a message uses the file). details lists what. Finish or remove those first.
409state_conflict

Not allowed in the current state

The action does not fit the object's current state, e.g. resolving a conversation that is already resolved, or starting a campaign that already started. Read the object, check state / status, then decide.
422assignee_invalid

Member cannot take this conversation

Assign someone from GET /v1/members who can see the conversation's channel. Viewers and members without access to that number are refused.
422media_invalid

File not accepted

WhatsApp limits each media type: images JPEG/PNG up to 5 MB, video MP4/3GPP up to 16 MB, audio up to 16 MB, documents up to 100 MB, stickers WebP up to 100 KB (500 KB animated). message says which rule failed.
422flow_not_triggerable

Flow cannot be started

Only a published flow whose trigger is "API / webhook" can be started through the API. Publish it, or change its trigger in the flow builder.
422webhook_url_invalid

Webhook URL not allowed

Use a public https:// URL. Private, local and cloud-metadata addresses are refused.
422webhook_endpoint_limit

Too many endpoints

Delete an endpoint you no longer use (10 per workspace).
429rate_limited

Too many requests

Wait Retry-After seconds. Pace requests using the RateLimit-* headers on every response.
500internal_error

Server error

Retry with the same Idempotency-Key. If it persists, contact support with the request_id.
503platform_paused

Sending paused

Outbound messaging is paused platform-wide for maintenance or an incident. Retry later.
503service_unavailable

Temporarily unavailable

Retry with backoff.