# Models and privacy labels

Browse the catalog, read model capabilities, and understand the privacy label on each route.

Every model in AnonRouter is a route with a declared privacy guarantee, a set of
capabilities, and a price. Model IDs follow a `creator/model` slug, for example
`meta-llama/llama-3.3-70b`. The router also resolves a model's raw provider
route id, so either form works in a request.

## Latest model aliases

Use a **Latest** alias when you want a model family to follow AnonRouter's
latest reviewed stable release without changing the model ID in your app. For
example, **DeepSeek Flash Latest** uses the exact ID
`~deepseek/deepseek-flash-latest`, including the leading `~`.

A Latest alias points to one reviewed model in its creator and family. It is
updated through a reviewed promotion, not by guessing which provider name or
release date is newest. It is an explicit model choice, rather than `/auto` or
a router that chooses among different families for each request.

| Alias                 | Model ID                          |
| --------------------- | --------------------------------- |
| DeepSeek Flash Latest | `~deepseek/deepseek-flash-latest` |
| DeepSeek Pro Latest   | `~deepseek/deepseek-pro-latest`   |
| Kimi Latest           | `~moonshotai/kimi-latest`         |
| GLM Latest            | `~z-ai/glm-latest`                |
| GLM Flash Latest      | `~z-ai/glm-flash-latest`          |
| MiniMax Latest        | `~minimax/minimax-latest`         |
| Qwen Latest           | `~qwen/qwen-latest`               |
| Qwen Coder Latest     | `~qwen/qwen-coder-latest`         |

Use the alias as the `model` value in a chat request:

```json
{
  "model": "~deepseek/deepseek-flash-latest",
  "max_tokens": 1024,
  "messages": [{ "role": "user", "content": "Explain this code." }]
}
```

In the [private ticket flow](/quickstart), request the ticket with the same
alias ID. The concrete target is frozen when the ticket is issued: a promotion
between ticket issuance and completion does not switch that request's model.
The response names the concrete model that served the request.

### Check what Latest currently means

The model page shows the current target and version history. Catalog entries
include `alias.targetModelId`, `alias.revision`, and `alias.history`;
`GET /v1/models` also exposes the target as `canonical_slug`. Read the current
catalog rather than hard-coding today's mapping in your app.

Prices, capabilities, context limits, and eligible provider routes follow the
resolved target. A future promotion can change them. Your provider pin,
workspace settings, privacy boundary, and price limits still apply; if the
target is unavailable or fails those checks, the request is refused rather than
silently choosing an unrelated model. A `-latest` name does not make a model
free or add it to the automatic routing pool.

For reproducible integrations, select the concrete versioned model ID instead
of the Latest alias. See [provider routing](/provider-routing) to pin a provider
as well, and [choose a router](/routers) when you want selection across models.

## List models

`GET /v1/models` returns the models enabled on the deployment. It requires an
inference or management key.

```bash
curl "https://control.anonrouter.ai/v1/models" \
  -H "Authorization: Bearer $ANONROUTER_API_KEY"
```

Each entry describes one model:

```json title="Illustrative model object"
{
  "id": "meta-llama/llama-3.3-70b",
  "object": "model",
  "owned_by": "meta-llama",
  "display_name": "Llama 3.3 70B",
  "provider": "venice",
  "model_type": "text",
  "privacy_class": "private",
  "provider_privacy_class": "private",
  "context_window": 65536,
  "max_output_tokens": 4096,
  "pricing": {
    "input_usd_per_million_tokens": 0.7,
    "output_usd_per_million_tokens": 2.8,
    "unit_usd": null
  },
  "capabilities": {
    "embeddings": false,
    "streaming": true,
    "tools": true,
    "web": false,
    "reasoning": {
      "supported": false,
      "effort_configurable": false,
      "supported_efforts": [],
      "can_disable": false,
      "default_effort": null,
      "always_on": false
    }
  },
  "routing": {
    "enabled": true,
    "quality_tier": 4,
    "tasks": ["general", "coding"],
    "expected_latency_ms": 900
  }
}
```

> **The endpoint is the source of truth**
>
> Field values above are illustrative. Prices, context windows, and the enabled
> model set change over time. Read them from the live endpoint rather than
> hard-coding them.

`model_type` is one of `text`, `image`, `tts`, or `embedding`. For flat-priced
media models, `pricing.unit_usd` is the per-image or per-character price and the
per-token fields are null.

## Public catalog

`GET /v1/catalog/models` is an unauthenticated, cacheable view of the catalog
with richer privacy metadata (`privacyLevel`, `privacySummary`, `privacyNotes`,
`moderation`, and `modalities`). It supports `ETag` and returns `304` when
unchanged, which makes it convenient for a public model browser.

## Route prices and long-context tiers

The listed price of the serving route determines the charge. Input, output,
cache-read, and cache-write rates can differ; a model's lowest advertised rate is
not a promise that every eligible provider route has that rate. With an active
[subscription](/subscriptions), allowance usage is priced at your plan's price
for the route, which is never higher than the pay-as-you-go price.

Some routes publish prompt-size tiers in `pricing.long_context_tiers` on
`GET /v1/models`. The public catalog exposes `priceTiers` and
`priceTiersInEffect`. `in_effect` on an OpenAI-shaped tier, or
`priceTiersInEffect` in the public catalog, says whether tier billing is enabled.
If false, the standard rates apply. When enabled, read the serving route's
schedule: above a tier's prompt threshold, its rates apply to the whole request,
including output and cache buckets. At exactly the threshold, the lower tier
applies. See
[metering and long-context pricing](/metering#long-context-pricing).

The published context window and a price threshold are different limits. A
higher price tier does not grant a larger window; an intentional route cap
still applies. See [context limits](/context-limits).

## Privacy labels

Every route carries one privacy classification. The label tells you the
strongest guarantee that route actually provides.

| Label     | `privacy_class` | What it means                                                                                                              |
| --------- | --------------- | -------------------------------------------------------------------------------------------------------------------------- |
| Anonymous | `anonymous`     | Your identity is hidden, but the model provider can see the prompt while serving it. Provider retention is not guaranteed. |
| Private   | `private`       | Prompt and response content is not retained after the request completes.                                                   |
| TEE       | `tee`           | Inference runs inside a hardware-isolated, attestable enclave.                                                             |
| E2EE      | `e2ee`          | Your client encrypts the prompt so that only a verified enclave can decrypt it.                                            |

> **AnonRouter never stores payloads**
>
> These labels describe the upstream provider handling. Regardless of the label,
> AnonRouter itself does not write prompts or responses to disk. On Anonymous
> routes the provider can still see the prompt, so provider zero-retention is not
> guaranteed there.

> **Read `privacyNotes`, not just the label**
>
> The label is a category; the per-route notes are the actual boundary, and on
> two of them the difference matters.
> 
> **E2EE says the enclave you verified is the only thing that can decrypt, not
> that it is the machine running the model.** On some Venice routes the enclave
> that holds your key is a verified gateway rather than the model host: it
> decrypts and forwards the plaintext onward inside the provider. The route's
> `privacyNotes` say so.
> 
> **`private` is a retention promise, not an enclave.** A `private` route carries
> no attestation. A provider whose name evokes confidential computing is not
> thereby a TEE route; the route's privacy label is the claim.

TEE and E2EE labels describe the route modality; they do not by themselves
claim a particular strength of attestation. See the [E2EE client guide](/e2ee)
for encrypted transport setup and [TEE verification and encrypted
inference](/tee-verification) for the live provider matrix, verification levels,
public evidence API, request receipts, and the opaque NEAR v2 protocol.

## Free models

Free variants use a separate `<creator>/<model>:free` ID and cost $0, including
inference fees. `anonrouter/free` chooses an available free model for each
request; it never selects a paid route. `/auto` does not select free variants.

Enable free models once for your account on the dashboard **Privacy** page, a
free model's page, or the Free Models Router page. That opt-in is consent to
Anonymous routes, where the provider can see and may retain your prompts and
responses. No per-request consent field is required, but workspace privacy
boundaries still apply.

See [free models](/free-models) for setup, examples, eligibility, shared capacity,
workspace settings, and errors. See [choose a router](/routers) to compare the
Free Models Router with the paid routers.

## Capabilities

The `capabilities` block tells you what a model supports before you call it:

* `streaming`: server-sent event streaming.
* `tools`: tool-calling fields are accepted and forwarded to the model.
* `web`: the model can use web access.
* `embeddings`: the model is an embedding model.
* `reasoning`: whether reasoning is supported, whether the effort level is
  configurable, which efforts are attested, and whether it can be disabled. See
  [reasoning controls](/reasoning).

## Moderation

Moderation is a property of the model, not a router policy. Models published as
uncensored run unfiltered. The public catalog exposes a `moderation` field so you
can filter the catalog by it.

## Model health

`GET /v1/models/uptime?model=<id>&days=<n>` returns a passive success-rate and
latency series for a model, computed from request metadata.
