Models
A model is identified by an author/model id (the same scheme OpenRouter uses). The catalog
aggregates every model offered by active providers. You pick the model, and provider
routing decides which provider fulfills it.
Model ids
You can pass either form as the model field in a request body:
| Form | Example | Notes |
|---|---|---|
author/model | openai/gpt-4o | Recommended. The segment before the first / is the model author. |
| bare model | gpt-4o | Accepted; resolved against the catalog. |
The author/model id refers to the model author (e.g. openai, anthropic), not to
the provider fulfilling the request. Providers are addressed separately through the
provider object.
Dot and hyphen forms
Some models write their version number with a dot upstream and a hyphen in the provider-native id. Onlist publishes one form as the public id and accepts the other as an alias, so both resolve to the same model:
| Where it appears | Example |
|---|---|
Public id: id, model page URL, sitemap | anthropic/claude-opus-4.8 |
Alias, also accepted in the model field | anthropic/claude-opus-4-8 |
canonical_slug in GET /v1/models | anthropic/claude-opus-4-8 |
This matches OpenRouter, which publishes the same models under the dot form. Requesting
the hyphen form works and is not deprecated; a model page opened at the hyphen URL
redirects to the published one. If you persist model ids, persist canonical_slug: it
does not move when the published form does.
Listing models
GET /v1/models returns the catalog in the OpenAI/OpenRouter list shape. It is public,
no authentication required, and is cached for about 60 seconds. There is one entry per
(author, model) aggregated across active, ready listings.
curl https://onlist.io/v1/modelsA response looks like this:
{
"object": "list",
"data": [
{
"id": "anthropic/claude-opus-4.8",
"name": "Anthropic: Claude Opus 4.8",
"owned_by": "anthropic",
"canonical_slug": "anthropic/claude-opus-4-8",
"created": 1780680536,
"context_length": 1000000,
"pricing": { "prompt": "0.0000030000", "completion": "0.0000150000" },
"supported_parameters": ["tools", "reasoning", "structured_outputs"]
}
]
}
A few honest details about the fields:
pricing.prompt/pricing.completionare USD-per-token decimal strings (so"0.0000030000"is $3.00 per million prompt tokens).nameis the human-readable display label (Anthropic: Claude Opus 4.8), not a copy ofid.canonical_slugis the provider-native form of the id. It stays put whenidis published under an alias form, so it is the safer value to store.createdis the listing'screated_at(when a provider listed the model on Onlist), not the model's release date, a deliberate divergence from OpenRouter.- The response carries an
X-Onlist-Catalog-Version: 1header pinning the catalog shape.
The onlist/auto default
onlist/auto (and the OpenRouter alias openrouter/auto) resolve to one static
platform-default model. They do not inspect your prompt and pick the best model
per request. These sentinels are request-side routing values; they never appear in the
GET /v1/models data[]. Sending an auto sentinel to an endpoint that doesn't support
it returns 422.
Model variant suffixes
A : suffix on a model id means one of two things, and Onlist reads them the way
OpenRouter does. Only the last : segment is inspected.
Routing shortcuts never change which model you get. They are stripped from the id and only reorder the eligible providers:
| Suffix | Effect |
|---|---|
:floor | Cheapest provider first (same as provider.sort: "price"). |
:nitro | Fastest provider first (same as provider.sort: "throughput"). |
:exacto | Honored as the default ordering, which is already a composite quality score. No warning. |
:online | Not available on Onlist (it needs OpenRouter's web-search plugin, and the plugins field is unsupported too). Dropped, and reported as ignored: model variant slug ":online" (not available on Onlist). |
# Route to the cheapest provider for this model
curl https://onlist.io/v1/chat/completions \
-H "Authorization: Bearer YOUR_ONLIST_TOKEN" \
-H "Content-Type: application/json" \
-d '{"model": "openai/gpt-4o:floor", "messages": [{"role": "user", "content": "hi"}]}'
Static variants are separate models, not options. Every other suffix, including
:free, :batch, :thinking and anything Onlist does not recognize, stays in the model id
and is routed to its own listing: deepseek/deepseek-v4:thinking and
deepseek/deepseek-v4 are two different products.
If no provider sells that exact id, the request returns 404 no_listing_for_model.
Onlist does not quietly drop the suffix and serve you the base model. There are no
:free listings on Onlist today, so those ids have nothing behind them. Full table and
the rules for combining the two kinds:
Provider routing.
Next steps
- Provider routing: Choose which provider fulfills a model: only, sort, allow, max_price.
- Streaming: Stream responses over Server-Sent Events.
- Usage & cost: Token usage, and where cost actually lives.
- OpenAPI spec: Full request and response schemas, including GET /v1/models (YAML download).