Skip to content
kenari.

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.

Way to payWhat it means
PAYGEach paid request is charged to your balance at the model price. This is the default.
SubscriptionA 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.
BYOKRequests served by your own provider key cost Rp 0 on kenari. See BYOK.

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.

MethodBalance is added
QRISWhen the payment completes
CryptoWhen 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.

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_reached once 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.

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.

  1. Reservation. Before the request runs, kenari reserves its worst case: the estimated input plus max_tokens at the Output price. If you omit max_tokens, a large default applies. The reservation must fit in your balance minus the reservations of your other requests in flight.
  2. 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.

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.

Chat models are priced on four dimensions per 1M tokens. Each dimension is charged as tokens × price ÷ 1,000,000.

DimensionBilled onIf no price is set
InputPrompt tokens that were not read from or written to the cacheAlways set
OutputTokens the model generates, including reasoning tokensAlways set
Cache readPrompt tokens served from the cacheBilled at the Input price. A Cache read price is never charged above Input.
Cache writePrompt tokens written to the cacheBilled 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.

Terminal window
curl -s https://kenari.id/v1/models \
| jq '.data[] | select(.id == "deepseek-v4-flash") | .pricing'

Prices for every model are on Models and pricing.

EndpointBilled by
Chat completions, Messages, ResponsesTokens, on the four price dimensions above. Images and files that the model reads itself count as Input tokens.
Embeddings, Rerank, ModerationsInput tokens, estimated from the text at about four characters per token
System OneInput tokens. The estimate is about four characters per token, and the charge never exceeds it. Output tokens are not billed.
ImagesPer image, n times the model price
Text to speechPer 1,000 input characters, rounded up
TranscriptionsPer second of audio, rounded up
MusicPer song
VideosPer second of video, at the price of the resolution you ask for
OCR and the ocr engine in Read documentsPer 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 searchPer call
BYOKFree 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.

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.