Base URLs
Authentication
Send an API key asAuthorization: Bearer <key> or X-Api-Key: <key>. See authentication for key types and rotation.
Conventions
Request bodies are snake_case; responses are camelCase
Request bodies are snake_case; responses are camelCase
You send
external_id, you read back externalId. The TypeScript and Python
SDKs pass your parameters through verbatim, so their params are snake_case too.
This is the single most common surprise for new integrators.Single resources are wrapped in a data envelope
Single resources are wrapped in a data envelope
GET /v1/submissions/{id} returns a data envelope. List endpoints return
data alongside has_more and next_cursor. Every SDK unwraps this for you.Lists are cursor-paginated
Lists are cursor-paginated
Pass
next_cursor back as cursor. limit defaults to 25 and caps at 100. See
pagination.Writes accept an Idempotency-Key
Writes accept an Idempotency-Key
Retrying a
POST with the same key returns the original result instead of
creating a duplicate. See idempotency.Errors carry a stable code and a request_id
Errors carry a stable code and a request_id
Branch on the error
code, never on the message. Quote the request id in
support tickets. See errors.Rate limit is 1000 requests per minute per key
Rate limit is 1000 requests per minute per key
Exceeding it returns
429. The SDKs retry automatically. See
rate limits.