Skip to main content

x402: An internet native payments protocol

Project description

x402 Python

Python package for the x402 payments protocol.

Installation

pip install x402

Overview

The x402 package provides the core building blocks for implementing the x402 Payment Protocol in Python. It's designed to be used by:

  • FastAPI middleware for accepting payments
  • Flask middleware for accepting payments
  • httpx client for paying resources
  • requests client for paying resources

FastAPI Integration

The simplest way to add x402 payment protection to your FastAPI application:

from fastapi import FastAPI
from x402.fastapi.middleware import require_payment

app = FastAPI()
app.middleware("http")(
    require_payment(price="0.01", pay_to_address="0x209693Bc6afc0C5328bA36FaF03C514EF312287C")
)

@app.get("/")
async def root():
    return {"message": "Hello World"}

To protect specific routes:

app.middleware("http")(
    require_payment(price="0.01",
    pay_to_address="0x209693Bc6afc0C5328bA36FaF03C514EF312287C"),
    path="/foo"  # <-- this can also be a list ex: ["/foo", "/bar"]
)

Flask Integration

The simplest way to add x402 payment protection to your Flask application:

from flask import Flask
from x402.flask.middleware import PaymentMiddleware

app = Flask(__name__)

# Initialize payment middleware
payment_middleware = PaymentMiddleware(app)

# Add payment protection for all routes
payment_middleware.add(
    price="$0.01",
    pay_to_address="0x209693Bc6afc0C5328bA36FaF03C514EF312287C",
)

@app.route("/")
def root():
    return {"message": "Hello World"}

To protect specific routes:

# Protect specific endpoint
payment_middleware.add(
    path="/foo",
    price="$0.001",
    pay_to_address="0x209693Bc6afc0C5328bA36FaF03C514EF312287C",
)

Client Integration

Simple Usage

Httpx Client

from eth_account import Account
from x402.clients.httpx import x402HttpxClient

# Initialize account
account = Account.from_key("your_private_key")

# Create client and make request
async with x402HttpxClient(account=account, base_url="https://api.example.com") as client:
    response = await client.get("/protected-endpoint")
    print(await response.aread())

Requests Session Client

from eth_account import Account
from x402.clients.requests import x402_requests

# Initialize account
account = Account.from_key("your_private_key")

# Create session and make request
session = x402_requests(account)
response = session.get("https://api.example.com/protected-endpoint")
print(response.content)

Advanced Usage

Httpx Extensible Example

import httpx
from eth_account import Account
from x402.clients.httpx import x402_payment_hooks

# Initialize account
account = Account.from_key("your_private_key")

# Create httpx client with x402 payment hooks
async with httpx.AsyncClient(base_url="https://api.example.com") as client:
    # Add payment hooks directly to client
    client.event_hooks = x402_payment_hooks(account)
    
    # Make request - payment handling is automatic
    response = await client.get("/protected-endpoint")
    print(await response.aread())

Requests Session Extensible Example

import requests
from eth_account import Account
from x402.clients.requests import x402_http_adapter

# Initialize account
account = Account.from_key("your_private_key")

# Create session and mount the x402 adapter
session = requests.Session()
adapter = x402_http_adapter(account)

# Mount the adapter for both HTTP and HTTPS
session.mount("http://", adapter)
session.mount("https://", adapter)

# Make request - payment handling is automatic
response = session.get("https://api.example.com/protected-endpoint")
print(response.content)

Manual Server Integration

If you're not using the FastAPI middleware, you can implement the x402 protocol manually. Here's what you'll need to handle:

  1. Return 402 error responses with the appropriate response body
  2. Use the facilitator to validate payments
  3. Use the facilitator to settle payments
  4. Return the appropriate response header to the caller

Here's an example of manual integration:

from typing import Annotated
from fastapi import FastAPI, Request
from x402.types import PaymentRequiredResponse, PaymentRequirements
from x402.encoding import safe_base64_decode

payment_requirements = PaymentRequirements(...)
facilitator = FacilitatorClient(facilitator_url)

@app.get("/foo")
async def foo(req: request: Request):
    payment_required = PaymentRequiredResponse(
        x402_version: 1,
        accepts=[payment_requirements],
        error="",
    )
    payment_header = req.headers.get("X-PAYMENT", "")

    if payment_header == "":
        payment_required.error = "X-PAYMENT header not set"
        return JSONResponse(
            content=payment_required.model_dump(by_alias=True),
            status_code=402,
        )
    
    payment = PaymentPayload(**json.loads(safe_base64_decode(payment_header)))

    verify_response = await facilitator.verify(payment, payment_requirements)
    if not verify_response.is_valid:
        payment_required.error = "Invalid payment"
        return JSONResponse(
            content=payment_required.model_dump(by_alias=True),
            status_code=402,
        )

    settle_response = await facilitator.settle(payment, payment_requirements)
    if settle_response.success:
        response.headers["X-PAYMENT-RESPONSE"] = base64.b64encode(
            settle_response.model_dump_json().encode("utf-8")
        ).decode("utf-8")
    else:
        payment_required.error = "Settle failed: " + settle_response.error
        return JSONResponse(
            content=payment_required.model_dump(by_alias=True),
            status_code=402,
        )

For more examples and advanced usage patterns, check out our examples directory.

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

og_test_x402-0.0.5.tar.gz (2.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

og_test_x402-0.0.5-py3-none-any.whl (2.1 MB view details)

Uploaded Python 3

File details

Details for the file og_test_x402-0.0.5.tar.gz.

File metadata

  • Download URL: og_test_x402-0.0.5.tar.gz
  • Upload date:
  • Size: 2.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for og_test_x402-0.0.5.tar.gz
Algorithm Hash digest
SHA256 b41a7452a322b8300aac37675a0e259198fdb3566ecc564fdad65eb90726ed5a
MD5 7ae6e871eb40f8497f569adbe2549d81
BLAKE2b-256 d03973e47b43ef13b8e6bf9419b198becf5f3c3845d1df1f4eb3cd606ef3ef74

See more details on using hashes here.

File details

Details for the file og_test_x402-0.0.5-py3-none-any.whl.

File metadata

  • Download URL: og_test_x402-0.0.5-py3-none-any.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for og_test_x402-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 4ca0e6c07e339edd7f1a1f254acbd461bc9d984f76d7aaf6f2a7f53e7c582468
MD5 c0792e600e9824571ad087b8a08f019c
BLAKE2b-256 9027c83158bb449e39f27c296bf4a326723c961c4cadb58fa82e254ab6e065ae

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page