Models and pricing
The model list is dynamic. Do not write a static list in your code: call GET /v1/models (public, no key) and read each model’s prices and capabilities from there. A bare GET /v1/models lists chat models only (same as OpenRouter): embedding, rerank, moderation, and System One models do not appear there. For those modalities, use ?modality= (see below).
curl https://kenari.id/v1/modelsEach entry carries an id, vendor (owned_by), and, when known, context length, input/output modalities, reasoning and tool_call flags, reasoning_options level, pricing (a rate list per token in micro-Rupiah per 1 million tokens), pricing_lines (an array per billable line: endpoint, billable, unit, variant, micro_idr, with one parser for every type), endpoints (the kenari API families this line serves, for example chat, embeddings, images), and sunset_at. Prices in this endpoint are exactly the same as the table below because they use the same source.
sunset_at is the epoch-seconds moment a model is scheduled to stop being served, or null when nothing is scheduled. The model stays listed and keeps serving requests until that moment passes. After it passes, the model disappears from GET /v1/models and requests to that id are rejected. Check this value if you cache a copy of the model list on your side, so you can move off the model before the date arrives.
?modality= filter
Section titled “?modality= filter”Use the modality query parameter to list specialized models:
modality value | Returned set | Example ids |
|---|---|---|
embedding | Embedding models | bge-m3, qwen3-embedding-0.6b |
rerank | Rerank models | bge-reranker-base |
moderation | Moderation models | (empty for now. See Moderations) |
systemone | System One models | jev-1-13-free |
Unknown values return 400. A present-but-empty value, or no value at all, falls back to the default behavior (chat only, identical to calling without the parameter). Each modality page above documents the endpoint (POST /v1/embeddings, /v1/rerank, /v1/moderations, /v1/systemone) that consumes these ids.
curl https://kenari.id/v1/models?modality=embeddingFree version
Section titled “Free version”One model can have both paid and free versions. The free version uses the same id with a :free suffix, is billed at Rp 0, and has a per-account request limit per minute. Use step-3-7-flash for the paid version (from balance) or step-3-7-flash:free for the free version. Both appear in GET /v1/models. Exceeding the RPM limit returns HTTP 429. Besides the per-minute limit, there is also a daily allowance with tiers based on account status (new, topped up, or subscribed). This lane is best-effort, with no guarantee of the same speed or availability as paid models. See Billing and Rupiah for the tiers and the 429 code.
Active prices
Section titled “Active prices”Prices in this table are read directly from GET /v1/models and always match what is billed. Figures are in Rupiah per 1 million tokens. Specialized models, meaning image, audio, embedding, rerank, and System One, get their own tables below the token one, grouped by kind with the unit spelled out. Those tables use ?modality= for the kinds the unparameterized listing leaves out.
GET /api/public/pricing is public too. It lists every sellable catalog id, including older family versions and the :free siblings. Embed, rerank, and moderation rows stay off this feed. Image and speech rows stay on it. For those specialized rows and the rest of the catalog, use GET /v1/models.
Live model pricing
Loading prices...
Specialized models
These models each carry one price in their own unit, so the token columns above do not apply to them.