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: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
Retryrate_limit_error and api_error. Do not retry 4xx errors unchanged;
they will fail identically.