{
  "$schema": "./registry.schema.json",
  "registry": "reason-codes",
  "title": "Reason codes",
  "version": "2026-11-draft5",
  "spec": "Draft 0.4 section 13",
  "entries": [
    {
      "value": "signature_invalid",
      "http": 401,
      "when": "The signature or key binding fails"
    },
    {
      "value": "operator_unknown",
      "http": 401,
      "when": "The operator's UCP profile cannot be resolved, or the operator is not onboarded"
    },
    {
      "value": "grant_invalid",
      "http": 401,
      "when": "The grant is unknown or not bound to the signing key"
    },
    {
      "value": "grant_revoked",
      "http": 403,
      "when": "The seller or operator revoked the grant"
    },
    {
      "value": "grant_expired",
      "http": 403,
      "when": "The grant is past exp"
    },
    {
      "value": "action_forbidden",
      "http": 403,
      "when": "The verb is forbid, not granted, or not the caller's to use"
    },
    {
      "value": "not_in_scope",
      "http": 403,
      "when": "The listing is not the seller's, has no terms, or is closed"
    },
    {
      "value": "below_floor",
      "http": 403,
      "when": "Under the seller's floor; the floor is never stated"
    },
    {
      "value": "counterparty_requirements_unmet",
      "http": 403,
      "when": "The buyer falls short of the listing's requirements"
    },
    {
      "value": "buyer_authority_exceeded",
      "http": 403,
      "when": "Outside the buyer's AP2 mandate"
    },
    {
      "value": "protected_payment_required",
      "http": 403,
      "when": "Protected payment is required"
    },
    {
      "value": "approval_invalid",
      "http": 403,
      "when": "An approval's signature, challenge, expiry or single use fails"
    },
    {
      "value": "approval_surface_not_allowed",
      "http": 403,
      "when": "Wrong approval level, or above the certified cap"
    },
    {
      "value": "approval_timeout",
      "http": 403,
      "when": "An ask expired with no answer"
    },
    {
      "value": "terms_invalid",
      "http": 422,
      "when": "Listing terms or Deal Terms break the term set or the listing's options, or supersedes names an offer outside the negotiation"
    },
    {
      "value": "custody_attestation_invalid",
      "http": 422,
      "when": "A custody attestation does not bind to this listing or item"
    },
    {
      "value": "offer_expired",
      "http": 409,
      "when": "The offer or counter passed expires_at"
    },
    {
      "value": "listing_reserved",
      "http": 409,
      "when": "Another accepted offer holds the listing (7.4)"
    },
    {
      "value": "offer_replayed",
      "http": 409,
      "when": "An accepted offer's nonce was already used"
    },
    {
      "value": "release_condition_unmet",
      "http": 409,
      "when": "Money requested before its condition holds (10.3)"
    },
    {
      "value": "seal_mismatch",
      "http": 409,
      "when": "Seal or item identifier differs from pickup"
    },
    {
      "value": "offer_budget_exhausted",
      "http": 429,
      "when": "Too many below-floor offers (8.5)"
    }
  ],
  "note": "Every refusal carries exactly one registered reason. The list is complete for Draft 0.4, in its order."
}
