# Models & pricing
## How pricing works
- Prices are per million tokens, split into input, cached input, and output.
- Cached input, prompt tokens served from cache, bills at the model's cached rate in the table.
[Details ↗](capabilities/caching.md)
- Web search bills per search, on top of tokens. [Details ↗](#web-search)
## Rate card
The live rate card is in the [portal](https://app.keln.ai) model catalog and in the API:
[`/v1/models`](api/models.md) returns each model's verified `context_length` and a
`pricing` object (`prompt` / `completion` / `input_cache_read`, per-token USD strings):
```bash
curl https://api.keln.ai/v1/models
```
<!-- PRICES:BEGIN — generated by services/exchange/scripts/render_pricing_table.py from
services/exchange/charts/keln-control-plane/values.yaml (rates.models, staged rows
excluded). Do not edit by hand: run the script. The control-plane test
test_docs_pricing_mirror.py fails whenever this block is stale. -->
<div id="rate-card" markdown="1">
| Model | Input $/M | Cached input $/M | Output $/M |
|---|---|---|---|
| deepseek-ai/deepseek-v4-pro-0813 | 1.32 | 0.26 | 3.96 |
| deepseek-ai/deepseek-v4.1-flash | 0.30 | 0.03 | 1.20 |
| google/gemma-4-31b-it | 0.15 | 0.15 | 0.46 |
| minimaxai/minimax-m3 | 0.30 | 0.12 | 1.20 |
| moonshotai/kimi-k2.7-code | 0.95 | 0.2375 | 4.00 |
| moonshotai/kimi-k3 | 3.00 | 0.60 | 15.00 |
| nvidia/nemotron-3-ultra-550b-a55b | 0.80 | 0.20 | 3.00 |
| openai/gpt-oss-120b | 0.15 | 0.10 | 0.60 |
| qwen/qwen3.6-35b-a3b | 0.25 | 0.20 | 1.49 |
| qwen/qwen3.8-2.4t-a95b | 2.50 | 0.50 | 6.25 |
| qwen/qwen3.8-27b | 0.50 | 0.15 | 3.20 |
| zai-org/glm-5.2 | 1.40 | 0.35 | 4.40 |
| zai-org/glm-5.3 | 1.40 | 0.31 | 4.40 |
| zai-org/glm-5.3-flash | 0.15 | 0.05 | 0.50 |
</div>
<!-- PRICES:END -->
<script>
// Live rate card: the same /v1/models the portal and keln.ai read, rendered once on load.
// Context length and vision exist only there (derived from the routable supply at runtime), so
// the static table above is the no-JS fallback and this replaces it whole — never cell by cell.
(function () {
var box = document.getElementById('rate-card');
if (!box) return;
var perM = function (s) {
var t = (parseFloat(s) * 1e6).toFixed(4).replace(/0+$/, '');
if (t.slice(-1) === '.') t += '00'; else if (t.split('.')[1].length < 2) t += '0';
return t;
};
fetch('https://api.keln.ai/v1/models', { headers: { accept: 'application/json' } })
.then(function (r) { if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); })
.then(function (d) {
var ms = (d.data || []).filter(function (m) { return m.pricing && m.pricing.prompt; });
if (!ms.length) return;
ms.sort(function (a, b) { return a.id.toLowerCase() < b.id.toLowerCase() ? -1 : 1; });
var rows = ms.map(function (m) {
var vision = (m.input_modalities || []).indexOf('image') >= 0 ? '✓' : '';
var ctx = m.context_length ? Number(m.context_length).toLocaleString('en-US') : '';
return '<tr><td>' + m.id + '</td><td>' + ctx + '</td><td>' + perM(m.pricing.prompt) +
'</td><td>' + perM(m.pricing.input_cache_read || m.pricing.prompt) + '</td><td>' +
perM(m.pricing.completion) + '</td><td>' + vision + '</td></tr>';
}).join('');
box.innerHTML = '<table><thead><tr><th>Model</th><th>Context</th><th>Input $/M</th>' +
'<th>Cached input $/M</th><th>Output $/M</th><th>Vision</th></tr></thead><tbody>' +
rows + '</tbody></table>';
box.setAttribute('data-source', 'live');
})
.catch(function () { /* keep the static table */ });
})();
</script>
With JavaScript on, this table is the live `/v1/models` response, context length and vision
included; without it you see the rate card as committed with the last docs build. Scrape the
endpoint rather than hardcoding these numbers if you'd like the updates for free. Ids are
canonically lowercase and matched case-insensitively.
## Web search
**$10 per 1,000 searches**, on top of tokens. A search is one query, whatever the number of
results; the results the model reads count as input tokens at the model's rate. Keln never bills
errors, attempts past the cap, or searches the model did not run. `usage.cost` on every response
includes the fee. The same price applies from the API, from [Codex](codex.md) and [Claude Code](api/anthropic.md#using-claude-code), and from
[Claude Desktop](claude-desktop.md). How to turn it on and what comes back:
[Web search ↗](capabilities/web-search.md)
## Model lifecycle
Keln adds a model when providers can serve it at the published SLO, and emails active users of a
model 14 days before deprecating it.
Models & pricing
How pricing works
Prices are per million tokens, split into input, cached input, and output.
Cached input, prompt tokens served from cache, bills at the model's cached rate in the table.
Details ↗
Web search bills per search, on top of tokens. Details ↗
Rate card
The live rate card is in the portal model catalog and in the API:
/v1/models returns each model's verified context_length and a
pricing object (prompt / completion / input_cache_read, per-token USD strings):
curlhttps://api.keln.ai/v1/models
Model
Input $/M
Cached input $/M
Output $/M
deepseek-ai/deepseek-v4-pro-0813
1.32
0.26
3.96
deepseek-ai/deepseek-v4.1-flash
0.30
0.03
1.20
google/gemma-4-31b-it
0.15
0.15
0.46
minimaxai/minimax-m3
0.30
0.12
1.20
moonshotai/kimi-k2.7-code
0.95
0.2375
4.00
moonshotai/kimi-k3
3.00
0.60
15.00
nvidia/nemotron-3-ultra-550b-a55b
0.80
0.20
3.00
openai/gpt-oss-120b
0.15
0.10
0.60
qwen/qwen3.6-35b-a3b
0.25
0.20
1.49
qwen/qwen3.8-2.4t-a95b
2.50
0.50
6.25
qwen/qwen3.8-27b
0.50
0.15
3.20
zai-org/glm-5.2
1.40
0.35
4.40
zai-org/glm-5.3
1.40
0.31
4.40
zai-org/glm-5.3-flash
0.15
0.05
0.50
With JavaScript on, this table is the live /v1/models response, context length and vision
included; without it you see the rate card as committed with the last docs build. Scrape the
endpoint rather than hardcoding these numbers if you'd like the updates for free. Ids are
canonically lowercase and matched case-insensitively.
Web search
$10 per 1,000 searches, on top of tokens. A search is one query, whatever the number of
results; the results the model reads count as input tokens at the model's rate. Keln never bills
errors, attempts past the cap, or searches the model did not run. usage.cost on every response
includes the fee. The same price applies from the API, from Codex and Claude Code, and from
Claude Desktop. How to turn it on and what comes back:
Web search ↗
Model lifecycle
Keln adds a model when providers can serve it at the published SLO, and emails active users of a
model 14 days before deprecating it.