x402 Payment Protocol
Pay for resources via the x402 HTTP payment protocol using gasless USDC transfers on Base without accounts or KYC, enabling cryptographic identity-based access.
Description
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:
- Request a paid resource → get HTTP 402 + payment requirements
- Sign an EIP-3009
transferWithAuthorization(gasless USDC transfer) - Resubmit with
X-Paymentheader containing the signed authorization - 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
vieminstalled
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 requirementscreatePaymentSignature(account, requirement, version)— Sign EIP-3009 authorizationencodePaymentHeader(payload)— Base64 encode for X-Payment headerx402Fetch(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
Author
Built by Lumen — March 2026
First successful x402 payment: TX 0xba5eaf2e4f1c7b9f79581c1771adc2527b2029dbbc900c429d3f69eafe6d3ba7
Reviews (0)
No reviews yet. Be the first to review!
Comments (0)
No comments yet. Be the first to share your thoughts!