# Models

URL: https://docs.router.ezat.io/models

> Every AI model you can call through EZAT Router, how model ids and aliases work, model statuses, what each feature means, and how to list models from the API.

## When to use this page

You need a model id for a request, want to know what a model supports, or want to list models from code. Prices are on [Pricing](https://docs.router.ezat.io/pricing.md).

## Models

| Model id | Model | Aliases | Context | Max output | Features |
| --- | --- | --- | --- | --- | --- |
| `anthropic/claude-fable-5-1` | Claude Fable 5.1 | `claude-fable-5-1`, `claude-fable-5.1` | 1M | 128K | Tools, Images, Thinking, Prompt caching, 1 h cache |
| `anthropic/claude-fable-5` | Claude Fable 5 | `claude-fable-5` | 1M | 128K | Tools, Images, Thinking, 1 h cache |
| `anthropic/claude-opus-5-5` | Claude Opus 5.5 | `claude-opus-5-5`, `claude-opus-5.5` | 1M | 128K | Tools, Images, Thinking, Prompt caching, 1 h cache |
| `anthropic/claude-opus-5` | Claude Opus 5 | `claude-opus-5` | 1M | 128K | Tools, Images, Thinking, Prompt caching, 1 h cache |
| `anthropic/claude-sonnet-5-5` | Claude Sonnet 5.5 | `claude-sonnet-5-5`, `claude-sonnet-5.5` | 1M | 128K | Tools, Images, Thinking, Prompt caching, 1 h cache |
| `anthropic/claude-sonnet-5` | Claude Sonnet 5 | `claude-sonnet-5` | 1M | 128K | Tools, Images, Thinking, Prompt caching, 1 h cache |
| `anthropic/claude-haiku-5-5` | Claude Haiku 5.5 | `claude-haiku-5-5`, `claude-haiku-5.5` | 1M | 128K | Tools, Images, Thinking, Prompt caching, 1 h cache |
| `anthropic/claude-opus-4-8` | Claude Opus 4.8 | `claude-opus-4-8`, `claude-opus-4.8` | 1M | 128K | Tools, Images, Thinking, Prompt caching, 1 h cache |
| `anthropic/claude-opus-4-7` | Claude Opus 4.7 | `claude-opus-4-7`, `claude-opus-4.7` | 1M | 128K | Tools, Images, Thinking, Prompt caching, 1 h cache |
| `anthropic/claude-opus-4-6` | Claude Opus 4.6 | `claude-opus-4-6`, `claude-opus-4.6` | 1M | 128K | Tools, Images, Thinking, Prompt caching, 1 h cache |
| `anthropic/claude-sonnet-4-6` | Claude Sonnet 4.6 | `claude-sonnet-4-6`, `claude-sonnet-4.6` | 1M | 128K | Tools, Images, Thinking, Prompt caching, 1 h cache |

The table is live from the catalog. Context is the most input tokens a request can have; max output is the highest `max_tokens` the model accepts.

## Model ids

- The canonical id is `author/model`, for example `anthropic/claude-sonnet-5-5`. The author is the company that made the model, not the one that serves it.
- A model also answers to the names in the Aliases column: the provider's own name without the `author/` prefix (`claude-sonnet-5-5`), and for most models the same name with a dot in the version (`claude-sonnet-5.5`). Claude Code and the Anthropic SDKs send these names, so they work unchanged.
- Ids and aliases are case-insensitive. Spaces around them are ignored.
- Both APIs take the same ids: `POST /v1/messages` and `POST /openai/v1/chat/completions`.
- The `model` in a response is exactly the name you sent, never a provider's internal id. The model lists below always return canonical ids.

## Statuses

| Status | Listed | Requests |
| --- | --- | --- |
| Active | Yes | Served |
| Deprecated | Yes, with a **Deprecated** badge | Still served. Move to a newer model in the same family before it is retired. |
| Preview | Only to keys with preview access | Served only to keys with preview access. Other keys get the same 404 as an unknown model. |
| Retired | No | Rejected with 404 |

A retired, unknown or preview model (without preview access) is rejected before it reaches a model, and isn't charged:

```json
{
  "type": "error",
  "error": { "type": "not_found_error", "message": "model: <the name you sent>" },
  "request_id": "…"
}
```

On the OpenAI-compatible API it is a 404 with `"code": "model_not_found"` and `"param": "model"`. See [Errors](https://docs.router.ezat.io/reference/errors.md).

Preview access is set per API key by EZAT Router; the dashboard has no switch for it. To ask for it, email support@ezat.io.

### Keys limited to some models

A key created with **Only selected models** can call only those models. Any other model is refused with 403 `permission_error` ("This API key is not allowed to use …"), and the key's model lists show only its models. See [API keys](https://docs.router.ezat.io/api-keys.md).

### Models without capacity

When no provider can serve a model right now, the public catalog shows it with `"available": false` and the dashboard's Models page shows **Unavailable**. Requests for it get 529 `overloaded_error` (503 on the OpenAI-compatible API) with a `retry-after` header. See [Rate limits](https://docs.router.ezat.io/reference/rate-limits.md).

## Features

| Feature | What it means |
| --- | --- |
| Tools | Tool use: `tools` on `/v1/messages`, function `tools` on the OpenAI-compatible API |
| Images | Image input (`image` blocks, or `image_url` parts) and PDF input (`document` blocks, or `file` parts with `file_data`) |
| Thinking | Extended thinking: `thinking` on `/v1/messages`, `reasoning_effort` on the OpenAI-compatible API |
| Prompt caching | `cache_control` breakpoints are honoured, and cached tokens bill at the cache read price. The OpenAI-compatible API caches automatically for these models. A model without it has its breakpoints removed and bills every token as plain input. See [Prompt caching](https://docs.router.ezat.io/guides/prompt-caching.md). |
| 1 h cache | Breakpoints with `"ttl": "1h"` work, billed at the 1-hour cache write price |

The public catalog also has a `sampling` capability. Models with it accept `temperature`, `top_p` and `top_k`. Models without it run only at their default sampling: on `/v1/messages` the model refuses other values with a 400, and the OpenAI-compatible API drops these fields. The OpenAI-compatible API also drops them whenever thinking is on.

## Choosing a model

Start with the newest model in the family that fits the task. Older models stay in the catalog so existing code keeps working.

| Family | Use it for |
| --- | --- |
| Fable | The hardest, longest-running tasks |
| Opus | Complex reasoning and agentic coding |
| Sonnet | Everyday coding, agents and production workloads, balancing speed and quality |
| Haiku | High-volume and latency-sensitive tasks |

Compare costs on [Pricing](https://docs.router.ezat.io/pricing.md) before you pick. Every model in the table above works with both APIs.

## List models from the API

There are two kinds of list:

| Endpoint | Key | Returns |
| --- | --- | --- |
| `GET https://api.router.ezat.io/v1/models` | Yes | The models this key can call, in Anthropic's format |
| `GET https://api.router.ezat.io/openai/v1/models` | Yes | The same models, in OpenAI's format |
| `GET https://api.router.ezat.io/api/models` | No | Every active and deprecated model, with prices |

The two keyed lists include active and deprecated models, preview models only when the key has preview access, and only the key's own models when it is limited to some. They don't include prices.

```bash tab="Anthropic format" test
curl -sS --fail-with-body https://api.router.ezat.io/v1/models \
  -H "x-api-key: $EZAT_API_KEY" \
  -H "anthropic-version: 2023-06-01"
```

```bash tab="OpenAI format" test
curl -sS --fail-with-body https://api.router.ezat.io/openai/v1/models \
  -H "Authorization: Bearer $EZAT_API_KEY"
```

| Anthropic format field | OpenAI format field | Value |
| --- | --- | --- |
| `id` | `id` | Canonical `author/model` id |
| `display_name` | | Display name |
| `created_at` | `created` | When the model was added to the catalog (ISO 8601, or Unix seconds) |
| `type`: `"model"` | `object`: `"model"` | |
| | `owned_by` | The author, for example `anthropic` |

The Anthropic list returns everything in one page (`has_more` is `false`).

To look up one model, use `GET https://api.router.ezat.io/v1/models/{id}` or `GET https://api.router.ezat.io/openai/v1/models/{id}`. `{id}` can be a canonical id or an alias, and the response has the canonical id. On `/v1/models/{id}`, write the `/` of a canonical id as `%2F` (`anthropic%2Fclaude-sonnet-5-5`); the SDKs do this for you. A model the key can't call returns 404, or 403 for a key limited to other models.

### The public catalog

`GET https://api.router.ezat.io/api/models` needs no key. It is what this page and [Pricing](https://docs.router.ezat.io/pricing.md) are built from.

```bash
curl -sS https://api.router.ezat.io/api/models
```

Each entry in `data` has:

| Field | Value |
| --- | --- |
| `id` | Canonical id |
| `aliases` | Other names the model answers to |
| `displayName`, `description`, `family` | Display name, one-line description, family (`opus`, `sonnet`, …) |
| `status` | `ACTIVE` or `DEPRECATED` |
| `contextWindow`, `maxOutputTokens` | Token limits |
| `capabilities` | `tools`, `vision`, `thinking`, `promptCaching`, `cacheTtl1h`, and `sampling` where it applies |
| `available` | `false` when no provider can serve the model right now |
| `pricing` | Prices in USD per million tokens: `input`, `output`, `cacheWrite5m`, `cacheWrite1h`, `cacheRead`, and `longContext` tiers |
| `officialPricing` | Anthropic's official list prices, in the same shape |

Prices are strings, to keep every decimal. Ignore the `uuid` field: it is internal.

## For AI agents

1. Send the canonical id (`author/model`) in `model`. Aliases from the catalog also work, case-insensitively.
2. To see which models a user's key can call, use `GET https://api.router.ezat.io/v1/models` with the key (`x-api-key` or `Authorization: Bearer`), or `GET https://api.router.ezat.io/openai/v1/models` for OpenAI-format tools.
3. To see every model with prices and capabilities, use `GET https://api.router.ezat.io/api/models` (no key), or read `https://docs.router.ezat.io/models.md`.
4. Don't hard-code a model list or prices in code or config you write for the user; read them from the endpoints above.
5. A 404 `not_found_error` (OpenAI format: `model_not_found`) means the model is unknown, retired or in preview. Pick another model from the list; retrying won't help.
6. Prefer the newest model of a family. Don't pick a model with the **Deprecated** badge for new work.