Get your agent paid in SOL
agentpay gives any AI agent a pay link: a tip jar and a paywall in one. Payers use Phantom or scan a Solana Pay QR. The SOL goes straight to the agent's wallet.
agentpay takes no cut. The payer covers only the Solana network fee, about 0.000005 SOL.
How it works
Three steps. No middleman.
agentpay never holds funds and stores nothing. Each link carries everything it needs, and the blockchain is the receipt.
Make a link
Paste a wallet below, or have your agent create an invoice. Leave the amount blank for a tip jar.
/pay/<wallet>?amount=0.05&label=my-botAnyone pays
They tap Pay with Phantom, or scan the Solana Pay QR with any mobile wallet. The SOL goes directly to the agent.
solana:<wallet>?amount=0.05&reference=…Agent unlocks
The agent polls the status API, which finds the reference on-chain and checks the amount and recipient.
GET /api/invoice/status → {"paid": true}Link builder
Make your agent's pay link
Everything runs in your browser and nothing is saved. Share the link anywhere: a bio, a README, an agent's reply, a 402 response.
to get a QR
Reusable link: each visitor gets their own reference key on the pay page, so each payment can be tracked.
For agents
A paywall in two calls
How an agent uses this: When your agent wants to charge for something, it sends POST https://agentpay.wtf/api/invoice with {"to":"<its wallet>","amount":"0.05","label":"<its name>","memo":"<order id>"}. It gets back a url to give the payer (a human or another agent), a solanaPayUrl and qr for wallets, and a reference public key. It then polls GET /api/invoice/status?reference=…&to=…&amount=… every few seconds. When the response says "paid": true, the payment has been checked on-chain: it went to the recipient and covered at least the amount. The response also gives the signature, payer and slot, and the agent can deliver. No API key, no account, no fee. Funds never touch agentpay.
# create a single-use invoice curl -s -X POST https://agentpay.wtf/api/invoice \ -H 'content-type: application/json' \ -d '{"to":"<AGENT_WALLET>","amount":"0.05","label":"research-bot-7","memo":"order-1234"}' # → { "url": "https://agentpay.wtf/pay/<AGENT_WALLET>?amount=0.05&…&reference=<REF>", "reference": "<REF: fresh random public key>", "solanaPayUrl": "solana:<AGENT_WALLET>?amount=0.05&reference=<REF>&…", "qr": "data:image/png;base64,…", "statusUrl": "https://agentpay.wtf/api/invoice/status?reference=<REF>&…" }
# poll until paid curl -s "https://agentpay.wtf/api/invoice/status?reference=<REF>&to=<AGENT_WALLET>&amount=0.05&memo=order-1234" # before payment { "paid": false, "status": "pending", "signature": null, … } # after payment lands (checked on-chain) { "paid": true, "status": "paid", "signature": "<tx signature>", "amount": "0.05", "payer": "<payer wallet>", "slot": <slot>, "validator": "@solana/pay validateTransfer" }
const API = 'https://agentpay.wtf' const inv = await fetch(API + '/api/invoice', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ to: WALLET, amount: '0.05', label: 'research-bot-7', memo: orderId }), }).then(r => r.json()) reply(`pay 0.05 SOL to unlock: ${inv.url}`) // or show inv.qr for (;;) { const s = await fetch(inv.statusUrl).then(r => r.json()) if (s.paid) return deliver(s.signature) // on-chain verified await new Promise(r => setTimeout(r, 3000)) }
agentpay for X
How it works on X
AI agents have X accounts now. Link your agent's @ to its wallet once, and anyone can pay it at agentpay.wtf/@handle. Tag, reply, pay, deliver.
Someone tags the agent
A post that tags the agent, or a tag bot like @UseTaggedBot, with a pay command.
The agent replies
Its bot calls POST /api/x/mention and replies with an invoice link.
Pay on the web
The payer opens the agent's verified page and pays with Phantom or a Solana Pay QR.
Paid, then delivered
The agent polls statusUrl. On paid: true, it delivers.
FAQ
Questions
Does agentpay hold my SOL?
No. The payer signs a SystemProgram transfer from their wallet straight to the agent's wallet. agentpay has no wallet, stores no payment data, and takes no fee.
Which wallets work?
Phantom in the browser, plus any wallet that scans Solana Pay transfer requests (Phantom mobile, Solflare and others).
How is "paid" decided?
The API looks up the invoice's reference key with getSignaturesForAddress, then checks that the transaction succeeded, paid the right recipient, and covered at least the requested amount (with @solana/pay validateTransfer). Nothing is marked paid without a confirmed on-chain transaction.
Can I use it as a tip jar?
Yes. Leave the amount empty and the payer picks it. Every visitor gets their own reference key, so each tip can be tracked.