{
  "schema_version": "1",
  "generated_at": "2026-10-20T00:00:00Z",
  "description": "Checked protocol facts. Bitcoin and Lightning protocols are first. Each fact has a source URL and a verified_at date. Null means the cited pages do not state that field.",
  "markdown_url": "https://agentpaywire.com/api/protocol-facts.md",
  "count": 9,
  "protocols": [
    {
      "id": "l402",
      "name": "L402",
      "featured": true,
      "spec_url": {
        "value": "https://docs.lightning.engineering/the-lightning-network/l402/protocol-specification",
        "source": "https://docs.lightning.engineering/the-lightning-network/l402/protocol-specification",
        "verified_at": "2026-10-20"
      },
      "http_status_codes": {
        "value": [
          402
        ],
        "source": "https://docs.lightning.engineering/the-lightning-network/l402/protocol-specification",
        "verified_at": "2026-10-20"
      },
      "http_headers": {
        "value": [
          {
            "name": "WWW-Authenticate",
            "direction": "server to client",
            "role": "Challenge using the L402 scheme, with a base64 macaroon and a Lightning invoice."
          },
          {
            "name": "Authorization",
            "direction": "client to server",
            "role": "L402 credential: base64 macaroon, a colon, then the hex-encoded invoice preimage. Multiple macaroons are comma-separated before the colon."
          }
        ],
        "source": "https://docs.lightning.engineering/the-lightning-network/l402/protocol-specification",
        "verified_at": "2026-10-20"
      },
      "payment_rail": {
        "value": "Lightning",
        "source": "https://docs.lightning.engineering/the-lightning-network/l402/protocol-specification",
        "verified_at": "2026-10-20"
      },
      "networks": {
        "value": [
          {
            "name": "Lightning",
            "caip2": null,
            "asset": "bitcoin",
            "contract": null
          }
        ],
        "source": "https://docs.lightning.engineering/the-lightning-network/l402/protocol-specification",
        "verified_at": "2026-10-20"
      },
      "facilitators": null,
      "client_libraries": {
        "value": [
          {
            "name": "lightninglabs/lnget",
            "url": "https://github.com/lightninglabs/lnget"
          }
        ],
        "source": "https://github.com/lightninglabs/lnget",
        "verified_at": "2026-10-20"
      },
      "pay_flow": {
        "value": [
          "Request the resource.",
          "Read the HTTP 402 challenge: WWW-Authenticate carries an L402 macaroon and a Lightning invoice.",
          "Pay the invoice and take the preimage.",
          "Retry with Authorization: L402 <macaroon>:<preimage>."
        ],
        "source": "https://docs.lightning.engineering/the-lightning-network/l402/protocol-specification",
        "verified_at": "2026-10-20"
      },
      "notes": {
        "value": "The same credential is reused until the server revokes it and issues a new 402. The gRPC binding uses HTTP 200 with Grpc-Status 402 and puts the macaroon and invoice in grpc-status-details-bin. The HTTP Authorization header is the same.",
        "source": "https://docs.lightning.engineering/the-lightning-network/l402/protocol-specification",
        "verified_at": "2026-10-20"
      },
      "example": {
        "value": "GET https://api.agentpaywire.com/v1/search?q=bitcoin with no Authorization header returns HTTP 402 and a BOLT11 invoice for 100 sats. Pay the invoice, then retry with Authorization: L402 <macaroon>:<preimage>. sha256 of that preimage matches the payment hash. One payment grants 100 requests for 30 days. Discovery: https://agentpaywire.com/.well-known/l402. The files on https://agentpaywire.com stay free.",
        "source": "https://agentpaywire.com/.well-known/l402",
        "verified_at": "2026-10-20"
      }
    },
    {
      "id": "bolt12",
      "name": "BOLT 12",
      "featured": true,
      "spec_url": {
        "value": "https://github.com/lightning/bolts/blob/master/12-offer-encoding.md",
        "source": "https://github.com/lightning/bolts/blob/master/12-offer-encoding.md",
        "verified_at": "2026-10-20"
      },
      "http_status_codes": null,
      "http_headers": null,
      "payment_rail": {
        "value": "Lightning",
        "source": "https://github.com/lightning/bolts/blob/master/12-offer-encoding.md",
        "verified_at": "2026-10-20"
      },
      "networks": {
        "value": [
          {
            "name": "Lightning",
            "caip2": null,
            "asset": "bitcoin",
            "contract": null
          }
        ],
        "source": "https://github.com/lightning/bolts/blob/master/12-offer-encoding.md",
        "verified_at": "2026-10-20"
      },
      "facilitators": null,
      "client_libraries": null,
      "pay_flow": {
        "value": [
          "The receiver publishes an offer. The human-readable prefix is lno.",
          "The payer sends an invoice request over Lightning. The human-readable prefix is lnr. The request repeats the offer fields.",
          "The receiver replies with an invoice.",
          "The payer pays that invoice."
        ],
        "source": "https://github.com/lightning/bolts/blob/master/12-offer-encoding.md",
        "verified_at": "2026-10-20"
      },
      "notes": {
        "value": "Offers, invoice requests, and invoices are TLV messages. The ASCII form is a human-readable prefix, the character 1, then a bech32-style data string. There is no checksum. Writers use all lowercase or all uppercase, and should use uppercase in QR codes. offer_amount may be in another currency; the issuer converts it to millisatoshis on the invoice.",
        "source": "https://github.com/lightning/bolts/blob/master/12-offer-encoding.md",
        "verified_at": "2026-10-20"
      }
    },
    {
      "id": "bip21",
      "name": "BIP 21",
      "featured": true,
      "spec_url": {
        "value": "https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki",
        "source": "https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki",
        "verified_at": "2026-10-20"
      },
      "http_status_codes": null,
      "http_headers": null,
      "payment_rail": {
        "value": "Bitcoin on-chain",
        "source": "https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki",
        "verified_at": "2026-10-20"
      },
      "networks": {
        "value": [
          {
            "name": "Bitcoin",
            "caip2": null,
            "asset": "BTC",
            "contract": null
          }
        ],
        "source": "https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki",
        "verified_at": "2026-10-20"
      },
      "facilitators": null,
      "client_libraries": {
        "value": [
          {
            "name": "Bitcoin-Qt",
            "url": null
          }
        ],
        "source": "https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki",
        "verified_at": "2026-10-20"
      },
      "pay_flow": {
        "value": [
          "Read a bitcoin: URI. The scheme is case-insensitive. The path is a bitcoin address.",
          "Read optional query keys: amount in decimal BTC, label, and message.",
          "The client must not pay the URI without user authorization.",
          "Treat any req- parameter the client does not implement as making the whole URI invalid. Other unknown parameters can be ignored."
        ],
        "source": "https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki",
        "verified_at": "2026-10-20"
      },
      "notes": {
        "value": "The BIP text says it is superseded by BIP 321. Amounts use a period as the decimal separator and must not contain commas.",
        "source": "https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki",
        "verified_at": "2026-10-20"
      }
    },
    {
      "id": "nwc",
      "name": "NWC (NIP-47)",
      "featured": true,
      "spec_url": {
        "value": "https://github.com/nostr-protocol/nips/blob/master/47.md",
        "source": "https://github.com/nostr-protocol/nips/blob/master/47.md",
        "verified_at": "2026-10-20"
      },
      "http_status_codes": null,
      "http_headers": null,
      "payment_rail": {
        "value": "Lightning",
        "source": "https://github.com/nostr-protocol/nips/blob/master/47.md",
        "verified_at": "2026-10-20"
      },
      "networks": {
        "value": [
          {
            "name": "Lightning via a NIP-47 wallet service",
            "caip2": null,
            "asset": "bitcoin",
            "contract": null
          }
        ],
        "source": "https://github.com/nostr-protocol/nips/blob/master/47.md",
        "verified_at": "2026-10-20"
      },
      "facilitators": null,
      "client_libraries": null,
      "pay_flow": {
        "value": [
          "The wallet service gives the user a nostr+walletconnect:// URI with its pubkey, one or more relay URLs, and a client secret.",
          "The client reads the info event (kind 13194) for supported methods.",
          "To pay, the client encrypts a pay_invoice request and publishes kind 23194 to the relay.",
          "The wallet service pays the BOLT 11 invoice and returns kind 23195 with the preimage, or an error."
        ],
        "source": "https://github.com/nostr-protocol/nips/blob/master/47.md",
        "verified_at": "2026-10-20"
      },
      "notes": {
        "value": "pay_invoice takes a BOLT 11 invoice. amount, when set, is millisatoshis. make_invoice amount is also millisatoshis. get_info reports network as mainnet, testnet, signet, or regtest. NIP-44 is the preferred encryption. Missing the encryption tag means NIP-04.",
        "source": "https://github.com/nostr-protocol/nips/blob/master/47.md",
        "verified_at": "2026-10-20"
      }
    },
    {
      "id": "x402",
      "name": "x402",
      "featured": false,
      "spec_url": {
        "value": "https://docs.x402.org/core-concepts/http-402",
        "source": "https://docs.x402.org/core-concepts/http-402",
        "verified_at": "2026-10-20"
      },
      "http_status_codes": {
        "value": [
          402
        ],
        "source": "https://docs.x402.org/core-concepts/http-402",
        "verified_at": "2026-10-20"
      },
      "http_headers": {
        "value": [
          {
            "name": "PAYMENT-REQUIRED",
            "direction": "server to client",
            "role": "Base64-encoded PaymentRequired object, sent with HTTP 402. V2."
          },
          {
            "name": "PAYMENT-SIGNATURE",
            "direction": "client to server",
            "role": "Base64-encoded PaymentPayload sent when retrying after HTTP 402."
          },
          {
            "name": "PAYMENT-RESPONSE",
            "direction": "server to client",
            "role": "Base64-encoded SettlementResponse after settlement is attempted."
          }
        ],
        "source": "https://docs.x402.org/core-concepts/http-402",
        "verified_at": "2026-10-20"
      },
      "payment_rail": {
        "value": "V2 schemes on the HTTP 402 page: exact and upto settle during the request, and batch-settlement confirms the authorization first and redeems on-chain later.",
        "source": "https://docs.x402.org/core-concepts/http-402",
        "verified_at": "2026-10-20"
      },
      "networks": {
        "value": [
          {
            "name": "Base",
            "caip2": "eip155:8453",
            "asset": null,
            "contract": null
          },
          {
            "name": "Ethereum",
            "caip2": "eip155:1",
            "asset": null,
            "contract": null
          },
          {
            "name": "Solana",
            "caip2": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
            "asset": null,
            "contract": null
          },
          {
            "name": "Base Sepolia",
            "caip2": "eip155:84532",
            "asset": null,
            "contract": null
          }
        ],
        "source": "https://docs.x402.org/guides/migration-v1-to-v2",
        "verified_at": "2026-10-20"
      },
      "facilitators": {
        "value": [
          {
            "name": "Facilitator used in the V2 seller example",
            "url": "https://x402.org/facilitator"
          }
        ],
        "source": "https://docs.x402.org/guides/migration-v1-to-v2",
        "verified_at": "2026-10-20"
      },
      "client_libraries": {
        "value": [
          {
            "name": "@x402/axios",
            "url": null
          },
          {
            "name": "@x402/evm",
            "url": null
          },
          {
            "name": "@x402/core",
            "url": null
          }
        ],
        "source": "https://docs.x402.org/guides/migration-v1-to-v2",
        "verified_at": "2026-10-20"
      },
      "pay_flow": {
        "value": [
          "The client requests the resource.",
          "The server returns HTTP 402 and a PAYMENT-REQUIRED header.",
          "The client signs a payment payload and retries with PAYMENT-SIGNATURE.",
          "The server verifies the payload itself or via a facilitator /verify call, then settles itself or via /settle.",
          "The server returns the resource and a PAYMENT-RESPONSE header. A failed settlement is another 402."
        ],
        "source": "https://docs.x402.org/core-concepts/facilitator",
        "verified_at": "2026-10-20"
      },
      "notes": {
        "value": "V2 network ids use CAIP-2. The migration guide maps base to eip155:8453, ethereum to eip155:1, and solana to solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp. It does not publish a USDC contract address. V1 header names were X-PAYMENT and X-PAYMENT-RESPONSE. The scheme names exact, upto, and batch-settlement are on the HTTP 402 page.",
        "source": "https://docs.x402.org/guides/migration-v1-to-v2",
        "verified_at": "2026-10-20"
      }
    },
    {
      "id": "mpp",
      "name": "MPP",
      "featured": false,
      "spec_url": {
        "value": "https://mpp.dev/protocol",
        "source": "https://mpp.dev/protocol",
        "verified_at": "2026-10-20"
      },
      "http_status_codes": {
        "value": [
          402
        ],
        "source": "https://mpp.dev/protocol/http-402",
        "verified_at": "2026-10-20"
      },
      "http_headers": {
        "value": [
          {
            "name": "WWW-Authenticate",
            "direction": "server to client",
            "role": "Payment challenge. Required parameters include id, intent, method, realm, and request."
          },
          {
            "name": "Authorization",
            "direction": "client to server",
            "role": "Payment credential when the challenge does not set a header parameter."
          },
          {
            "name": "Payment-Authorization",
            "direction": "client to server",
            "role": "Payment credential when the challenge sets header to Payment-Authorization."
          },
          {
            "name": "Payment-Receipt",
            "direction": "server to client",
            "role": "Receipt after a successful payment."
          }
        ],
        "source": "https://mpp.dev/protocol/transports/http",
        "verified_at": "2026-10-20"
      },
      "payment_rail": {
        "value": "Cards through Shared Payment Tokens, or stablecoins. Stripe docs name Tempo as a stablecoin network and say Tempo transfers use USDC.e.",
        "source": "https://docs.stripe.com/payments/machine/mpp",
        "verified_at": "2026-10-20"
      },
      "networks": {
        "value": [
          {
            "name": "Tempo",
            "caip2": null,
            "asset": null,
            "contract": null
          }
        ],
        "source": "https://docs.stripe.com/payments/machine/mpp",
        "verified_at": "2026-10-20"
      },
      "facilitators": {
        "value": [
          {
            "name": "Stripe",
            "url": "https://docs.stripe.com/payments/machine/mpp"
          }
        ],
        "source": "https://docs.stripe.com/payments/machine/mpp",
        "verified_at": "2026-10-20"
      },
      "client_libraries": {
        "value": [
          {
            "name": "mppx",
            "url": "https://mpp.dev/"
          }
        ],
        "source": "https://docs.stripe.com/payments/machine/mpp",
        "verified_at": "2026-10-20"
      },
      "pay_flow": {
        "value": [
          "The client requests the resource with no payment credential.",
          "The server returns HTTP 402 and a WWW-Authenticate Payment challenge.",
          "The client retries with an Authorization or Payment-Authorization credential.",
          "The server returns HTTP 200 and a Payment-Receipt header."
        ],
        "source": "https://mpp.dev/protocol/transports/http",
        "verified_at": "2026-10-20"
      },
      "notes": {
        "value": "The challenges page uses 0x20c0000000000000000000006a37DA5C996874BE as an OUSD-on-Tempo example and says the sample identifiers are illustrative. This file does not treat that address as a canonical contract. CAIP-2 is not stated there.",
        "source": "https://mpp.dev/protocol/challenges",
        "verified_at": "2026-10-20"
      }
    },
    {
      "id": "ap2",
      "name": "AP2",
      "featured": false,
      "spec_url": {
        "value": "https://github.com/google-agentic-commerce/AP2/blob/main/docs/ap2/specification.md",
        "source": "https://github.com/google-agentic-commerce/AP2/blob/main/docs/ap2/specification.md",
        "verified_at": "2026-10-20"
      },
      "http_status_codes": null,
      "http_headers": null,
      "payment_rail": {
        "value": "A Payment Mandate authorizes a payment instrument for a checkout. The instrument is not limited to one rail by the specification page.",
        "source": "https://github.com/google-agentic-commerce/AP2/blob/main/docs/ap2/specification.md",
        "verified_at": "2026-10-20"
      },
      "networks": null,
      "facilitators": null,
      "client_libraries": {
        "value": [
          {
            "name": "ap2 Python package (install from the repository)",
            "url": "https://github.com/google-agentic-commerce/AP2"
          }
        ],
        "source": "https://github.com/google-agentic-commerce/AP2/blob/main/README.md",
        "verified_at": "2026-10-20"
      },
      "pay_flow": {
        "value": [
          "The merchant gives the shopping agent a merchant-signed checkout JWT.",
          "A trusted surface signs a Checkout Mandate bound to a hash of that JWT.",
          "The shopping agent presents a Payment Mandate bound to the same checkout hash.",
          "The credential provider, network, and merchant payment processor verify the Payment Mandate.",
          "A signed Payment Receipt is returned after the mandate is accepted or rejected."
        ],
        "source": "https://github.com/google-agentic-commerce/AP2/blob/main/docs/ap2/specification.md",
        "verified_at": "2026-10-20"
      },
      "notes": {
        "value": "A closed Payment Mandate uses vct mandate.payment.1. A closed Checkout Mandate uses vct mandate.checkout.1. AP2 does not define the commerce APIs around it. The specification says it is compatible with UCP. The pages checked do not name an HTTP status code or header.",
        "source": "https://github.com/google-agentic-commerce/AP2/blob/main/docs/ap2/specification.md",
        "verified_at": "2026-10-20"
      }
    },
    {
      "id": "acp",
      "name": "ACP",
      "featured": false,
      "spec_url": {
        "value": "https://www.agenticcommerce.dev/",
        "source": "https://www.agenticcommerce.dev/",
        "verified_at": "2026-10-20"
      },
      "http_status_codes": null,
      "http_headers": null,
      "payment_rail": {
        "value": "Delegated payment tokens between buyers, agents, and businesses, plus checkout payment processing. The docs do not name one chain or asset.",
        "source": "https://docs.stripe.com/agentic-commerce/protocols/acp",
        "verified_at": "2026-10-20"
      },
      "networks": null,
      "facilitators": null,
      "client_libraries": null,
      "pay_flow": {
        "value": [
          "An agent creates, updates, and completes a checkout session, including the cart and fulfillment options.",
          "Delegate payment passes a payment token from the buyer through the agent to the business.",
          "Delegate authentication uses OAuth 2.0 when the agent acts for the buyer.",
          "Webhooks report order, shipping, delivery, and refund updates."
        ],
        "source": "https://docs.stripe.com/agentic-commerce/protocols/acp",
        "verified_at": "2026-10-20"
      },
      "notes": {
        "value": "Stripe describes ACP as an open standard created by Stripe, OpenAI, and Meta. The page points at agenticcommerce.dev for the specification. It does not name HTTP payment headers or status codes.",
        "source": "https://docs.stripe.com/agentic-commerce/protocols/acp",
        "verified_at": "2026-10-20"
      }
    },
    {
      "id": "ucp",
      "name": "UCP",
      "featured": false,
      "spec_url": {
        "value": "https://ucp.dev/",
        "source": "https://ucp.dev/",
        "verified_at": "2026-10-20"
      },
      "http_status_codes": null,
      "http_headers": null,
      "payment_rail": {
        "value": "Secure payment via AP2, using payment mandates and verifiable credentials.",
        "source": "https://ucp.dev/",
        "verified_at": "2026-10-20"
      },
      "networks": null,
      "facilitators": null,
      "client_libraries": null,
      "pay_flow": {
        "value": [
          "Discover products through catalog search and lookup.",
          "Build a cart.",
          "Link identity with OAuth 2.0. The site shows a /.well-known/oauth-authorization-server document as the account-linking pattern.",
          "Complete checkout. The site says payment uses AP2.",
          "Track the order after purchase."
        ],
        "source": "https://ucp.dev/",
        "verified_at": "2026-10-20"
      },
      "notes": {
        "value": "The site says transports are REST and JSON-RPC, and that AP2, A2A, and MCP support is built in. It does not name an HTTP payment header, status code, CAIP-2 id, or asset contract. The specification repository is https://github.com/universal-commerce-protocol/ucp.",
        "source": "https://ucp.dev/",
        "verified_at": "2026-10-20"
      }
    }
  ]
}
