Give agents
money.Not your wallet.
Paymod sits between your agents and your treasury. Every x402 payment, onchain transfer or financial call is checked against your rules before it settles, gets escalated to a human or refused.
The decision path
Intent arrives
An agent asks to pay. The request carries its identity, the counterparty, the amount, and the reason, never a private key.
POST /v1/intents agent: research-agent kind: x402 to: api.serpstack value: 0.42 USDC
Policy is evaluated
Limits, thresholds, allowlists, velocity, and time windows are checked deterministically. No model decides whether money moves.
eval policy@treasury/ops cap.per_call 1.00 ✓ cap.daily 50.00 ✓ (12.9 used) vendor.allow true ✓ → ALLOW
Human, only when it matters
Anything over a threshold pauses and pings an approver in Telegram or Slack. Approve, reject, or let it expire.
escalate → telegram:@treasury quorum 1 of 2 ttl 10m status awaiting
Settle and record
Allowed actions execute from the treasury and land in an append-only ledger with the exact policy version that authorised them.
settled 0x8c…4f2 policy v12 (hash 9a3f…) ledger entry #10,482
Connect agents four ways
Model Context Protocol server
Point any MCP-capable agent at Paymod. It gets payment tools, not credentials.
{ "mcpServers": {
"paymod": { "url": "https://mcp.paymod.io" }
}}Drop-in agent skills
Prewritten skills for pay, quote, refund, and balance checks.
skills/ pay-x402.md transfer.md check-budget.md
Typed client for your own runtime
Two lines from intent to settlement, with the policy verdict returned inline.
const r = await paymod.pay({
to: "api.serpstack",
value: "0.42 USDC",
});
r.verdict; // "allow"Anything else that speaks HTTP
Sign a request, get a decision. Webhooks stream every state change back.
POST /v1/intents X-Paymod-Key: pk_live_… → 202 escalated
Rules you can read out loud
A policy is a short document, not a config maze. Tap a clause to see what the engine would do with it.
approver ping sent
Every verdict is reproducible: same intent, same policy version, same answer.
Humans in the loop, not in the way
When an intent crosses a threshold, Paymod holds it and asks a human where humans already reside.
- →Telegram & SlackOne-tap approve or reject, with full intent context.
- →QuorumRequire one, two, or N approvers per rule.
- →ExpiryUnanswered requests die instead of lingering.
- →Kill switchFreeze one agent, or the whole treasury, in a tap.
Append-only, argument-free
| # | time | agent | action | usdc | verdict | authority |
|---|---|---|---|---|---|---|
| 10,482 | 09:41:02 | ops-agent | transfer · base | 180.00 | APPROVED | @mara |
| 10,481 | 09:40:55 | research-agent | x402 · serpstack | 0.42 | ALLOWED | policy v12 |
| 10,480 | 09:38:11 | growth-agent | x402 · ads.exchange | 12.50 | ALLOWED | policy v12 |
| 10,479 | 09:36:47 | unknown-agent | transfer · eth | 2,400.00 | BLOCKED | no grant |
| 10,478 | 09:31:20 | research-agent | x402 · openrouter | 0.08 | ALLOWED | policy v12 |
| 10,477 | 09:22:04 | ops-agent | refund · stripe | 40.00 | APPROVED | @dre |
Recorded whether it settled, escalated, or was refused.
Each entry stores the exact rule version that decided it.
Stream to your warehouse or pull a signed CSV for finance.