Error envelope
Every error shares one envelope:code— a stable, machine-readable identifier. Branch on this, not on the message.message— a human-readable description. Subject to change; don’t parse it.field— present only for validation errors tied to a specific input field.request_id— the same value as theX-Request-Idresponse header. Include it when contacting support.
Error codes
Rate limiting
Authenticated requests are limited per(business, oauth_client) pair. Anonymous requests (only GET /health) are limited per IP.
Every response includes:
A
429 rate_limited response additionally carries a Retry-After header (seconds). Honor it: wait the indicated time before retrying, and prefer exponential backoff for repeated 429s..png)