API·ERRORS
Errors
Every error response from the API has the same shape:
{ "error": { "code": "string", "message": "human-readable", "details": { } } }
details is optional and present only when relevant (e.g., a list of field-level validation errors).
Status codes
| Status | Code | Meaning |
|---|---|---|
400 | bad_request | Malformed request body or query parameters. details lists field errors. |
401 | unauthorized | Missing, malformed, or unknown API key. |
403 | forbidden | Valid key, but missing required scope. |
404 | not_found | Resource does not exist or is not in your workspace. |
409 | conflict | State conflict — e.g., trying to set a duplicate unique value. |
429 | rate_limited | Token bucket exhausted. See Rate limits. |
500 | internal_error | Something went wrong on our end. Safe to retry after a short delay. |
Field-level validation
For 400 bad_request on a create or update, details.fields is an object keyed by field name with an array of issues:
{
"error": {
"code": "bad_request",
"message": "Validation failed",
"details": {
"fields": {
"Email": ["must be a valid email address"]
}
}
}
}