Open-source spend governance for AI agents
Project description
PayGraph
Open-source spend governance for AI agents. Issue single-use virtual cards or pay x402-enabled APIs with USDC — with policy enforcement, audit logging, and human-in-the-loop approval.
Architecture
Agent (LangGraph / any framework)
│
▼
┌──────────────────────────────────────────┐
│ AgentWallet │
│ ┌───────────────┐ ┌────────────────┐ │
│ │ Policy Engine │ │ Audit Logger │ │
│ └───────┬───────┘ └───────┬────────┘ │
│ │ │ │
│ ┌───────▼──────────────────▼────────┐ │
│ │ Payment Rails │ │
│ │ Card: Mock │ Stripe │ │
│ │ x402: X402Gateway │ MockX402 │ │
│ └──────────────────────────────────┘ │
└──────────────────────────────────────────┘
Install
pip install paygraph
With LangGraph support:
pip install paygraph[langgraph]
With x402 support (EVM + Solana USDC payments):
pip install paygraph[x402]
With live demo (includes LLM providers):
pip install paygraph[live]
Quickstart
from paygraph import AgentWallet, SpendPolicy, MockGateway
wallet = AgentWallet(
gateway=MockGateway(auto_approve=True),
policy=SpendPolicy(
max_transaction=25.0,
daily_budget=100.0,
blocked_vendors=["doordash"],
),
)
result = wallet.request_spend(
amount=4.20,
vendor="Anthropic API",
justification="Need Claude credits for document summarization.",
)
print(result) # Card approved. PAN: 4111..., CVV: 123, Expiry: 12/28
StripeCardGateway (Real Cards)
from paygraph import AgentWallet, SpendPolicy, StripeCardGateway
wallet = AgentWallet(
gateway=StripeCardGateway(api_key="sk_test_..."),
policy=SpendPolicy(max_transaction=50.0),
)
result = wallet.request_spend(
amount=4.20,
vendor="Anthropic API",
justification="API credits for task completion.",
)
Configuration
StripeCardGateway accepts the following parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
api_key |
str |
required | Stripe secret key (sk_test_... or sk_live_...) |
cardholder_id |
str | None |
None |
Existing cardholder ID to use (skips auto-creation) |
currency |
str |
"usd" |
Card currency (e.g. "eur", "gbp") |
billing_address |
dict | None |
US address | Cardholder billing address (line1, city, postal_code, country) |
single_use |
bool |
True |
Mint a new card per transaction; set False to reuse one card |
When single_use=False, a single card is created on the first spend and reused for subsequent calls (spending limit is updated each time).
x402 Gateway (Pay APIs with USDC)
x402 is an HTTP 402-based protocol for machine-to-machine payments. Instead of minting a card, the gateway makes an HTTP request, handles the 402→sign→retry cycle on-chain, and returns the API response.
from paygraph import AgentWallet, X402Gateway, SpendPolicy
wallet = AgentWallet(
x402_gateway=X402Gateway(evm_private_key="0x..."), # Base/Polygon USDC
policy=SpendPolicy(max_transaction=5.0),
)
response = wallet.request_x402(
url="https://api.example.com/paid-endpoint",
amount=0.01,
vendor="ExampleAPI",
justification="Need data for analysis.",
)
print(response) # The API response body
Supports both EVM (Base, Polygon, etc.) and Solana:
# Solana only
gateway = X402Gateway(svm_private_key="BASE58_KEY")
# Both networks
gateway = X402Gateway(evm_private_key="0x...", svm_private_key="BASE58_KEY")
For testing without blockchain:
from paygraph import AgentWallet, MockX402Gateway
wallet = AgentWallet(
x402_gateway=MockX402Gateway(auto_approve=True, response_body='{"data": 42}'),
)
LangGraph Integration
from paygraph import AgentWallet, SpendPolicy, MockX402Gateway
wallet = AgentWallet(
x402_gateway=MockX402Gateway(auto_approve=True),
policy=SpendPolicy(max_transaction=25.0, blocked_vendors=["doordash"]),
)
# wallet.spend_tool → card payments, wallet.x402_tool → x402 API payments
tools = [wallet.spend_tool, wallet.x402_tool]
# Use with LangGraph
from langgraph.prebuilt import create_react_agent
from langchain_anthropic import ChatAnthropic
llm = ChatAnthropic(model="claude-sonnet-4-20250514")
agent = create_react_agent(llm, tools=tools)
result = agent.invoke({"messages": [("user", "Buy $4.20 in API credits from Anthropic")]})
Policy Configuration
SpendPolicy accepts the following parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
max_transaction |
float |
100.0 |
Maximum amount per transaction (dollars) |
daily_budget |
float |
1000.0 |
Maximum total spend per day |
blocked_vendors |
list[str] |
[] |
Vendors that are always denied |
allowed_vendors |
list[str] |
[] |
If set, only these vendors are allowed |
blocked_mccs |
list[str] |
[] |
Blocked merchant category codes |
require_justification |
bool |
False |
Require non-empty justification string |
Environment Variables
| Variable | Required for | Description |
|---|---|---|
ANTHROPIC_API_KEY |
--live (default) |
Anthropic API key for Claude LLM |
OPENAI_API_KEY |
--live --model openai |
OpenAI API key for GPT LLM |
STRIPE_API_KEY |
--stripe |
Stripe secret key (sk_test_ or sk_live_) |
STRIPE_CURRENCY |
--stripe (optional) |
Card currency (default: usd) |
STRIPE_BILLING_COUNTRY |
--stripe (optional) |
Billing address country code (e.g. FR) |
STRIPE_CARDHOLDER_ID |
--stripe (optional) |
Reuse an existing cardholder ID |
EVM_PRIVATE_KEY |
x402 (EVM) | EVM private key for Base/Polygon USDC payments |
SVM_PRIVATE_KEY |
x402 (Solana) | Solana private key (base58) for USDC payments |
Copy .env.example to .env and fill in your keys:
cp .env.example .env
CLI
# Run simulated demo (no API keys needed)
paygraph demo
# Run live demo with a real LLM
export ANTHROPIC_API_KEY=sk-ant-...
paygraph demo --live
# Use OpenAI instead
export OPENAI_API_KEY=sk-...
paygraph demo --live --model openai
# Use Stripe Issuing for real card issuance
export STRIPE_API_KEY=sk_test_...
paygraph demo --live --stripe
License
MIT
Project details
Release history Release notifications | RSS feed
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 paygraph-0.1.0.tar.gz.
File metadata
- Download URL: paygraph-0.1.0.tar.gz
- Upload date:
- Size: 26.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
651eb40db62ebfcbc13b1fa4bc7437e00ce25c85b9afc17c136a8a853de3866c
|
|
| MD5 |
e11ac5ebebc46dfec8132237a970e283
|
|
| BLAKE2b-256 |
9b6b6ba4ea58dfcfaf2d486d3aa25bee4fe95a296d3a37709b7c852205b6c433
|
File details
Details for the file paygraph-0.1.0-py3-none-any.whl.
File metadata
- Download URL: paygraph-0.1.0-py3-none-any.whl
- Upload date:
- Size: 23.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76ad4bc05db122333ab75ffee3fe748e693248e2e43ed70cf26d710343e09b42
|
|
| MD5 |
32bccaf0f3a0663470769bebd061ecfc
|
|
| BLAKE2b-256 |
09f4c9f638b5622a643f1f1786ec5bb38417432de98932f06131a6cdd768173e
|