Framework-agnostic payer for the x402 HTTP payment protocol. Works with LangChain, CrewAI, AutoGen, LangGraph, or any other agent framework.
Project description
x402-agent
Framework-agnostic payer for the x402 HTTP payment protocol.
x402-agentis an independent open-source package. It is not affiliated with, endorsed by, or sponsored by the x402 Foundation, LF Projects, LLC, or Coinbase, Inc. "x402" is used nominatively to refer to the open HTTP payment protocol. Maintained by Xenarch.
Zero framework dependencies. Subclass or compose from LangChain, CrewAI, AutoGen, LangGraph, or anything else that wants to let an agent spend USDC against a 402 Payment Required response without rolling its own pay loop.
What it does
from decimal import Decimal
from x402_agent import X402Payer, BudgetPolicy
payer = X402Payer(
private_key="0x...",
budget_policy=BudgetPolicy(
max_per_call=Decimal("0.05"),
max_per_session=Decimal("1.00"),
),
)
result = payer.pay("https://example.com/gated/article")
# {"success": True, "body": "...", "amount_usd": "0.01", ...}
pay(url) walks the full challenge: GET → parse 402 → pick a supported (scheme, network) → enforce your budget → sign an EIP-3009 USDC authorisation → retry with the version-correct payment header (PAYMENT-SIGNATURE for V2, X-PAYMENT for V1 legacy gates) → return the unlocked body. Never raises; every failure mode is a dict you can show an LLM.
Async via await payer.pay_async(url).
What's in the package
| Symbol | Purpose |
|---|---|
X402Payer |
Neutral pay loop with _pre_payment_hook / _post_payment_hook for subclasses |
BudgetPolicy |
Per-call + per-session spend caps, optional human-approval callback, thread-safe |
select_accept |
Pick a supported (scheme, network) from a parsed PaymentRequired |
price_usd |
Atomic-units → Decimal USD using the advertised asset decimals |
is_public_host / is_public_host_async |
SSRF guard for agent-provided URLs |
budget_hint_exceeds |
Early-refusal check against pay.json budget_hints |
payment_headers |
Return the (request, response) header pair for V1 vs V2 wire |
Constants (DEFAULT_NETWORK, DEFAULT_SCHEME, X_PAYMENT_HEADER, X_PAYMENT_RESPONSE_HEADER, PAYMENT_SIGNATURE_HEADER, PAYMENT_RESPONSE_HEADER) are exported so adapters don't have to hard-code them.
Subclassing
The four hooks are the intended extension point. Override any subset:
class MyPayer(X402Payer):
def _pre_payment_hook(self, *, url, accept, price):
# Return an error dict to abort before the budget lock.
if self._is_suspicious(accept.pay_to):
return {"error": "refused_by_policy"}
return None
def _post_payment_hook(self, result, paid_response):
# Mutate result in place; post runs after budget.commit().
result["signed_by"] = "my-facilitator"
Pre-hook runs before the budget lock so a slow external check (reputation lookup, etc.) can't block other concurrent payments. Post-hook runs after the spend is committed so a receipt fetch failure can't revert a paid GET.
Stability
__all__ defines the v0.x stable surface. Anything in x402_agent._helpers or x402_agent._payer is accessible but subject to rename.
Licence
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_agent-0.2.0.tar.gz.
File metadata
- Download URL: x402_agent-0.2.0.tar.gz
- Upload date:
- Size: 124.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"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 |
0c151b9183944aa9af3695e3c4d00c885ecf21448dd2e277a0c3a9a3bc1a24bb
|
|
| MD5 |
b11dd7bbf35dc2a7b0d6dbe7b092b12e
|
|
| BLAKE2b-256 |
abc97977451490f02dea0525b29bf2bd0e5a94da93ea17b7ee18a39a68b437e2
|
File details
Details for the file x402_agent-0.2.0-py3-none-any.whl.
File metadata
- Download URL: x402_agent-0.2.0-py3-none-any.whl
- Upload date:
- Size: 14.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"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 |
e2663ddb6df7a1525268111f0039862ac04322d43ffed8f70a579f5253316391
|
|
| MD5 |
e5cbbdff08785469b5aaf6332de3e21c
|
|
| BLAKE2b-256 |
2a4498b4bde8a9e5af7ba02e197c45032fbb6db009a40077c3b22833c6e77676
|