POST /api/v1/checkout/sessions, GET /api/v1/checkout/sessions/{id}, and the
cancel endpoint — can return. A card decline is not an error on this
API — it’s a normal 201/200 response with a failed session status.
See Payment outcomes for that
path.
Problem format
The Checkout API returns errors as RFC 9457application/problem+json bodies:
TL;DR: Branch on
code or type (they carry the same information) — never on title or detail. Every entry below is grouped by cause, with a stable anchor, HTTP status, retry rule, and — for 429 — the rate-limit body field.codeis the stable dotted identifier (for examplesession:invalid_state) — the value the tables below list, and the valueerror.codemirrors.typeis a derived tag URI:urn:radiumone:checkout:followed bycodewith every:and_replaced by-(sosession:invalid_state→urn:radiumone:checkout:session-invalid-state). A handful of codes are already full URNs from a different domain (for exampleurn:radiumone:auth:outlet-binding-violation) —codeandtypeare identical for those. The one exception in the other direction is the catch-all500(internal:server_error): itstypeis the genericabout:blank, not a derived URN.titleis a short label, not a stable identifier — many error paths share the generic title"RadiumOne error". Don’t branch on it.detailis human-readable and can change, and may echo part of your request (for example the offending URL) — don’t parse it.detailscarries typed extras for some errors, for exampleretry_after(seconds) on a429.erroris a deprecated{code, message}mirror ofcode/detail, kept for backward compatibility. Prefer the top-level fields.
Authentication and authorization
Missing, malformed, or mismatched credentials on any of the three operations.Validation
The request body failed a field rule or a cross-field check.Session state and idempotency
Session lookup, cancellation conflicts, and create-time idempotency. See Session lifecycle for the full state model behind these.Configuration and availability
Your merchant configuration or the gateway itself is unreachable.gateway:request_failed and gateway:unavailable both mean “no session was created, and it’s safe to retry the same create call” — they differ in cause (a genuine upstream failure vs. a breaker deliberately short-circuiting). Branch on code/type, not the HTTP status alone.Rate limits and server errors
Next steps
Payment outcomes
Declines, expiry, and cancellation — not errors on this API.
Redirect and signature errors
Signature verification and return-URL signal reference.
Handle failures
Ten common failure scenarios, each with the exact signal and what to do.
Test your integration
Exercise these paths in sandbox before you go live.