Skip to main content

X402 Protocol

The X402 protocol is a payment-aware HTTP extension that enables AI agents to require and verify payments for API access. This guide provides a complete overview of X402 implementation in the Nevermined Payments Library.
🔐 Bearer-token hygiene. The payment-signature header is a bearer credential — anyone holding it can spend the associated plan’s credits until it expires. Send it only over HTTPS, never log the full value, and configure your log/trace exporters (pino, winston, OpenTelemetry) to redact payment-signature, authorization, and cookie headers by default.

Overview of X402

X402 is an HTTP-based protocol for payment-protected resources:
  • 402 Payment Required: HTTP status code for payment requests
  • payment-signature: Header containing payment credentials (X402 v2)
  • PAYMENT-REQUIRED: Header with payment requirements in 402 responses
  • PAYMENT-RESPONSE: Header with payment settlement details in success responses
  • Cryptographic Signatures: ERC-4337 account abstraction for secure payments

Supported Schemes

Nevermined supports two x402 payment schemes: The scheme is determined by the plan’s pricing configuration. Plans with isCrypto: false use nvm:card-delegation; all others use nvm:erc4337. The SDK auto-detects the scheme via resolveScheme(). The network value within nvm:card-delegation is determined by which provider issued the delegation being consumed (stripe, braintree, or visa).

Visa support

Visa delegations use the same nvm:card-delegation scheme and SDK surface as Stripe and Braintree, but two steps must happen in a browser before the SDK can consume them:
  1. Card enrolment — the cardholder enrols a Visa card through VGS Collect (PCI-compliant iframe) in the Nevermined webapp. The card is bound to a Visa Agentic Token via the VGS Credential Management Platform.
  2. Delegation creation — the cardholder approves a delegation via a WebAuthn/passkey (FIDO) device-binding ceremony embedded by Visa VTS. This produces a single-use assuranceData blob bound to the spending limit + duration + merchant context.
Both steps require a real DOM and a user gesture, so the SDK cannot perform them programmatically. Once a Visa delegation exists, the SDK consumes it identically to Stripe/Braintree — see Reusing Existing Delegations.

X402 Version 2 Specification

The Nevermined Payments Library implements X402 v2, which uses:
  • payment-signature header for access tokens (replaces Authorization)
  • PAYMENT-REQUIRED header for payment requirements (replaces custom formats)
  • PAYMENT-RESPONSE header for settlement receipts
  • Structured payment credentials with cryptographic signatures

Generate X402 Access Tokens

The supported flow is create-first: create a delegation once with payments.delegation.createDelegation(...), then request access tokens by passing only its delegationId. Both schemes (nvm:erc4337 and nvm:card-delegation) require a delegationConfig — the older “just pass planId + agentId” shape no longer mints a token and surfaces BCK.X402.0030 (“Required token-generation input is missing or incomplete”; the details field names the missing input) at the backend.
⚠️ Inline create-on-the-fly is deprecated. Passing creation fields (spendingLimitCents, durationSecs, providerPaymentMethodId, cardId, currency, merchantAccountId, maxTransactions) directly in delegationConfig instead of a delegationId still works, but getX402AccessToken now emits a runtime deprecation warning. Create the delegation first (above) and pass only { delegationId }.

Generate Tokens via Nevermined App

Users can also generate X402 access tokens through the Nevermined App:
  1. Visit nevermined.app/permissions/agent-permissions
  2. Select the plan you’ve purchased
  3. Configure token parameters (agent, expiration, limits)
  4. Generate and copy the X402 access token
  5. Use the token in API requests
This provides a user-friendly interface for non-technical users to generate tokens without code.

Generate Card-Delegation Tokens

For fiat plans using nvm:card-delegation, create the delegation first with createDelegation (passing the card’s providerPaymentMethodId), then request tokens by its delegationId. currency is required on creation:
A EUR delegation is the same call with currency: 'eur'. The delegation’s currency is fixed at creation, so you create one delegation per currency and reuse each by its delegationId.

Reusing Existing Delegations

Passing delegationConfig: { delegationId } is the supported pattern for every provider, and the only supported pattern for Visa delegations (which cannot be created from the SDK). Reuse one delegation across multiple agents that share a single spending budget:
When delegationId is provided, the backend verifies that the delegation is active and that the requesting API key has access, then returns its existing token without creating a new delegation. The provider (stripe, braintree, or visa) is inferred from the delegation record on the server. To scope a token request to a specific NVM API key, add apiKeyId alongside delegationId — both fields stay active (non-deprecated):

Deprecated: inline create-on-the-fly

⚠️ Deprecated. Supplying creation fields directly in delegationConfig instead of a delegationId (e.g. providerPaymentMethodId + spendingLimitCents, a bare cardId, or an identifier-less “auto-select” shape) still creates a delegation on the fly, but getX402AccessToken now emits a runtime deprecation warning. Use the create-first pattern above (createDelegation{ delegationId }); inline creation will be removed in a future major release.

CardDelegationConfig Reference

The deprecated fields apply only to inline create-on-the-fly. Create the delegation with createDelegation and pass only delegationId (optionally apiKeyId) here.

Auto Scheme Resolution

Use resolveScheme() to auto-detect the correct scheme from plan metadata:

DelegationAPI

Manage payment methods and delegations for card delegation:
listPaymentMethods accepts an optional ListOptions:

Update Payment Method

Restrict a card to specific NVM API Keys so only designated agents can use it:

List Delegations

Retrieve all delegations for the authenticated user:

createDelegation

Create a delegation once, then reuse it across token requests by its delegationId (the create-first pattern). This is the supported way to provision spending authority for nvm:erc4337 and nvm:card-delegation — prefer it over inline create-on-the-fly in getX402AccessToken.
CreateDelegationPayload fields:
Visa delegations require a browser-side device-binding ceremony and cannot be created from the SDK — see Visa support. Create them in the Nevermined webapp, then consume them here by delegationId.

DelegationListResponse Fields

listDelegations() resolves to a DelegationListResponse object:

DelegationSummary Fields

Each item in the delegations array is a DelegationSummary:

PaymentMethodSummary Fields

X402 Access Token Structure

The access token is a JWT containing an X402 v2 payment credential:

Card-Delegation Token Structure

For fiat plans using nvm:card-delegation, the token contains a JWT-based delegation authorization:

Token Components

  • x402Version: Protocol version (2 for current spec)
  • accepted: Payment method specification
    • scheme: nvm:erc4337 for crypto or nvm:card-delegation for fiat
    • network: eip155:84532 (Base Sepolia) for crypto, one of stripe, braintree, or visa for fiat
    • planId: The payment plan being used
    • extra: Additional metadata (version, agentId, etc.)
  • payload: Payment authorization
    • signature (erc4337): Cryptographic proof of payment authorization
    • token (card-delegation): Signed JWT encoding the delegation claims
    • authorization: Subscriber identity and session keys
  • extensions: Optional protocol extensions

Verify X402 Permissions

Agents verify tokens before executing requests:

Verification Response

Settle X402 Permissions

After successful execution, burn credits:

Settlement Response

HTTP Headers (X402 v2)

payment-signature Header

Subscribers include this header in requests:

PAYMENT-REQUIRED Header (402 Response)

Agents return this header when payment is required:
The header contains base64-encoded payment requirement JSON. The scheme and network vary by plan type: Crypto plan:
Fiat plan:

PAYMENT-RESPONSE Header (Success)

Agents include this header in successful responses:
The header contains base64-encoded settlement details:

Complete X402 Flow

Subscriber Side

Agent Side

buildPaymentRequired Helper

Simplifies creating X402PaymentRequired objects:
When scheme is set to 'nvm:card-delegation', the network is automatically set to 'stripe'.

Best Practices

  1. Always Verify Before Execute: Never skip token verification
  2. Settle After Success: Only burn credits after successful execution
  3. Use X402 v2 Headers: Prefer payment-signature over Authorization
  4. Return 402 Properly: Include PAYMENT-REQUIRED header with details
  5. Log Transactions: Record settlement transaction hashes
  6. Handle Errors: Provide clear error messages in 402 responses
  7. Token Reuse: Subscribers can reuse tokens for multiple requests
  8. Restrict Cards to API Keys: When running multiple agents, restrict each card to specific NVM API Keys using allowedApiKeyIds to prevent unauthorized spending
  9. Reuse Delegations: Pass delegationId to reuse existing delegations instead of creating new ones on each request — this avoids delegation sprawl and keeps spending consolidated

Source References:
  • src/x402/token.ts (getX402AccessToken)
  • src/x402/delegation-api.ts (DelegationAPI: listPaymentMethods, listDelegations, updatePaymentMethod)
  • src/x402/facilitator-api.ts (verifyPermissions, settlePermissions, buildPaymentRequired)
  • tests/e2e/test_x402_e2e.test.ts (complete X402 flow)