Errors
Every error response has the same shape, for every endpoint:
A validation failure adds a list of field errors:
field is the dotted path into the request body. You can map it to a form field. type is a stable
kind of error. You can use it as a localization key.
Codes
Hams adds new codes without a new API version. Treat a code that you do not know as a generic failure.
A 404 never means forbidden
A resource that belongs to another account returns the same 404 and the same generic message as a
resource that does not exist. The API does not show whether an id is valid in another account. A 404
on an id that you received always means that the id is not in your account.
A transcript that does not exist also returns 404. This includes a transcript that failed. See
Call history and recordings.
A 401 and the dashboard endpoints
A developer key works only under /api/developer/v1. If you send a key to any other path, the
API rejects the request as not authenticated. This includes the paths that the dashboard uses. A dashboard session
also does not open the developer endpoints. The 2 credentials do not overlap.
A 429 and the limits
By default, each key can make 10 requests each second across the API. The limit for a key is a fixed window. It
resets at the window boundary. Calls that you place also have a limit for each account each second.
That limit counts the requests in a window that moves with time. It does not count the requests that it refuses. Both limits
answer 429 with the standard body and a Retry-After header.
Wait until the time in the header. Then try again.
A 503 means try again
A 503 with the code service_unavailable on a call placement means that no call server can take
the call now. The system did not place
the call. Try again with a longer delay each time. The key and the request are correct.