> ## Documentation Index
> Fetch the complete documentation index at: https://developers.circle.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Before reading these docs, install the relevant Circle Skill to get pre-loaded context — skills are LLM-optimized and cover architecture decisions, correct flows, and common pitfalls. In Claude Code: run /plugin marketplace add circlefin/skills then /plugin install circle-skills@circle. With Vercel Skills CLI: run npx skills add circlefin/skills. Available skills: use-usdc https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-usdc/SKILL.md (balances, transfers, approvals on EVM and Solana); EURC has no skill — see https://developers.circle.com/stablecoins/what-is-eurc.md; bridge-stablecoin https://github.com/circlefin/skills/blob/master/plugins/circle/skills/bridge-stablecoin/SKILL.md (crosschain transfers via CCTP, USDC, EURC, and third-party assets); use-arc https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-arc/SKILL.md (Arc chain config, contract deployment, USDC bridging — Arc docs: https://docs.arc.io/llms.txt); use-circle-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-circle-wallets/SKILL.md (choose wallet type); use-developer-controlled-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-developer-controlled-wallets/SKILL.md (custodial wallets for payouts and treasury); use-user-controlled-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-user-controlled-wallets/SKILL.md (embedded wallets with Web2 login); use-modular-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-modular-wallets/SKILL.md (smart contract wallets with passkeys and ERC-4337); use-gateway https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-gateway/SKILL.md (unified USDC balance, nanopayments); use-smart-contract-platform https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-smart-contract-platform/SKILL.md (deploy, interact, monitor contracts). Pair any skill with the Circle MCP server for live SDK signatures, contract addresses, and chain IDs: {"mcpServers":{"circle":{"url":"https://api.circle.com/v1/codegen/mcp"}}}.
> Read the product overview first. Each product has an overview explaining when and why to use it. Read it before quickstarts.
> Pick the right wallet type. Developer-controlled (you hold keys), user-controlled (end user holds keys via PIN/social login), or modular (smart contract wallets with passkeys). See https://developers.circle.com/wallets.md.
> Use CCTP V2 for crosschain transfers. CCTP natively transfers USDC and EURC via burn-and-mint, and supports permissionless wrapping of third-party assets via lock-and-mint. V1 is legacy; always use V2 unless V1 is specified or the chain requires it (Noble, Sui, and Aptos still require V1). Migration guide: https://developers.circle.com/cctp/migration-from-v1-to-v2.md.
> Use Bridge Kit for frontend bridging. Wraps CCTP with a simpler SDK for user-facing apps. Use CCTP directly for backend transfers.
> Gas Station vs Paymaster. Gas Station sponsors gas for Circle Wallet transactions. Paymaster lets users pay gas in USDC. Different use cases — read both overviews.
> Gateway Nanopayments for sub-cent payments. Gasless USDC micropayments down to $0.000001 via x402 and batched settlement. For pay-per-request APIs, AI agent payments, streaming.
> Look up USDC addresses per chain. Never hardcode — use https://developers.circle.com/stablecoins/usdc-contract-addresses.md.
> Prefer SDKs over raw API calls. Node.js and Python SDKs handle auth, retries, and errors.
> API key required. Bearer token in Authorization header. Testnet and mainnet use separate keys and may use different base URLs depending on the product.
> Set up webhooks when available. Most operations are async. Webhooks deliver transaction confirmations and state changes.
> When calling list endpoints, paginate using pageSize and pageAfter until no nextPageAfter cursor is returned—stopping at the first page silently misses records.
> Building an AI agent? Start with the Agent Stack—Circle CLI, agent wallets, and nanopayments built for autonomous use cases: https://developers.circle.com/agent-stack.md.

# Verify an x402 payment

> Verifies the buyer's signed authorization and the payment payload without creating a payment, consuming keyless trial usage, or submitting anything onchain. Use before [Settle an x402 payment](/api-reference/facilitator-service/all/settle-payment) to catch problems early.

For `upto`, `amount` must equal the maximum the buyer signed.

Example signatures come from a public test key. Never fund it.




## OpenAPI

````yaml openapi/facilitator-service.yaml post /v1/facilitator/x402/verify
openapi: 3.0.3
info:
  title: Facilitator Service
  version: 1.0.0
  description: >
    Facilitator Service is Circle's hosted x402 facilitator. Sellers call
    Facilitator Service to verify and settle x402 payments in USDC on Arc, Base,
    and Polygon PoS without operating their own relayer, gas wallet, or
    sanctions screening.


    Facilitator Service implements the x402 v2 `exact` scheme and settles USDC
    through EIP-3009 authorizations.


    Facilitator Service also implements the x402 v2 `upto` scheme. With `upto`,
    the buyer signs a Permit2 authorization for a maximum amount, and the seller
    settles the actual amount, from zero up to that maximum. The buyer either
    approves the Permit2 contract onchain or attaches a signed EIP-2612 permit
    through the `eip2612GasSponsoring` extension, which needs no buyer
    transaction. `/supported` lists the networks where `upto` is available.
servers:
  - url: https://api.circle.com
    description: Production
security:
  - CircleApiKey: []
  - FacilitatorSellerProof: []
tags:
  - name: Payments
    description: |
      x402 payment verification, settlement, and status.
  - name: Supported payment kinds
    description: |
      x402 payment kinds and extensions Facilitator Service accepts.
paths:
  /v1/facilitator/x402/verify:
    post:
      tags:
        - Payments
      summary: Verify an x402 payment
      description: >
        Verifies the buyer's signed authorization and the payment payload
        without creating a payment, consuming keyless trial usage, or submitting
        anything onchain. Use before [Settle an x402
        payment](/api-reference/facilitator-service/all/settle-payment) to catch
        problems early.


        For `upto`, `amount` must equal the maximum the buyer signed.


        Example signatures come from a public test key. Never fund it.
      operationId: VerifyPayment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - x402Version
                - paymentPayload
                - paymentRequirements
              properties:
                x402Version:
                  type: integer
                  enum:
                    - 2
                  description: >-
                    x402 protocol version. Facilitator Service supports version
                    2.
                paymentPayload:
                  $ref: '#/components/schemas/PaymentPayload'
                paymentRequirements:
                  $ref: '#/components/schemas/PaymentRequirements'
            examples:
              exact:
                summary: Exact payment
                description: Verifies a 1 USDC `exact` payment on Arc testnet.
                value:
                  x402Version: 2
                  paymentPayload:
                    x402Version: 2
                    resource:
                      url: https://api.example.com/premium
                      description: Premium report
                      mimeType: application/json
                    accepted:
                      scheme: exact
                      network: eip155:5042002
                      amount: '1000000'
                      asset: '0x3600000000000000000000000000000000000000'
                      payTo: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
                      maxTimeoutSeconds: 12
                      extra:
                        name: USDC
                        version: '2'
                        assetTransferMethod: eip3009
                    payload:
                      signature: >-
                        0x15e13cbd896cdf88f30cb826b2e79b97a35280b2ab459a1f50cd64ee48034e2849e7445b14feadcc3d1bb2868b41e8cf7997b623daa73872509c7027194765311b
                      authorization:
                        from: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
                        to: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
                        value: '1000000'
                        validAfter: '0'
                        validBefore: '1791400000'
                        nonce: >-
                          0x4d3f8a2c9b1e7f60d5a4c3b2e1f0a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2
                    extensions:
                      payment-identifier:
                        info:
                          required: true
                          id: pay_5f0d3c1a9b7e4d2c
                  paymentRequirements:
                    scheme: exact
                    network: eip155:5042002
                    amount: '1000000'
                    asset: '0x3600000000000000000000000000000000000000'
                    payTo: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
                    maxTimeoutSeconds: 12
                    extra:
                      name: USDC
                      version: '2'
                      assetTransferMethod: eip3009
              upto:
                summary: Upto payment
                description: >-
                  Verifies an `upto` payment with a 5 USDC maximum on Arc
                  testnet. `amount` equals the signed maximum. The buyer has
                  already approved Permit2.
                value:
                  x402Version: 2
                  paymentPayload:
                    x402Version: 2
                    resource:
                      url: https://api.example-seller.com/llm/completions
                      description: Metered LLM completion
                      mimeType: application/json
                    accepted:
                      scheme: upto
                      network: eip155:5042002
                      amount: '5000000'
                      asset: '0x3600000000000000000000000000000000000000'
                      payTo: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
                      maxTimeoutSeconds: 300
                      extra:
                        name: USDC
                        version: '2'
                        assetTransferMethod: permit2
                        facilitatorAddress: '0x2240278661b83f55D31B2506F77266f6fFd21D55'
                    payload:
                      signature: >-
                        0xc73bf42ff0307a07972c5d07349a289d34270ad4298454b66c41a1fbe6a5a13e22f516c1cc85c884e41d77db7ea4c6a8b1b8271c1012022962e5af0601a52e341b
                      permit2Authorization:
                        from: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
                        permitted:
                          token: '0x3600000000000000000000000000000000000000'
                          amount: '5000000'
                        spender: '0x4020A4f3b7b90ccA423B9fabCc0CE57C6C240002'
                        nonce: '1791399400123456'
                        deadline: '1791400300'
                        witness:
                          to: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
                          facilitator: '0x2240278661b83f55D31B2506F77266f6fFd21D55'
                          validAfter: '1791399400'
                    extensions:
                      payment-identifier:
                        info:
                          required: true
                          id: pay_5f0d3c1a9b7e4d2c
                  paymentRequirements:
                    scheme: upto
                    network: eip155:5042002
                    amount: '5000000'
                    asset: '0x3600000000000000000000000000000000000000'
                    payTo: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
                    maxTimeoutSeconds: 300
                    extra:
                      name: USDC
                      version: '2'
                      assetTransferMethod: permit2
                      facilitatorAddress: '0x2240278661b83f55D31B2506F77266f6fFd21D55'
              uptoGasSponsored:
                summary: Upto payment with a gasless Permit2 approval
                description: >-
                  Same `upto` payment, with an `eip2612GasSponsoring` permit
                  that approves Permit2 for exactly the signed maximum, so the
                  buyer needs no approval transaction.
                value:
                  x402Version: 2
                  paymentPayload:
                    x402Version: 2
                    resource:
                      url: https://api.example-seller.com/llm/completions
                      description: Metered LLM completion
                      mimeType: application/json
                    accepted:
                      scheme: upto
                      network: eip155:5042002
                      amount: '5000000'
                      asset: '0x3600000000000000000000000000000000000000'
                      payTo: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
                      maxTimeoutSeconds: 300
                      extra:
                        name: USDC
                        version: '2'
                        assetTransferMethod: permit2
                        facilitatorAddress: '0x2240278661b83f55D31B2506F77266f6fFd21D55'
                    payload:
                      signature: >-
                        0xc73bf42ff0307a07972c5d07349a289d34270ad4298454b66c41a1fbe6a5a13e22f516c1cc85c884e41d77db7ea4c6a8b1b8271c1012022962e5af0601a52e341b
                      permit2Authorization:
                        from: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
                        permitted:
                          token: '0x3600000000000000000000000000000000000000'
                          amount: '5000000'
                        spender: '0x4020A4f3b7b90ccA423B9fabCc0CE57C6C240002'
                        nonce: '1791399400123456'
                        deadline: '1791400300'
                        witness:
                          to: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
                          facilitator: '0x2240278661b83f55D31B2506F77266f6fFd21D55'
                          validAfter: '1791399400'
                    extensions:
                      payment-identifier:
                        info:
                          required: true
                          id: pay_5f0d3c1a9b7e4d2c
                      eip2612GasSponsoring:
                        info:
                          from: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
                          asset: '0x3600000000000000000000000000000000000000'
                          spender: '0x000000000022D473030F116dDEE9F6B43aC78BA3'
                          amount: '5000000'
                          nonce: '0'
                          deadline: '1791400300'
                          signature: >-
                            0x30d1893d3332db1f1f73076c6f43c2ea35eba2b999eec11003e7cf6577566cf1182fec72031187a0f8a40e1af5ed4b5267be572fd7800e0a7ff4f6653e0861e71b
                          version: '1'
                  paymentRequirements:
                    scheme: upto
                    network: eip155:5042002
                    amount: '5000000'
                    asset: '0x3600000000000000000000000000000000000000'
                    payTo: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
                    maxTimeoutSeconds: 300
                    extra:
                      name: USDC
                      version: '2'
                      assetTransferMethod: permit2
                      facilitatorAddress: '0x2240278661b83f55D31B2506F77266f6fFd21D55'
      responses:
        '200':
          description: Verification result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VerifyResponse'
        '400':
          description: Malformed request body.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: >
            Missing or invalid authentication. Returned when:


            - Neither a valid Circle API key nor a valid seller proof is
            present.

            - The seller proof does not match the payment's `network` and
            `payTo`.

            - The seller proof's nonce has been replayed with a different
            digest.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '412':
          description: >
            `upto` only. Returned when all of the following are true:


            - The buyer's USDC balance covers the signed maximum.

            - The buyer's Permit2 allowance for
            `0x000000000022D473030F116dDEE9F6B43aC78BA3` is below the signed
            maximum.

            - The request carries no usable `eip2612GasSponsoring` permit (the
            extension is absent or has no signed fields).


            The body carries the `permit2_allowance_required` reason. An
            insufficient balance returns `insufficient_funds` instead.


            To proceed, the buyer either approves Permit2 onchain or attaches a
            signed `eip2612GasSponsoring` permit, which needs no buyer
            transaction.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '415':
          description: Unsupported content encoding.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Unexpected internal error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: >
            A required service is temporarily unavailable. For `upto`, also
            returned when verification is at capacity. Retry with backoff.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - CircleApiKey: []
        - FacilitatorSellerProof: []
components:
  schemas:
    PaymentPayload:
      type: object
      description: >
        x402 v2 payment payload. Includes the payment terms the buyer accepted
        and the signed authorization for the USDC transfer: an EIP-3009
        authorization for `exact`, or a Permit2 authorization for `upto`.


        For `upto`, the payload sent to `/settle` must match the payload sent to
        `/verify`. The seller can only vary `paymentRequirements.amount` between
        calls.
      required:
        - x402Version
        - accepted
        - payload
      properties:
        x402Version:
          type: integer
          enum:
            - 2
          description: x402 protocol version. Facilitator Service supports version 2.
        resource:
          $ref: '#/components/schemas/ResourceInfo'
        accepted:
          $ref: '#/components/schemas/PaymentRequirements'
        payload:
          description: >
            Signed buyer authorization. Facilitator Service reads it according
            to `paymentRequirements.scheme`.
          oneOf:
            - $ref: '#/components/schemas/ExactPayload'
            - $ref: '#/components/schemas/UptoPayload'
        extensions:
          type: object
          description: >
            Optional x402 extensions. Facilitator Service recognizes
            `payment-identifier` on every scheme and `eip2612GasSponsoring` on
            `upto`.


            Use `payment-identifier` to scope idempotency to your seller
            account. The value carries an `info` object with `required` and `id`
            fields. `id` must be 16 to 128 characters from `[A-Za-z0-9_-]`. An
            `info` object without an `id` is treated as if the extension were
            absent.
          additionalProperties: true
          properties:
            eip2612GasSponsoring:
              $ref: '#/components/schemas/EIP2612GasSponsoring'
          example:
            payment-identifier:
              info:
                required: true
                id: pay_5f0d3c1a9b7e4d2c
    PaymentRequirements:
      type: object
      description: >
        Payment terms the seller advertises for an x402 resource. Facilitator
        Service validates that the buyer's authorization matches these
        requirements.
      required:
        - scheme
        - network
        - amount
        - asset
        - payTo
        - maxTimeoutSeconds
      properties:
        scheme:
          type: string
          enum:
            - exact
            - upto
          description: >
            Payment scheme. Facilitator Service supports `exact` and `upto`.
            `upto` is available only on the networks where `/supported` lists an
            `upto` kind.
        network:
          type: string
          description: >
            CAIP-2 network identifier. Must match one of the blockchains
            Facilitator Service supports. See [Supported
            networks](/facilitator-service/supported-networks).
          example: eip155:5042002
        amount:
          type: string
          description: >
            Payment amount in atomic USDC units. USDC uses 6 decimals, so
            `1000000` equals 1 USDC.


            For `upto`, the meaning depends on the endpoint. On verify, `amount`
            must equal the maximum the buyer signed. On settle, `amount` is the
            actual amount to charge, from `0` up to that maximum. Facilitator
            Service checks the buyer's USDC balance and Permit2 allowance
            against this amount.
          example: '1000000'
        asset:
          type: string
          description: |
            USDC contract address on the target network.
          example: '0x3600000000000000000000000000000000000000'
        payTo:
          type: string
          description: The seller's payout address on the target network.
          example: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
        maxTimeoutSeconds:
          type: integer
          description: >
            Maximum time in seconds Facilitator Service may wait for the
            settlement to reach a terminal state before returning a pending
            response.
          example: 12
        extra:
          type: object
          description: >
            Scheme-specific parameters.


            For the `exact` scheme with EIP-3009, Facilitator Service expects
            `name`, `version`, and `assetTransferMethod`.


            For the `upto` scheme, the `upto` kind in `/supported` advertises
            `name`, `version`, `assetTransferMethod: permit2`, and
            `facilitatorAddress`. Buyers sign `facilitatorAddress` into
            `witness.facilitator`.
          additionalProperties: true
          example:
            name: USDC
            version: '2'
            assetTransferMethod: eip3009
    VerifyResponse:
      type: object
      required:
        - isValid
        - payer
      properties:
        isValid:
          type: boolean
          description: Whether the payload passed every check before submission.
          example: true
        invalidReason:
          type: string
          description: Reason code. Present when `isValid` is false.
          enum:
            - invalid_x402_version
            - unsupported_scheme
            - invalid_network
            - invalid_payment_requirements
            - invalid_payload
            - invalid_exact_evm_payload_recipient_mismatch
            - invalid_exact_evm_payload_authorization_value_mismatch
            - invalid_exact_evm_payload_authorization_valid_after
            - invalid_exact_evm_payload_authorization_valid_before
            - invalid_exact_evm_payload_signature
            - invalid_transaction_state
            - insufficient_funds
            - invalid_permit2_spender
            - invalid_permit2_recipient_mismatch
            - permit2_token_mismatch
            - permit2_amount_mismatch
            - permit2_not_yet_valid
            - permit2_deadline_expired
            - upto_facilitator_mismatch
            - invalid_permit2_signature
            - permit2_invalid_nonce
            - invalid_eip2612_extension_format
            - eip2612_from_mismatch
            - eip2612_asset_mismatch
            - eip2612_spender_not_permit2
            - eip2612_deadline_expired
            - permit2_2612_amount_mismatch
            - permit2_simulation_failed
          example: invalid_exact_evm_payload_signature
        payer:
          type: string
          description: >
            Buyer address recovered from the signed authorization. Always
            rendered, including on invalid results, so callers can correlate.
          example: 0x9aE2...
    ErrorResponse:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: integer
          description: HTTP status code echoed in the body for programmatic handling.
          example: 403
        message:
          type: string
          description: >-
            Human-readable summary of the error, suitable for display to end
            users.
          example: Registration required to continue settling on this address
        errors:
          type: array
          description: Per-issue reason codes.
          items:
            type: object
            required:
              - reason
            properties:
              reason:
                type: string
                description: |
                  Machine-readable reason code.
                enum:
                  - registration_required
                  - authorization_expired
                  - payment_identifier_conflict
                  - credential_bound_elsewhere
                  - credential_payer_conflict
                  - authorization_reused
                  - permit2_allowance_required
                example: registration_required
    ResourceInfo:
      type: object
      description: |
        Optional metadata about the resource the buyer is paying for.
      properties:
        url:
          type: string
          description: URL of the paid resource.
          example: https://api.example.com/premium
        description:
          type: string
          description: Human-readable description of the resource.
          example: Premium report
        mimeType:
          type: string
          description: MIME type the resource returns.
          example: application/json
    ExactPayload:
      type: object
      description: Signed payload for the `exact` scheme.
      required:
        - signature
        - authorization
      properties:
        signature:
          type: string
          description: >
            Buyer's EIP-3009 signature over the `TransferWithAuthorization`
            typed data, signed under the USDC contract's EIP-712 domain for the
            payment's network.
          example: 0x...
        authorization:
          $ref: '#/components/schemas/EIP3009Authorization'
    UptoPayload:
      type: object
      description: Signed payload for the `upto` scheme.
      required:
        - signature
        - permit2Authorization
      properties:
        signature:
          type: string
          description: >
            Buyer's signature over the Permit2 `PermitWitnessTransferFrom` typed
            data, signed under the Permit2 EIP-712 domain for the payment's
            network. Accepts EOA signatures and signatures from deployed
            ERC-1271 smart accounts.
          example: 0x...
        permit2Authorization:
          $ref: '#/components/schemas/Permit2Authorization'
    EIP2612GasSponsoring:
      type: object
      description: >
        `upto` only. Signed EIP-2612 permit that approves the Permit2 contract
        to spend the buyer's USDC, so the buyer needs no onchain approval
        transaction.


        The permit's fields are always checked against the payload. Its nonce
        and signature are checked onchain only when the buyer's Permit2
        allowance is below the payment amount.


        An attached permit is always submitted with the settlement. The Permit2
        proxy skips a permit that fails onchain.
      required:
        - info
      properties:
        info:
          type: object
          description: >
            When any of `from`, `asset`, `spender`, `amount`, `nonce`,
            `deadline`, or `signature` is present, all seven are required, and a
            partial or malformed set returns `invalid_eip2612_extension_format`.
            An `info` with none of them, such as an echo of the seller's
            declaration, is treated as if the extension were absent.
          properties:
            from:
              type: string
              description: >
                Permit owner. Must equal `permit2Authorization.from`, otherwise
                `eip2612_from_mismatch`.
              example: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
            asset:
              type: string
              description: >
                USDC contract address. Must equal
                `permit2Authorization.permitted.token`, otherwise
                `eip2612_asset_mismatch`.
              example: '0x3600000000000000000000000000000000000000'
            spender:
              type: string
              description: >
                Approved spender. Must be the Permit2 contract
                (`0x000000000022D473030F116dDEE9F6B43aC78BA3`), otherwise
                `eip2612_spender_not_permit2`.
              example: '0x000000000022D473030F116dDEE9F6B43aC78BA3'
            amount:
              type: string
              description: >
                Permit value in atomic USDC units. Must equal the signed Permit2
                maximum (`permitted.amount`), otherwise
                `permit2_2612_amount_mismatch`.
              example: '5000000'
            nonce:
              type: string
              description: >
                The buyer's current EIP-2612 nonce on the USDC contract, as a
                decimal string. When the permit is needed and the nonce does not
                match onchain, the result is `permit2_simulation_failed`.
              example: '0'
            deadline:
              type: string
              description: >
                Unix timestamp after which the permit expires. Separate from the
                Permit2 `deadline`. Must be at least 10 seconds in the future,
                otherwise `eip2612_deadline_expired`.
              example: '1791400300'
            signature:
              type: string
              description: >
                65-byte signature over the USDC contract's EIP-2612 `Permit`
                typed data, under the USDC EIP-712 domain for the payment's
                network. When the permit is needed and the signature is invalid,
                the result is `permit2_simulation_failed`.
              example: >-
                0x30d1893d3332db1f1f73076c6f43c2ea35eba2b999eec11003e7cf6577566cf1182fec72031187a0f8a40e1af5ed4b5267be572fd7800e0a7ff4f6653e0861e71b
            version:
              type: string
              description: Extension version. Facilitator Service does not validate it.
              example: '1'
    EIP3009Authorization:
      type: object
      description: >
        EIP-3009 `TransferWithAuthorization` message the buyer signed.
        Facilitator Service submits this authorization to the USDC contract to
        move funds from `from` to `to`.
      required:
        - from
        - to
        - value
        - validAfter
        - validBefore
        - nonce
      properties:
        from:
          type: string
          description: Buyer's address (source of the USDC transfer).
          example: 0x9aE2...
        to:
          type: string
          description: >
            Recipient address. Must equal `paymentRequirements.payTo` for
            Facilitator Service to accept the authorization.
          example: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
        value:
          type: string
          description: >
            Transfer amount in atomic USDC units. Must equal
            `paymentRequirements.amount`.
          example: '1000000'
        validAfter:
          type: string
          description: Unix timestamp before which the authorization is not valid.
          example: '0'
        validBefore:
          type: string
          description: Unix timestamp after which the authorization is no longer valid.
          example: '2208988800'
        nonce:
          type: string
          description: >
            Unique 32-byte value that binds this authorization to one specific
            transfer. Reusing a nonce that already settled returns
            `invalid_transaction_state`.
          example: 0x4d3f...
    Permit2Authorization:
      type: object
      description: >
        Permit2 `PermitWitnessTransferFrom` message the buyer signed for the
        `upto` scheme. The buyer signs a maximum amount, and you settle any
        amount from zero up to that maximum. Facilitator Service submits this
        authorization to the x402 `upto` Permit2 proxy from the facilitator
        wallet named in `witness.facilitator`.
      required:
        - from
        - permitted
        - spender
        - nonce
        - deadline
        - witness
      properties:
        from:
          type: string
          description: >
            Buyer's address (the Permit2 owner and source of the USDC transfer).
            The buyer's USDC allowance for the Permit2 contract must cover the
            payment amount, or the request must carry an `eip2612GasSponsoring`
            permit. Otherwise Facilitator Service returns HTTP 412.
          example: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
        permitted:
          type: object
          description: Token and maximum amount the buyer authorizes.
          required:
            - token
            - amount
          properties:
            token:
              type: string
              description: |
                USDC contract address. Must equal `paymentRequirements.asset`.
              example: '0x3600000000000000000000000000000000000000'
            amount:
              type: string
              description: >
                Maximum transfer amount in atomic USDC units. Must be greater
                than zero. On verify, must equal `paymentRequirements.amount`.
                On settle, `paymentRequirements.amount` must not exceed it.
              example: '5000000'
        spender:
          type: string
          description: >
            Address of the x402 `upto` Permit2 proxy contract that Facilitator
            Service calls to settle.
          example: '0x4020A4f3b7b90ccA423B9fabCc0CE57C6C240002'
        nonce:
          type: string
          description: >
            Permit2 unordered nonce as a uint256 decimal string. A nonce already
            used onchain returns `permit2_invalid_nonce`.
          example: '1791399400123456'
        deadline:
          type: string
          description: >
            Unix timestamp after which the authorization is no longer valid.
            Must be at least 10 seconds in the future when Facilitator Service
            checks it.
          example: '1791400300'
        witness:
          type: object
          description: Extra terms the buyer binds into the Permit2 signature.
          required:
            - to
            - facilitator
            - validAfter
          properties:
            to:
              type: string
              description: |
                Recipient address. Must equal `paymentRequirements.payTo`.
              example: '0x7c3ea945Fc4253255d8260fc18c2dee3D8C5dD3A'
            facilitator:
              type: string
              description: >
                Facilitator wallet allowed to submit the settlement. Take this
                from `extra.facilitatorAddress` on the `upto` kind in
                `/supported`. Addresses are compared case-insensitively.
              example: '0x2240278661b83f55D31B2506F77266f6fFd21D55'
            validAfter:
              type: string
              description: Unix timestamp before which the authorization is not valid.
              example: '1791399400'
  securitySchemes:
    CircleApiKey:
      type: http
      scheme: bearer
      description: >
        Bearer token authentication with a Circle API key. Use this for
        production settlement. Settling with an API key also binds the `payTo`
        to your Circle account, which ends the keyless trial allowance.
    FacilitatorSellerProof:
      type: apiKey
      in: header
      name: Facilitator-Seller-Proof
      description: >
        Base64url-encoded envelope carrying an EIP-712 signature that proves the
        caller controls the `payTo` address. Use this for the keyless trial,
        before you settle with a Circle API key. Settling an `upto` payment
        requires a Circle API key.

````