code in the error body. Every error includes a trace_id, which lets Ringg find the request in seconds. Keep it in your logs.
Rejected requests
401 missing_api_key or invalid_api_key
TheX-API-Key header is missing, or the key isn’t a current key for your workspace.
- Check you are using the key for the right environment: staging and production keys differ.
- If the key was regenerated in the dashboard, update your service.
403 invalid_signature
The signature didn’t match, or the timestamp was out of range. In order of how often we see them:
When Ringg rotates a secret, the old one keeps working until it is retired, so a rotation alone doesn’t cause this error.
403 workspace_mismatch
The API key works, but its workspace doesn’t own thephone_number_id in the body. Use the key of the workspace the number is registered to.
404 unknown_phone_number_id
The number isn’t registered for relay in this environment. Check thephone_number_id is Meta’s numeric id for the number, not the display number, and that you are calling the environment it was registered in.
422 invalid_body
The body doesn’t match the endpoint’s shape. Themessage names the field. Common causes:
- Extra top-level fields. Every relay body accepts only its documented fields. On
/status, send{ "phone_number_id": "…", "statuses": [ … ] }only, not Meta’s wholeentryorvaluewrapper. prior_messagestoo long, or a message with empty text. Up to 200 messages, each 1 to 4,096 characters.rolenotcustomeroragent.- A wrong type, such as
chat_idnot being a UUID on/ackor/close.
422 missing_message_id
value.messages[0].id is empty. Forward Meta’s original message id: it is how Ringg avoids answering the same message twice.
503 errors
unable_to_accept, auth_unavailable, config_unavailable and relay_unavailable are temporary. Retry with backoff. Retrying /inbound with the same message id is always safe.
No reply for a message
/inbound answers 202 as soon as the message is stored. If no message.outbound follows, check these in order:
If none of these explain it, send Ringg the
phone_number_id, the customer message id and the time.
Replies arrive out of order
Ringg delivers one reply per chat at a time, insequence order. Out-of-order messages on WhatsApp usually mean your service sends to Meta in parallel. Send each chat’s replies one at a time, in sequence order.
Acks
Ack every
message.outbound, even when the send failed. A failed or skipped ack keeps the AI agent from referring to a message the customer never saw.
Handover history looks wrong
A chat closed unexpectedly
A chat closes when:- the AI agent ends it (
conversation.closed,reason: "completed"); - you call
/close; - you ack a reply as
failedwith Meta error131047(24-hour window closed),131026(undeliverable) or131051(unsupported type); - it reaches the agent’s idle or maximum-length timeout.
What to send Ringg support
- The
trace_idfrom any error response - The
phone_number_id,chat_idandevent_idinvolved - The customer message id (
wamid…), if a reply is missing - The time, with time zone
- Environment: staging or production