Models
GET /v1/models, the catalog of models providers can currently serve, with each model's context
window and live pricing. It is the machine-readable version of the
Models & pricing page.
This endpoint requires no authentication and is CORS-open
(Access-Control-Allow-Origin: *):
curl https://api.keln.ai/v1/models
{
"object": "list",
"data": [
{
"id": "deepseek-ai/deepseek-v4.1-flash",
"object": "model",
"owned_by": "keln",
"created": 1783468800,
"added": 1790709351,
"context_length": 1048576,
"input_modalities": ["text", "image"],
"reasoning": {
"mandatory": false,
"supported_efforts": ["none", "low", "high", "max"],
"default_effort": "max"
},
"pricing": {
"prompt": "0.0000003",
"completion": "0.0000012",
"input_cache_read": "0.000000036"
},
"performance": {
"tps_p50": 64.2,
"ttft_p50_ms": 520,
"as_of": 1786000000
}
}
]
}
Fields
| Field | Meaning |
|---|---|
id |
The model id you pass to /v1/chat/completions, the open ecosystem's own naming (org/model), canonically lowercase. |
context_length |
The model's context window (prompt + output tokens), the number Keln enforces. Every listed model declares one, so treat the field as always present. Keln rejects oversized requests against this number before billing. |
input_modalities |
Always present: ["text"], or ["text","image"] for models that accept image_url content parts (Images). |
reasoning |
Present on every reasoning model, in the shape OpenRouter publishes. mandatory is true when thinking cannot be switched off (reasoning_effort: "none" answers reasoning_not_disableable). supported_efforts lists the reasoning_effort values that change something on this model, none first when it switches thinking off; levels that run the same depth are listed once, and the field is absent on a model that is on/off only. default_effort is what an omitted reasoning_effort runs. Per-model table: Reasoning. |
pricing |
Per-token USD strings: prompt / completion / input_cache_read. Multiply by 1M for the $/Mtok shown on Models & pricing. |
performance |
Live routing figures for the model: tps_p50 (delivered output tokens per second), ttft_p50_ms (median time to first token, present when there's a figure for it), and as_of (unix seconds). Omitted entirely when no fresh measurement exists; read its absence as "no recent data", not as zero. |
added |
Unix seconds, when the model joined the Keln catalog. This is the real date. |
created |
A constant epoch, held fixed for strict OpenAI clients that require the field. It is not a date; use added. |
Practical uses
- Pre-flight sizing. Read
context_lengthbefore sending huge prompts instead of catchingcontext_length_exceeded. - Live pricing.
pricingalways matches what billing charges; read it instead of hardcoding the rates. - Catalog discovery. A model is listed only when it is both servable at the published SLO and priced; it leaves with 14 days' notice.