Skip to main content

The shape

An error carries a code to branch on, a message describing what happened, a fix describing the way out, and over REST the requestId that is also on the lath-request-id header. The HTTP status matches the class of problem. The fix exists because most callers are not sitting at a terminal. An agent that receives one has its next step named for it. Every code, its status and its fix are listed in the error code catalogue.

Ones you will meet

unauthenticated — no valid key. missing_variables — the template references variables the call did not supply, and names them. sms_too_long — the body exceeds the segment limit, with the count and the encoding that decided it. invalid_input names the field. not_found names the thing.

A success is not always a delivery

This is the one worth reading twice. A send can answer 200 and still not reach anybody, in two different ways that carry two different fields. suppressed is about the recipient. email.send and sms.send answer status: "suppressed" with a suppressed object giving the reason — suppressed, no_consent, consent_revoked or topic_archived — when the audience policy refused. The message is stored and will never send. blocked is about your environment. sms.send answers status: "queued" together with a blocked object when the environment cannot text anybody yet — no active carrier registration, or no number. The message is stored and sends once that clears, so do not wait on its status before then. Check both fields before reporting a message as sent.
Last modified on September 23, 2026