Pay for x402 APIs with 3 lines of Python — no wallet needed
Project description
x402-pay
Call any x402 API with one line of Python. No wallet needed.
import x402_pay
resp = x402_pay.get("https://weather.hugen.tokyo/weather/current?city=Tokyo")
print(resp.json())
Auto-provisions an API key with $0.05 trial credit on first use. Routes requests through a broker that handles on-chain payment on your behalf.
Install
pip install x402-pay
Quick Demo
python -m x402_pay demo
Walks through key creation, API call, and balance check in 10 seconds.
Usage
One-liner (sync)
import x402_pay
resp = x402_pay.get("https://weather.hugen.tokyo/weather/current?city=Tokyo")
print(resp.json())
resp = x402_pay.post("https://defi.hugen.tokyo/defi/simulate", json={
"chain_id": "1", "from": "0xABC...", "to": "0xDEF...",
})
Discover APIs
import x402_pay
apis = x402_pay.discover("token security")
for api in apis:
print(f"{api['description']} — {api['price']}")
resp = x402_pay.get(api["url"])
Async client
from x402_pay import PayClient
async with PayClient() as client:
resp = await client.get("https://weather.hugen.tokyo/weather/current?city=Tokyo")
print(resp.json())
print(f"Balance: ${await client.balance():.2f}")
Explicit API key
from x402_pay import PayClient
async with PayClient(api_key="gw_YOUR_KEY") as client:
resp = await client.get("https://defi.hugen.tokyo/defi/token?chain=ethereum&address=0x...")
Wallet mode (power users)
pip install x402-pay[wallet]
from x402_pay import DirectClient
async with DirectClient(private_key="0x...") as client:
resp = await client.get("https://weather.hugen.tokyo/weather/current?city=Tokyo")
How Billing Works
- First call auto-creates an API key with $0.05 trial credit
- Key saved to
~/.x402-pay/config.json - Each API call deducts from your balance ($0.005–$0.50 depending on the API)
- Low balance warning prints to stderr when you have ~1 call left
- When balance runs out,
InsufficientBalanceis raised with a topup URL
Topping up
try:
resp = x402_pay.get("https://scout.hugen.tokyo/scout/hn?q=AI")
except x402_pay.InsufficientBalance as e:
print(f"Balance: ${e.balance:.2f}, need: ${e.needed:.2f}")
print(f"Top up ($1.00 USDC on Base): {e.topup_url}")
The topup URL accepts a $1.00 x402 payment (USDC on Base chain). After payment, your key is credited immediately and you can retry the call.
Check your balance anytime:
python -m x402_pay balance
Verbose Mode
See cost and balance after every call:
import x402_pay
x402_pay.set_verbose()
resp = x402_pay.get("https://weather.hugen.tokyo/weather/current?city=Tokyo")
# stderr: [x402-pay] cost=$0.0050 balance=$0.0450
Or via environment variable:
X402_VERBOSE=1 python my_script.py
Configuration
| Variable | Default | Description |
|---|---|---|
X402_API_KEY |
auto-created | API key for broker mode |
X402_BROKER_URL |
https://discovery.hugen.tokyo |
Broker endpoint |
X402_PAY_CONFIG_DIR |
~/.x402-pay |
Config directory |
X402_VERBOSE |
off | Print cost/balance to stderr |
CLI
python -m x402_pay demo # live walkthrough
python -m x402_pay balance # check credit
python -m x402_pay info # show config details
API Reference
Module-level (sync)
x402_pay.get(url, **kwargs)— sync GET through brokerx402_pay.post(url, **kwargs)— sync POST through brokerx402_pay.balance()— check balance in USDx402_pay.discover(query, limit=5)— search API catalogx402_pay.set_verbose(True)— enable cost/balance output
PayClient (async)
PayClient(api_key="", broker_url="", timeout=60.0)await client.get(url)/await client.post(url)— API callsawait client.balance()— balance in USDawait client.topup_url()— URL to add creditawait client.discover(query)— search API catalog
DirectClient (async, requires [wallet])
DirectClient(private_key="0x...")await client.get(url)/await client.post(url)— direct x402 payment
Exceptions
PayError— base exceptionInsufficientBalance— balance too low (.balance,.needed,.topup_url)NotInCatalog— URL not in catalog (.url)BrokerError— upstream call failed (.refunded)
License
MIT
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 x402_pay-0.4.0.tar.gz.
File metadata
- Download URL: x402_pay-0.4.0.tar.gz
- Upload date:
- Size: 17.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f275bbf10ce794b6c399cfc806a271bf570edf980f8815a3c9a2527e8e1a6754
|
|
| MD5 |
b8df98c433143c82d08f74aabd59322a
|
|
| BLAKE2b-256 |
11af3abe9b60a722de4557e4cb1022ccdf2340837d09feb74b109d4efe141f55
|
File details
Details for the file x402_pay-0.4.0-py3-none-any.whl.
File metadata
- Download URL: x402_pay-0.4.0-py3-none-any.whl
- Upload date:
- Size: 16.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
01e1958963a75321aac6968a0d81a8c5a7e1ea8b6bcbbb4dcbfa3110bf691928
|
|
| MD5 |
511e099e49daa487fca3cf2f4839d00e
|
|
| BLAKE2b-256 |
9fc5dd6e88bda299c189a6661c2606c8b709a435fc2d631903fd43daa48d3f33
|