Turn any API into a paid service instantly with HTTP 402 Payment Required protocol
xPay2 is a proxy service that adds payment functionality to any existing API without requiring code changes. Developers paste their backend URL, set a price, and get a paid public endpoint powered by the x402 protocol and USDC payments on Base.
- π Zero Backend Integration - Works with any HTTP API, no code changes needed
- π³ HTTP 402 Protocol - Standards-compliant payment-required responses
- β‘ Credit System - Prepaid API usage with instant, gasless requests
- π EIP-712 Signatures - Cryptographically secure authentication
- π Usage Analytics - Track all requests, payments, and settlements
- π Multi-Chain Support - Base, Optimism, Arbitrum, Polygon
- π° USDC Payments - Stable, predictable pricing
- Node.js 18+
- USDC on Base network
- Private key with USDC balance
# Clone the repository
git clone <repo-url>
cd ethindia-xPay2
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env
# Add your EVM_PRIVATE_KEY and ADDRESS to .env
# Initialize the database
npm run init-db
# Start the development server
npm run dev# 1. Create a project with a paid endpoint
curl -X POST http://localhost:3000/api/projects \
-H "Content-Type: application/json" \
-d '{
"name": "My API",
"description": "My paid API service",
"defaultPrice": 0.01,
"currency": "USD",
"payTo": "0xYourAddress",
"paymentChains": ["base"],
"endpoints": [{
"url": "https://api.example.com",
"path": "/data",
"method": "GET",
"price": 0.01,
"description": "Get data endpoint"
}]
}'
# 2. Your proxy URL is now live!
# http://localhost:3000/api/proxy/{project-slug}/data
# 3. Requests without payment return 402
curl http://localhost:3000/api/proxy/{project-slug}/data
# Returns: 402 Payment Required with payment instructions
# 4. Use x402-fetch to make paid requests
# See examples/ directory for client codeThe credit system enables prepaid API usage with instant, gasless requests:
- Overpay once - Pay $0.05 for a $0.01 endpoint
- Get $0.04 in credits - Automatically stored in your account
- Use credits instantly - Make requests with zero-value signatures
- No gas fees - Credit usage skips on-chain settlement
// First request: Pay $0.05 for $0.01 endpoint
// β Creates $0.04 in credits
// Subsequent requests: Use zero-value authentication
// β Deducts $0.01 from credits (now $0.03)
// β Instant response, no on-chain transaction
// β No gas fees
// Continue until credits depleted
// β System returns 402 asking for payment# Enable credits for an endpoint
curl -X PATCH http://localhost:3000/api/endpoints/{endpoint-id} \
-H "Content-Type: application/json" \
-d '{
"creditsEnabled": true,
"minTopupAmount": 0.01
}'Run the comprehensive test suite:
node e2e-test.jsTest Coverage:
- β 20/20 tests passing
- Basic payment flow
- Credit creation via overpayment
- Zero-value authentication
- Credit exhaustion handling
- Edge cases (invalid signatures, expired timestamps)
βββββββββββββββ
β Client β
β (x402-fetch)β
ββββββββ¬βββββββ
β X-Payment: <signature>
βΌ
βββββββββββββββββββββββββββββββββββ
β xPay2 Proxy β
β ββββββββββββββββββββββββββββ β
β β 1. Verify Payment β β
β β - EIP-712 signature β β
β β - Credit balance β β
β ββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββ β
β β 2. Forward Request β β
β β - Add headers β β
β β - Proxy to backend β β
β ββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββ β
β β 3. Settle Payment β β
β β - On-chain (if paid) β β
β β - Skip (if credits) β β
β ββββββββββββββββββββββββββββ β
ββββββββββ¬βββββββββββββββββββββββββ
β Response + Receipt
βΌ
βββββββββββββββββββ
β Your Backend β
β (no changes!) β
βββββββββββββββββββ
POST /api/projects
Content-Type: application/json
{
"name": "My API",
"description": "API description",
"defaultPrice": 0.02,
"currency": "USD",
"payTo": "0xYourAddress",
"paymentChains": ["base"],
"endpoints": [...]
}PATCH /api/endpoints/{endpointId}
Content-Type: application/json
{
"creditsEnabled": true,
"minTopupAmount": 0.01
}GET /api/proxy/{project-slug}/{endpoint-path}
X-Payment: <base64-encoded-x402-payment>All proxied requests include tracking headers:
X-Proxy-Payment-Status- Payment verification statusX-Proxy-Settlement-Status- On-chain settlement statusX-Credit-Balance- Remaining credit balance (if credits enabled)X-Credit-Used- Whether credits were used for this requestX-Credit-Total-Deposited- Total credits ever depositedX-Credit-Total-Spent- Total credits ever spent
- Next.js - Pages Router for API routes
- SQLite + Drizzle ORM - Lightweight database
- viem - Ethereum interactions and EIP-712 signing
- x402 - HTTP 402 protocol implementation
- BigNumber.js - Precise decimal arithmetic
- Base Network - Layer 2 for cheap USDC transfers
- Full cryptographic verification of all signatures
- Validates against USDC's EIP-712 domain
- Timestamp validation (validAfter/validBefore)
- Nonce-based replay protection
- Eliminates JavaScript floating-point errors
- Ensures exact credit calculations
- Prevents balance discrepancies
Example:
// Without BigNumber β
0.03 - 0.01 = 0.019999999999999997
// With BigNumber β
new BigNumber(0.03).minus(0.01) = 0.02# Required
EVM_PRIVATE_KEY=0x... # Private key for settlement
ADDRESS=0x... # Address to receive payments
# Optional
FACILITATOR_URL=https://facilitator.coinbase.com
ENABLE_SETTLEMENT=true # Enable on-chain settlement
NEXT_PUBLIC_APP_URL=http://localhost:3000# Build for production
npm run build
# Start production server
npm start
# Or deploy to Vercel
vercel deploySee the examples/ directory for:
- Client implementation with x402-fetch
- Credit usage patterns
- Error handling
- Multi-endpoint projects
Contributions welcome! Please read CLAUDE.md for development guidelines.
MIT
Built with β€οΈ for ETHIndia 2024