Docs
Teams and providers
Teams, $ANTI holders and selling your own inference.
TeamsGET/api/orgs
A team is several wallets on one balance. Owners and admins run it, members use its keys, and the billing role can read the money and the audit trail. The server enforces every rule on every route.
Projects group team keys under a monthly budget carved out of the balance, the way a member budget is. A key sits in one project at most. Once a project's settled spend and holds this UTC month reach its budget, its keys get 429 policy_exceeded naming the project, and a hold that would go over the budget is never placed, so concurrent requests cannot overspend it. Create one at POST /api/orgs/{id}/projects and assign keys with PUT /api/orgs/{id}/key-projects.
GET /api/orgs/{id}/chargeback?month=YYYY-MM splits a month's settled spend by project and member, from the ledger, as JSON or format=csv. Its total is the statement's spend. The team's statement shows deposits, spend by project and the closing balance.
A team can prove an email domain with a TXT record, or with a link sent to an admin mailbox there where email is set up. That proof lapses after 30 days, and a TXT record takes the domain back from a team that proved it by email. Anyone who signs in with an email at that domain through Privy can then ask to join. An admin approves, or the domain lets them in as members at once. Privy's email sign in proves the address. A typed address proves nothing. GET /api/orgs/{id}/audit reads the team's audit trail by kind, actor and date. The full list is in the OpenAPI document and the pages are at /team.
Holders
An account whose signed in wallet holds 100,000 $ANTI or more on Robinhood Chain (the Holder tier) is a holder here. For a key, the holder is the account that made it, read from its stored reading (refreshed hourly, never on the request path). A request paid with x402 is served as a non holder.
A model new here serves holders only for its first 7 days. holders_only_until on GET /v1/models says until when. A non holder who names one gets 403 holder_only with the day it opens, a fallback in models is tried instead, and Autopilot never routes a non holder to one. POST /v1/ensemble and buying a price lock are for holders too (a lock already bought is honoured), and a holder's tier shows beside a published handle on the leaderboard. What holding gives is at /token.
Provide inferencePOST/api/marketplace/provider
Accounts can serve open models here from their own OpenAI compatible endpoint, at their own price per 1M tokens in and out. Apply at provide with the base URL, an optional key for it, the models it serves (a catalog id, or a new vendor/model id), the prices, a payout wallet and what the endpoint keeps. The operator approves every application.
Nothing reaches an endpoint until the operator has approved the application and the endpoint is verified. Verification runs again every 24 hours with a health check hourly. It covers two streamed pings (first token under 15000 ms), the tool calling and JSON output it declares, one item each of the task probes, fixed questions answered within 1 item(s) of a reference model, and the token counts it reports, within 25% of the gateway's own count. A failing endpoint is paused with the reason. Every request goes through the outbound guard: https only, public addresses only, the socket pinned to the checked address and no redirects.
A verified endpoint competes with our own route for the models it serves, on the billed price (its price plus the margin), measured latency and measured quality, behind its own circuit breaker. For a model we also serve, it competes only while its price is no higher than ours on input and on output. It is never chosen for a request it cannot meet, such as tools or JSON it did not pass, a prompt too long for its context, or our data policy. A declaration of what it keeps counts only once the operator has verified it, so under the default policy an endpoint that may keep prompts gets no traffic. A key opts out with marketplaceOff in its policy. Callers see x-antimatter-upstream: marketplace, never the provider.
Each request served adds the provider's price times the settled tokens to what it is owed, the same figure the usage row records as the provider cost. No money moves by itself. The operator pays by hand and records the transaction, and the provider reads earnings, traffic and checks at GET /api/marketplace/provider. A customer reports a request by posting a reason to its own request path plus /dispute, as below, or at POST /api/marketplace/disputes.
curl https://useantimatter.com/v1/requests/req_.../dispute \
-H "Authorization: Bearer $ANTIMATTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reason": "the answer ignored the question"}'