{
  "openapi": "3.1.0",
  "info": {
    "title": "ExitProof API",
    "version": "0.1.0",
    "description": "Pre-payment safety, reversibility intelligence, durable Exit Manifests, and bounded exit packs for AI agents.",
    "x-guidance": "Use POST /v1/agent-purchase/check for a $0.01 pre-payment check of an autonomous HTTP purchase. The one-cent operation uses stablecoin machine-payment rails, never forwards payment credentials to the target, and rejects conflicts before charging. Use POST /v1/reversibility before a real-world commitment. If durable exit evidence is valuable, POST /v1/manifests is $0.25 after reversibility preflight. Later, POST /v1/exit-pack is $1.00 after manifest access and actionability preflight. Missing evidence remains unknown. ExitProof does not decide whether to buy, provide legal advice, make chargeback decisions, or execute cancellation."
  },
  "servers": [
    {
      "url": "https://exitproof.davisvillelabs.com"
    }
  ],
  "paths": {
    "/v1/agent-purchase/check": {
      "post": {
        "operationId": "check_agent_purchase",
        "summary": "Check an autonomous agent purchase before payment",
        "description": "Paid $0.01 after a non-paying specialist preflight observes or validates a parseable, non-conflicting HTTP 402 machine-payment challenge. ExitProof never forwards payment credentials to the target and never actively probes POST, PUT, PATCH, or DELETE. At this price the operation is exposed only through compatible stablecoin machine-payment methods.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/check_agent_purchase"
              }
            }
          }
        },
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.01"
          },
          "protocols": [
            {
              "mpp": {
                "method": "tempo",
                "intent": "charge",
                "currency": "0x20C000000000000000000000b9537d11c60E8b50"
              }
            },
            {
              "x402": {
                "version": 2,
                "scheme": "exact",
                "asset": "USDC",
                "network": "eip155:8453"
              }
            }
          ],
          "offers": [
            {
              "intent": "charge",
              "method": "tempo",
              "amount": "10000",
              "currency": "0x20C000000000000000000000b9537d11c60E8b50",
              "description": "ExitProof pre-payment agent purchase safety check"
            },
            {
              "protocol": "x402",
              "version": 2,
              "scheme": "exact",
              "amount": "10000",
              "asset": "USDC",
              "network": "eip155:8453",
              "description": "ExitProof pre-payment agent purchase safety check"
            }
          ]
        },
        "x-receipt-envelope": {
          "schemaVersion": "davisville-receipt-envelope.v1",
          "contract": "https://davisvillelabs.com/agents/receipt-envelope-v1.json",
          "schema": "https://davisvillelabs.com/agents/davisville-receipt-envelope.v1.schema.json",
          "deliveryContract": "https://davisvillelabs.com/agents/delivery-contract-v1.json"
        },
        "responses": {
          "200": {
            "description": "Point-in-time agent purchase safety result with additive Davisville Receipt Envelope v1",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/check_agent_purchaseResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "invalid_input",
                  "message": "Invalid input.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "402": {
            "description": "Machine-payment challenge only after the target-purchase preflight succeeds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "422": {
            "description": "Target purchase evidence is unsafe, inaccessible, conflicting, non-402, or insufficient for a paid check.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "purchase_preflight_rejected",
                  "message": "Target purchase evidence is unsafe, inaccessible, conflicting, non-402, or insufficient for a paid check.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "503": {
            "description": "No compatible configured payment method is available for this operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "no_supported_payment_method_for_operation",
                  "message": "No compatible configured payment method is available for this operation.",
                  "requestId": "req_example",
                  "retryable": true
                }
              }
            }
          }
        }
      }
    },
    "/v1/reversibility": {
      "post": {
        "operationId": "check_reversibility",
        "summary": "Check reversibility",
        "description": "Free deterministic preflight. Caller-supplied transaction terms are recorded as caller-supplied, not independently verified.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/check_reversibility"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Reversibility assessment",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReversibilityAssessment"
                }
              }
            }
          },
          "400": {
            "description": "Invalid or ambiguous input.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "invalid_input",
                  "message": "Invalid or ambiguous input.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          }
        }
      }
    },
    "/v1/manifests": {
      "post": {
        "operationId": "create_exit_manifest",
        "summary": "Create Exit Manifest",
        "description": "Paid $0.25 only after current, non-conflicting evidence passes manifest preflight. Retry an identical settled-delivery failure with the identical payment credential; the settlement binding recovers the same durable result without another charge.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/create_exit_manifest"
              }
            }
          }
        },
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.25"
          },
          "protocols": [
            {
              "mpp": {
                "method": "tempo",
                "intent": "charge",
                "currency": "0x20C000000000000000000000b9537d11c60E8b50"
              }
            },
            {
              "x402": {
                "version": 2,
                "scheme": "exact",
                "asset": "USDC",
                "network": "eip155:8453"
              }
            }
          ],
          "offers": [
            {
              "intent": "charge",
              "method": "tempo",
              "amount": "250000",
              "currency": "0x20C000000000000000000000b9537d11c60E8b50",
              "description": "ExitProof durable Exit Manifest"
            },
            {
              "protocol": "x402",
              "version": 2,
              "scheme": "exact",
              "amount": "250000",
              "asset": "USDC",
              "network": "eip155:8453",
              "description": "ExitProof durable Exit Manifest"
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Exit Manifest plus access token. Store both manifestId and accessToken securely.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ManifestCreateResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "invalid_input",
                  "message": "Invalid input.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "402": {
            "description": "Machine-payment challenge after preflight. MPP uses WWW-Authenticate; x402 v2 HTTP uses PAYMENT-REQUIRED.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "422": {
            "description": "Evidence did not pass paid manifest preflight.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "manifest_preflight_rejected",
                  "message": "Evidence did not pass paid manifest preflight.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "502": {
            "description": "Payment settled but durable delivery failed. Retry the identical request with the identical payment credential.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "settled_delivery_failed",
                  "message": "Payment settled but durable delivery failed. Retry the identical request with the identical payment credential.",
                  "requestId": "req_example",
                  "retryable": true
                }
              }
            }
          },
          "503": {
            "description": "Paid operation or durable persistence is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "machine_payment_not_configured",
                  "message": "Paid operation or durable persistence is unavailable.",
                  "requestId": "req_example",
                  "retryable": true
                }
              }
            }
          }
        }
      }
    },
    "/v1/manifests/get": {
      "post": {
        "operationId": "get_exit_manifest",
        "summary": "Get Exit Manifest",
        "description": "Free authenticated manifest retrieval. Requires the exact manifest_id and access_token returned at creation or recovered from an identical settled retry.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/get_exit_manifest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Stored Exit Manifest",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ManifestReadResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid access input.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "invalid_input",
                  "message": "Invalid access input.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "403": {
            "description": "Manifest access denied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "manifest_access_denied",
                  "message": "Manifest access denied.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "404": {
            "description": "Manifest not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "manifest_not_found",
                  "message": "Manifest not found.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "410": {
            "description": "Manifest expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "manifest_expired",
                  "message": "Manifest expired.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          }
        }
      }
    },
    "/v1/exit-pack": {
      "post": {
        "operationId": "build_exit_pack",
        "summary": "Build exit pack",
        "description": "Paid $1.00 after manifest access and the same actionability gate advertised by the stored assessment. Historical deadlines remain historical and are not represented as current rights.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/build_exit_pack"
              }
            }
          }
        },
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "1.00"
          },
          "protocols": [
            {
              "mpp": {
                "method": "tempo",
                "intent": "charge",
                "currency": "0x20C000000000000000000000b9537d11c60E8b50"
              }
            },
            {
              "x402": {
                "version": 2,
                "scheme": "exact",
                "asset": "USDC",
                "network": "eip155:8453"
              }
            },
            {
              "mpp": {
                "method": "stripe",
                "intent": "charge",
                "currency": "usd"
              }
            }
          ],
          "offers": [
            {
              "intent": "charge",
              "method": "tempo",
              "amount": "1000000",
              "currency": "0x20C000000000000000000000b9537d11c60E8b50",
              "description": "ExitProof bounded exit action pack"
            },
            {
              "protocol": "x402",
              "version": 2,
              "scheme": "exact",
              "amount": "1000000",
              "asset": "USDC",
              "network": "eip155:8453",
              "description": "ExitProof bounded exit action pack"
            },
            {
              "intent": "charge",
              "method": "stripe",
              "amount": "100",
              "currency": "usd",
              "description": "ExitProof bounded exit action pack"
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Transaction-specific exit action pack",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExitPackResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid access input.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "invalid_input",
                  "message": "Invalid access input.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "402": {
            "description": "Machine-payment challenge after preflight. MPP uses WWW-Authenticate; x402 v2 HTTP uses PAYMENT-REQUIRED.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "Manifest access denied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "manifest_access_denied",
                  "message": "Manifest access denied.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "404": {
            "description": "Manifest not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "manifest_not_found",
                  "message": "Manifest not found.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "410": {
            "description": "Manifest expired.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "manifest_expired",
                  "message": "Manifest expired.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "422": {
            "description": "Stored manifest is not actionable enough for a paid exit pack.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "exit_pack_preflight_rejected",
                  "message": "Stored manifest is not actionable enough for a paid exit pack.",
                  "requestId": "req_example",
                  "retryable": false
                }
              }
            }
          },
          "503": {
            "description": "Paid operation or durable persistence is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "schemaVersion": "error.v1",
                  "error": "machine_payment_not_configured",
                  "message": "Paid operation or durable persistence is unavailable.",
                  "requestId": "req_example",
                  "retryable": true
                }
              }
            }
          }
        }
      }
    },
    "/v1/supported-policies": {
      "get": {
        "operationId": "list_supported_policies",
        "summary": "List maintained policy overlays",
        "responses": {
          "200": {
            "description": "Maintained merchant policy snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/mcp": {
      "post": {
        "operationId": "exitproofMcp",
        "summary": "MCP endpoint",
        "description": "Streamable HTTP MCP endpoint supporting 2026-07-28, 2025-11-25, and Muse-compatible 2025-06-18.",
        "responses": {
          "200": {
            "description": "MCP JSON-RPC response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "check_reversibility": {
        "type": "object",
        "description": "One contemplated or existing commitment to evaluate. merchant, commitment_type, and amount are required. Transaction-specific checkout_terms are the strongest input when available; maintained policy evidence can add context but never overrides conflicting transaction-specific terms.",
        "required": [
          "merchant",
          "commitment_type",
          "amount"
        ],
        "properties": {
          "merchant": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "description": "Merchant, platform, provider, or counterparty name exactly enough to identify the commitment. Used to match maintained policy overlays; do not include account numbers, credentials, or secrets."
          },
          "commitment_type": {
            "type": "string",
            "enum": [
              "subscription",
              "reservation",
              "ticket",
              "service",
              "software",
              "digital_purchase",
              "rental",
              "deposit",
              "other"
            ],
            "description": "Closest category for the commitment being evaluated. This affects policy matching and should describe what the user is committing to, not the payment method."
          },
          "event_type": {
            "type": "string",
            "enum": [
              "initial",
              "renewal",
              "purchase",
              "reservation",
              "deposit",
              "other"
            ],
            "default": "initial",
            "description": "Lifecycle event for this commitment. Use renewal for a recurring renewal, reservation for a booking event, deposit for a deposit event, or leave omitted for an initial commitment."
          },
          "amount": {
            "type": "number",
            "minimum": 0,
            "description": "Commitment amount in major currency units, for example 125.50 for USD 125.50. Must be non-negative and uses currency below for all monetary interpretation."
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Za-z]{3}$",
            "minLength": 3,
            "maxLength": 3,
            "default": "USD",
            "description": "Three-letter ISO 4217 currency code for amount and all monetary checkout terms. Defaults to USD."
          },
          "country": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2,
            "pattern": "^[A-Za-z]{2}$",
            "description": "Optional two-letter ISO 3166-1 alpha-2 country code, such as US. Used to scope maintained policy rules when geography matters."
          },
          "region": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional state, province, or region label when the commitment or merchant terms are region-specific."
          },
          "purchase_channel": {
            "type": "string",
            "enum": [
              "direct",
              "apple",
              "google_play",
              "marketplace",
              "travel_agency",
              "other",
              "unknown"
            ],
            "default": "unknown",
            "description": "Where the commitment is being made or billed. Use apple or google_play when that billing platform controls cancellation/refund rules; use direct for the merchant itself."
          },
          "expected_commitment_at": {
            "type": "string",
            "format": "date-time",
            "description": "RFC 3339 timestamp with explicit timezone for when the commitment is expected to occur. ExitProof evaluates time windows at the later of now and this timestamp."
          },
          "client_reference": {
            "type": "string",
            "maxLength": 200,
            "description": "Optional caller-owned correlation reference. ExitProof stores only a SHA-256 hash; do not place secrets or sensitive personal data here."
          },
          "checkout_terms": {
            "type": "object",
            "description": "Transaction-specific cancellation, refund, renewal, charge, and loss terms observed for this exact commitment. Supply these whenever available; they control the transaction-specific assessment while maintained policy evidence remains contextual.",
            "properties": {
              "refundable": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the committed amount is refundable."
              },
              "cancellable": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the commitment can be canceled."
              },
              "free_cancellation_until": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 deadline with explicit timezone through which the supplied terms state cancellation is free."
              },
              "cancellation_deadline": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 timestamp with explicit timezone for the stated cancellation deadline, even when cancellation may involve a loss."
              },
              "cancellation_penalty_amount": {
                "type": "number",
                "minimum": 0,
                "description": "Stated cancellation penalty in major units of currency. Mutually exclusive with cancellation_penalty_percent."
              },
              "cancellation_penalty_percent": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "description": "Stated cancellation penalty as a percentage from 0 to 100. Mutually exclusive with cancellation_penalty_amount."
              },
              "nonrefundable_amount": {
                "type": "number",
                "minimum": 0,
                "description": "Amount explicitly stated as nonrefundable, in major units of currency."
              },
              "auto_renews": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the commitment renews automatically."
              },
              "renewal_interval": {
                "type": "string",
                "maxLength": 80,
                "description": "Human-readable renewal interval from the supplied terms, such as monthly or annually. Use only when auto-renewal terms are stated."
              },
              "cancellation_method": {
                "type": "string",
                "maxLength": 240,
                "description": "Recorded method or path for cancellation/refund, such as an account page, support channel, or merchant instruction. This can make a later exit pack actionable."
              },
              "charge_timing": {
                "type": "string",
                "maxLength": 160,
                "description": "When the merchant states the charge will occur, such as immediately, at check-in, or 24 hours before renewal."
              },
              "source_url": {
                "type": "string",
                "maxLength": 500,
                "description": "HTTP(S) source URL for the supplied transaction terms. ExitProof removes credentials, query parameters, and fragments before storing the URL."
              },
              "observed_at": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 timestamp with explicit timezone for when the caller observed these checkout terms."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "check_agent_purchase": {
        "type": "object",
        "description": "Pre-payment safety check for one autonomous HTTP purchase. ExitProof either performs a credential-free GET/HEAD probe or analyzes a 402 challenge already observed by the caller. It never forwards payment credentials or sends state-changing probe requests.",
        "required": [
          "target_url"
        ],
        "properties": {
          "target_url": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTPS endpoint the agent is considering paying. Credentials, localhost, private-address literals, and non-HTTPS URLs are rejected."
          },
          "request_method": {
            "type": "string",
            "enum": [
              "GET",
              "HEAD",
              "POST",
              "PUT",
              "PATCH",
              "DELETE"
            ],
            "default": "GET",
            "description": "HTTP method of the contemplated purchase. Live probing is allowed only for GET or HEAD. For state-changing methods supply observed_response instead."
          },
          "operation": {
            "type": "string",
            "maxLength": 160,
            "description": "Optional caller label for the target operation. This is descriptive only and is included in the check digest."
          },
          "live_probe": {
            "type": "boolean",
            "description": "Whether ExitProof may make one anonymous, credential-free request to target_url. Defaults true for GET/HEAD and false for state-changing methods."
          },
          "advertised": {
            "type": "object",
            "description": "Optional payment facts advertised by discovery metadata. ExitProof compares these to the observed 402 challenge and rejects material conflicts before its own payment challenge.",
            "properties": {
              "protocol": {
                "type": "string",
                "enum": [
                  "x402",
                  "mpp"
                ],
                "description": "Advertised machine-payment protocol."
              },
              "price_cents": {
                "type": "integer",
                "minimum": 1,
                "description": "Advertised price in whole USD cents."
              },
              "currency": {
                "type": "string",
                "description": "Advertised currency or asset code."
              },
              "network": {
                "type": "string",
                "maxLength": 120,
                "description": "Advertised payment network, for example eip155:8453."
              },
              "asset": {
                "type": "string",
                "maxLength": 120,
                "description": "Advertised asset symbol or address."
              },
              "pay_to": {
                "type": "string",
                "maxLength": 200,
                "description": "Advertised payment destination."
              }
            },
            "additionalProperties": false
          },
          "observed_response": {
            "type": "object",
            "description": "A 402 response already observed by the calling agent. Required when live_probe is false. Supply payment challenge headers only, never a payment credential.",
            "required": [
              "http_status"
            ],
            "properties": {
              "http_status": {
                "type": "integer",
                "const": 402,
                "description": "HTTP 402 status from the target."
              },
              "payment_required": {
                "type": "string",
                "maxLength": 32768,
                "description": "PAYMENT-REQUIRED response header for x402 v2, when present."
              },
              "www_authenticate": {
                "type": "string",
                "maxLength": 32768,
                "description": "WWW-Authenticate response header containing an MPP Payment challenge, when present."
              },
              "observed_at": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 timestamp with explicit timezone for when the caller observed this response."
              }
            },
            "additionalProperties": false
          },
          "retry_contract": {
            "type": "object",
            "description": "Optional retry, settled-delivery recovery, and refund/reversal facts advertised by the target. These remain caller-supplied unless independently verified elsewhere.",
            "properties": {
              "idempotent_retry": {
                "type": "boolean",
                "description": "Whether the target advertises safe idempotent retry semantics."
              },
              "settled_delivery_recovery": {
                "type": "boolean",
                "description": "Whether the target advertises recovery after settlement if delivery fails without requiring a second payment."
              },
              "refund_or_reversal_url": {
                "type": "string",
                "format": "uri",
                "description": "Public HTTPS refund, reversal, or recovery documentation URL, when published."
              },
              "source_url": {
                "type": "string",
                "format": "uri",
                "description": "Public HTTPS source supporting the retry/recovery claims."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "create_exit_manifest": {
        "type": "object",
        "description": "One contemplated or existing commitment to evaluate. merchant, commitment_type, and amount are required. Transaction-specific checkout_terms are the strongest input when available; maintained policy evidence can add context but never overrides conflicting transaction-specific terms.",
        "required": [
          "merchant",
          "commitment_type",
          "amount"
        ],
        "properties": {
          "merchant": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "description": "Merchant, platform, provider, or counterparty name exactly enough to identify the commitment. Used to match maintained policy overlays; do not include account numbers, credentials, or secrets."
          },
          "commitment_type": {
            "type": "string",
            "enum": [
              "subscription",
              "reservation",
              "ticket",
              "service",
              "software",
              "digital_purchase",
              "rental",
              "deposit",
              "other"
            ],
            "description": "Closest category for the commitment being evaluated. This affects policy matching and should describe what the user is committing to, not the payment method."
          },
          "event_type": {
            "type": "string",
            "enum": [
              "initial",
              "renewal",
              "purchase",
              "reservation",
              "deposit",
              "other"
            ],
            "default": "initial",
            "description": "Lifecycle event for this commitment. Use renewal for a recurring renewal, reservation for a booking event, deposit for a deposit event, or leave omitted for an initial commitment."
          },
          "amount": {
            "type": "number",
            "minimum": 0,
            "description": "Commitment amount in major currency units, for example 125.50 for USD 125.50. Must be non-negative and uses currency below for all monetary interpretation."
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Za-z]{3}$",
            "minLength": 3,
            "maxLength": 3,
            "default": "USD",
            "description": "Three-letter ISO 4217 currency code for amount and all monetary checkout terms. Defaults to USD."
          },
          "country": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2,
            "pattern": "^[A-Za-z]{2}$",
            "description": "Optional two-letter ISO 3166-1 alpha-2 country code, such as US. Used to scope maintained policy rules when geography matters."
          },
          "region": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional state, province, or region label when the commitment or merchant terms are region-specific."
          },
          "purchase_channel": {
            "type": "string",
            "enum": [
              "direct",
              "apple",
              "google_play",
              "marketplace",
              "travel_agency",
              "other",
              "unknown"
            ],
            "default": "unknown",
            "description": "Where the commitment is being made or billed. Use apple or google_play when that billing platform controls cancellation/refund rules; use direct for the merchant itself."
          },
          "expected_commitment_at": {
            "type": "string",
            "format": "date-time",
            "description": "RFC 3339 timestamp with explicit timezone for when the commitment is expected to occur. ExitProof evaluates time windows at the later of now and this timestamp."
          },
          "client_reference": {
            "type": "string",
            "maxLength": 200,
            "description": "Optional caller-owned correlation reference. ExitProof stores only a SHA-256 hash; do not place secrets or sensitive personal data here."
          },
          "checkout_terms": {
            "type": "object",
            "description": "Transaction-specific cancellation, refund, renewal, charge, and loss terms observed for this exact commitment. Supply these whenever available; they control the transaction-specific assessment while maintained policy evidence remains contextual.",
            "properties": {
              "refundable": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the committed amount is refundable."
              },
              "cancellable": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the commitment can be canceled."
              },
              "free_cancellation_until": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 deadline with explicit timezone through which the supplied terms state cancellation is free."
              },
              "cancellation_deadline": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 timestamp with explicit timezone for the stated cancellation deadline, even when cancellation may involve a loss."
              },
              "cancellation_penalty_amount": {
                "type": "number",
                "minimum": 0,
                "description": "Stated cancellation penalty in major units of currency. Mutually exclusive with cancellation_penalty_percent."
              },
              "cancellation_penalty_percent": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "description": "Stated cancellation penalty as a percentage from 0 to 100. Mutually exclusive with cancellation_penalty_amount."
              },
              "nonrefundable_amount": {
                "type": "number",
                "minimum": 0,
                "description": "Amount explicitly stated as nonrefundable, in major units of currency."
              },
              "auto_renews": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the commitment renews automatically."
              },
              "renewal_interval": {
                "type": "string",
                "maxLength": 80,
                "description": "Human-readable renewal interval from the supplied terms, such as monthly or annually. Use only when auto-renewal terms are stated."
              },
              "cancellation_method": {
                "type": "string",
                "maxLength": 240,
                "description": "Recorded method or path for cancellation/refund, such as an account page, support channel, or merchant instruction. This can make a later exit pack actionable."
              },
              "charge_timing": {
                "type": "string",
                "maxLength": 160,
                "description": "When the merchant states the charge will occur, such as immediately, at check-in, or 24 hours before renewal."
              },
              "source_url": {
                "type": "string",
                "maxLength": 500,
                "description": "HTTP(S) source URL for the supplied transaction terms. ExitProof removes credentials, query parameters, and fragments before storing the URL."
              },
              "observed_at": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 timestamp with explicit timezone for when the caller observed these checkout terms."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "get_exit_manifest": {
        "type": "object",
        "description": "Credentials for one previously created Exit Manifest. Both values are required together and are returned by create_exit_manifest or settlement recovery.",
        "required": [
          "manifest_id",
          "access_token"
        ],
        "properties": {
          "manifest_id": {
            "type": "string",
            "pattern": "^xm_[a-f0-9]{32}$",
            "description": "Unguessable Exit Manifest identifier returned by create_exit_manifest. It starts with xm_ followed by 32 lowercase hexadecimal characters."
          },
          "access_token": {
            "type": "string",
            "pattern": "^xp_[A-Za-z0-9_-]{20,}$",
            "description": "Secret bearer token returned by create_exit_manifest or deterministic settlement recovery. Required with manifest_id; treat it like a credential and do not log or expose it."
          }
        },
        "additionalProperties": false
      },
      "build_exit_pack": {
        "type": "object",
        "description": "Credentials for one previously created Exit Manifest. Both values are required together and are returned by create_exit_manifest or settlement recovery.",
        "required": [
          "manifest_id",
          "access_token"
        ],
        "properties": {
          "manifest_id": {
            "type": "string",
            "pattern": "^xm_[a-f0-9]{32}$",
            "description": "Unguessable Exit Manifest identifier returned by create_exit_manifest. It starts with xm_ followed by 32 lowercase hexadecimal characters."
          },
          "access_token": {
            "type": "string",
            "pattern": "^xp_[A-Za-z0-9_-]{20,}$",
            "description": "Secret bearer token returned by create_exit_manifest or deterministic settlement recovery. Required with manifest_id; treat it like a credential and do not log or expose it."
          }
        },
        "additionalProperties": false
      },
      "list_supported_policies": {
        "type": "object",
        "description": "No parameters. This tool lists the current maintained policy-overlay catalog.",
        "properties": {},
        "additionalProperties": false
      },
      "check_reversibilityResponse": {
        "type": "object",
        "description": "Bounded reversibility assessment with evidence, loss/deadline information, limitations, and paid-operation eligibility flags.",
        "required": [
          "schemaVersion",
          "assessment",
          "merchant",
          "commitmentType",
          "amountMinor",
          "currency",
          "evaluatedAt",
          "reason",
          "evidence",
          "limitations",
          "paidExitManifestAvailable",
          "paidExitPackAvailable",
          "caseDigest"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-reversibility.v1",
            "description": "ExitProof reversibility result schema version."
          },
          "assessment": {
            "type": "string",
            "enum": [
              "fully_reversible",
              "conditionally_reversible",
              "low_reversibility",
              "effectively_irreversible",
              "unknown"
            ],
            "description": "Evidence-bounded reversibility classification. unknown means current evidence is insufficient or conflicting."
          },
          "evidenceBasis": {
            "type": "string",
            "description": "Whether the assessment is based on checkout terms, maintained policy, both, or insufficient evidence."
          },
          "evidenceState": {
            "type": "string",
            "description": "Current evidence state, such as established, incomplete, conflicting, expired, or missing."
          },
          "merchant": {
            "type": "string",
            "description": "Normalized merchant or platform name."
          },
          "commitmentType": {
            "type": "string",
            "description": "Normalized commitment type."
          },
          "amountMinor": {
            "type": "integer",
            "minimum": 0,
            "description": "Commitment amount in minor currency units."
          },
          "currency": {
            "type": "string",
            "description": "Normalized three-letter currency code."
          },
          "evaluatedAt": {
            "type": "string",
            "description": "Timestamp at which the commitment was evaluated."
          },
          "reversibleUntil": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Recorded exit deadline when established, otherwise null."
          },
          "maximumStatedLossMinor": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum stated loss in minor currency units when safely established, otherwise null."
          },
          "currentExitEstablished": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether current evidence establishes an exit route."
          },
          "reason": {
            "type": "string",
            "description": "Concise evidence-grounded explanation of the assessment."
          },
          "evidenceConflict": {
            "type": "boolean",
            "description": "True when evidence conflicts and cannot safely support a confident paid result."
          },
          "evidence": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "One evidence item used by ExitProof.",
              "properties": {
                "type": {
                  "type": "string",
                  "description": "Evidence type, such as checkout_terms or official_policy."
                },
                "authority": {
                  "type": "string",
                  "description": "Authority label for the source."
                },
                "evidenceOrigin": {
                  "type": "string",
                  "description": "Origin classification, such as caller_supplied or maintained_policy."
                },
                "independentlyVerified": {
                  "type": "boolean",
                  "description": "Whether ExitProof independently verified this evidence item."
                },
                "sourceUrl": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Source URL when one is available."
                },
                "observedAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "When the evidence was observed, when available."
                }
              },
              "additionalProperties": true
            },
            "description": "Evidence items supporting or limiting the assessment."
          },
          "limitations": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Important limits on what the assessment proves."
          },
          "decisionSupport": {
            "type": "object",
            "description": "Decision-support summary that does not decide whether the user should make the commitment.",
            "additionalProperties": true
          },
          "paidExitManifestAvailable": {
            "type": "boolean",
            "description": "Whether current evidence passes the preflight required before create_exit_manifest can be challenged for payment."
          },
          "paidExitPackAvailable": {
            "type": "boolean",
            "description": "Whether the current evidence appears actionable enough for a later exit pack after a manifest exists."
          },
          "exitPackEligibility": {
            "type": "object",
            "description": "Reasoned actionability status for a future exit pack.",
            "additionalProperties": true
          },
          "caseDigest": {
            "type": "string",
            "description": "Stable digest of the normalized commitment inputs used for this assessment."
          }
        },
        "additionalProperties": true
      },
      "check_agent_purchaseResponse": {
        "type": "object",
        "description": "Point-in-time pre-payment safety result. eligible_to_attempt means the observed payment requirements are internally consistent and a positive retry/recovery signal was supplied; review_required means no contradiction was found but one or more safety facts remain unknown.",
        "required": [
          "schemaVersion",
          "checkedAt",
          "assessment",
          "target",
          "observedPayment",
          "availablePaymentOffers",
          "checks",
          "reversibility",
          "evidence",
          "limitations",
          "nextStep",
          "checkDigest",
          "receiptEnvelope"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-agent-purchase-check.v1",
            "description": "Agent purchase check schema version."
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time the check result was produced."
          },
          "assessment": {
            "type": "string",
            "enum": [
              "eligible_to_attempt",
              "review_required"
            ],
            "description": "Bounded pre-payment status. This is not a recommendation to buy."
          },
          "target": {
            "type": "object",
            "description": "Normalized target endpoint and contemplated method.",
            "additionalProperties": true
          },
          "observedPayment": {
            "type": "object",
            "description": "Selected machine-payment offer normalized from the observed 402 challenge.",
            "additionalProperties": true
          },
          "availablePaymentOffers": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "All parseable x402 or MPP offers found in the observed response."
          },
          "advertised": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": true
              },
              {
                "type": "null"
              }
            ],
            "description": "Normalized caller-supplied advertised terms used for consistency checks."
          },
          "checks": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "status",
                "detail"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "status": {
                  "enum": [
                    "pass",
                    "unknown"
                  ]
                },
                "detail": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            },
            "description": "Individual safety checks. Conflicts reject before payment and therefore never appear as a paid result."
          },
          "reversibility": {
            "type": "object",
            "description": "Published retry, settled-delivery recovery, and reversal metadata supplied for this target.",
            "additionalProperties": true
          },
          "evidence": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Evidence provenance, including whether the 402 challenge was independently observed by ExitProof."
          },
          "limitations": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Boundaries on what the paid result establishes."
          },
          "nextStep": {
            "type": "object",
            "description": "Machine-readable status and bounded instruction for the calling agent.",
            "additionalProperties": true
          },
          "checkDigest": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "SHA-256 digest of the normalized target, payment facts, recovery facts, and evidence provenance."
          },
          "receiptEnvelope": {
            "$ref": "https://davisvillelabs.com/agents/davisville-receipt-envelope.v1.schema.json",
            "description": "Additive Davisville Receipt Envelope v1. The native ExitProof purchase-check result remains authoritative."
          }
        },
        "additionalProperties": true
      },
      "create_exit_manifestResponse": {
        "type": "object",
        "description": "Durable privacy-minimized Exit Manifest plus the bearer access token returned to the caller.",
        "required": [
          "manifestId",
          "createdAt",
          "expiresAt",
          "assessment",
          "accessToken",
          "accessTokenReturnedOnce",
          "privacyNote"
        ],
        "properties": {
          "manifestId": {
            "type": "string",
            "description": "Unguessable identifier for the stored Exit Manifest."
          },
          "createdAt": {
            "type": "string",
            "description": "Manifest creation timestamp."
          },
          "expiresAt": {
            "type": "string",
            "description": "Manifest expiration timestamp."
          },
          "assessment": {
            "type": "string",
            "description": "Reversibility assessment preserved in the manifest."
          },
          "paidExitPackAvailable": {
            "type": "boolean",
            "description": "Whether the stored manifest is eligible for an exit-pack preflight at creation time."
          },
          "accessToken": {
            "type": "string",
            "description": "Secret bearer token required with manifestId for later retrieval or exit-pack creation. ExitProof does not store this token in plaintext."
          },
          "accessTokenReturnedOnce": {
            "type": "boolean",
            "description": "Whether this response is the first normal return of the access token."
          },
          "accessTokenReissuedForSettlementRecovery": {
            "type": "boolean",
            "description": "True only when deterministic settlement recovery re-derived the access token after a settled delivery failure."
          },
          "privacyNote": {
            "type": "string",
            "description": "How ExitProof protects and may recover the access token."
          }
        },
        "additionalProperties": true
      },
      "get_exit_manifestResponse": {
        "type": "object",
        "description": "Authenticated read of one previously stored Exit Manifest.",
        "required": [
          "schemaVersion",
          "manifest"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-manifest-read.v1",
            "description": "Manifest-read response schema version."
          },
          "manifest": {
            "type": "object",
            "description": "Stored Exit Manifest. This read does not refresh or reinterpret the original evidence.",
            "additionalProperties": true
          }
        },
        "additionalProperties": false
      },
      "build_exit_packResponse": {
        "type": "object",
        "description": "Bounded action pack derived from an actionable Exit Manifest.",
        "required": [
          "schemaVersion",
          "manifestId",
          "generatedAt",
          "assessment",
          "actionability",
          "exitRoute",
          "prerequisites",
          "deadlineStatus",
          "steps",
          "suggestedRequest",
          "evidenceChecklist",
          "sources",
          "limitations"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-exit-pack.v1",
            "description": "Exit-pack response schema version."
          },
          "manifestId": {
            "type": "string",
            "description": "Manifest used to build this action pack."
          },
          "generatedAt": {
            "type": "string",
            "description": "Timestamp when the action pack was generated."
          },
          "assessment": {
            "type": "string",
            "description": "Reversibility assessment preserved by the manifest."
          },
          "actionability": {
            "type": "object",
            "description": "Why the stored manifest is actionable and which exit route is established.",
            "additionalProperties": true
          },
          "exitRoute": {
            "type": "object",
            "description": "Recorded cancellation/refund route or cited-source route to follow.",
            "additionalProperties": true
          },
          "prerequisites": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Checks to complete before acting on the exit plan."
          },
          "deadlineStatus": {
            "type": "string",
            "enum": [
              "open",
              "passed",
              "not_established"
            ],
            "description": "Current status of the recorded exit deadline at generation time."
          },
          "reversibleUntil": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Recorded exit deadline when established."
          },
          "maximumStatedLossMinor": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum stated loss in minor currency units when established."
          },
          "unresolvedLossExposure": {
            "type": "boolean",
            "description": "True when the recorded evidence does not establish a complete maximum loss."
          },
          "currency": {
            "type": "string",
            "description": "Currency associated with recorded monetary values."
          },
          "steps": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ordered bounded next steps for pursuing cancellation or refund."
          },
          "suggestedRequest": {
            "type": "string",
            "description": "Suggested message the user or agent can adapt when requesting cancellation/refund."
          },
          "evidenceChecklist": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Evidence to retain while pursuing the exit."
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Recorded source references supporting the action pack."
          },
          "limitations": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Boundaries and caveats; ExitProof does not execute the exit or guarantee success."
          }
        },
        "additionalProperties": true
      },
      "list_supported_policiesResponse": {
        "type": "object",
        "description": "Maintained merchant-policy overlay catalog. This is coverage metadata, not a statement that unlisted merchants cannot be evaluated.",
        "required": [
          "schemaVersion",
          "policySnapshot",
          "important",
          "merchants"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-supported-policies.v1",
            "description": "Supported-policy response schema version."
          },
          "policySnapshot": {
            "type": "object",
            "description": "Version and verification date for the maintained policy snapshot.",
            "additionalProperties": true
          },
          "important": {
            "type": "string",
            "description": "Coverage caveat explaining that transaction-specific checkout terms can be used for any merchant."
          },
          "merchants": {
            "type": "array",
            "description": "Merchants with maintained policy overlays.",
            "items": {
              "type": "object",
              "required": [
                "id",
                "displayName",
                "aliases",
                "ruleIds"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable maintained-policy merchant identifier."
                },
                "displayName": {
                  "type": "string",
                  "description": "Human-readable merchant name."
                },
                "aliases": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Names that map to this merchant policy overlay."
                },
                "ruleIds": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Maintained rule identifiers available for this merchant."
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false
      },
      "ErrorResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "error",
          "message",
          "requestId",
          "retryable"
        ],
        "properties": {
          "schemaVersion": {
            "const": "error.v1"
          },
          "error": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "requestId": {
            "type": "string"
          },
          "retryable": {
            "type": "boolean"
          }
        },
        "additionalProperties": true
      },
      "EvidenceItem": {
        "type": "object",
        "required": [
          "type",
          "authority",
          "evidenceOrigin",
          "independentlyVerified"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "authority": {
            "type": "string"
          },
          "evidenceOrigin": {
            "enum": [
              "caller_supplied",
              "maintained_policy"
            ]
          },
          "independentlyVerified": {
            "type": "boolean"
          },
          "sourceUrl": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "observedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "effectiveAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "ruleId": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": true
      },
      "ReversibilityAssessment": {
        "type": "object",
        "required": [
          "schemaVersion",
          "assessment",
          "maximumStatedLossMinor",
          "humanReviewRecommended",
          "paidExitManifestAvailable",
          "paidExitPackAvailable",
          "evidence"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-assessment.v1"
          },
          "assessment": {
            "enum": [
              "fully_reversible",
              "conditionally_reversible",
              "low_reversibility",
              "effectively_irreversible",
              "unknown"
            ]
          },
          "maximumStatedLossMinor": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0
          },
          "humanReviewRecommended": {
            "type": "boolean"
          },
          "evidenceConflict": {
            "type": "boolean"
          },
          "evidenceState": {
            "type": "string"
          },
          "paidExitManifestAvailable": {
            "type": "boolean"
          },
          "paidExitPackAvailable": {
            "type": "boolean"
          },
          "reversibleUntil": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "evidence": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EvidenceItem"
            }
          }
        },
        "additionalProperties": true
      },
      "ManifestCreateResponse": {
        "type": "object",
        "required": [
          "manifestId",
          "accessToken",
          "createdAt",
          "expiresAt",
          "assessment"
        ],
        "properties": {
          "manifestId": {
            "type": "string",
            "pattern": "^xm_[a-f0-9]{32}$"
          },
          "accessToken": {
            "type": "string",
            "pattern": "^xp_[A-Za-z0-9_-]{20,}$"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          },
          "assessment": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "ManifestReadResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "manifest"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-manifest-read.v1"
          },
          "manifest": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": false
      },
      "ExitPackResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "manifestId",
          "generatedAt",
          "deadlineStatus",
          "steps",
          "limitations"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-exit-pack.v1"
          },
          "manifestId": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "deadlineStatus": {
            "enum": [
              "passed",
              "open",
              "not_established"
            ]
          },
          "maximumStatedLossMinor": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0
          },
          "unresolvedLossExposure": {
            "type": "boolean"
          },
          "steps": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "limitations": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": true
      },
      "PaymentRequired": {
        "type": "object",
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "payment"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "const": 402
          },
          "detail": {
            "type": "string"
          },
          "payment": {
            "type": "object",
            "required": [
              "protocols",
              "operation",
              "priceCents",
              "currency",
              "methods"
            ],
            "properties": {
              "protocols": {
                "type": "array",
                "items": {
                  "enum": [
                    "MPP",
                    "x402"
                  ]
                }
              },
              "operation": {
                "enum": [
                  "check_agent_purchase",
                  "create_exit_manifest",
                  "build_exit_pack"
                ]
              },
              "priceCents": {
                "type": "integer",
                "enum": [
                  1,
                  25,
                  100
                ]
              },
              "currency": {
                "const": "USD"
              },
              "methods": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      }
    }
  },
  "x-exitproof-commerce": {
    "protocol": "MPP+x402",
    "protocols": [
      "MPP",
      "x402"
    ],
    "enabled": true,
    "operations": {
      "check_agent_purchase": {
        "priceCents": 1,
        "currency": "USD",
        "methods": [
          "tempo",
          "x402"
        ],
        "preflight": "parseable non-conflicting target 402 challenge required"
      },
      "create_exit_manifest": {
        "priceCents": 25,
        "currency": "USD",
        "methods": [
          "tempo",
          "x402"
        ]
      },
      "build_exit_pack": {
        "priceCents": 100,
        "currency": "USD",
        "methods": [
          "tempo",
          "x402",
          "stripe"
        ]
      }
    },
    "methods": {
      "tempo": {
        "intents": [
          "charge"
        ],
        "network": "tempo",
        "asset": "USDC.e",
        "preferred": true
      },
      "x402": {
        "version": 2,
        "intents": [
          "charge"
        ],
        "network": "eip155:8453",
        "asset": "USDC",
        "transport": "http",
        "preferred": true
      },
      "stripe": {
        "intents": [
          "charge"
        ],
        "paymentMethodTypes": [
          "card",
          "link"
        ],
        "preferred": false
      }
    },
    "stablecoin": {
      "ready": true,
      "mode": "live",
      "rail": {
        "id": "stripe-mpp-tempo",
        "configured": true,
        "enabled": true,
        "protocol": "MPP",
        "method": "tempo",
        "provider": "stripe",
        "asset": "USDC.e",
        "network": "Tempo"
      }
    },
    "freePreflight": true,
    "preflightBeforeChallenge": true,
    "paymentDoesNotGuaranteeExitOutcome": true
  }
}