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:

FormExampleNotes
author/modelopenai/gpt-4oRecommended. The segment before the first / is the model author.
bare modelgpt-4oAccepted; 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 appearsExample
Public id: id, model page URL, sitemapanthropic/claude-opus-4.8
Alias, also accepted in the model fieldanthropic/claude-opus-4-8
canonical_slug in GET /v1/modelsanthropic/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/models

A 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.completion are USD-per-token decimal strings (so "0.0000030000" is $3.00 per million prompt tokens).
  • name is the human-readable display label (Anthropic: Claude Opus 4.8), not a copy of id.
  • canonical_slug is the provider-native form of the id. It stays put when id is published under an alias form, so it is the safer value to store.
  • created is the listing's created_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: 1 header pinning the catalog shape.

The onlist/auto default

Caution

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:

SuffixEffect
:floorCheapest provider first (same as provider.sort: "price").
:nitroFastest provider first (same as provider.sort: "throughput").
:exactoHonored as the default ordering, which is already a composite quality score. No warning.
:onlineNot 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.

Caution

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).