Skip to main content
Every error is JSON with a stable, machine-readable error string. Branch on that string, not on the HTTP status: 429 alone has seven meanings, and 403 has ten.
Some errors add fields: message (a sentence for your logs, never for branching), status, balance_halalas, price_halalas, provider_code, fields, errors and used_by. Every response carries an X-Request-Id header. Log it, and quote it when you write to support.

By HTTP status

The Retry column

  • Yes: send the same request again, with the same Idempotency-Key. Back off between tries.
  • Later: the same request works once something changes: time passes, the balance is topped up, a template is approved. Do not loop on it.
  • No: change the request, the key or the setup first. Sending it again answers the same.

Shared by every endpoint

Checked in this order, before the endpoint’s own logic.

Verify

The codes of /v1/verify/..., after the shared checks.

WhatsApp messages

The Tawked Notifications endpoints, /v1/whatsapp/..., after the shared checks, in this order.

Template writes

Creating, editing and deleting a template over the API are not open to a key you create, full access included: POST, PATCH and DELETE under /v1/whatsapp/templates answer it 403 insufficient_scope, and templates are written on Notifications → Templates. The key of a connected app holds notifications:templates; these are the codes those three calls answer it.

Email

The Tawked Email endpoints, /v1/email/..., after the shared checks, in this order. See Sending email. Beyond a send in the original shape (one to string), a refusal names where it sits: field (to, cc, headers.List-Unsubscribe, a list’s parameter) and field_index; a batch’s index names the message. Something that goes wrong at the sending service after the 202 is the message’s failed status and an email.failed webhook, never an error answer: its error.code is send_failed, email_paused (the sending service refused it as paused), email_early_access, sender_not_verified, recipient_suppressed, queue_expired, account_not_active (the account or application could no longer send when it was due) or application_deleted, and its price is refunded. A pause after the 202 holds the message instead: it stays queued and charged, is sent if the pause lifts within 12 hours of its time, and otherwise fails with queue_expired, refunded once.

Conversation menus

The Tawked Chat endpoints, /v1/chat/menus/..., after the shared checks, in this order. They answer a connected app’s key alone: a key you create, full access included, gets 403 insufficient_scope naming chat:menus, and your own menus are added on Chat → Conversation menus.

Auto-attendant

The Tawked Chat endpoints /v1/chat/attendant/..., after the shared checks, in this order. They answer a connected app’s key alone: a key you create, full access included, gets 403 insufficient_scope naming chat:attendant, and your own auto-attendant is built on Chat → Auto-attendant.

Partner API

The partner endpoints (/v1/partner/...) have their own ladder. Codes sent on behalf of an application meet the shared and Verify ladders above, where service_required, service_not_found and account_not_active are the partner-key cases; see Sending codes for an application.

Partner invalid request fields

fields names what was refused, in your own spelling:
  • Verify settings endpoint: the bare field names, or verify alone for an empty or unrecognised patch.
  • Provision and brand update: verify. followed by the field name for a refused setting.
  • Metadata: metadata. followed by the key for a refused tag, or metadata alone for a wrong shape, on a write or on the list filter.
  • Logo: logo for a missing, oversized or non-image file.
  • Webhook: events for an unknown event name; url or secret, which are set in the console only.
  • Feeds and logs: cursor, since, event or status.
  • Usage: no fields; message says from and to must be ISO dates.
  • Any write: a malformed Idempotency-Key is refused with a message.

Webhook endpoints

The webhook endpoints by API, /v1/webhooks/..., after the shared checks; a live key with the explicit webhooks:manage.

Received email

The received email endpoints, /v1/email/received/... and /v1/email/inbound-addresses, after the shared checks and live_key_required. They need a key that holds email:inbound (403 insufficient_scope names it); a forward needs email:send too, and answers every refusal of a send listed under Email.

Retired endpoints

Last modified on October 20, 2026