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.
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-sonnet-4-20250514",
"name": "anthropic/claude-sonnet-4-20250514",
"owned_by": "anthropic",
"canonical_slug": "anthropic/claude-sonnet-4-20250514",
"created": 1730000000,
"context_length": 200000,
"pricing": { "prompt": "0.000003", "completion": "0.000015" },
"supported_parameters": ["tools", "reasoning", "structured_outputs"]
}
]
}
A few honest details about the fields:
pricing.prompt/pricing.completionare USD-per-token decimal strings (so"0.000003"is $3.00 per million prompt tokens).namecurrently mirrorsid(it is not yet a human-pretty label).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 suffixes
You can append a sort suffix to the model id. A suffix overrides provider.sort:
| Suffix | Effect | Equivalent to |
|---|---|---|
:floor | Prefer the cheapest provider | provider.sort: "price" |
:nitro | Prefer the fastest provider | provider.sort: "throughput" |
# 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"}]}'
OpenRouter's :online suffix (and the plugins field for web search / file parsing) are
not supported on Onlist; they are a no-op. Don't rely on them.
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).