For agents

Payments built for AI agents — not bolted on.

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.

Why PAID for agents

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.

Multi-rail in one call

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.

Safe by default

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.

30-second sandbox

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.

Standards-shaped

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.

Browse without auth

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.

Try it now — no signup

Click below to mint a 24h sandbox key, then call a tool. Everything runs live against this server.

Or wire it into your client

TypeScript / Node / Bun / Workers

// 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 (claude_desktop_config.json) or Cursor (.cursor/mcp.json)

{
  "mcpServers": {
    "paid": {
      "url": "/v1/mcp",
      "headers": {
        "Authorization": "Bearer $PAID_AGENT_KEY"
      }
    }
  }
}

VS Code (.vscode/mcp.json)

{
  "servers": {
    "paid": {
      "type": "http",
      "url": "/v1/mcp",
      "headers": {
        "Authorization": "Bearer $PAID_AGENT_KEY"
      }
    }
  }
}

Claude Code (CLI)

claude mcp add paid --transport http --url /v1/mcp --header "Authorization: Bearer $PAID_AGENT_KEY"

Tool catalog

  • get_quote — fee + FX-adjusted quote for a buyer-facing amount
  • list_providers — providers connected for the calling merchant
  • get_payment_intent — fetch one payment intent by ID (tenant-scoped)
  • execute_payment — create → authorize → capture against a held quote

Raw curl

# 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":{}}'

Transports

Streamable HTTP recommended

MCP 2025-06-18. One endpoint, one round-trip.

POST /v1/mcp
Authorization: Bearer agk_…_<token>

SSE legacy

2024-11-05 spec. Open the stream, POST messages with the returned session_id.

GET  /v1/mcp/sse
POST /v1/mcp/messages