Models

GET /v1/models lists the models a key may use, with the metadata a client needs to configure itself. The list is per key: a key limited to some models lists only those.

The models#

Model idContextMax outputVisionToolsReasoning effortsInput modalities
glm-5.31,048,576131,072noyeslow, high, maxtext
deepseek-v4.1-flash1,048,576393,216yesyeslow, high, maxtext, image
deepseek-dgx1,048,576393,216yesyeslow, high, maxtext, image
glm-5.3-flash1,048,576131,072yesyesno effort values publishedtext, image, video, file
deepseek-v4.1-flash-abliterated1,048,576131,072yesyeslow, high, maxtext, image
glm-5.3-abliterated1,048,576131,072noyeslow, high, maxtext
glm-5.3-flash-abliterated1,048,576131,072noyeslow, high, maxtext

An embedding model is listed with output_modalities: ["embedding"] and its dimensions; Embeddings is its endpoint. GET /v1/models is the current list for any key.

A prompt plus the output it may ask for must fit the context window. A request over it is refused with the context length error, context_length_exceeded in the OpenAI format, so an agent that compacts on it keeps doing so.

deepseek-dgx is DeepSeek V4.1 Flash served on our own DGX Spark, and it is the only model the Sparks serve.

One id per model#

A model has one id: what GET /v1/models lists and what a request sends. There is no suffix to select, because every route is zero-retention and there is no region to choose. An id that still carries one, such as glm-5.3:zdr, is refused with 404 not_found_model; drop the suffix. Zero retention has the rule.

Pricing#

Prices are in EUR per 1M tokens, in three buckets: input, cached input and output. A cached input token is the cheapest, and a cache write is free because it is included in the input price. Reasoning tokens are output tokens, never a fourth price.

Prices are published and fixed per model. The price of a bucket does not depend on how a request is served, so a request is charged the price shown when it ran. The published price is the promise. This page prints no figure because the list changes; GET /v1/models returns the current prices for the key that asks, and the dashboard shows the same numbers.

Ask for the list#

cURLbash
curl -sSf https://api.zdr.sh/v1/models \  -H "Authorization: Bearer $ZDR_API_KEY"
json
{"object":"list","data":[{"id":"glm-5.3","object":"model","created":1759400000,"owned_by":"zdr.sh","name":"GLM 5.3","context_window":1048576,"context_length":1048576,"max_output_tokens":131072,"input_modalities":["text"],"reasoning":true,"supported_reasoning_efforts":["low","high","max"],"supports_tools":true}]}

The fields#

FieldMeaning
idThe string to send as model
objectAlways model
createdWhen the model was added, Unix seconds
owned_byAlways zdr.sh
nameThe display name, for example GLM 5.3
context_window, context_lengthThe context window under both names
max_output_tokensThe largest output the model accepts
input_modalitiestext, image, video, file
output_modalitiestext on a chat model, embedding on an embedding model
embedding_dimensionsThe vector size on an embedding model, 0 on a chat model
reasoningWhether the model can think before answering
supported_reasoning_effortsThe values reasoning_effort may take, [] when the model has no effort control
supports_toolsWhether the model can call tools
input_eur_per_1m, cached_eur_per_1m, output_eur_per_1mThe price of each bucket, in EUR per million tokens

Anthropic shape#

Send an anthropic-version header and the answer is the Anthropic list shape. The ids are the same; the metadata is the minimum the shape carries.

cURLbash
curl -sSf https://api.zdr.sh/v1/models \  -H "x-api-key: $ZDR_API_KEY" \  -H "anthropic-version: 2023-06-01"
json
{"data":[{"type":"model","id":"glm-5.3","display_name":"GLM 5.3","created_at":"2026-10-02T12:00:00Z"}],"has_more":false,"first_id":"glm-5.3","last_id":"glm-5.3"}

A claude- id is never listed, even when the key maps one. Messages has the mapping.

Discovery in practice#

  • opencode does not call this endpoint for a custom provider: list the models in opencode.json
  • Hermes Agent probes it, so a model added to the list shows up without a config change
  • Claude Code keeps only ids containing claude or anthropic, so add zdr.sh ids by hand as in the Claude Code page