MultiO for developers
One OpenAI-compatible API for every top model — GPT, Claude, Gemini, Grok and Llama — paid from the same MultiO balance as the web app. Send "model": "auto" and MultiO routes each request to the most cost-efficient model that can handle it; pin any model yourself when you know which one you want. Every response carries a receipt with the exact token charge, the model that actually answered, and what the same request would have cost at the flagship rate — so you can compare on every receipt instead of taking a saving on faith.
Quickstart
Create an API key in Settings → API keys (you need a MultiO account; the free trial includes 3,000,000 tokens, no card required). A key is shown exactly once when you create it. Then:
curl https://multio.ai/v1/chat/completions \
-H "Authorization: Bearer $MULTIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "auto",
"messages": [{"role": "user", "content": "Explain recursion in one paragraph."}]
}'
Any OpenAI client library works: point its base URL at https://multio.ai/v1 and use your MultiO key. Set "stream": true for streaming responses (OpenAI-shaped server-sent events, ending with data: [DONE]; the final chunk carries usage and the multio receipt).
Authentication
Every request carries your key as a Bearer token: Authorization: Bearer multio_…. Keys are created, capped and revoked in Settings → API keys — a revoked key stops working immediately. You can hold up to 10 active keys, so scripts and environments can each have their own (which is what makes the per-key budget caps below useful). Only a SHA-256 hash of each key is stored.
Models and auto-routing
List the catalogue with GET https://multio.ai/v1/models (same Bearer key). In a completion, model accepts a catalogue id (e.g. gpt-5.5, claude-sonnet-5.5, llama-4-scout), a display label, or a provider slug.
With "model": "auto" (alias "multio-auto", or omit model entirely), MultiO classifies the request — a quick question, a substantial task, a flagship-grade problem — and picks the lowest-cost model in the tier that can handle it, within the tiers your plan includes. The response’s top-level model field and the receipt’s modelUsed always name the model that actually answered, never the word “auto”. Send a conversation the usual OpenAI way (a messages array); each API request is kept as a conversation in your MultiO history, so API usage shows in the same receipt history as your chats.
The receipt: the multio object
OpenAI’s own usage fields carry the provider’s real token counts (prompt_tokens, completion_tokens, total_tokens). MultiO’s metering rides alongside in a multio extension object that OpenAI-shaped clients may ignore:
"multio": {
"source": "api",
"tokensCharged": 812,
"costMicro": 5410,
"balanceTokens": 79123456,
"conversationId": "…",
"cached": false,
"modelUsed": "llama-4-scout",
"cacheHit": false,
"flagshipTokensCharged": 31250
}
| Field | Meaning |
|---|---|
tokensCharged | What this request cost you, in MultiO tokens — the exact amount your balance dropped. |
costMicro | The same charge in micro-dollars (1,000,000 micro = $1) at the answering model’s published rates. |
balanceTokens | Your MultiO token balance after this request. |
modelUsed | The catalogue id of the model that answered (the routed model, when you sent auto). |
cacheHit | True when the answer came from cache: tokensCharged is then 0. |
flagshipTokensCharged | What this request’s exact usage — the same input and output tokens — would have cost in MultiO tokens at the flagship GPT-5.5 rates. Compare it with tokensCharged on every receipt; your mix will vary, so the receipt is the measurement, not a promise. |
cached | The original cache flag (same value as cacheHit), kept for clients built before receipts v2. |
conversationId | The conversation this request was recorded as, visible in your MultiO history. |
Budget caps — enforced, not just tracked
Each API key can carry a daily cap and a monthly cap (set in dollars in Settings → API keys, at creation or any time after). Caps are per key, counted over the UTC day and the UTC calendar month, and they are hard: before any provider call, MultiO sums the key’s spend in the window plus its in-flight calls, and if the new call’s worst-case estimate would cross the cap, the request is refused and no provider is called:
HTTP 402
{ "error": { "code": "API_KEY_BUDGET_EXCEEDED", "type": "insufficient_quota", … } }
Settings also shows each key’s spend so far today and this month against its caps. A cap of $0 blocks the key entirely; clearing a cap removes the limit. Caps govern API spend only — your plan balance and its existing protections apply as usual.
Rate limits
Each API key may make 60 requests per minute. Beyond that, requests are refused with HTTP 429, error code API_KEY_RATE_LIMITED, and a Retry-After header. (Your account’s overall chat rate limit applies across the web app and the API combined, as it does today.)
Caching
Stateless single-turn text requests may be served from MultiO’s shared response caches (an exact-match cache, and a semantic cache that recognises a reworded repeat of a standalone question). A cache hit costs 0 tokens and its receipt says "cacheHit": true. Multi-turn requests, requests carrying tool definitions, and requests whose system text differs are never served from the semantic cache. There is nothing to configure: eligibility is automatic, and every receipt tells you whether it happened.
Pricing
The API draws on the same MultiO token balance as the web app — there is no separate API plan and no per-request fee on top of the metered token charge at published rates:
- Free trial: 3,000,000 tokens, no card required.
- Pro: $20/month for 80,000,000 tokens.
- Household: $39/month — one pooled wallet of 160,000,000 tokens for up to 5 people.
- Top-ups: $5 for 30,000,000 tokens · $10 for 60,000,000 · $25 for 150,000,000.
Estimate your own workload in the model cost calculator, and see per-model rates in the model guide.
Errors
Errors use the OpenAI shape — { "error": { "message", "type", "param": null, "code" } } — with the HTTP status you would expect: 400 for a malformed request or unknown model (model_not_found), 401 for an unknown or revoked key, 402 for an empty balance (NO_CREDIT) or a key budget cap (API_KEY_BUDGET_EXCEEDED), and 429 for rate limits.
Questions: support@multio.ai. The API’s data handling is covered by the Privacy Policy and Terms that govern your MultiO account.