Reference

Reason code reference

Last updated: 14 June 202639 codes across 5 namespaces · 36 active, 3 reserved

The short answer

Every verification returns a list of reason_codes, each in one of five namespaces: the three verification layers (transport, mandate, allowance), plus checkout attestation (produced inside the mandate layer) and policy (from the decision engine). A code is one of three kinds: a pass signal that supports allow, a fail signal that drives deny, or an uncertainty signal that yields review in standard mode. The decision is the combination of these across the required layers.

Reason codes are how a decision explains itself. Read them with the per-layer result in the response: a single fail code on a required layer is enough to deny, while an allow lists the pass codes for every check it cleared. The effect column below is the code's nature on its own; the final decision also depends on which layers your policy marks required and on the mode.

pass supports allow   fail drives deny   review uncertainty   info contextual only   reserved defined but not emitted in 0.1.0

Three codes below are reserved: they exist in the API's code vocabulary but the current version does not emit them yet, so do not branch on them. Where one is reserved, the note says which code fires in its place today.

transport

Web Bot Auth · RFC 9421

Answers "which agent is this?" by verifying an HTTP message signature against the agent's published key directory.

CodeMeaningEffect
signature_presentA signature was on the request. Contextual on its own.info
signature_missingNo signature found, so the agent could not be identified.fail
signature_validThe signature verified against the resolved key. Transport passed.pass
signature_invalidA signature was present but did not verify.fail
required_components_missingThe signature did not cover the minimum RFC 9421 components, so it does not bind the request.fail
key_directory_unreachableThe agent's key directory could not be fetched, so the signature is unproven.review
agent_untrustedValid signature, but the agent is not on the merchant's trusted_agents allow-list.fail

mandate

AP2 v0.2 · SD-JWT

Answers "is this agent allowed to spend, and on this exact cart?" by verifying the signed spending mandate and binding it to the real basket.

CodeMeaningEffect
absentReserved. When no mandate is supplied and the mandate layer is required, the gateway emits policy.required_layer_missing instead, which denies.reserved
parse_errorThe mandate could not be parsed as a valid SD-JWT.fail
signature_validThe mandate signature verified against its issuer key.pass
signature_invalidThe mandate signature did not verify.fail
exp_validThe mandate is within its validity window.pass
expiredThe mandate's expiry has passed.fail
vct_supportedThe credential type is one the gateway supports.pass
vct_unsupportedThe mandate declares an unrecognized credential type.fail
checkout_hash_matchThe mandate's checkout_hash matches the merchant-signed checkout terms.pass
checkout_hash_mismatchThe mandate authorizes a different checkout than the one in play.fail
cart_amount_matchThe signed checkout amount matches the server-built cart.pass
cart_amount_mismatchThe signed amount differs from the real cart (low-mandate, high-cart attack).fail
constraint_satisfiedThe cart satisfies every constraint the mandate carries.pass
constraint_amount_exceededThe cart total exceeds the mandate's authorized amount.fail
constraint_currency_mismatchThe cart currency differs from the mandate's currency.fail
constraint_scope_violationReserved for merchant or category scope constraints. The current version enforces amount and currency constraints, not scope.reserved
cnf_chain_validThe key-confirmation chain from the user's open mandate to the agent key is intact.pass
cnf_chain_brokenThe chain is broken, so the agent's authority cannot be traced to the user.fail
replay_detectedThis mandate jti was already used.fail

checkout

merchant attestation

Answers "did the merchant actually sign these checkout terms, or did the agent invent them?" Active only when a merchant checkout-signing key is provisioned, which is what standard mode turns on.

CodeMeaningEffect
signature_validThe checkout terms were signed by the merchant, not the agent.pass
signature_invalidThe checkout-terms signature does not verify against the merchant key.fail
signature_missingAttestation is enabled but no merchant-signed terms were presented.fail
merchant_mismatchThe terms were signed for a different merchant than the one verifying.fail

allowance

ACP · Shared Payment Token

Answers "does the Agentic Commerce Protocol session add up?" for merchants running in ACP mode.

CodeMeaningEffect
validThe allowance covers the cart and is unexpired.pass
expiredThe allowance expiry has passed.fail
amount_exceededThe cart exceeds the allowance max_amount.fail
currency_mismatchThe cart currency differs from the allowance currency.fail
session_mismatchReserved for binding the allowance to a specific checkout session id. The current version does not check the session id yet.reserved
token_absentNo Shared Payment Token was supplied for an ACP verification.fail
authentication_requiredThe session needs a 3DS or SCA step-up, so it cannot allow yet.review

policy

merchant policy

Signals that come from the merchant's own policy rather than a protocol layer.

CodeMeaningEffect
required_layer_missingA layer marked required produced no usable input.fail
clock_skew_exceededThe gap between the signature's created time and received_at is larger than the allowed skew.fail

How codes combine into a decision

The gateway evaluates each required layer, collects its checks, and resolves the layer to pass, fail, indeterminate, or skipped. The decision then follows three rules:

This is why two stores can send the same codes and get different decisions: the verdict is the codes read through the store's policy mode.

See codes on a real decision

Request a merchant key and read live reason codes on your own checkouts, or read the API reference for the full request and response shape.