Skip to main content

Reason codes

Every decision carries reason codes from a fixed registry. There is no free text. A code you see on a payout, a change, a case or a trace means exactly what this page says.

Gate decisions​

The six words: ALLOW, STEP_UP, HOLD, REROUTE, REVIEW, DENY. When two policies disagree, the strictest wins in that order.

Trust: beneficiaries and payouts​

CodeMeaning
NEW_BENEFICIARYThis destination has never received a successful payout here.
BENEFICIARY_ACCOUNT_CHANGED_RECENTLYThe destination was changed recently.
BENEFICIARY_CHANGE_VELOCITY_HIGHChanged more often than usual.
BENEFICIARY_NAME_MISMATCHThe account holder's name does not match the record.
BENEFICIARY_UNVERIFIEDThe destination has not been verified.
COOLING_OFF_ACTIVE / COOLING_OFF_SATISFIEDA change is inside its window, or the window has elapsed.
SELLER_UNVERIFIED / SELLER_NEW / SELLER_RESTRICTED / SELLER_HISTORY_CLEANSeller signals.
PAYOUT_AMOUNT_ABOVE_BASELINEMuch larger than this seller's usual payout.
PAYOUT_AMOUNT_ABOVE_THRESHOLDAbove the amount that needs human approval.
FULFILLMENT_EVIDENCE_SUFFICIENT / _MISSING / _TIER_TOO_LOWState of delivery evidence.
FULFILLMENT_REVERSEDA delivery record was later cancelled.
OPEN_CASE_ON_SUBJECT / OPEN_DISPUTE_ON_ORDERBlocking open work.
ATO_SESSION_RULEThe requester changed credentials inside the takeover window.
DUAL_APPROVAL_REQUIRED / STEP_UP_REQUIRED / MANUAL_REVIEW_REQUESTEDControl requirements.
POLICY_DEFAULTNo rule matched; the defaults decided.

Routing: why a connection was excluded​

CodeThe filter that stopped it
ROUTE_CONNECTION_NOT_ACTIVEContracted: not active or not dispatchable.
ROUTE_ENVIRONMENT_MISMATCHEnvironment.
ROUTE_METHOD_UNSUPPORTEDMethod.
ROUTE_CURRENCY_UNSUPPORTEDCurrency.
ROUTE_OPERATION_UNSUPPORTEDOperation (for example manual capture on PayNow).
ROUTE_AMOUNT_OUT_OF_RANGEAmount.
ROUTE_CIRCUIT_OPEN / ROUTE_UNHEALTHYHealth.
ROUTE_RISK_BLOCKEDRisk: the Gate routed away from it.
ROUTE_RETRY_POLICY_BLOCKEDRetry: already tried for this payment.

Routing: why the winner won​

CodeMeaning
ROUTE_ONLY_CANDIDATEOne connection survived every filter.
ROUTE_SCORE_WINNERSeveral were eligible in the same health class; this one scored highest.
ROUTE_HEALTH_WINNERA healthy connection was preferred over an impaired one before any score was compared.
NO_ELIGIBLE_ROUTENothing survived.
ROUTE_FAILOVER_PRE_COLLECTIONA re-route after a pre-send technical failure, before any card was collected.
ROUTE_SAME_PROVIDER_RETRYA retry after a soft decline.

Credentials​

CodeMeaning
LIVE_KEY_IN_TEST_ENVIRONMENTA live-shaped key in Test.
TEST_KEY_IN_LIVE_ENVIRONMENTA test key in Live.
SECRET_KEY_NOT_ALLOWED_USE_RESTRICTEDA Stripe sk_ key. Use a restricted key.
KEY_PREFIX_UNRECOGNIZEDNot a credential shape this provider uses.
PROVIDER_AUTH_FAILEDThe provider rejected it.
PROVIDER_SCOPE_INSUFFICIENTIt lacks the permissions the platform needs.
WEBHOOK_REGISTRATION_SCOPE_MISSINGStripe: no Webhook Endpoints: Write. Stored DEGRADED.

Outcomes​

CodeMeaning
PROVIDER_TIMEOUT / PROVIDER_RATE_LIMITED / PROVIDER_5XXTransient provider failures.
OUTCOME_RESOLVED_BY_QUERY / OUTCOME_RESOLVED_BY_WEBHOOKHow an unknown outcome was settled.
OUTCOME_UNRESOLVED_ESCALATEDThe query budget ran out; manual review.
PROVIDER_AMOUNT_MISMATCH / DUPLICATE_CHARGE_SUSPECTEDObservation conflicts.
PAID_THEN_FAILED_CONFLICTA payout reported paid, then failed.
PEHMEN_ENTITLEMENT_REVOKED / LIVE_DAILY_CAP_EXCEEDEDLive gate refusals.

Normalized decline codes (on attempts)​

Soft (one retry): INSUFFICIENT_FUNDS, ISSUER_UNAVAILABLE, PROCESSING_ERROR, TRY_AGAIN_LATER, VELOCITY_LIMIT. Hard (never retried): GENERIC_DECLINE, STOLEN_LOST_CARD, FRAUD_SUSPECTED, INVALID_CARD, EXPIRED_CARD, CURRENCY_UNSUPPORTED, AMOUNT_INVALID, DUPLICATE_TRANSACTION. Authentication: AUTHENTICATION_REQUIRED, AUTHENTICATION_FAILED. Technical: CONNECTION_FAILED_PRE_SEND, TIMEOUT, RATE_LIMITED, PROVIDER_5XX, CREDENTIAL_REVOKED, CONFIGURATION_ERROR. PayNow: QR_EXPIRED, PAYMENT_WINDOW_EXPIRED.

The provider's own code is always kept beside the normalized one.