error string, the likely cause and the fix. The Errors page lists every code, and every response carries an X-Request-Id to quote to support@tawked.com.
Codes
The code never arrives on the phone
The code never arrives on the phone
reference. Its status says what happened.- A test key sends only to the phone the account owner verified at signup. Any other number answers
422 sandbox_unverified_destination. See Testing and the sandbox. sent, but nothing on the phone: check the number in the log. Tawked accepts five Saudi mobile formats and normalises them; a typo in a valid format still goes to the wrong phone. See Numbers, language and the SMS.failedright away: the send failed and was refunded. Retry with the sameIdempotency-Key.- Not in the log at all: the call was refused before a send. Read the
erroryour server got back.
403 account_not_active on start, but WhatsApp sends work
403 account_not_active on start, but WhatsApp sends work
429 rate_limited for one number
429 rate_limited for one number
403 application_paused
403 application_paused
429 sandbox_quota_exceeded
429 sandbox_quota_exceeded
Keys
403 insufficient_scope
403 insufficient_scope
WWW-Authenticate header names the scope the call needs, for example scope="verify:send". Access cannot be changed after a key is created: create a key with the access you need, deploy it, then revoke the old one. See Key access.403 ip_not_allowed
403 ip_not_allowed
429 too_many_requests
429 too_many_requests
Retry-After: wait, then retry within the minute. If you poll GET /v1/verify/{id} for outcomes, use webhooks instead.WhatsApp messages
403 live_key_required
403 live_key_required
/v1/whatsapp/.... Use the application’s live key with Notifications access. A live key works while the application is in review.409 no_whatsapp_number or 409 number_disconnected
409 no_whatsapp_number or 409 number_disconnected
no_whatsapp_number: nothing is connected yet. The owner or an admin connects the number under Notifications → Overview.number_disconnected: the number is attached, but Meta does not report it as connected now. Notifications → Overview shows its health and what Meta asks of it.422 unknown_template or 422 template_not_approved
422 unknown_template or 422 template_not_approved
template name must match a template on the number’s WhatsApp Business Account exactly, and Meta must have approved it. GET /v1/whatsapp/templates lists them with their status. A template that exists in several languages also needs lang. See Templates.422 invalid_params
422 invalid_params
header.image. The message names what to fix. The template’s placeholders in GET /v1/whatsapp/templates say what each one needs.422 consent_opted_out
422 consent_opted_out
The message was accepted but shows failed
The message was accepted but shows failed
202 means Meta accepted the message. Delivery can still fail later: the status becomes failed, a message.failed event carries Meta’s reason in error, and the fee is refunded. Notifications → Messages shows each message’s history.Webhooks
The signature never matches
The signature never matches
- Compute the HMAC over the raw body, before any JSON parsing. A framework that parses and re-serialises the body changes its bytes.
- The signed string is
{tawked-timestamp}.{raw body}, with a dot between, and the timestamp is in milliseconds as sent. - Use the application’s current signing secret. Rotating it on the Webhooks page changes what every later delivery is signed with.
- Compare the hex digests in constant time.
Events do not arrive
Events do not arrive
- The URL must be
https://on a public host. A redirect is not followed. - Your endpoint must answer
2xxwithin 5 seconds. Acknowledge first, then do the work. - A failed delivery is tried 5 times in all: at once, then after 1 minute, 5 minutes, 30 minutes and 2 hours. After that, Send again in the log queues it anew.
- Send a test event checks the whole path in one click.
The same event arrived twice
The same event arrived twice
data.id together with the event name.The balance
402 insufficient_credits
402 insufficient_credits
balance_halalas and price_halalas. Top up under Wallet, by card or bank transfer, and set a Low-balance alert under Wallet → Balance so it does not happen again.429 spend_cap_reached
429 spend_cap_reached
X-Request-Id, the time of the call and the error you got.