Skip to main content

Request

A valid virtual key is the only requirement. The list is what that key can dispatch, so two keys in the same project can return different lists.

Response

OpenAI’s own list shape:
Entries are sorted by id and deduplicated. data is always an array, empty rather than null when the key reaches no models.

What the list holds

Three sources, filtered to what the key can actually call:
  1. Model aliases on the key, under the alias name. An alias whose target the key cannot dispatch to is left out.
  2. Allowlist entries, when the key sets models_allowed. An allowlist of literal model ids is authoritative on its own, so no provider catalog is queried. A wildcard entry such as claude-haiku-* is a pattern rather than a model name, so it is left out of the list, and an allowlist that holds one runs discovery to get the concrete ids behind the pattern.
  3. Discovered models from every credential the key can reach, read from each provider’s own catalog.
Every candidate is then dropped when the key’s allowlist or its policy rules refuse it, and when the key holds no credential for the provider that would serve it. A listed model is one a request for it can reach.

Model tiers

When the key runs on a routing policy, the reserved tier names complex, reasoning and fast are in the list. A tier is an alias the policy sets, and it falls through to the policy’s default model when the policy names no target for it. A tier with no target and no default model is not listed.

Providers with an instance handle

A model from a provider that has an instance handle is listed under the handle-qualified id, for example europe/gpt-5-mini. That id is the only name that reaches that provider when the key holds two of the same family. owned_by stays the provider family, because that is what a model picker groups by.

Incomplete discovery

A provider the key can dispatch to can contribute no models to the catalog. The response then carries X-Langwatch-Models-Discovery-Incomplete with one provider:reason token per gap, comma separated:
The header is absent when the list is complete, and when the key sets a literal allowlist, since no catalog is read then.

Errors

The full table is on Errors. Also check: Model naming, Model aliases, Routing policies.
Last modified on September 6, 2026