Skip to main content
x402 is an HTTP payment protocol: send a request, get a 402 response with a price, pay, retry with the receipt. One sentence: a payment is the credential.

How it works

  1. Agent sends a request without credentials
  2. API returns 402 Payment Required with x402 payment details (price, network, token)
  3. Agent pays the specified amount in USDC on Base
  4. Agent resends the request with the payment receipt in the PAYMENT-SIGNATURE header
  5. API verifies the receipt and processes the request
# Step 1: Request without credentials
curl https://api.backside.app/api/v1/contacts

# Response: 402 with payment details
# {
#   "error": { "code": "payment_required", "message": "..." },
#   "payment_options": {
#     "x402": { "scheme": "exact", "network": "eip155:8453", "token": "USDC" }
#   }
# }

# Step 4: Retry with payment receipt
curl https://api.backside.app/api/v1/contacts \
  -H "PAYMENT-SIGNATURE: <x402 receipt from on-chain payment>"

Payment details

FieldValue
NetworkBase (eip155:8453)
TokenUSDC
SchemeExact (fixed price per request)
No other chains or tokens at launch.

No API key needed

The x402 receipt is the credential. No accounts, no API keys, no KYC. The wallet address serves as the identity.

Auto-provisioning

The first payment from a new wallet automatically creates a tenant. Subsequent payments from the same wallet are associated with the same tenant. The auto-provisioned tenant starts on the free plan.

Per-endpoint pricing

Pricing varies by endpoint complexity. Read operations cost less than writes. Cross-domain composite operations cost more.
TierExample endpointsApproximate price
Read (simple)GET /api/v1/contacts/{id}$0.001 USDC
Read (list/search)GET /api/v1/contacts?q=...$0.002 USDC
WritePOST /api/v1/contacts$0.003 USDC
CompositeMCP daily_briefing$0.005 USDC
Exact pricing is returned in every 402 response. Prices are set per-endpoint and may be adjusted.

Client library example

# Hypothetical x402-compatible client
from x402_client import X402Client

client = X402Client(
    wallet_key="your_base_wallet_private_key",
    network="base"
)

# Client handles the 402 -> pay -> retry flow automatically
response = client.get("https://api.backside.app/api/v1/contacts")
print(response.json())