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

GET /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.

FieldContent
idmodel ID that you send in model
objectalways model
owned_bypersonal (your own provider key) or platform (managed by Noirdoc)
display_namedisplay name of the model
endpoint_familyfamily of the model: chat, embeddings, rerank, stt, tts or image_gen. It determines which endpoint you call the model through.
legacy_public_idformer 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.

Shell
curl https://api.noirdoc.de/v1/models \
  -H "Authorization: Bearer $NOIRDOC_API_KEY"
Python
for model in client.models.list():
    print(model.id)
TypeScript
for await (const model of client.models.list()) {
  console.log(model.id);
}
JSON
{
  "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

GET /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.

FieldContent
public_idmodel ID for model
endpoint_familyfamily of the model as in GET /v1/models, for example chat or rerank
legacy_public_idformer ID of this row, still callable and bound to this provider, otherwise null
provider_slug, provider_display_nameprovider of this row
price_input, price_outputprice for input and output
price_cache_read, price_cache_write, price_cache_write_1hprices for the prompt cache, otherwise null
long_context_thresholdinput 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_longprices above the threshold; null means the normal price applies
price_unitunit of the prices
price_currencycurrency, EUR
starter_allowedtrue 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.

Shell
curl https://api.noirdoc.de/v1/prices
Python
import httpx

response = httpx.get("https://api.noirdoc.de/v1/prices")
prices = response.json()["data"]
TypeScript
const res = await fetch("https://api.noirdoc.de/v1/prices");
const { data: prices } = await res.json();
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_unitMeaningFamilyFilled prices
per1MTokensper 1 million tokenschat, embeddings, rerank, Noirdoc Shieldchat: price_input and price_output; embeddings, rerank and Noirdoc Shield: only price_input
per1MCharsper 1 million characters of input textspeech outputprice_input
perRequestper successful request, regardless of the number of documentsrerankprice_input
perMinuteper minute of audiotranscriptionprice_input or price_output
perImageper generated imageimagesprice_output
perMpxper started megapixel (1024 × 1024 pixels) per imageimagesprice_output
perFirstMpxfirst megapixel of an image; price_input, if set, carries the price of each additional megapixelimagesprice_output, optional price_input