The repository or configuration that created this release differ from a previous release. View details.
This release is a pre-release and may not be stable for production use.
blockchain0x-x402 (Python)
Official Python port of @blockchain0x/x402.
Ships the wire primitives + a 402-aware fetch wrapper. Sibling
package to blockchain0x; install only when your service either
issues x402-aware HTTP calls (a payer) or verifies inbound x402
payments (a recipient).
Pre-release:
0.0.1a0ships the wire primitives + theX402Client402-aware fetch wrapper + ASGI middleware (Starlette / FastAPI / Quart) + a Flaskbefore_requesthook.
Why a separate package
x402 is a separable concern from the rest of the Blockchain0x SDK:
- A consumer who only verifies inbound webhooks does not need the x402 client stack.
- A service that exposes paid HTTP routes does not need the webhook verifier bundled with it.
Keeping them as two pip-installable packages lets each downstream service depend only on what it actually uses.
Install
pip install blockchain0x-x402
For the payer path (X402Client) you also need the main SDK:
pip install blockchain0x blockchain0x-x402
For the recipient/verifier path you only need blockchain0x-x402.
Verify an inbound x402 payment (recipient)
from blockchain0x_x402 import parse_payment_header, X402WireError
def verify(request):
raw = request.headers.get("X-Payment")
try:
payment = parse_payment_header(raw)
except X402WireError as e:
return JSONResponse({"code": e.code}, status_code=400)
# payment.payment_request_id, payment.tx_hash, payment.network
# ...
The verifier:
- Accepts only
exact-usdc:<base64>scheme; anything else rejects withheader.unknown_scheme. - Validates txHash, payerAddress, amountUsdc, and network shape; any
drift rejects with
header.payload_malformed. - Lowercases hex fields so downstream comparisons against on-chain transaction logs are deterministic.
Issue x402-aware HTTP calls (payer)
import os
from blockchain0x import Client
from blockchain0x_x402 import X402Client
sdk = Client(api_key=os.environ["BLOCKCHAIN0X_API_KEY"])
x402 = X402Client(sdk=sdk, agent_id="agt_...")
response = x402.fetch("https://service-b.com/llm-query", method="POST")
response.raise_for_status()
The wrapper handles a 402 response transparently:
- Parses the 402 body and picks the requirement matching the SDK's network.
- Calls
sdk.payments.create(...)to settle on-chain. The SDK auto-attaches anIdempotency-Keyso a flaky retry does not double-spend. - Polls
sdk.transactions.get(payment_id)every 1s for up to 30s until the transaction confirms. - Rebuilds the request with the
X-Paymentheader and re-issues it once. The second 200 response is returned to the caller.
Failures surface as X402ClientError with stable codes:
no_matching_requirement- the 402 had noacceptsentry for the SDK's network mode.settlement_timeout- the on-chain payment did not confirm within the poll window.chain_failed- the payment row flipped tofailedstatus before confirming.
Expose a paid HTTP route (recipient, server-side)
Two ready-made adapters wrap the verifier into a framework-level gate so paid routes do not have to repeat the parse + settle dance themselves.
Starlette / FastAPI / any ASGI app
from starlette.applications import Starlette
from blockchain0x import Client
from blockchain0x_x402.server import X402Middleware, PricingEntry
sdk = Client(api_key=os.environ["BLOCKCHAIN0X_API_KEY"])
app = Starlette(routes=[...])
app.add_middleware(
X402Middleware,
sdk=sdk,
pricing={
"POST /llm-query": PricingEntry(
amount_usdc="0.10",
pay_to_address="0xabc...",
payment_request_id="pr_demo",
),
},
)
A miss in the pricing table is a no-op (the route is free). A hit
with no valid X-Payment short-circuits the response with HTTP 402
and the canonical accepts[] body the payer needs. A hit with a
valid payment attaches the parsed payload to scope["x402_payment"]
for downstream handlers and lets the request proceed.
Flask
from flask import Flask, g
from blockchain0x import Client
from blockchain0x_x402.server import x402_before_request_factory, PricingEntry
app = Flask(__name__)
app.before_request(x402_before_request_factory(
sdk=Client(api_key=os.environ["BLOCKCHAIN0X_API_KEY"]),
pricing={
"POST /llm-query": PricingEntry(
amount_usdc="0.10",
pay_to_address="0xabc...",
payment_request_id="pr_demo",
),
},
))
@app.post("/llm-query")
def handler():
# g.x402_payment is the verified ExactUsdcPayment payload.
...
Both adapters call sdk.payment_requests.settle() once per request
to anchor trust; the backend's settle route is the chain-of-custody
boundary. The settle() impl may be sync OR async - the adapter
awaits whichever shape it returns.
Wire-format cross-compatibility
The Python build_payment_header output is byte-for-byte identical
to the Node SDK's. A Python payer can pay a Node server, a Node
payer can pay a Python server - the canonical JSON shape is:
{
"scheme": "exact-usdc",
"version": 1,
"paymentRequestId": "...",
"txHash": "...",
"payerAddress": "...",
"amountUsdc": "...",
"network": "..."
}
Keys are insertion-ordered; no whitespace between separators. The
hex fields (txHash, payerAddress) are lowercased before encoding.
License
Apache-2.0.
Metadata
Release files for blockchain0x-x402 0.0.1a1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Change of provenance
The repository or configuration that created these release files differ from that of a previous release.
We recommend inspecting the repository and configuration before proceeding. View details.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| blockchain0x_x402-0.0.1a1.tar.gz | 26.5 kB | With provenance | Details for blockchain0x_x402-0.0.1a1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| blockchain0x_x402-0.0.1a1-py3-none-any.whl | Python 3 | none | any | Details for blockchain0x_x402-0.0.1a1-py3-none-any.whl |
Total release size: 51.5 kB
Release files / blockchain0x_x402-0.0.1a1.tar.gz
Change of provenance
This file belongs to a release with changed provenance: the repository or configuration that created the release files differ from that of a previous release.
We recommend inspecting the repository and configuration before proceeding. View details.
| Download URL | blockchain0x_x402-0.0.1a1.tar.gz |
|---|---|
| Size | 26.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dfe26e6b85b02366c875dabfb24bbb5df5d507fc091800fd6364baddeeaf8897
|
|
BLAKE2b-256 checksum How to use checksums |
c394984bb6a114c7966d399e5d72660112c1a8cc221c609f7c03e8c29f550ade
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.
Transparency logRelease files / blockchain0x_x402-0.0.1a1-py3-none-any.whl
Change of provenance
This file belongs to a release with changed provenance: the repository or configuration that created the release files differ from that of a previous release.
We recommend inspecting the repository and configuration before proceeding. View details.
| Download URL | blockchain0x_x402-0.0.1a1-py3-none-any.whl |
|---|---|
| Size | 25.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8cfb899824c2a902e12832b7d7ad11d1ebbac127319fc4aa4725188e92c806ef
|
|
BLAKE2b-256 checksum How to use checksums |
0f939fa58bc9d8f628ba53ea1e2f9c8c3900164f68904b5420714868f47bc6ea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.
Transparency logSecurity for blockchain0x-x402 0.0.1a1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Change of provenance
The repository and configuration that created this release differ from a previous release.
While this could reflect a routine change by the project maintainers, it may also indicate that the release files have been compromised.
Repository
Attestation for blockchain0x_x402-0.0.1a1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.