x402 payment protocol integration for LangChain - enable AI agents to pay for APIs with USDC
Project description
langchain-x402
Enable AI agents to pay for APIs with USDC using the x402 protocol.
langchain-x402 integrates the x402 payment protocol with LangChain, allowing your AI agents to autonomously access paid APIs without managing API keys or subscriptions.
What is x402?
x402 is the HTTP-native payment protocol that finally implements the 402 Payment Required status code. Instead of API keys and monthly subscriptions, software pays software—per request, in USDC, with cryptographic proof.
How it works:
- Agent requests a resource
- Server returns
402 Payment Requiredwith price info - Agent signs a USDC payment authorization (EIP-3009)
- Agent retries with payment proof
- Server settles on-chain, returns data
All in a single HTTP round-trip.
Installation
pip install langchain-x402
Quick Start
import os
from langchain_x402 import X402Wallet, X402PaymentTool
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agent
# 1. Create a wallet with a USDC budget
wallet = X402Wallet(
private_key=os.environ["WALLET_PRIVATE_KEY"],
network="eip155:8453", # Base mainnet (CAIP-2 format)
budget_usd=10.00
)
# 2. Create the payment tool
tool = X402PaymentTool(wallet=wallet)
# 3. Add to your agent
llm = ChatOpenAI(model="gpt-4o")
agent = create_react_agent(llm, tools=[tool], prompt=your_prompt)
executor = AgentExecutor(agent=agent, tools=[tool])
# 4. Agent can now access any x402-enabled API
result = executor.invoke({
"input": "Get the premium analysis from https://sandbox.agentrails.io/api/x402/protected/analysis"
})
Try It with the Sandbox
The AgentRails Sandbox is a free test environment with x402-protected endpoints you can hit right away. No signup required to see the 402 flow in action.
1. Check available endpoints and pricing
curl https://sandbox.agentrails.io/api/x402/pricing
{
"endpoints": [
{ "resource": "/api/x402/protected/analysis", "amountUsdc": 0.01 },
{ "resource": "/api/x402/protected/data", "amountUsdc": 0.001 }
],
"supportedNetworks": [
"eip155:5042002", "eip155:84532", "eip155:11155111",
"eip155:8453", "eip155:1"
],
"payTo": "0x6255d8dd3f84ec460fc8b07db58ab06384a2f487"
}
2. See a 402 response
curl -i https://sandbox.agentrails.io/api/x402/protected/analysis
# → 402 Payment Required
# → PAYMENT-REQUIRED: <base64-encoded payment requirements>
3. Point your agent at the sandbox
wallet = X402Wallet(
private_key=os.environ["WALLET_PRIVATE_KEY"],
network="eip155:84532", # Base Sepolia testnet (CAIP-2 format)
budget_usd=1.00
)
tool = X402PaymentTool(wallet=wallet)
# The tool handles the 402 → sign → retry flow automatically
result = tool.invoke({
"url": "https://sandbox.agentrails.io/api/x402/protected/analysis"
})
Sandbox Endpoints
| Endpoint | Cost | Description |
|---|---|---|
GET /api/x402/protected/analysis |
$0.01 USDC | AI analysis (premium) |
GET /api/x402/protected/data |
$0.001 USDC | Data endpoint (micropayment) |
GET /api/x402/pricing |
Free | Pricing for all protected endpoints |
GET /api/x402/stats |
Free | Payment statistics |
Full API reference: sandbox.agentrails.io/swagger
Features
Automatic Payment Handling
The X402PaymentTool automatically detects 402 responses and handles payment negotiation:
tool = X402PaymentTool(
wallet=wallet,
auto_pay=True, # Automatically pay when within budget
timeout=30.0, # Request timeout in seconds
)
Budget Control
Set spending limits at the wallet level:
wallet = X402Wallet(
private_key=key,
network="eip155:8453",
budget_usd=5.00 # Agent can't spend more than $5
)
# Check remaining budget
print(f"Remaining: ${wallet.remaining_usd}")
# Check if can afford a specific amount
if wallet.can_afford(0.01):
print("Can afford $0.01 request")
Per-Request Price Limits
Limit how much an agent can pay for a single request:
# In the tool input
result = tool.invoke({
"url": "https://sandbox.agentrails.io/api/x402/protected/analysis",
"max_price_usd": 0.05 # Won't pay more than $0.05 for this request
})
Payment History
Track all payments made by the wallet:
for payment in wallet.payments:
print(f"{payment.resource_url}: ${payment.amount_usd}")
# Get summary
summary = wallet.get_payment_summary()
print(f"Total spent: ${summary['spent_usd']}")
print(f"Payments made: {summary['payment_count']}")
Multi-Network Support
Supports multiple EVM networks using CAIP-2 identifiers:
# Base (recommended - low fees)
wallet = X402Wallet(private_key=key, network="eip155:8453")
# Ethereum
wallet = X402Wallet(private_key=key, network="eip155:1")
# Testnets
wallet = X402Wallet(private_key=key, network="eip155:84532") # Base Sepolia
wallet = X402Wallet(private_key=key, network="eip155:5042002") # Arc testnet
Legacy network names (
base-mainnet,base-sepolia, etc.) are still accepted for backwards compatibility.
API Reference
X402Wallet
X402Wallet(
private_key: str, # Hex-encoded private key
network: str, # CAIP-2 network ID (e.g., "eip155:8453")
budget_usd: float, # Maximum USD to spend
)
Properties:
address- Wallet addressspent_usd- Total USD spentremaining_usd- Remaining budgetpayments- List of PaymentRecord objects
Methods:
can_afford(amount_usd)- Check if budget allows paymentsign_payment(to, amount, valid_before)- Sign EIP-3009 authorizationget_payment_summary()- Get spending summary dictreset_budget(new_budget)- Reset budget and clear history
X402PaymentTool
X402PaymentTool(
wallet: X402Wallet, # Wallet for payments
auto_pay: bool = True, # Auto-pay when within budget
timeout: float = 30.0, # HTTP timeout
)
Tool Input Schema:
{
"url": str, # Required: URL to request
"method": str = "GET", # HTTP method
"body": str | None, # Request body
"headers": dict | None, # Additional headers
"max_price_usd": float | None, # Per-request price limit
}
Networks
V2 uses CAIP-2 network identifiers:
| Network ID (CAIP-2) | Chain ID | Environment | Legacy Alias |
|---|---|---|---|
eip155:8453 |
8453 | Production | base-mainnet |
eip155:84532 |
84532 | Testnet | base-sepolia |
eip155:1 |
1 | Production | ethereum-mainnet |
eip155:11155111 |
11155111 | Testnet | ethereum-sepolia |
eip155:5042002 |
5042002 | Testnet | arc-testnet |
Security Considerations
- Never commit private keys - Use environment variables or secret managers
- Set appropriate budgets - Limit what agents can spend
- Use testnets first - Test with
eip155:84532(Base Sepolia) before mainnet - Monitor spending - Check
wallet.get_payment_summary()regularly
Examples
See the examples/ directory:
basic_agent.py- Simple ReAct agent with payment capabilitymulti_api.py- Agent accessing multiple paid APIs
How It Differs From API Keys
| API Keys | x402 |
|---|---|
| 1 key per service | 1 wallet for all services |
| Monthly subscriptions | Pay per request |
| Human signup required | Zero onboarding |
| Credential rotation | No credentials to leak |
| Service-level limits | Agent-level budgets |
Related Packages
- crewai-x402 - x402 integration for CrewAI
Resources
- x402 Protocol Spec
- AgentRails Documentation
- AgentRails Swagger (Sandbox)
- EIP-3009 Specification
- LangChain Custom Tools
License
MIT License - see LICENSE for details.
Contributing
Contributions welcome! Please read our contributing guidelines and submit PRs to the GitHub repository.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file langchain_x402-0.2.1.tar.gz.
File metadata
- Download URL: langchain_x402-0.2.1.tar.gz
- Upload date:
- Size: 14.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1fa5bc6092562f3f50e6dd07cc84fa5993328e7e5e2d4308116e91a13d01e662
|
|
| MD5 |
182247d6d3e8d4f6f744118d5ac44d42
|
|
| BLAKE2b-256 |
36b7c612e02890802d86dc6e677043f74d1d4b8e43b3f7c6a2d9f7eb1636f1f7
|
File details
Details for the file langchain_x402-0.2.1-py3-none-any.whl.
File metadata
- Download URL: langchain_x402-0.2.1-py3-none-any.whl
- Upload date:
- Size: 13.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
003e9e2fa6cf0d036c4eb4678e2ac99410f21499196197d7e19f287c58e1c640
|
|
| MD5 |
0a802b7d2b5ef5087aa455b88d47210f
|
|
| BLAKE2b-256 |
7b1f35a4f971f6b74433223340b9ff8da2a7c841a7f437fbcc658e50d85066d3
|