Documentation

Primer x402 Python SDK v1.1.0

Primer ecosystem toolkit for Python. Use with the official x402 Python SDK.

Breaking changes from v0.x. See deprecated Python docs for the old API.

pypi primer-x402

Installation

bash
pip install primer-x402

Dependencies

The SDK requires the official x402 Python SDK and web3.py:

bash
# Core dependencies (installed automatically)
pip install x402 web3 eth-account

Facilitator Client

Create a pre-configured client for the Primer facilitator:

python
from primer_x402 import primer_facilitator, primer_facilitator_sync, PRIMER_FACILITATOR_URL

# Async client
facilitator = await primer_facilitator()

# Sync client
facilitator = primer_facilitator_sync()

# Use with official x402 middleware
from x402 import payment_middleware

app.add_middleware(payment_middleware(routes, facilitator=facilitator))

API Reference

Export Type Description
primer_facilitator() Async Function Creates async facilitator client for x402.primer.systems
primer_facilitator_sync() Function Creates sync facilitator client for x402.primer.systems
PRIMER_FACILITATOR_URL str "https://x402.primer.systems"

SKALE Networks

Network constants for SKALE chains:

python
from primer_x402 import skale_networks, skale_rpc_urls

# Network identifiers (CAIP-2 format)
skale_networks.base          # "eip155:1187947933"
skale_networks.base_sepolia  # "eip155:324705682"

# RPC endpoints
skale_rpc_urls.base          # "https://skale-base.skalenodes.com/v1/base"
skale_rpc_urls.base_sepolia  # "https://base-sepolia-testnet.skalenodes.com/v1/..."

Using SKALE Networks

python
from primer_x402 import skale_networks

routes = {
    '/api/data': {
        'price': '$0.001',
        'network': skale_networks.base,
        'payTo': '0xYourWalletAddress'
    }
}

Robinhood Chain

Network constants for Robinhood Chain (Arbitrum Orbit L2):

python
from primer_x402 import robinhood_networks, robinhood_rpc_urls

# Network identifiers (CAIP-2 format)
robinhood_networks.mainnet  # "eip155:4663"
robinhood_networks.testnet  # "eip155:46630"

# RPC endpoints
robinhood_rpc_urls.mainnet  # "https://rpc.mainnet.chain.robinhood.com"
robinhood_rpc_urls.testnet  # "https://rpc.testnet.chain.robinhood.com"

Using Robinhood Chain

python
from primer_x402 import robinhood_networks

routes = {
    '/api/data': {
        'price': '$0.001',
        'network': robinhood_networks.mainnet,
        'payTo': '0xYourWalletAddress'
    }
}

Prism Settlement

Prism enables gasless payments for any ERC-20 token via EIP-712 signatures. Use this for tokens that don't support EIP-3009.

Creating Payment Payloads

python
from eth_account import Account
from web3 import Web3
from primer_x402 import (
    create_prism_payload,
    get_prism_nonce,
    PrismPaymentParams,
    PRISM_CONTRACT_ADDRESS,
)

# Set up web3 and account
web3 = Web3(Web3.HTTPProvider('https://mainnet.base.org'))
account = Account.from_key(os.environ['PRIVATE_KEY'])

# Create a signed payment payload
payload = create_prism_payload(
    account,
    web3,
    PrismPaymentParams(
        token='0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',  # USDC on Base
        to='0xRecipientAddress',
        value=1000000,  # 1 USDC (6 decimals)
    ),
    'eip155:8453'
)

print(payload)
# {
#     "x402Version": 2,
#     "scheme": "exact",
#     "network": "eip155:8453",
#     "payload": {
#         "signature": "0x...",
#         "authorization": {
#             "from": "0x...",
#             "to": "0x...",
#             "value": "1000000",
#             "nonce": "0",
#             "validAfter": 1234567890,
#             "validBefore": 1234571490
#         }
#     }
# }

Prism API Reference

Export Description
create_prism_payload(account, web3, params, network) Create a signed EIP-712 payment payload
get_prism_nonce(web3, user, token) Get current nonce for a user/token pair
PRISM_CONTRACT_ADDRESS 0x402357ff1e18d42d0f14a5d56d6e1ebd741b3a86
PRISM_ABI Contract ABI for direct interaction
ERC20_PAYMENT_TYPES EIP-712 type definitions

PrismPaymentParams

Field Type Required Description
token str Yes ERC-20 token contract address
to str Yes Recipient address
value int Yes Amount in smallest unit (e.g., wei)
valid_after int | None No Unix timestamp (default: now - 60s)
valid_before int | None No Unix timestamp (default: now + 1hr)

CLI

The CLI provides project scaffolding for Bittensor/Chutes AI proxies:

bash
# Create a new Chutes AI proxy
x402 create chutes-proxy my-ai-api

# Navigate and install
cd my-ai-api
pip install -r requirements.txt

# Edit main.py to set your wallet address

# Set your Chutes API key
export CHUTES_API_KEY=your_key

# Run locally
uvicorn main:app --reload

Generated Project Structure

text
my-ai-api/
  main.py            # FastAPI app with x402 middleware
  requirements.txt   # Dependencies
  Dockerfile         # Container deployment
  .env.example       # Environment template
  README.md

Full Example

Complete FastAPI server using Primer facilitator:

python
from fastapi import FastAPI
from x402 import payment_middleware
from primer_x402 import primer_facilitator_sync, skale_networks

app = FastAPI()

# Configure payment routes
routes = {
    '/api/premium': {
        'price': '$0.01',
        'network': 'eip155:8453',
        'payTo': '0xYourWalletAddress'
    },
    '/api/skale': {
        'price': '$0.001',
        'network': skale_networks.base,
        'payTo': '0xYourWalletAddress'
    }
}

# Add x402 middleware with Primer facilitator
facilitator = primer_facilitator_sync()
app.add_middleware(payment_middleware(routes, facilitator=facilitator))

@app.get('/api/premium')
async def premium_content():
    return {'data': 'premium content'}

@app.get('/api/skale')
async def skale_content():
    return {'data': 'skale content'}