Errors & Rate Limits

Understand WATI HTTP error responses and rate limits when handling API requests.

Inspect HTTP status, the endpoint's business result, and the final message outcome separately. A successful HTTP response can contain a business failure; accepted messages are not necessarily delivered.

HTTP and business outcomes

OutcomeHow to handle it
2xxParse the documented response. V3 template send/schedule can return success:false with error in HTTP 200. Even success:true can include recipient errors or omit invalid recipients.
400Correct the documented validation/business error before retrying. V3 errors commonly use code, message, timestamp; use the operation's schema.
401Check authentication and endpoint eligibility. For example, the current V3 contact-update handler rejects the TRIAL role and can return plain text. A 401 does not universally have a JSON body.
403Check scopes, roles, workspace, channel, plan and other account restrictions. More token scopes do not override every restriction.
404 / 405Check the resource, documentation version, route and HTTP method.
429Check whether the refusal is a request rate, account usage or plan limit. Honor Retry-After when supplied; do not assume the header is always present. Use bounded backoff for retryable rate limits; resolve quota/plan restrictions first.
5xx / timeout / connection lossA write may already have been accepted. Treat its result as unknown and reconcile before resending.

Authentication/authorization failures can be plain text or empty. Do not force every error into one JSON envelope. Legacy endpoints can use their own ok, result or info business fields; consult that endpoint instead of applying the V3 shape.

V3 request batch limits

OperationRequest boundaryAdditional checks
PUT /api/ext/v3/contacts1–100 contactsThe current handler denies the TRIAL role; other endpoint permissions still apply.
POST /api/ext/v3/messageTemplates/send1–10,000 recipientsBalance, broadcast-size, usage, channel and account restrictions can reduce what is accepted.
POST /api/ext/v3/messageTemplates/schedule1–10,000 recipientsSame account checks; a current/past scheduled time can be processed immediately. Generate a future UTC value when scheduling.

Batch size is not a per-second rate limit or an entitlement to send that volume. Legacy V1/V2 limits do not establish V3 limits. Rate and usage limits can vary by account and operation; use the applicable endpoint and account terms instead of a universal call-rate table.

Recover a send safely

  1. Save the requested target, channel, correlation values and any returned message/broadcast IDs.
  2. Check the business result and each recipient's errors. Compare requested and returned recipients; omitted rows do not establish success.
  3. Confirm message outcomes with the currently supported webhook events, message history or status capability for that channel. Keep accepted, sent, delivered, read and failed distinct.
  4. For an unknown result, reconcile the original attempt before retrying. Do not resend the whole batch to recover a subset. broadcast_name and local_message_id are not a general request-level idempotency guarantee.

See the V3 template recipe for code that checks business and recipient results without automatic resends.