Checkout Errors
The checkout endpoints use the ACP error envelope, which differs from the standard Gomry error format used everywhere else in this API. The catalog endpoints use the standard format.string
invalid_request, processing_error, or service_unavailable. A coarse class for clients that do not switch on code.string
The specific reason. See the table below.
string
Human-readable. Safe to log; not intended to be shown to a buyer verbatim.
string
Present when one field caused the failure — for example
items[0].id.API-Version, and echoes Request-Id and Idempotency-Key when you sent them. Correlating a failure is exactly when those headers matter most.
Codes
Blocking messages vs errors
An error is a failed request. A blocked session is not an error — it returns200 with status: "not_ready_for_payment" and one or more entries in messages[]:
messages[].code is a separate, smaller enum from the error codes above — the ACP spec closes it to six values:
A
type: "error" message blocks payment; type: "info" is advisory. Read status for the decision and messages for the reason.
Retrying
Safe to retry as-is
Safe to retry as-is
500 internal_error, 503 temporarily_unavailable, and 409 request_not_idempotent. Use exponential backoff, and reuse the same Idempotency-Key so a retry cannot double-charge.Fix, then retry
Fix, then retry
Every
400. The request is wrong and will fail identically until changed.Re-read the session first
Re-read the session first
409 sold_out, 409 not_on_sale, 409 amount_mismatch. The world changed underneath the session. GET it, show the buyer what is now true, and only then retry.Do not retry
Do not retry
401 invalid_signature and 402 payment_declined. Retrying a declined token will not make it succeed; ask for another payment method.
