How billing works
kenari bills in Rupiah. Most requests are paid from a prepaid balance, a plan can cover chat usage on listed models, and free models and your own provider keys cost nothing. This page is the one home for money: top up, spend limits, how a request is charged, and what each endpoint is billed by.
How you pay
Section titled “How you pay”| Way to pay | What it means |
|---|---|
| PAYG | Each paid request is charged to your balance at the model price. This is the default. |
| Subscription | A plan gives you quota for chat on listed models. See Subscriptions. |
| Free models | :free models cost Rp 0 within daily and per-minute limits. See Free models. |
| BYOK | Requests served by your own provider key cost Rp 0 on kenari. See BYOK. |
Balance and top up
Section titled “Balance and top up”Open the Balance page, or use Top up in the top bar. Choose an amount and a payment method, then continue to the payment page.
| Method | Balance is added |
|---|---|
| QRIS | When the payment completes |
| Crypto | When the network confirms the payment |
The minimum and maximum for each method are shown on the Balance page.
You always enter the amount in Rupiah. For crypto, kenari issues the invoice in US dollars at the platform exchange rate when the invoice is created, and the network fee is paid by the payer on top of the invoice. For QRIS, the payment page can show a Service fee added to the amount. Total to pay is the figure your banking app asks for. Your balance is credited the amount you chose.
Each invoice has its own link, so you can reopen the payment page while the invoice is valid. The page checks the status every few seconds, and Check now forces a check. Subscription payments use the same page. An expired invoice cannot be paid, so choose Create new payment.
A top-up bonus code adds extra balance when you top up. See Codes and referral.
PAYG spend limit
Section titled “PAYG spend limit”You can cap how much PAYG can spend. On the Plan page, open Limits and PAYG, turn on Keep using your balance, and set PAYG balance limit to Daily or Monthly with an amount in Rupiah, then click Save. The change does not apply until you save. To turn the cap off, choose No limit and click Save.
- Daily counts spend over the last 24 hours. Monthly counts spend over the last 30 days. Both are rolling windows.
- Only PAYG spend counts. That includes web and X search fees taken from your balance and video renders that are still in progress. Plan quota, coupons, free models and BYOK do not.
- A paid request is refused with HTTP 402 and code
payg_limit_reachedonce the spend in the window has reached the limit, even if your balance has money. - The limit is checked before a request starts, so the request that crosses it still completes and the next one is refused. A search or page fetch that would take the spend past the limit is refused instead.
- A saved limit stays in force while its setting is hidden.
How a chat request is charged
Section titled “How a chat request is charged”A paid chat request is charged in two steps. Other endpoints reserve and charge by their own unit, described under What each endpoint is billed by.
- Reservation. Before the request runs, kenari reserves its worst case: the estimated input plus
max_tokensat the Output price. If you omitmax_tokens, a large default applies. The reservation must fit in your balance minus the reservations of your other requests in flight. - Settlement. When the response ends, kenari charges the actual usage and releases the rest of the reservation.
If your balance cannot cover the requested max_tokens, kenari lowers max_tokens to what the balance can pay for, as long as at least 1,024 output tokens remain. The response can then end early with finish_reason set to length. Below that floor the request is refused with HTTP 402:
{ "error": { "message": "insufficient balance: available Rp 19,589; this request reserves up to Rp 21,500 worst-case (input estimate + max_tokens x output rate). Send a shorter prompt or top up at https://kenari.id/pay", "type": "insufficient_balance", "param": null, "code": "insufficient_balance" }}The message shows the balance available right now and the worst-case cost of this one request. A request funded by plan quota, a coupon or a free model does not need balance.
No output, no charge
Section titled “No output, no charge”A chat request that finishes with no output tokens costs Rp 0, even if the prompt was processed. This holds whether the request was funded by balance or by plan quota. The request still appears in your usage history with zero cost.
If you close a stream before it ends and the provider did not report usage, kenari charges for what it had already delivered, estimated from the text sent. Closing the connection after the last token does not make it free.
Price dimensions
Section titled “Price dimensions”Chat models are priced on four dimensions per 1M tokens. Each dimension is charged as tokens × price ÷ 1,000,000.
| Dimension | Billed on | If no price is set |
|---|---|---|
| Input | Prompt tokens that were not read from or written to the cache | Always set |
| Output | Tokens the model generates, including reasoning tokens | Always set |
| Cache read | Prompt tokens served from the cache | Billed at the Input price. A Cache read price is never charged above Input. |
| Cache write | Prompt tokens written to the cache | Billed at the Input price |
Prices and balances are stored in micro-Rupiah, where Rp 1 is 1,000,000 micro-Rupiah. GET /v1/models returns prices in micro-Rupiah per 1M tokens, so 2000000000 means Rp 2,000 per 1M tokens. The dashboard shows ordinary Rupiah. To read your balance from code, call GET /v1/account/balance. See Account balance.
curl -s https://kenari.id/v1/models \ | jq '.data[] | select(.id == "deepseek-v4-flash") | .pricing'Prices for every model are on Models and pricing.
What each endpoint is billed by
Section titled “What each endpoint is billed by”| Endpoint | Billed by |
|---|---|
| Chat completions, Messages, Responses | Tokens, on the four price dimensions above. Images and files that the model reads itself count as Input tokens. |
| Embeddings, Rerank, Moderations | Input tokens, estimated from the text at about four characters per token |
| System One | Input tokens. The estimate is about four characters per token, and the charge never exceeds it. Output tokens are not billed. |
| Images | Per image, n times the model price |
| Text to speech | Per 1,000 input characters, rounded up |
| Transcriptions | Per second of audio, rounded up |
| Music | Per song |
| Videos | Per second of video, at the price of the resolution you ask for |
OCR and the ocr engine in Read documents | Per page read, for the ocr engine and /v1/ocr only. These are the only document paths not billed by tokens, and plans never cover them. Every other way of attaching a document is billed as input tokens. See Images and files as input. |
| Server tools and Web and X search | Per call |
| BYOK | Free on kenari |
Paid non-chat requests reserve an amount of balance before they run, calculated from the estimate for that endpoint. Embeddings, Rerank and Moderations charge the estimated input tokens, and the usage in the response is for display only. For Transcriptions, kenari estimates the duration from the file size, then charges the real duration the provider reports, and the estimate if the provider reports none. The charge never exceeds the reservation, and the rest is released. A request fails with 402 when the balance cannot cover the reservation, even if the actual audio or text is short.
Plan quota covers chat only. Paid requests to every other endpoint are paid from your balance, except for the daily allowance of web search calls that plans include. Free models, such as jev-1-13-free, do not need balance. See Subscriptions for what happens to these endpoints when a plan runs out.
Usage history
Section titled “Usage history”Open the Usage page in the dashboard. The Usage tab shows requests, tokens and cost per model and per API key, with a filter for free, plan, PAYG and own-key usage, and a CSV download. The Balance & billing tab shows your balance history, your payments, and an invoice builder for any period.
The same usage is available over the API with GET /v1/usage, /v1/usage/daily and /v1/usage/log. Amounts there are in micro-Rupiah, which is Rupiah times 1,000,000. Reading usage is free. See Usage.