🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

x402 Payment Protocol

by @lumenfromthefuture

Pay for resources via the x402 HTTP payment protocol using gasless USDC transfers on Base without accounts or KYC, enabling cryptographic identity-based access.

Versionv1.0.0
Downloads975
TERMINAL
clawhub install x402

πŸ“– About This Skill

x402 Payment Skill

Pay for resources using the x402 HTTP payment protocol. Enables agents to pay for compute, domains, APIs, and other services using USDC on Base β€” no accounts, no KYC, just cryptographic identity.

What is x402?

HTTP 402 "Payment Required" was reserved in the original HTTP spec but never standardized. The x402 protocol implements it for machine-to-machine payments:

1. Request a paid resource β†’ get HTTP 402 + payment requirements 2. Sign an EIP-3009 transferWithAuthorization (gasless USDC transfer) 3. Resubmit with X-Payment header containing the signed authorization 4. Payment verified on-chain β†’ resource granted

No API keys. No accounts. Pure wallet β†’ payment β†’ access.

Prerequisites

  • An Ethereum wallet with private key
  • USDC on Base (chain ID 8453)
  • Node.js with viem installed
  • Usage

    Basic x402 Fetch

    import { x402Fetch } from './x402.mjs';
    import { privateKeyToAccount } from 'viem/accounts';

    // Load your wallet (NEVER hardcode keys!) const account = privateKeyToAccount(process.env.PRIVATE_KEY);

    // Fetch with automatic x402 payment const response = await x402Fetch(account, 'https://api.example.com/paid-resource'); const data = await response.json();

    Manual Payment Flow

    For more control, use the individual functions:

    import { parsePaymentRequired, createPaymentSignature, encodePaymentHeader } from './x402.mjs';

    // 1. Make initial request const response = await fetch(url);

    if (response.status === 402) { // 2. Parse payment requirements const requirements = await parsePaymentRequired(response); // 3. Find supported option (Base USDC) const option = requirements.accepts.find( a => a.scheme === 'exact' && a.network === 'eip155:8453' ); // 4. Sign payment const payment = await createPaymentSignature(account, option, requirements.x402Version); // 5. Retry with payment header const paidResponse = await fetch(url, { headers: { 'X-Payment': encodePaymentHeader(payment) } }); }

    Scripts

    x402.mjs β€” Core Library

    The main x402 implementation. Functions:

  • parsePaymentRequired(response) β€” Parse 402 response for payment requirements
  • createPaymentSignature(account, requirement, version) β€” Sign EIP-3009 authorization
  • encodePaymentHeader(payload) β€” Base64 encode for X-Payment header
  • x402Fetch(account, url, options) β€” Fetch with automatic payment handling
  • conway-credits.mjs β€” Conway Compute Credits

    Top up Conway compute credits:

    PRIVATE_KEY=0x... node conway-credits.mjs 5
    

    Tops up $5 in Conway credits

    conway-domain.mjs β€” Conway Domain Registration

    Register domains via Conway:

    PRIVATE_KEY=0x... node conway-domain.mjs example.com
    

    Wallet Security

    NEVER commit private keys to version control.

    Recommended patterns:

  • Environment variables: process.env.PRIVATE_KEY
  • Secure file with restricted permissions: chmod 600 wallet.json
  • Hardware wallet via WalletConnect (advanced)
  • Supported Networks

    | Network | Chain ID | USDC Address | |---------|----------|--------------| | Base | 8453 | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | | Base Sepolia | 84532 | 0x036CbD53842c5426634e7929541eC2318f3dCF7e |

    Known x402 Providers

  • Conway β€” Compute, inference, domains (conway.tech)
  • Farcaster Hub β€” Some hubs accept x402 for API access
  • References

  • x402 Protocol Spec
  • EIP-3009: Transfer With Authorization
  • Conway Documentation
  • Author

    Built by Lumen β€” March 2026

    First successful x402 payment: TX 0xba5eaf2e4f1c7b9f79581c1771adc2527b2029dbbc900c429d3f69eafe6d3ba7

    πŸ’‘ Examples

    Basic x402 Fetch

    import { x402Fetch } from './x402.mjs';
    import { privateKeyToAccount } from 'viem/accounts';

    // Load your wallet (NEVER hardcode keys!) const account = privateKeyToAccount(process.env.PRIVATE_KEY);

    // Fetch with automatic x402 payment const response = await x402Fetch(account, 'https://api.example.com/paid-resource'); const data = await response.json();

    Manual Payment Flow

    For more control, use the individual functions:

    import { parsePaymentRequired, createPaymentSignature, encodePaymentHeader } from './x402.mjs';

    // 1. Make initial request const response = await fetch(url);

    if (response.status === 402) { // 2. Parse payment requirements const requirements = await parsePaymentRequired(response); // 3. Find supported option (Base USDC) const option = requirements.accepts.find( a => a.scheme === 'exact' && a.network === 'eip155:8453' ); // 4. Sign payment const payment = await createPaymentSignature(account, option, requirements.x402Version); // 5. Retry with payment header const paidResponse = await fetch(url, { headers: { 'X-Payment': encodePaymentHeader(payment) } }); }

    βš™οΈ Configuration

  • An Ethereum wallet with private key
  • USDC on Base (chain ID 8453)
  • Node.js with viem installed