Skip to main content
Every 4xx and 500 response (except 429) is the same JSON object:

Errors every endpoint can return

These are raised at the boundary — authentication, request parsing, resource lookup — before or around the operation itself, so every endpoint can return them. Each reference page lists them alongside the endpoint’s own codes, grouped by status; this table is where they are explained once.

Errors specific to an endpoint

Each reason an operation itself can refuse has its own code — insufficient funds, an expired FX quote, a transfer that can no longer be canceled, a money-movement action that needs an IP allowlist. They are listed first under their status on the endpoint’s reference page, with the message you will see. For example, Create an ACH transfer lists insufficient_funds and destination_archived next to conflict under 409, and ip_allowlist_required next to forbidden under 403. An endpoint never returns a code it does not list. When a reason is about a field of the request, details.field names it and, when that field carries an identifier, details.id holds the value received. The reference page shows one example for each field an endpoint can name.

Retry behavior

Retry

Retry idempotent reads after 429 or 500 responses with exponential backoff and random jitter.

Fix before retrying

Change the request or credentials before retrying 400, 401, 403, or 404 responses.
For a timed-out create request or a create request that returns 500, do not retry automatically. Its idempotency key may already be permanently consumed. Follow the idempotency guidance and reconcile through the resource’s list and retrieve endpoints before deciding whether to make a new create attempt.