failure_reasonβ a stable, machine-readable code. Branch on this.failure_reason_messageβ human-readable copy describing the failure. Show this to a user, but do not hardcode or match on it: the wording is English today and may be reworded or localized later.
Branch on
failure_reason, not on failure_reason_message β the code is stable, the message is
not. This mirrors how you branch on a top-level error code rather than its message. See
Errors.When the fields are present
failure_reason and failure_reason_message are null (or absent) unless the resource actually
reached a bad outcome. They are populated on:
- Money movements that did not succeed β an
onramp,offramp,conversion, ortransferwithstatus: "failed", and anonramp,offramp, orconversionwithstatus: "returned". - Failed verifications β the
kyc.rejectedwebhook event and the verification endpoints.
failed for money movements, verification_failed for verifications.
Money movement codes
These apply to anonramp, offramp, conversion, or transfer that did not succeed.
temporarily_unavailable is the retryable one β retry the request with backoff. failed is
deliberately generic: a provider decline, invalid upstream input, a released hold, and anything
otherwise unrecognised all collapse to it.
quote_expired means nobody paid in before the quoteβs rate window closed β not that anything
went wrong on our side. No funds moved, so it is always safe to create a fresh quote and try again.
This is the most common non-success outcome by a wide margin, so if you alert on failures, exclude
this code: counting it inflates your apparent failure rate with transactions that were simply never
funded. It applies to onramp, offramp, and conversion.
funding_failed is reported on an offramp whose funding transfer could not be completed. The
offramp fails immediately rather than sitting in processing until its quote expires, and no funds
moved β create a new quote and retry.
refund_failed means the transaction failed and the refund attempt did not complete. Unlike the
other codes it may need our involvement to resolve β contact support with the resource id rather
than retrying.
returned accompanies status: "returned", not "failed" (see the warning above). Its message
deliberately does not promise a credit, because whether one happens depends on how far the
transaction got: an offramp whose payout had already settled is credited back in full β appearing as
a deposit-type transaction β while a transaction that never debited you has nothing to credit
back. Check your wallet balance or transactions list rather than inferring a credit from this code.
Verification (KYC) codes
These apply to thekyc.rejected webhook event and the verification endpoints.
The first eight are actionable β the applicant can usually fix the problem and resubmit.
verification_failed is deliberately generic: any rejection we should not detail collapses to it,
and we never reveal the underlying detection.