Skip to main content
Every non-2xx response has the same body:
Branch on type for control flow and on code for specific handling. Both are stable; message is written for humans and may be reworded. Always log request_id. It is echoed in the X-Request-ID response header, and quoting it lets us find your exact request.

Types

A 404 does not distinguish “does not exist” from “belongs to another workspace”. That is deliberate: telling them apart would let anyone probe for record ids across workspaces.

Missing scopes

A 403 from a scope check names exactly what is missing, so you do not have to guess:
A 403 that is not insufficient_scope usually means workspace write policy — for example, an entity mirrored from an external CRM. Call GET /v1/capabilities to see which entities you may write.

Retrying

Retry rate_limit_error and api_error. Do not retry 4xx errors unchanged; they will fail identically.
Use exponential backoff with jitter. Retrying immediately during a rate limit extends it.