Antimatter

Docs

Billing and receipts

Credits, price locks and receipts anyone can check.

CreditsGET/api/credits

Keys are free. An account that has never deposited spends a lifetime free allowance of $0.25. Past it, the answer is 402 free_allowance_exhausted. A funded account whose balance cannot cover a request's worst case cost gets 402, insufficient_credits. A signed in wallet that holds $ANTI on Robinhood Chain may reach a holder tier, which can widen the allowance, raise the rate and take a share off the margin. GET /api/account/holder says which.

You pay each model's own published price per million tokens, plus 10%. The margin is the same for everyone, on every model unless a model says otherwise, and nothing is added at the end. The prices GET /v1/models, pricing and every page show already include it, so the price you see is the price charged.

Right now we take only $ANTI on Robinhood Chain, not stablecoins. Send it from your signed in wallet to the address GET /api/credits and the billing page show, then claim the transfer by its transaction hash. It is credited exactly once, in dollars at the credit price when it is claimed. The credit price is the lower of the newest price sample, at most 15 minutes old, and the median of the last 24 hours' samples, at least 12 of them. A sample is DEX Screener's price of the deepest $ANTI pool, cross checked against GeckoTerminal. If the two are more than 15% apart, it is not used. With no price the claim answers 503 pricing_unavailable, nothing is credited, and the transaction stays claimable. One claim is credited up to 2% of the pool's liquidity and at most $1,000.00, and is refused whole above it. GET /api/credits carries deposits.anti with the credit price now. A stablecoin, Solana or x402 payment is refused by name.

No wallet? Sign in on the site with email, Google, X or a wallet app through Privy, which holds the email and the embedded wallet's key shares. The session is still that wallet's signature. The embedded wallet can buy USDC on Base with a card from Stripe or MoonPay, a purchase between you and them, then pay it in like any other wallet.

# with the wallet session cookie
curl https://useantimatter.com/api/credits/deposit \
  -H "Content-Type: application/json" \
  -d '{"txHash": "0x...", "chain": "robinhood"}'

Or bring your own OpenRouter, OpenAI, Anthropic, Google, DeepSeek, xAI, Mistral, Groq, Cerebras, Together or Fireworks key at POST /api/provider-keys. A key is used for the models we serve through that provider directly (GET /api/provider-keys says which, as servedHere), never by an agent's key. Those requests bill your provider account, spend no credits, are never cached, and come back with x-antimatter-byok: 1.

Price locksPOST/api/account/price-locks

A signed in account can lock one model's billed input and output rates for up to 30 days. It moves an amount of credit into the lock and pays a premium of 5% of that amount, once, from the balance. A keyed request on the personal balance whose every model, fallbacks included, is the locked one is paid from the lock and billed, rate by rate, at the lower of the locked rate and today's, so a lock never costs more than not locking. When the lock cannot hold the request's worst case, the balance pays at today's rates. At the end, whatever is left returns to the balance. The premium does not.

# with the wallet session cookie, from the site's own origin
curl https://useantimatter.com/api/account/price-locks \
  -H "Content-Type: application/json" \
  -d '{"model": "inclusionai/ling-3.0-tiny", "amountMicros": 5000000, "days": 7}'

Verifiable receiptsGET/v1/requests/{id}/proof

We seal the books by day: once a UTC day has closed, about an hour after midnight, every usage row and every ledger entry of that day becomes a leaf of a Merkle tree, and the day's root is stored. Roots are not published on chain here, so a proof checks against the stored root only, and says so.

A usage leaf holds the row, the request id, the model, the prompt and completion tokens, what was billed, what the provider charged and the markup those two imply. A ledger leaf holds the entry, its kind, the amount and a SHA-256 of its reference. The account is a keyed digest, never an address, so erasing an account leaves every sealed day and every proof as it was. Leaves are SHA-256 after the byte 0x00, nodes after 0x01, the day header after 0x02, and an odd node is carried up unchanged.

curl https://useantimatter.com/v1/requests/req_.../proof \
  -H "Authorization: Bearer $ANTIMATTER_API_KEY"

The answer is the proof. Paste it into verify, which recomputes it in the browser and compares the root with the sealed day. A receipt's proof is on its receipt page. GET /api/receipts/commitments lists the sealed days with what was billed, what the providers charged and the margin that implies, read from the sealed days only.