Develop / Reference
Models & pricing
Which models a key may call and where to find the public price list of the models managed by Noirdoc and of Noirdoc Shield.
Models
/v1/models - Authentication
- yes, API key
- Format
- JSON
- Billing
- no model costs
GET /v1/models returns the models the calling key may use. The response has the shape of the OpenAI model list (object: "list" with data). The list contains
- the models of your organisation’s own provider keys (BYOK),
- the models managed by Noirdoc, if your organisation may use them.
The gateway filters the list with the same rules as the requests themselves: the organisation’s classification as professionals bound by secrecy, starter credit eligibility (while no confirmed top-up has been made yet, only starter-eligible managed models appear alongside your own BYOK models), the key’s restrictions and its allowed models apply here too. If you also send the X-Noirdoc-Tags header (Request tags (Preview)), the gateway additionally applies the allowed models and provider restrictions of every named tag. If the same ID exists at your own and at a managed provider, your own provider takes precedence.
| Field | Content |
|---|---|
id | model ID that you send in model |
object | always model |
owned_by | personal (your own provider key) or platform (managed by Noirdoc) |
display_name | display name of the model |
endpoint_family | family of the model: chat, embeddings, rerank, stt, tts or image_gen. It determines which endpoint you call the model through. |
legacy_public_id | former ID of the model, still callable, otherwise null |
The list is sorted by id and contains models of all endpoint families. The family is in endpoint_family: chat for /v1/chat/completions, /v1/responses and /v1/messages, embeddings for /v1/embeddings, rerank for /v1/rerank, stt for /v1/audio/transcriptions, tts for /v1/audio/speech and image_gen for /v1/images/generations. Non-model endpoints such as /v1/shield, /v1/files, /v1/skills and /v1/tags do not appear in the list. The provider’s API format (OpenAI or Anthropic) is not in it either. If you call a model through an endpoint of a different family or a different API format, the gateway answers with the error code wrong_endpoint_for_model.
curl https://api.noirdoc.de/v1/models \
-H "Authorization: Bearer $NOIRDOC_API_KEY"for model in client.models.list():
print(model.id)for await (const model of client.models.list()) {
console.log(model.id);
}{
"object": "list",
"data": [
{
"id": "qwen3.8-27b",
"object": "model",
"owned_by": "platform",
"display_name": "Qwen 3.8 27B",
"endpoint_family": "chat",
"legacy_public_id": null
}
]
}Prices
/v1/prices - Authentication
- no, public
- Format
- JSON
- Billing
- none
GET /v1/prices is the public price list of the models managed by Noirdoc. The endpoint needs no key. It contains all active managed models with a complete price regardless of starter credit status and indicates per row in starter_allowed (boolean) whether the model and provider are included in starter credit. Models of your own provider keys never appear in it.
The list has one row per model and provider. If several providers offer the same model ID, the ID appears several times, each with its provider and price. Providers & routing explains which provider the gateway selects.
| Field | Content |
|---|---|
public_id | model ID for model |
endpoint_family | family of the model as in GET /v1/models, for example chat or rerank |
legacy_public_id | former ID of this row, still callable and bound to this provider, otherwise null |
provider_slug, provider_display_name | provider of this row |
price_input, price_output | price for input and output |
price_cache_read, price_cache_write, price_cache_write_1h | prices for the prompt cache, otherwise null |
long_context_threshold | input tokens from which the *_long prices apply to the whole request, otherwise null |
price_input_long, price_output_long, price_cache_read_long, price_cache_write_long | prices above the threshold; null means the normal price applies |
price_unit | unit of the prices |
price_currency | currency, EUR |
starter_allowed | true if this row (model and provider) can be called on starter credit, otherwise false |
At the top level alongside data, the response also carries the shield object with the flat rate for Noirdoc Shield: €0.40 per 1 million inspected input tokens (price_input: "0.40", price_unit: "per1MTokens", currency and price_currency: "EUR"). This charge applies on top of the model price — as well as on BYOK routes when Shield is active and on standalone calls to POST /v1/shield/inspect.
curl https://api.noirdoc.de/v1/pricesimport httpx
response = httpx.get("https://api.noirdoc.de/v1/prices")
prices = response.json()["data"]const res = await fetch("https://api.noirdoc.de/v1/prices");
const { data: prices } = await res.json();{
"object": "list",
"data": [
{
"public_id": "qwen3.8-27b",
"legacy_public_id": null,
"provider_slug": "<provider-slug>",
"provider_display_name": "<Provider>",
"endpoint_family": "chat",
"price_input": 0.3,
"price_output": 2.2,
"price_cache_read": null,
"price_cache_write": null,
"price_cache_write_1h": null,
"long_context_threshold": null,
"price_input_long": null,
"price_output_long": null,
"price_cache_read_long": null,
"price_cache_write_long": null,
"price_unit": "per1MTokens",
"price_currency": "EUR",
"starter_allowed": true
}
],
"shield": {
"price_input": "0.40",
"price_unit": "per1MTokens",
"currency": "EUR",
"price_currency": "EUR"
}
}Price units
price_unit states what the amounts refer to. Which fields are filled depends on the model’s family.
price_unit | Meaning | Family | Filled prices |
|---|---|---|---|
per1MTokens | per 1 million tokens | chat, embeddings, rerank, Noirdoc Shield | chat: price_input and price_output; embeddings, rerank and Noirdoc Shield: only price_input |
per1MChars | per 1 million characters of input text | speech output | price_input |
perRequest | per successful request, regardless of the number of documents | rerank | price_input |
perMinute | per minute of audio | transcription | price_input or price_output |
perImage | per generated image | images | price_output |
perMpx | per started megapixel (1024 × 1024 pixels) per image | images | price_output |
perFirstMpx | first megapixel of an image; price_input, if set, carries the price of each additional megapixel | images | price_output, optional price_input |