Skip to main content
Errors are Stripe-shaped: a machine-readable code, a human-readable message, and a request_id to quote when asking for help.
string
required
The broad class of failure. Branch on this when you need coarse handling.
string
required
The specific error. This is the stable identifier — branch on it, not on the message.
string
required
Human-readable, and safe to log. Not stable across releases; never parse it.
string
Present on validation failures: the request field that was rejected.
string
required
Quote this in support tickets. It identifies the exact request in our logs.

Status codes

A 404 is returned rather than a 403 when a resource exists but belongs to a different organization. This is deliberate: it avoids confirming that an ID is real to a caller who cannot see it.

Typed errors in the SDKs

Each SDK maps status codes onto typed errors, so you branch on a class rather than an integer.

Retrying

The TypeScript, Python, and Go clients retry up to three times by default, with exponential backoff, on 429 and 5xx. They do not retry 4xx errors other than 429 — those will fail again.
Give every POST an idempotency key. Then a retry after a timeout is free: you get the original result back instead of a duplicate submission.