Spend cards for AI agents · addressed by ENS

Fund an agent by name. Never handle a card number.

x402 Card issues virtual cards to AI agents, addressed by ENS name. Policy lives in text records. Humans approve the exceptions.

See how it works
x402·card
AGENT · VIRTUAL
•••• •••• •••• 4021
01Name → Card

A name is the whole interface.

Type an ENS name and a virtual card is issued against it. The 16-digit number exists, but your agent never sees it. It pays by name.

causetype scout.x402card.etheffectcard issued, number masked
type an ENS name
x402·card
AGENT · VIRTUAL
•••• •••• •••• ••••
number: never exposedhandle: scout.x402card.eth
02Policy lives in ENS

Limits are just text records.

Spend rules are stored on the name itself and served by a signed ENS gateway. Change a record and the card’s controls follow. No dashboard, no redeploy.

causetext records set on the nameeffectcard enforces them
researcher.x402card.ethTEXT
card.limit.tx50
card.limit.monthly500
card.mcc.allow5734,7372
x402·card
AGENT · VIRTUAL
tx ≤ $50
month ≤ $500
mcc: software
•••• •••• •••• 7318
researcher.x402card.eth
03Spend

In-policy charges clear. The rest bounce.

Every authorization is checked against the card’s controls in real time. A decline tells the agent exactly which rule it hit, so it can adapt instead of retrying.

cause$42 software charge · $18 casino chargeeffectone approved, one declined with reason
$42.00ModelHub API · MCC 5734
$18.00SpinPalace · MCC 7995
x402·card
AGENT · VIRTUAL
tx ≤ $50mcc: software
•••• 7318
researcher.x402card.eth
SPENT / MO
$0 / $500
✓APPROVED · $42 ≤ card.limit.tx
✕ MERCHANT_CATEGORY_NOT_ALLOWED7995 ∉ card.mcc.allow
04Funding by name

The agent asks. A human says yes.

When an agent asks for more than its policy allows, the request pauses. The approval is bound to that exact name, amount and currency. Approve once; the allowance and the ENS record update together.

causeyou press Approveeffectallowance $500 → $800
researcher.x402card.ethrequests funds · dataset license
+$300
policy idle
human in the loop · alice.eth
Monthly allowance$500
card.limit.monthly = 500$1,000
05Kill switch

Anomaly in. Card frozen.

Bursts of authorizations, repeated blocked merchants. The engine freezes the card and writes the status to ENS, so every resolver sees it at once. Only a human can unfreeze.

cause38 tx in 60seffectcard.status = frozen
tx / 10slast 5 min
ANOMALY · 38 tx in 60s · 12× baseline
x402·card
AGENT · VIRTUAL
•••• •••• •••• 7318
researcher.x402card.eth
FROZEN
card.status = active
next charge → CARD_INACTIVE
Sample stream

Every agent, every charge, by name.

One feed across your fleet. Declines carry their rule, holds wait for a human, freezes show up the moment they happen.

Showing sample events. Real sandbox events appear here as agents use their cards.

→Under the hood

Real names. Real resolver. Sandbox money.

*.x402card.eth resolves on Ethereum mainnet through an ENSIP-10 offchain resolver. Cards and charges run on the Airwallex sandbox. Agents connect over MCP and never see a card number or an API key.

ENS · mainnet

OffchainResolver

Every lookup reverts with an EIP-3668 OffchainLookup. The contract checks the gateway’s signature before returning a record.

0xf11eb8f6…792a0 ↗
Gateway

Signed CCIP-Read

A Cloudflare Worker answers text() lookups from the card’s policy and signs each answer for five minutes. Card numbers and IDs are never stored in records.

x402card.dmpay.workers.dev/gateway
Agents · MCP

Five tools, one token per card

issue_card, get_card, request_funding, freeze, list_transactions. An agent’s token only works for its own name.

// MCP client config
{ "x402card": {
    "type": "http",
    "url": "https://x402card.dmpay.workers.dev/mcp",
    "headers": { "Authorization": "Bearer x4c_…" } } }

Give your agent a name, not a number.

Pick a name, set three records, and it can pay. Takes about a minute in the sandbox.