Python Merchant SDK for Sangria payment preflight and settlement
Project description
sangria-core
Python SDK for accepting x402 payments. Supports FastAPI.
Install
pip install sangria-core
Quick Start
FastAPI
from fastapi import FastAPI, Request
from sangria_sdk import SangriaMerchantClient
from sangria_sdk.adapters.fastapi import require_sangria_payment
app = FastAPI()
client = SangriaMerchantClient(
base_url="https://api.sangria.net",
api_key="sg_live_...",
)
@app.get("/premium")
@require_sangria_payment(client, amount=0.01, description="Premium content")
async def premium(request: Request):
# request.state.sangria_payment.transaction == "0x..."
return {"data": "premium content"}
Bypass Payments
Skip payment for certain requests. This is useful if you want to let API key users access your endpoints for free while charging anonymous or agent-based callers via x402:
@app.get("/premium")
@require_sangria_payment(
client,
amount=0.01,
bypass_if=lambda req: req.headers.get("x-api-key") is not None,
)
async def premium(request: Request):
return {"data": "premium content"}
If your bypass_if callback raises, the SDK logs the exception (via logging.getLogger("sangria_sdk"), prefixed [sangria-sdk]) and falls through to the normal payment-required flow — the request is not bypassed. This is intentional: the SDK fails closed so a crashing callback cannot silently leak free access to paid endpoints. Write callbacks defensively against missing headers, unavailable stores, etc.
How It Works
The @require_sangria_payment decorator handles the x402 negotiation loop:
- First request (no
PAYMENT-SIGNATUREheader): calls Sangria's/v1/generate-paymentendpoint, returns402 Payment Requiredwith payment terms and a base64-encodedPAYMENT-REQUIREDresponse header. - Retry (with
PAYMENT-SIGNATUREheader): forwards the signed payload to Sangria's/v1/settle-paymentendpoint. On success, stores the result inrequest.state.sangria_paymentand calls your handler.
Errors
The SDK raises a SangriaError (or subclass) when the Sangria backend is unreachable, times out, or returns a non-2xx status. Business-level payment failures (bad signature, insufficient funds) are not errors — they flow through as normal 402 responses.
SangriaError # base — catch-all
├── SangriaConnectionError # DNS, refused, socket error
│ └── SangriaTimeoutError # client-side timeout
└── SangriaAPIStatusError # backend returned non-2xx (has .status_code, .response)
Every error carries .operation ("generate" or "settle") so you know which call failed.
from fastapi import Request
from fastapi.responses import JSONResponse
from sangria_sdk import SangriaError
@app.exception_handler(SangriaError)
async def sangria_error_handler(_request: Request, exc: SangriaError):
return JSONResponse(
status_code=503,
content={"error": "Payment provider unavailable"},
)
API Contract
POST /v1/generate-payment
Request:
{ "amount": 10000, "resource": "/premium", "description": "Premium content" }
Response (402):
{
"x402Version": 2,
"accepts": [{
"scheme": "exact",
"network": "eip155:84532",
"amount": "10000",
"asset": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
"payTo": "0xWalletAddress",
"maxTimeoutSeconds": 60
}],
"resource": { "url": "/premium", "description": "Premium content" }
}
POST /v1/settle-payment
Request:
{ "payment_payload": "<base64 EIP-712 signed authorization>" }
Response:
{ "success": true, "transaction": "0x...", "network": "base", "payer": "0x..." }
Requirements
- Python >= 3.10
- FastAPI >= 0.135.1
- httpx >= 0.28.1
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 sangria_core-0.3.1.tar.gz.
File metadata
- Download URL: sangria_core-0.3.1.tar.gz
- Upload date:
- Size: 9.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b2b1ea0caad41ad4cd8aea3e68c95772c54701add9c216559087265c94fe3b45
|
|
| MD5 |
f0ac4586c9c224e47eed655aea626ea7
|
|
| BLAKE2b-256 |
de291bf68c14b1511e6141a07e1ac1622bc2a15fb69375347a7fdc175c49ff3a
|
File details
Details for the file sangria_core-0.3.1-py3-none-any.whl.
File metadata
- Download URL: sangria_core-0.3.1-py3-none-any.whl
- Upload date:
- Size: 11.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b89f38c662708f6e8b968ca9f175fbcd2c046ff7a007c3293de09ad0462e081a
|
|
| MD5 |
eba4fd53ca4225a77106ce0e3a5e3c23
|
|
| BLAKE2b-256 |
deaf8caea6276473d97672dad4aec470cd13aa83d901dc82cea6cea72b11230f
|