APIs your agent can pay for.
Tally is a pay-per-request API on Robinhood Chain. Your agent asks; Tally answers 402 with a price; the agent signs once; Tally verifies it, settles the USDG on-chain and pays the gas. No keys, no accounts, nothing held in custody.
— requests served through the router (— in the last 24 h), last one —. On-chain: — settlements, — USDG moved on Robinhood Chain.
Refreshes every 15 s · median latency — · full log on the status page.
POST /api/v1/chatThe agent asks like any HTTP client would.402 Payment RequiredTally names the price. Nothing has moved yet.HTTP/1.1 402 Payment Required PAYMENT-REQUIRED: base64 of ↓ { "x402Version": 2, "accepts": [{ "scheme": "exact", "network": "eip155:4663", "amount": "1000", // 0.001 USDG "asset": "0x5fc5…d168", // USDG on Robinhood Chain "payTo": "0xYourMerchantAddress", "maxTimeoutSeconds": 120, "extra": { "assetTransferMethod": "permit2" } }] }
The 402 is the invoice. It names the exact amount, asset, recipient and how long the offer stands. Any x402 client reads it and pays without a human.
POST /api/v1/chat PAYMENT-SIGNATURE: …The agent retries with a signed authorization attached.PAYMENT-SIGNATURE: base64 of ↓ { "permit2Authorization": { "from": "0xAgent", "permitted": { "token": "0x5fc5…d168", "amount": "1000" }, "spender": "0x4020…0001", // x402 Permit2 proxy "nonce": "…", "deadline": "", "witness": { "to": "0xYourMerchantAddress", "validAfter": "0", "extra": "0x" } }, "signature": "0x…" // EIP-712, PermitWitnessTransferFrom }
A Permit2 signature, not a transaction. It's bound to one token, one amount, one recipient and a short deadline. After a one-time approval the agent pays no gas and holds only USDG.
POST /verify{ "isValid": true, "payer": "0xAgent" }POST /settle{ "success": true, "transaction": "0x…" }One transfer, agent to Tally. Nothing is held in escrow. A replayed signature is refused: the Permit2 nonce is spent on-chain.
200 OK PAYMENT-RESPONSE: …The response the agent asked for, with a receipt in the header.HTTP/1.1 200 OK PAYMENT-RESPONSE: base64 of { "success": true, "transaction": "0x…", "network": "eip155:4663" } { "model": "tally-router", "choices": [{ "message": { "role": "assistant", "content": "…" } }] }
The whole exchange is two round-trips. The agent's HTTP client did it without a human, an account, or an API key.
Free to test. Paid per request.
No plans, no cards, no accounts. Each request is one small USDG payment, and every IP gets a daily allowance to try it with nothing at all.
- Holders: free access · coming soon
- Hold a set amount of the Tally token and requests stop costing anything. The threshold is announced with the token; until then every request is paid or within the daily allowance.
- Robinhood Chain: pay per request
- 0.005 USDG per completion, paid in the request itself. Tally pays the gas.
- Prepaid key: 1, 5 or 20 USDG
- You fund a
tally_sk_…key once on the demo page; your agent spends it at 0.005 USDG per request withAuthorization: Bearer. No wallet in the agent, top up any time. - Every IP: 5 free router requests a day
- Send
Tally-Free: 1and the router answers without an invoice until the allowance is spent.
The Tally router
An OpenAI-compatible chat endpoint, priced per completion. Drop-in for any client that speaks x402.
- endpoint
- POST /api/v1/chat
- price
- 0.005 USDG per request
- free
- 5 per IP per day
- shape
- { messages, max_tokens } → choices[0].message
Twenty lines, and your agent pays as it goes.
Standard x402 packages. The client handles 402 → sign → retry inside fetch. USDG on Robinhood Chain isn't an SDK default yet, so the asset is spelled out; it pays through Permit2, so the wallet approves Permit2 once.
import { privateKeyToAccount } from 'viem/accounts'; import { x402Client, wrapFetchWithPayment } from '@x402/fetch'; import { ExactEvmScheme } from '@x402/evm/exact/client'; const account = privateKeyToAccount(process.env.AGENT_KEY); const USDG = '0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168'; const NETWORK = 'eip155:4663'; const client = x402Client.fromConfig({ schemes: [{ network: NETWORK, client: new ExactEvmScheme(account) }], spendControls: { allowedAssets: [{ network: NETWORK, asset: USDG, maxAmountPerPayment: '100000', }] }, }); const pay = wrapFetchWithPayment(fetch, client); const res = await pay('…/api/v1/chat', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ messages: [{ role: 'user', content: 'hi' }] }), }); // 402 → sign → retry → 200, handled inside pay()
import OpenAI from 'openai'; const client = new OpenAI({ baseURL: '…/api/v1', apiKey: 'tally_sk_…', // funded once on /demo }); const r = await client.chat.completions.create({ model: 'tally-router', messages: [{ role: 'user', content: 'hi' }], }); console.log(r.choices[0].message.content);
curl …/api/v1/chat \ -H 'Tally-Free: 1' \ -H 'content-type: application/json' \ -d '{"messages":[{"role":"user","content":"hi"}]}' # 200 OK # Tally-Free-Remaining: 4 # { # "model": "tally-router", # "choices": [{ "message": { "role": "assistant", "content": "…" } }] # } # # once the allowance is spent, the same call is 402 # and any x402 client pays 0.005 USDG per request
A standard x402 facilitator does the settling.
Tally runs its own. These four endpoints are what the payment SDKs talk to; you never call them yourself.
- POST
/verifyCheck a signed payment. No gas, nothing changes on-chain.
- POST
/settleVerify again, simulate, then broadcast the Permit2 transfer.
- GET
/supportedPayment kinds, networks and the relayer that signs settlements.
- GET
/healthRPC reachability and latest block for each Robinhood Chain network.
Networks
Tally settles USDG, the Global Dollar, on Robinhood Chain. Gas is ETH and the relayer pays it, so a payer only holds USDG.
- Non-custodial
- Each payment is one on-chain transfer, agent to Tally. Nothing sits in escrow, nothing is pre-loaded.
- No API keys, no accounts
- The signature is the credential. There is nothing to sign up for and nothing to leak.
- Gas paid for you
- Robinhood Chain prices gas in ETH. The Tally relayer pays it on every settlement, so an agent only ever needs to hold USDG.
- Simulated before it's sent
- A transfer that would fail is refused at
/verify. It never becomes a reverted transaction.
The Tally token
Tally is getting its own token on Robinhood Chain, the same network every request settles on. It is not needed to use the API today: requests are paid in USDG, and the free allowance costs nothing. First use, coming soon: hold a set amount and your requests are free. The threshold, contract address and buy link are announced here and on X first.
Until an address is shown on this page, no address claiming to be the Tally token is ours. Treat anything else as a scam.
- network
- Robinhood Chain (eip155:4663)
- needed to use Tally
- no · pay in USDG
- status
- not launched
- use cases
- free API access for holders · coming soon
not published yetGive your agent the URL.
Start with the free allowance, then pay per request or fund a key. Everything settles on Robinhood Chain.
…/api/v1/chat