A failed payment is not an HTTP error
This is the distinction that matters most. If a customer’s payment is declined, the request still succeeds: you get a2xx, and the failure is described inside the resource, on the
attempt’s failure block.
An HTTP error means Orchestrate could not process your request — bad credentials, invalid
input, a resource that does not exist. Handle the two separately.
Failure categories
Every payment failure carries a category. Branch on the category, not on the individual code: codes are added over time, categories are stable.HTTP status codes
Error shape
Errors carry a human-readable message. Validation errors add a field-by-field breakdown.message to your operators, not to your customers — for customers, use the
failure.code.message on the attempt, which is written for them.
Retrying safely
429 and 5xx are worth retrying with exponential backoff. For 429, respect the
Retry-After header and the operation-specific rate limit. Always send an
idempotency key on the original request so the retry cannot
create a second payment.
4xx other than 429 will not succeed on retry. Fix the request first.