SpendPreflightdocs
Reference / developer guide

Every decision reason

Use decision and flags for control flow; preserve the human-readable explanation.

Operator-maintained documentation
Live features and staging previews are distinguished. Index coverage is not yet available.

Preflight reason templates

Existing reasons are strings prefixed allow:, hold: or block:, not a universal enum. Values inside braces vary. The three endpoint_* identifiers and invalid_index_rule are prefixes followed by detail. This list covers the deployed gate; unknown future reasons must not be treated as allow.

DecisionReason template / prefixMeaning
blockno payment options found in inputNo usable options; correct the request.
holdcould not determine merchant domainSupply the merchant domain/resource URL.
blockdomain {domain} is on blocklistYour policy blocks this merchant.
holddomain {domain} not on allowlistStrict domain policy needs review.
blockmerchant name exactly matches an OFAC SDN entryVerify the possible identity match before proceeding.
holdmerchant name possibly matches an OFAC SDN entryAmbiguous names require a human to disambiguate.
holddomain registered {days} days ago (< {threshold})A new domain signal is not evidence of fraud.
holddomain has no DNS A recordNo A record observed. DNS errors remain unknown.
blockunsupported or malformed payment optionUnsupported scheme, oversized amount or malformed EVM destination.
blockinvalid payment amountNegative or nonfinite payment amount.
blocknetwork {network} not allowedNetwork differs from caller policy.
blockasset {asset} is not a known USDC contractWrong network/asset pair or another currency.
holdamount could not be priced in USDNo conversion assumption is made.
blockamount ${amount} exceeds max ${maximum}Single-payment budget exceeded.
holdamount ${amount} above hold threshold ${threshold}Human/policy approval required.
blockdaily cap ${cap} would be exceeded (spent ${spent})Daily budget exceeded using supplied/reserved spend.
blockpayTo {payTo} is on blocklistBlocked wallet.
holdpayTo {payTo} not on allowlistConfigured wallet allowlist requires review.
blockpayTo {payTo} is an OFAC SDN-listed addressPublic sanctions-list wallet match; verify before acting.
holdpayment option has no payToCannot identify the receiving wallet.
holdinvalid_index_ruleInvalid category-price configuration.
holdendpoint_price_above_category_medianquote exceeds the configured category median multiple.
holdendpoint_failed_last_3three usable failed unpaid checks; not paid-delivery testing.
holdendpoint_payto_changedpayee changed for this network/asset; investigate before paying.
allowall rules passedNo configured rule fired. This is not certification or a guarantee.

Payee check flags

Risk uses the strongest applicable signal. A name match is not proof the merchant is the listed entity. Address/name data is public OFAC screening, not certification.

FlagRisk contributionMeaning
sanctioned_addresshighExact wallet match in the public SDN index.
sanctioned_name_exacthighExact normalized name/alias match; identity still needs review.
sanctioned_name_possiblemediumFuzzy name match, not proof of identity.
invalid_domainmediumDomain could not be interpreted as a public merchant domain.
new_domainmediumKnown domain age below 30 days.
domain_age_unknownunknownNo usable registration date; unknown is not low risk.
domain_no_dnsmediumNo A record observed. MX is reported separately.

Request and payment errors

400/405/408/413 reject bad method/input/body before payment. Index lookup may return invalid_url, invalid_method, endpoint_not_listed (404), method_required (409) or index_unavailable (503). receipt_signing_unavailable and facilitator_unavailable are 503 before settlement. settlement_outcome_unknown means a transfer may already have happened: check the original authorization and chain, never automatically create a fresh payment.