Skip to content

REST API v1 · Reference

Errors

What each status means, and the codes in the error body. Every endpoint answers this way.

API reference · Errors

HTTP statuses

StatusMeaningWhen you see it
400Bad RequestMissing or invalid parameters — e.g. invalid_template_parameters names the offending variable
401UnauthorizedNo credentials, or api_key_invalid / api_key_revoked / api_key_expired for a rejected key
403Forbiddeninsufficient_scope — the key lacks the scope this endpoint needs (`required` names it); ip_not_allowed — the key is limited to other addresses; forbidden — the role is too low for this request (sending needs agent, admin-only writes need admin); or instagram_disabled — Instagram isn’t available for your workspace
404Not FoundThe requested message, template or webhook endpoint does not exist in your workspace
402Plan LimitA plan limit is reached: this month’s outgoing-message allowance is used up (quota_exceeded), or the contact limit is full, so a NEW lead cannot be added (recapturing an existing lead still works); or instagram_addon_required — the workspace hasn’t added the Instagram add-on (`offer` says what the owner can buy: add_addon or upgrade_plan)
409Conflictcontact_opted_out, a duplicate webhook URL (the body names the existing endpoint’s id), the 25-endpoint cap, Instagram not connected (not_connected, reconnect_required), WhatsApp Pay not set up, number_banned / sending_blocked (Meta is refusing messages from the number, so nothing was queued), or a broadcast to people who have never messaged you that needs confirmNewRecipients or has to wait (new_recipients_unconfirmed, new_recipient_cool_off, follow_up_too_soon)
413Payload Too LargeA request body above its limit: 64 KB for ordinary writes, 1 MB for bulk writes, and a media upload above 16 MB (8 MB for an Instagram photo)
422Unprocessableoutside_24h_window — a free-form send (WhatsApp or Instagram) needs an open customer service window; on WhatsApp use a template. needs_phone_number — a verification-code template to a customer WhatsApp shares no number for. Also invalid_post / invalid_schedule for an Instagram post, and notice_to_new_recipients / follow_up_notice_template for a broadcast of a utility or authentication template to people who have never messaged you
429Rate LimitedYou have exceeded the token bucket for this endpoint — wait the Retry-After seconds, then retry. With several keys in a workspace, each key may use at most half of a bucket, so one runaway integration cannot starve the others
503Briefly Unavailablerate_limiter_unavailable — a broadcast, a template submission, a webhook secret rotation, erasing a contact, a bulk write, deleting a template, disconnecting an integration or sending an invoice is paused while its safety limiter cannot be reached. Retry after Retry-After
500Server ErrorAn internal error occurred — retry with exponential backoff

Error codes

Every error body has an error field. Branch on it, not on the HTTP status or the message, which is written for people and may change. A validation error can carry an object there instead of a code. These are the codes you will meet most:

errorStatusWhat it means
unauthorized401No API key was sent.
api_key_invalid · api_key_revoked · api_key_expired401The key was sent and refused. Make a new key on the API keys page.
insufficient_scope403The key lacks the scope this endpoint needs; `required` names it.
ip_not_allowed403The key is limited to other addresses.
forbidden403The key’s role is too low for this request.
plan_feature_unavailable402The plan does not include this; `upgradeUrl` says where to change it.
plan_limit_reached · quota_exceeded402A plan limit is full: contacts, documents, or this month’s messages.
invalid400The body failed validation; `message` and `issues` say which field.
invalid_json400The body is not JSON.
invalid_reference400An id in the body points at nothing in your workspace.
invalid_template_parameters400A template variable is missing or blank; `issues` names it.
template_header_media_required400The template has an image, video or document header and none was sent.
cannot_send_to_self400The recipient is your own business number.
not_found404Not in your workspace (some endpoints spell it "not found"). Another workspace’s id answers the same.
not_available404This feature is not open to your workspace yet.
unknown_integration404No integration by that name; GET /integrations lists them.
payload_too_large413The body is over this endpoint’s limit.
conflict409The write clashes with an existing record.
contact_opted_out409The customer opted out; nothing was sent.
number_banned · sending_blocked409Meta is refusing messages from the number, so nothing was queued.
not_connected · reconnect_required409Instagram is not connected, or needs connecting again.
not_a_draft409Only a draft invoice can be edited or deleted; cancel an issued one.
no_payload409That webhook delivery is older than the payload log, so it cannot be sent again.
invalid_idempotency_key400The Idempotency-Key is empty or over 255 characters.
idempotency_key_in_progress409The first request with this key is still running. Retry shortly.
idempotency_key_reused422This key was used with a different request.
outside_24h_window422A free-form message needs an open 24-hour window; on WhatsApp send a template.
meta_error400 · 429Meta refused the call; `code` and `message` are Meta’s own. 429 when Meta is throttling.
send_unconfirmed · reply_unconfirmed502Instagram did not answer, so the message may have gone. Check before sending again; a retry with the same Idempotency-Key gets this answer, not a second send.
rate_limited429The bucket is empty. Wait Retry-After seconds.
uploads_in_progress429Too many uploads are running at once. Wait Retry-After seconds.
rate_limiter_unavailable503An action that costs money or cannot be undone is paused while its limiter is down. Retry after Retry-After.
internal_error500Something failed on our side. Retry with backoff.

A 429 is covered on Rate limits, and the idempotency codes under Idempotency.