2xx for success, 4xx for problems with the request, and 5xx for problems on our side. Error responses are JSON.
Status codes
Validation errors (400)
Validation failures return amessage array with one entry per failing field. Each entry names the field, echoes the offending value, and lists the violated constraints:
- Unknown fields are rejected. The API whitelists the documented fields for each endpoint; sending anything else fails the request rather than being silently dropped. This catches typos (
phonenumbervsphoneNumber) at the door. - Nested objects report through
children. When a nested field fails, the parent entry’schildrenarray carries the nested validation errors — each naming the inner field under apropertykey, with its ownconstraints(and deeperchildrenif the nesting continues).
Authentication errors (401)
401 responses carry a short message identifying which layer failed:
Authorization: Bearer <api-key> header present and correct → is the signature computed over the exact raw body with the right secret → is the timestamp fresh. The SDK signs every request automatically, which eliminates the most common cause.
Handling guidance
- Don’t retry
400/401/403— the request will fail the same way until you change it. - Treat
404as “not visible to me”, not proof of non-existence. - Retry
429after backing off — the window is one minute, so a short exponential backoff clears it. See Rate limits. - Retry
5xxGETs with backoff. For mutating calls, check state first (e.g.GET /request/{id}) before re-sending, so you don’t create duplicates.