# List models

> Lists the models the API serves, as a catalogue document in the OpenRouter provider schema 2.4: one entry per model id with its name, context length, maximum output, prices per token (decimal strings in US dollars), streaming support and supported parameters. The `id` of each entry is the value to send as `model` in a chat completion. No API key is needed, and the endpoint answers cross-origin requests from browsers, which is how the tables on [Models](https://docs.serenityedge.ai/docs/models) and [Pricing and limits](https://docs.serenityedge.ai/docs/pricing-and-limits) are filled.

Source: https://docs.serenityedge.ai/docs/api/edge/list-models/

`GET https://api.serenityedge.ai/v1/models`

Lists the models the API serves, as a catalogue document in the OpenRouter provider schema 2.4: one entry per model id with its name, context length, maximum output, prices per token (decimal strings in US dollars), streaming support and supported parameters. The `id` of each entry is the value to send as `model` in a chat completion. No API key is needed, and the endpoint answers cross-origin requests from browsers, which is how the tables on [Models](https://docs.serenityedge.ai/docs/models) and [Pricing and limits](https://docs.serenityedge.ai/docs/pricing-and-limits) are filled.

Add `?format=openai` to get the OpenAI-style list instead: `{"object": "list", "data": [{"id", "object", "created", "owned_by", "pricing", "context_length"}]}`, with every id and alias and its prices in US dollars per million tokens. Only this list includes the [decision models](https://docs.serenityedge.ai/docs/decisions) (preview) and the [embeddings, rerank and redaction](https://docs.serenityedge.ai/docs/embeddings-rerank-and-redaction) models, each with an `endpoints` array naming the routes it is served on (`/v1/decisions` and `/v1/systemone`; `/v1/embeddings`, `/v1/rerank` or `/v1/redact`) and an output price of 0; chat models have no `endpoints`. The tables of these models on [Decisions](https://docs.serenityedge.ai/docs/decisions#models) and [Embeddings, rerank and redaction](https://docs.serenityedge.ai/docs/embeddings-rerank-and-redaction#models) are filled from it.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `format` | query | string | no | `openai` returns the OpenAI-style list (`object`, `data[]` with `id`, `object`, `created` and `owned_by`, plus `pricing` and `context_length`) that the OpenAI SDKs expect from `models.list()`. It is the only list that includes the decision, embeddings, rerank and redaction models, marked with `endpoints`. Omit it for the provider catalogue. Always `openai`. |

## Responses

### 200: The catalogue, in the OpenRouter provider schema 2.4; with `format=openai`, the OpenAI-style list.

Body (`application/json`)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | array of ProviderModel (object) | yes |  |
| `data[].schema_version` | string | yes | Version of the provider schema (`2.4`). |
| `data[].id` | string | yes | Model id, used as the `model` parameter. |
| `data[].name` | string | yes | Display name, prefixed with the vendor and a colon (`Serenity: Orion Pro`, `Qwen: Qwen3.8 27B`). |
| `data[].created` | integer | yes | Unix timestamp (seconds) of the listing. |
| `data[].quantization` | string | no | Serving precision of the open models: `nvfp4`, or `bf16` for `paddleocr-vl-1.6`. The Orion ids do not publish it. |
| `data[].description` | string | no | Free-text description of the model and of where it is served. |
| `data[].input_modalities` | array of InputModality (object) | yes |  |
| `data[].input_modalities[].type` | string | yes | One of `text`, `image`. |
| `data[].input_modalities[].supported_inputs` | object | yes | For `text`, the context window. For `image`, the accepted `sources` (`base64`), `formats` and `references`, whose `max` is the most images per request on that model (from 1 to 8). |
| `data[].input_modalities[].supported_inputs.max_context_length` | any | no | Context window (input plus output). |
| `data[].input_modalities[].pricing` | array of TokenPrice (object) | yes | Input prices: one `prompt` entry and, when the prompt cache applies, one `cached_prompt` entry. |
| `data[].input_modalities[].pricing[].type` | string | yes | `prompt` is input, `cached_prompt` is input served from the prompt cache, `completion` is output. One of `prompt`, `cached_prompt`, `completion`. |
| `data[].input_modalities[].pricing[].unit` | string | yes | Always `token`. |
| `data[].input_modalities[].pricing[].cost_usd` | string | yes | Price per token in US dollars, as a decimal string so that no rounding takes place. Multiply by 1,000,000 for the price per million tokens shown on Pricing and limits. |
| `data[].input_modalities[].pricing[].implicit` | boolean | no | For `cached_prompt`: the cache applies automatically, without a request parameter. |
| `data[].input_modalities[].capacity` | array of TokenCapacity (object) | no |  |
| `data[].input_modalities[].capacity[].type` | string | yes | One of `prompt`, `completion`. |
| `data[].input_modalities[].capacity[].unit` | string | yes | Always `token`. |
| `data[].input_modalities[].capacity[].per` | string | yes | Always `minute`. |
| `data[].input_modalities[].capacity[].value` | integer | yes | Tokens per minute the provider can serve for this model. |
| `data[].output_modalities` | array of OutputModality (object) | yes |  |
| `data[].output_modalities[].type` | string | yes | Always `text`. |
| `data[].output_modalities[].max_length` | any | yes | Maximum output (`max_tokens`). |
| `data[].output_modalities[].streaming` | boolean | yes | Whether `stream: true` is supported. |
| `data[].output_modalities[].supported_parameters` | object | yes | Map from request parameter (`temperature`, `top_p`, `top_k`, `max_tokens`, `stop`, `seed`, `tools`, `structured_outputs`, `reasoning`) to its constraints. A parameter present in the map is supported. |
| `data[].output_modalities[].pricing` | array of TokenPrice (object) | yes | Output price: one `completion` entry. |
| `data[].output_modalities[].pricing[].type` | string | yes | `prompt` is input, `cached_prompt` is input served from the prompt cache, `completion` is output. One of `prompt`, `cached_prompt`, `completion`. |
| `data[].output_modalities[].pricing[].unit` | string | yes | Always `token`. |
| `data[].output_modalities[].pricing[].cost_usd` | string | yes | Price per token in US dollars, as a decimal string so that no rounding takes place. Multiply by 1,000,000 for the price per million tokens shown on Pricing and limits. |
| `data[].output_modalities[].pricing[].implicit` | boolean | no | For `cached_prompt`: the cache applies automatically, without a request parameter. |
| `data[].output_modalities[].capacity` | array of TokenCapacity (object) | no |  |
| `data[].output_modalities[].capacity[].type` | string | yes | One of `prompt`, `completion`. |
| `data[].output_modalities[].capacity[].unit` | string | yes | Always `token`. |
| `data[].output_modalities[].capacity[].per` | string | yes | Always `minute`. |
| `data[].output_modalities[].capacity[].value` | integer | yes | Tokens per minute the provider can serve for this model. |
| `data[].is_ready` | boolean | no | Whether the provider declares the model ready for production traffic. |
| `data[].is_free` | boolean | no |  |
| `data[].discount_to_user` | number | no | Discount applied to the listed prices, 0 when none. |
| `data[].openrouter` | object | no | Present when the model is listed on OpenRouter. |
| `data[].openrouter.slug` | string | no | The model id on OpenRouter (`qwen/qwen3.8-27b`). |
| `data[].datacenters` | array of object | no | Where inference runs. |
| `data[].datacenters[].country_code` | string | no |  |
| `data[].datacenters[].region` | string | no |  |
| `data[].deployment_region` | string | no | `EU`. |
| `data[].compliance` | object | no |  |
| `data[].compliance.zdr` | boolean | no | Zero data retention: prompts and completions are never written to disk or logs. |
| `data[].compliance.hipaa` | boolean | no |  |
| `object` | string | yes | Always `list`. |
| `data` | array of OpenAIModel (object) | yes |  |
| `data[].id` | string | yes | Model id or alias, used as the `model` parameter. |
| `data[].object` | string | yes | Always `model`. |
| `data[].created` | integer | yes | Unix timestamp (seconds) of the listing. |
| `data[].owned_by` | string | yes | `serenity`. |
| `data[].pricing` | object | no | Prices in US dollars per million tokens. Absent when not known. |
| `data[].pricing.input` | number | yes | Price per million input tokens. |
| `data[].pricing.output` | number | yes | Price per million output tokens. `0` for decision, embeddings, rerank and redaction models, whose output is not billed. |
| `data[].context_length` | integer | no | Context window in tokens. Absent when not known. |
| `data[].endpoints` | array of string | no | Present only on the models that are not chat models: the routes the model is served on, `/v1/decisions` and `/v1/systemone` for a decision model, or one of `/v1/embeddings`, `/v1/rerank` and `/v1/redact`. Chat models, served on `/v1/chat/completions`, have no `endpoints`. |

### 429: Rate limit exceeded, or the service is temporarily at capacity for this model. Wait for the number of seconds in the `Retry-After` header before retrying.

Header `Retry-After`: Seconds to wait before retrying.

Body (`application/json`): `ErrorResponse`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | Error (object) | yes | OpenAI-style error object. |
| `error.message` | string | yes | Human-readable description of the problem. |
| `error.type` | string | yes | Error category. One of `invalid_request_error`, `authentication_error`, `permission_error`, `not_found_error`, `rate_limit_error`, `server_error`. |
| `error.code` | string or null | no | Machine-readable error code, when available. |
| `error.param` | string or null | no | The request parameter the error refers to, when applicable. |
