Models
List the models your key can call, read their capabilities, and address a model, a Provider Endpoint or a Router.
List what your key can call
curl https://api.stav.ai/v1/models \
-H "Authorization: Bearer $STAV_API_KEY"
for m in client.models.list():
print(m.id)
The list contains:
autofirst — the Smart Router, using your workspace's default Router- every model your workspace may use and whose Inference Provider is currently available
- your workspace's Routers, as
@workspace/routerentries (owned_by: "stav")
It is "what this key can call now", not the whole catalogue. Requires inference:models.
Read one model
curl https://api.stav.ai/v1/models/anthropic/claude-sonnet-4-5 \
-H "Authorization: Bearer $STAV_API_KEY"
{
"id": "anthropic/claude-sonnet-4-5",
"object": "model",
"owned_by": "anthropic",
"context_length": 200000,
"max_completion_tokens": 64000,
"top_provider": { "context_length": 200000, "max_completion_tokens": 64000 },
"stav_category": "llm",
"stav_context_window": 200000,
"stav_supports_thinking": true,
"stav_capabilities": {
The stav_* fields are extensions; the OpenAI SDK exposes them via model_extra.
context_length, max_completion_tokens and top_provider use OpenRouter's names, so code written for OpenRouter reads them unchanged.
| Field | Meaning |
|---|---|
context_length | The smallest context window, in tokens, across the Provider Endpoints your key can be routed to. It holds wherever the request goes. Chat models only |
max_completion_tokens | The smallest max output tokens across those endpoints. Chat models only |
top_provider | context_length and max_completion_tokens of the endpoint Stav tries first |
stav_category | Model category, e.g. LLM or embedding |
stav_context_window | The model's own context window. Prefer context_length |
stav_supports_thinking | Honours reasoning_effort / extended thinking |
stav_capabilities | Capability flags you can check before sending |
stav_surfaces | Which of chat, messages, responses, embeddings, transcriptions serve this model. A model with no surface is not listed |
stav_native_dialect | Wire format of the model's own provider |
stav_max_upload_mb | On the transcriptions surface: the largest file /v1/audio/transcriptions takes for this model, in MB. null elsewhere |
Use them as a pre-flight check:
info = client.models.retrieve("anthropic/claude-sonnet-4-5")
caps = info.model_extra.get("stav_capabilities") or {}
if not caps.get("vision"):
raise RuntimeError("this pipeline needs a vision model")
GET /v1/models/{id} takes anything you can send as model: the canonical creator/model id, a bare name with exactly one match (nb-whisper-large), or a Router (@your-workspace/router). The answer always carries the canonical id. A pinned endpoint (creator/model/provider) is not a model: find it on the model's /endpoints.
See every Provider Endpoint
Different Inference Providers serve the same model with different limits and precision. List them:
curl https://api.stav.ai/v1/models/openai/gpt-oss-120b/endpoints \
-H "Authorization: Bearer $STAV_API_KEY"
{
"data": {
"id": "openai/gpt-oss-120b",
"name": "gpt-oss-120b",
"endpoints": [
{
"id": "openai/gpt-oss-120b/groq",
"provider_name": "Groq",
"tag": "groq",
"context_length": 131072,
"max_completion_tokens": 65536,
"quantization": null,
"pricing": { "currency": "EUR",
- The numbers in this example are illustrative. Call the endpoint for current values.
- The list holds only the endpoints your key can reach. Your workspace's policy applies: sovereignty floor, compute region, ZDR, blocked providers.
- The order is the order Stav tries them in.
- Send an entry's
idasmodelto pin that endpoint. pricingis what a request on that endpoint is charged, per token, in your workspace's currency. It is the same price billing uses.stav_conditional_rates: truemeans the endpoint also has prices that depend on the request, such as long context.- The shape matches OpenRouter's
/api/v1/models/{author}/{slug}/endpoints. - A Router works here too, and so does
auto:GET /v1/models/@your-workspace/router/endpointslists every endpoint of every model the Router can pick, under the Router's own rules (ZDR, region, floor) as well as your workspace's, best model first. Each entry'smodel_idnames its model, anddata.stav_routeristrue. The models come 100 to a page:?page=2, anddata.stav_total_modelsis the whole pool.
Model ids
| Form | Example | Meaning |
|---|---|---|
auto | auto | Smart Router, workspace default Router |
| Router | @acme/eu-only | A named Router your workspace created |
| Model | zai-org/glm-5-2 | This model; Stav picks the Provider Endpoint |
| Provider Endpoint | zai-org/glm-5-2/fireworks-ai | This model on this Inference Provider |
| Bare name | claude-sonnet-4-5 | Resolved to a creator/model id |
creator/model
The canonical form. Copy it from /v1/models or the catalogue. When a model has more than one Provider Endpoint, Stav chooses among those your workspace's policy allows.
creator/model/provider
Pins one Provider Endpoint. A pin narrows the choice; it never overrides your workspace's policy.
- No endpoint with that slug →
endpoint_not_found - The endpoint exists but your policy excludes it (or it is not live) →
endpoint_not_admissible
Some endpoints carry a serving variant after a colon, e.g. zai-org/glm-5-2/fireworks-ai:fast. The variant only applies to a pinned endpoint.
Bare names and aliases
A name without a slash is resolved in order:
- a registered alias — old slugs from before the
creator/modelrename, and ids the Inference Provider itself uses - the one active model whose id ends in
/<name>
If two models share that last segment, the bare name matches nothing. Use creator/model in code you keep.
Unknown model
{
"error": {
"message": "The model 'openai/gpt-4o-turbo' does not exist or you do not have access to it.",
"type": "invalid_request_error",
"param": "model",
"code": "model_not_found"
}
}
The message covers both cases on purpose: Stav does not confirm that a model you cannot use exists.
Browse the full catalogue
The public catalogue needs no key:
curl "https://api.stav.ai/v1/public/models?page_size=20"
curl "https://api.stav.ai/v1/public/providers"
In Your workspace, Connect → Models and Connect → Inference Providers show the same catalogue with pricing, sovereignty and endpoints. Use /v1/models for "what can this key call"; use the catalogue for everything else.
Filter by type
Every model has a type — the door it is served on: chat, embedding or transcription. The catalogue opens on Chat; pass category= to switch, and filter on the type's own facts with capability=:
# embedding models with at least 1024 dimensions that support Norwegian
curl "https://api.stav.ai/v1/public/models?category=embedding&capability=embedding_dimensions:>=1024,languages:no"
# transcription models with word timestamps, priced at or under €0.01 per audio minute
curl "https://api.stav.ai/v1/public/models?category=transcription&capability=stt_timestamps_word&max_price=0.01&price_unit=audio_minutes"
A capability term is a slug (vision_input), slug:>=N for a number, or slug:code for a list; an unknown slug, or a value the fact does not take, is refused by name (422). Each item carries price_from and price_unit in the type's own unit (tokens_in, request or audio_minutes), and type_counts says how many models of each type match the other filters. GET /v1/public/model-types lists the types with their filters, units and benchmark sets.
Pin or route?
- Pin a model when you reproduce an evaluation or a contract names the model.
- Pin an endpoint when you need one Inference Provider specifically.
- Use a Router for most production traffic: failover, cost and latency trade-offs, and a sovereignty floor set once for the workspace. Change the Router, not your code.