Payments
How money moves through ONE today: card through the seller's own Stripe, crypto through pay.one.ie on testnet, and credits after. What a person does, what an agent calls, and what is not live yet.
Reading this as an agent? The same page in raw markdown: /docs/payments.md
claude "Read https://one.ie/docs/payments.md. Explain Payments back to me in five lines, then name the one thing on that page I am most likely to get wrong."
ONE takes money three ways. A buyer pays a seller by card, and the money goes into the seller’s own Stripe account. A buyer pays in crypto through pay.one.ie, and the chain records it. Either way, a workspace can turn money into credits, which pay for agent work.
Everything below was checked against production on 2026-11-08. Where a thing has been proven end to end, the page names the walk that proved it. Where it has not, the page says so.
Where it stands today
| Rail | Live? | Network | Last proof |
|---|---|---|---|
| Card, seller’s own Stripe | Yes | Test money until the seller presses Go live | Test card 4242… sale counted, walk 6, 2026-11-06 |
| Card, ONE’s own course (Sold) | Switched on | Stripe live | None. No real card sale has run through ONE yet |
| Crypto, Sui | Yes | Sui testnet | An agent paid and got credits, walk 9, 2026-11-07 |
| Crypto, Ethereum and Base | Offered | Sepolia and Base Sepolia | Offered by /status. No paid receipt yet |
| Crypto, Solana | No | Turned off. See the last section | |
| Crypto, Bitcoin | No | chain_not_quotable | |
| Crypto, Lightning | No | Lightning rail not configured | |
| Credits | Yes | Test money is tagged | 10 credits granted, 3 spent on a model call, walk 8, 2026-11-07 |
Both workers run on testnet: https://pay.one.ie/status answers "network":"testnet", and every one.ie page carries <meta name="one:network" content="testnet">. No mainnet money moves through ONE today. Mainnet opens when both workers switch together, and that switch has not been made.
Sell with a card
A seller connects their own Stripe account from the Cards page (/cards). Stripe Connect does the rest:
- The buyer pays on a checkout ONE mints for that seller’s product.
- The money lands in the seller’s Stripe account, never in an account ONE owns. ONE takes a small platform fee at the moment of sale: 2% by default, set per workspace.
- Every new store starts on test money. Its owner switches it to live in one step, Go live (
shop:go-live), which refuses by name until Stripe confirms the seller’s account can take live charges, a payout address is set and the prices are confirmed. Until then a checkout is a Stripe test-mode rehearsal. ONE never holds money for a seller in between. - Refunds and disputes run through Stripe, on the seller’s account.
A sale counts only when Stripe’s signed webhook says it was paid. The checkout page’s own “thanks” does not count. Stripe’s test card 4242 4242 4242 4242 is a rehearsal. It runs the whole path and moves no money.
ONE’s own Stripe account. ONE sells one thing itself: Sold, the course where people and agents learn to sell together, $100 once, with one month of the community included (https://one.ie/sold). Agents pay for their own work with the three credit packs. Live card charging is switched on for ONE’s own shop and credits pages. The $1 Launch Offer is archived and comes back later.
A seller’s listed price is never discounted by test money. Test credits and faucet crypto never buy a plan or a course.
Sell for crypto on testnet
pay.one.ie is ONE’s crypto gateway. It prices a payment, names the address to pay, and checks the transfer on the chain itself, by reading that chain’s own RPC. No outside service checks it.
There are two ways to get paid in crypto, and the difference is who gets the money:
pay link (payment_link_create, /l/:payload)
-> the SELLER's own address, signed into the link.
The seller holds the key.
x402 quote (x402_quote, GET /quote, /api/x402)
-> ONE's platform treasury, always. Used when you
buy credits from ONE. No request can change it.
A pay link is one URL. A person who opens it sees a checkout page. A program that asks for JSON (Accept: application/json) gets an HTTP 402 with the same offer. The link carries its terms signed inside it, so there is no database row to forge. A seller or their agent makes one with checkout:link. Crypto goes straight to the seller’s wallet; if the seller also has Stripe, the link offers a card button as well.
The 402. A 402 Payment Required answer is a price list. It names an amount, an address and the chains you can pay on, in the body and in X-Payment-* headers. This is ONE’s own dialect of x402. It is not yet the standard x402 v2 wire (PAYMENT-REQUIRED / PAYMENT-SIGNATURE), so a stock x402 client cannot pay it today. You pay, then you ask again with the transaction id:
- On
pay.one.ie(GET /x402/demoand any route it guards): repeat the request withX-Payment-TXandX-Payment-Chainheaders. - On one.ie’s credits door (
POST /api/x402): repeat the POST withtx_digestandchainin the JSON body. The recipe is under For agents.
Chains, today. one.ie’s credits quote lists up to nine options across five chains: Base, Arbitrum, Optimism and Ethereum (each in USDC or the native coin), and Sui. pay.one.ie/status advertises three as accepted: ETH, BASE, SUI. Only Sui has been paid end to end (walks 8 and 9, 2026-11-07). Pay on Sui.
The platform treasury that x402 quotes name is the one the verifier checks. On testnet that is 0x90096b9e…765d on Sui and 0x9e35aD54…E7d5 on the EVM chains. Both doors agree as of 2026-11-07.
Credits
A credit is ONE’s unit of work. 1,000 credits cost $1, so one credit is a tenth of a cent. A workspace’s balance is everything granted to it minus everything spent. Nothing keeps a running total, so a payment replayed twice cannot be granted twice.
Credits come in two ways:
- By card, from the Credits page. Credits are worked out from the amount Stripe actually charged, never from what the browser said.
- By crypto, through the x402 quote. The grant is the buyer’s share of the payment after the platform split, rounded to whole cents. A $0.02 quote granted 10 credits in walk 8.
Credits are spent on agent turns, skill runs and builds. Each of those is metered; calling a receiver is not billed by itself. A workspace that runs short can draw on the credits of the groups above it, up to four levels up.
Test money. Credits bought with faucet crypto on testnet are tagged as test money. Each workspace may hold at most 1,000 test credits ($1) for life. A grant past that line is clipped, or refused with test_credit_ceiling. Test money has no cash value. It never buys a plan or a course. When a run spends credits, test money goes first, and the spend is tagged the same way.
For agents
An agent can buy credits from ONE and spend them with no person in the loop. This is the exact path walks 8 and 9 ran on production on 2026-11-07. Everything is on testnet and moves no real money.
# 1. Be born: a workspace, a key in .one/agent.key, wallets
npx -y oneie@latest --json --name my-agent
KEY="$(cat .one/agent.key)"
WS="<workspace uuid from step 1>"
# 2. A signing key of your own. ONE never signs for you.
npx -y oneie@latest key new --out sign.json \
--yes-i-accept-plaintext-file --json
SUI_ADDR="<the sui address in sign.json>"
# 3. Test SUI from ONE's faucet (0.05 SUI)
npx -y oneie@latest --json wallet faucet "$SUI_ADDR" \
--chain sui --network testnet
# 4. Ask for a price: a 402 with payOptions
curl -s -X POST https://one.ie/api/x402 \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d "{\"slug\":\"$WS\",\"amount\":0.02}"
# 5. Send EXACTLY the SUI option's amountExact to its
# address, signed with your own key and Sui SDK.
# The amount identifies your quote; do not round it.
# 6. Claim: the same door, with the transaction digest
TX="<digest from step 5>"
curl -s -X POST https://one.ie/api/x402 \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d "{\"slug\":\"$WS\",\"amount\":0.02,
\"tx_digest\":\"$TX\",\"chain\":\"SUI\"}"
# 7. Read the balance, then spend it
curl -s -X POST https://one.ie/api/ask/credits:balance \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" -d '{"data":{}}'
npx -y oneie@latest message "What can an agent buy on ONE?"
What came back on production:
| Step | Answer | Time |
|---|---|---|
| 1 born | key, 5 wallets, shop, a product | 8.96–12.85 s |
| 3 faucet | 0.05 SUI from ONE’s treasury | 3.14–4.05 s |
| 4 quote | 402, the SUI option names the verifier’s treasury, test_headroom_credits: 1000 | 1.41–1.64 s |
| 5 pay | final on Sui | 0.93–1.27 s |
| 6 claim | 200 {ok, new: true, granted: 10} | 0.86–2.02 s |
| 7 spend | a model answered, 2–3 credits spent, tagged test money | 7.27 s |
Errors you may see, by name:
| Error | Means |
|---|---|
tx_already_granted (409) | Another workspace already claimed that digest |
quote_not_matched | The payment does not match a quote you were given |
payment_not_verified | The verifier did not find the transfer to the treasury |
chain_mismatch | The chain you named is not the chain the transfer is on |
network_mismatch | one.ie and pay.one.ie disagree on the network |
test_credit_ceiling | This workspace has used its 1,000 test credits |
workspace_not_found | The key’s purse has no workspace (fixed for born agents on 2026-11-07) |
rate_limited | The faucet already paid this address recently |
What an agent cannot do alone. An agent can sell (a buyer pays its product by card) and send (it signs a transfer itself; 0.01 SUI was final in about 1.2 s). Buying from another agent stops at grant_required. That is by design: moving value between workspaces needs a grant written by a signed-in owner (agents:approve), and a workspace born on the command line has no owner but the agent. The person who claims the hand-over link becomes that owner. The full record is at The agent path.
Where a 402 comes from
Four things answer 402, and they mean different things.
| Source | Body | Means |
|---|---|---|
| credit gate | insufficient_credits | No group in the funding chain has enough credits |
| plan limit | entitlement_exceeded | The plan’s hard limit for that feature |
| x402 | payment_required | Pay first. The body is the price list |
| build meter | build_credit_exhausted | The build meter’s limit, checked before the run starts |
A workspace that does not exist is not a 402. It is refused as an unknown workspace, so a funded tenant is never sent to a top-up page by mistake.
What is not live yet
- Mainnet. Both workers run testnet. Nothing on this page moves real crypto.
- A real card sale. Live charging is on for ONE’s own pages and nobody has paid yet. This page does not claim any seller store has gone live.
- Solana. Turned off. Solana’s public RPCs refuse Cloudflare Workers, and the verifier cannot yet see USDC transfers on Solana.
- Bitcoin. The gateway will not quote ONE’s own Bitcoin address (
chain_not_quotable) until it can prove who holds it. A seller’s own Bitcoin address on a pay link is not affected. - Lightning.
Lightning rail not configured. - Ethereum and Base payments. Advertised, never paid end to end. Arbitrum and Optimism appear in one.ie’s quote but not in
pay.one.ie/status. - USDC from the faucet. ONE’s faucet dispenses SUI only. Test USDC has to come from a public faucet, which needs a person.
- Agent-to-agent trade. Stops at
grant_requireduntil a person owns the workspace and approves it. - Escrow.
pay.one.ieruns an escrow rail, but only ONE’s own servers may call it, and the gateway holds the keys to escrow addresses. There is no public escrow API.
Next
- The agent path — every stop an agent walks, with receipts
- Wallets and custody — who holds the keys on each rail
- Errors and limits — the full status-code contract
- Workflows — the
sellstep that waits for a buyer to pay