Combos
Only endpoints that intentionally differ from the standard API carry a chip; the chip links to the note that explains the difference.
A combo is a private model alias: use combo/<slug> in the model field of Chat Completions or Anthropic Messages. Create and manage it with your dashboard login session; call it with an API key from the same account.
/api/dashboard/combosDiffers from standard/v1/chat/completions/v1/messagesDiffers from standard/v1/modelsCall a saved combo
curl https://atmorouter.dev/v1/chat/completions \
-H "Authorization: Bearer $ATMOROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"combo/cheap-fast-pair","messages":[{"role":"user","content":"Hello!"}],"max_tokens":128}'For Anthropic Messages, send the same model ID to POST /v1/messages with your normal Messages body, including max_tokens. Use the protocol supported by your client and choose members that support its features. The combo does not translate unsupported model capabilities.
Public catalog requests list ordinary models only. Send a valid owner API key to GET /v1/models to discover your private combo IDs. Another account cannot discover or call your combo, even if it knows the slug; slugs are unique per account.
curl https://atmorouter.dev/v1/models \ -H "Authorization: Bearer $ATMOROUTER_API_KEY"
Context window and output limits
Authenticated model discovery includes a combo’s context_length and max_output_tokens when those limits are known for every saved member. Each value is the smallest corresponding limit across all saved members, including inactive members and those excluded by your key. Output is also capped by the known context window. A temporary availability change cannot increase this advertised limit.
Context length is the combined input and output window; it is not the maximum output length. For example, a combo whose members all have a 1,000,000-token context advertises 1,000,000. Adding a member with a 128,000-token context lowers that to 128,000. If a saved member is missing or its limit is unknown, the corresponding field is omitted rather than guessed. Current member limits can change as the catalog updates.
Limits are automatic; the combo management API has no manual context override. In Hermes and other clients, use your owner API key for model discovery and refresh the model list or cached metadata after changing a combo. Remove an old manual context override if it prevents discovery. If metadata is unavailable, use a conservative client setting supported by every member; a larger client value cannot expand a model’s actual capacity.
Routing strategies
| Strategy | Selection |
|---|---|
| round-robin | Rotate the starting model across eligible members on each request. Rotation is local to each gateway process and resets on restart. |
| failover | Try eligible members in saved order. Move to the next only after a safe rejection before output. |
| cheapest | Order by the sum of current input and output prices per million tokens. This heuristic does not guarantee the lowest total cost for your request. |
Disabled members and members excluded by your key are skipped. If the key has a model allowlist, it must allow both the combo ID and the underlying member IDs. Normal account and key budgets, request price caps, balance checks, and billing apply to the selected concrete model. A combo does not bypass funding or price limits.
Capacity waits apply per member, so a combo request can exceed one member’s capacity-wait window. Set your client timeout to allow for multiple member attempts. Each additional member attempt also consumes your account rate limit.
1. Create a combo Differs from standard
curl -c jar.txt https://atmorouter.dev/api/dashboard/login \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"..."}'
curl -b jar.txt https://atmorouter.dev/api/dashboard/combos \
-H "Content-Type: application/json" \
-d '{"name":"Cheap Fast Pair","models":["family/model-a","family/model-b"],"strategy":"failover"}'
# -> {"id":"c90d4f21-7b3e-4a5c-9d1f-2e6b8a0c4d7e","slug":"cheap-fast-pair","status":"created"}The member IDs above are illustrative. Choose actual IDs from the live catalog. In the dashboard, click members in priority order or use the arrows before saving.
| Parameter | Type | Description |
|---|---|---|
| name | string | Trimmed display name, 1–100 Unicode characters. Must produce a nonempty slug of at most 100 characters. |
| models | string[] | 2–32 distinct, nonempty model IDs, each at most 200 characters. Order is saved. Nested combo/ IDs are not allowed. |
| strategy | string | round-robin (default), failover, or cheapest. Legacy fallback is accepted and normalized to failover. |
The slug lowercases the name, replaces spaces with dashes, and removes characters outside [a-z0-9-]. Duplicate slugs within your account return 409. Creation validation does not guarantee that every member is currently callable: live availability, pricing, and key permissions are checked for each call. Existing legacy combos with one member remain callable.
2. List your combos
curl -b jar.txt https://atmorouter.dev/api/dashboard/combos
# -> {"data":[{"id":"...","name":"Cheap Fast Pair","slug":"cheap-fast-pair",
# "models":["family/model-a","family/model-b"],"strategy":"failover"}]}Newest first, scoped to your session account. An empty account returns {"data":[]}. A storage failure returns 503; an incomplete read does not prove a combo was deleted. A client-supplied user_id does not change ownership.
3. Delete a combo
curl -b jar.txt -X DELETE https://atmorouter.dev/api/dashboard/combos/c90d4f21-7b3e-4a5c-9d1f-2e6b8a0c4d7e
# -> {"status":"deleted"}The ID must be UUID-shaped. Unknown IDs and another account's IDs return the same 404. Authentication is checked before the ID shape. Deleting your account also removes your combos. There is no sharing or transfer endpoint; recreate a combo in the target account.
Management errors
| Situation | Status |
|---|---|
| Missing dashboard session, or inference API key used on a dashboard combo route | 401 |
| Malformed JSON, invalid name, members, strategy, or DELETE ID | 400 |
| Duplicate slug in your account | 409 |
| Unknown DELETE ID or ID owned by someone else | 404 |
| Unsupported management method | 405 |
| Storage failure while listing | 503 |
| Other management storage failure | 500 |
Inference errors use the selected protocol's error envelope. Calls with no eligible member, a disallowed combo alias, or an exhausted safe failover chain return an error; it never falls back to another account's combo. See Errors for normal inference, price, and balance refusals.