Quote first
get_quote binds amount + FX + fee into a single ID. Hand it to execute_payment and the price you saw is the price you pay —
no race between LLM reasoning and market drift.
Quote first, execute on commit. Multi-rail (cards, ACH, USDC, wallets) in one call. Deny-by-default policy on every key. Sandbox in 30 seconds, no human signup, no card on file.
get_quote binds amount + FX + fee into a single ID. Hand it to execute_payment and the price you saw is the price you pay —
no race between LLM reasoning and market drift.
Stripe + Circle + Dwolla + ClearBank + PayPal + Binance Pay + Solana wired
today; FedNow is built and awaiting live enrollment. list_providers returns whatever the merchant has connected; the
orchestrator picks the cheapest, lets you pin a specific rail. Every rail is
exercised in CI; live-volume proof is rolling out rail by rail.
New keys deny execute_payment. Caps at $500/call, $1k approval.
Currency + provider allow-lists. OFAC screened pre-authorize. Tenant breach
refused at tool entry.
POST /v1/agent_signup mints a 24h test key with no operator
account. Browse, quote, and prototype. Move to live by issuing a key from
the merchant dashboard.
MCP 2025-06-18 (Streamable HTTP) + 2024-11-05 (SSE) transports. JSON-RPC 2.0
wire. RFC 9728 OAuth Protected Resource Metadata at /.well-known/oauth-protected-resource.
Call discover/catalog over MCP or fetch the discovery JSON to
see what the server can do before you've signed up. Designed so an LLM
reasoning loop can decide whether to use us.
Click below to mint a 24h sandbox key, then call a tool. Everything runs live against this server.
// Plain fetch — no SDK to install. JSON-RPC 2.0 over Streamable HTTP.
// 1. Mint a 24h sandbox key (no operator account needed)
const signup = await fetch('/v1/agent_signup', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ agent_name: 'my-agent' })
});
const sandbox = await signup.json();
// 2. Use it
async function mcp(method: string, params: unknown = {}) {
const res = await fetch('/v1/mcp', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + sandbox.token,
'Content-Type': 'application/json'
},
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params })
});
return res.json();
}
const init = await mcp('initialize');
const tools = await mcp('tools/list');
const providers = await mcp('tools/call', { name: 'list_providers', arguments: {} });
console.log(init, tools, providers); claude_desktop_config.json) or Cursor (.cursor/mcp.json){
"mcpServers": {
"paid": {
"url": "/v1/mcp",
"headers": {
"Authorization": "Bearer $PAID_AGENT_KEY"
}
}
}
} .vscode/mcp.json){
"servers": {
"paid": {
"type": "http",
"url": "/v1/mcp",
"headers": {
"Authorization": "Bearer $PAID_AGENT_KEY"
}
}
}
} claude mcp add paid --transport http --url /v1/mcp --header "Authorization: Bearer $PAID_AGENT_KEY" get_quote — fee + FX-adjusted quote for a buyer-facing amountlist_providers — providers connected for the calling merchantget_payment_intent — fetch one payment intent by ID (tenant-scoped)execute_payment — create → authorize → capture against a held quote# 1. Discover the server (no auth)
curl /.well-known/agent-purchasing | jq
# 2. Mint a sandbox key (no auth, no signup)
curl -X POST /v1/agent_signup \
-H "Content-Type: application/json" \
-d '{"agent_name":"my-agent"}' | jq
# 3. Initialize an MCP session
curl -X POST /v1/mcp \
-H "Authorization: Bearer agk_test_<token>" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'
# 4. Browse the catalog without auth (PAID-specific extension)
curl -X POST /v1/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"discover/catalog","params":{}}'MCP 2025-06-18. One endpoint, one round-trip.
POST /v1/mcp
Authorization: Bearer agk_…_<token>2024-11-05 spec. Open the stream, POST messages with the returned session_id.
GET /v1/mcp/sse
POST /v1/mcp/messages