# Subscriptions

A subscription plan gives you a quota of chat usage on a list of models for a monthly price. While quota remains, requests to those models draw from it and your balance is not touched. This page covers how quota is measured, what happens when it runs out, and which endpoints a plan never covers. For money in general, see [How billing works](/en/docs/billing).

## Plans and quota windows

Each plan has up to three quota windows. A window with no ceiling is unlimited.

| Window | Length |
| --- | --- |
| 5 hours | 5 hours |
| Weekly | 7 days |
| Monthly | 30 days |

Quota is measured in Rupiah at each model's normal price, not in request counts. An expensive request, such as a large model with a long prompt, spends more of it. A request passes only when every window with a ceiling has room.

Windows roll, and they do not follow the calendar. Each window starts when your plan cycle starts and resets every window length after that. The monthly window and your plan start together, so the monthly reset normally falls on the day your plan ends. The dashboard then shows only the plan's end date, and the quota refills only if the plan renews. Renewing the same plan early extends the cycle and keeps the windows where they are, so the monthly reset then shows its own date. Upgrading to a higher plan starts new windows, and the remaining days of the old plan are credited toward the new price. [Starting a new cycle](#start-a-new-cycle) resets every window right away.

## Covered models

Each plan lists the models it covers. A request to a covered model draws from quota. A request to any other model is billed to your balance as PAYG, whatever quota is left. The live list for each plan is in the table at the end of this page.

A plan can also carry its own daily quota for `:free` models, separate from the quota windows. See [Free models](/en/docs/free-models).

## Pay for a plan

Choose a plan on the **Plan** page and pay by QRIS, crypto or balance. A plan lasts 30 days from payment.

A QRIS or crypto payment is checked again when it completes. If your plan or the plan price changed in the meantime, or the promo code on the invoice was already used, the plan is not activated. The amount you paid is added to your balance instead and you get a notification. Choose the plan again to buy it at the current price. A promo code that is still on an unpaid invoice cannot be used for a balance payment until you finish or cancel that invoice.

## Renew and auto-renew

The status card at the top of the **Plan** page shows when your plan ends. Turn on **Auto-renew from balance** and the card shows the renewal date and the price that will be taken from your balance. If your balance is short, the card shows how much is missing, with a **Top up** link.

When the cycle ends, kenari takes the plan price from your balance and starts the next 30 days. Auto-renew never splits the price between balance and QRIS or crypto, so the balance must cover all of it. If it does not, or the plan is no longer on sale, the plan ends, auto-renew switches off and you get a notification. Top up and choose a plan again to continue.

## Upgrade to a higher plan

Upgrading to a higher plan starts a new 30-day cycle from the day you upgrade. The time left on the old plan is not added to the new cycle. Its remaining value becomes a discount on the new plan's price, and the **Plan** page shows the amount before you pay.

## Start a new cycle

When you reach a limit early, you can buy a fresh cycle of your current plan instead of waiting. On the **Plan** page, the tile **Start a new cycle** shows the plan price per cycle. Choose **Start now**. A dialog shows the price, the days you forfeit and your balance after the payment, and you confirm with its payment button.

- You pay the full price of your current plan from your balance. QRIS and crypto are not offered.
- A new 30-day cycle starts now. The 5-hour, weekly and monthly windows all reset to zero.
- The days left in the old cycle are forfeited. The dialog shows how many.
- If your balance is short, the tile shows the amount missing with a **Top up** link.

It works only on a paid plan that is still on sale. A trial cycle, a coupon, and a plan that is no longer sold cannot be restarted, and the dashboard says so. A plan that started from a plan gift is a paid cycle and can be restarted. See [Plan gifts](/en/docs/gifts). If you have a free reset left, **Self-serve quota reset** with its **Reset now** button is offered first, and the tile does not appear while you have one. The plan comparison table lists the price of each plan under **Start a new cycle**.

Starting a new cycle is a dashboard action. There is no API call for it, and an API key cannot do it.

## When quota runs out

When any window with a ceiling is spent, two account settings decide what happens to requests for the models your plan covers. Find them on the **Plan** page, in the section **When your quota runs out**. Both are off by default.

| **Keep using your balance** | **Switch to free models** | What a request does |
| --- | --- | --- |
| On | Off | Continues, billed to your balance. The PAYG spend limit in [How billing works](/en/docs/billing) still applies. |
| On | On | Continues, billed to your balance. Free models are used only when the balance option is off. |
| Off | On | Falls through to [Free models](/en/docs/free-models) at no cost. |
| Off | Off | Refused with HTTP 429 and code `plan_limit_reached` until the window resets. |

```json
{
  "error": {
    "message": "...",
    "type": "plan_limit_reached",
    "param": null,
    "code": "plan_limit_reached"
  }
}
```

The `message` explains the situation to a person. Branch on `code`. See [Errors](/en/docs/errors) for the format.

After a plan has ended, usage is billed to your balance as PAYG, and the PAYG spend limit in [How billing works](/en/docs/billing) still applies. The one exception is when **Switch to free models** is on and **Keep using your balance** is off. Requests to the models the plan covered then go to [free models](/en/docs/free-models) at no cost. A model reserved for subscribers still needs an active plan, as described in [Subscriber-only models](#subscriber-only-models).

## Endpoints a plan never covers

A plan covers chat only. These endpoints are always paid from your balance, even while quota remains:

- Images, text to speech, transcription, music and video
- Embeddings, rerank, moderations and System One
- OCR, meaning the `ocr` engine of [Read documents](/en/docs/documents) and `/v1/ocr`

A document attached to a chat request and read the default way is ordinary input tokens, so a plan that covers the model covers it.

These endpoints, and any model that no plan or coupon covers, are always billed to your balance, whatever the two settings say. That holds while quota remains, after a window is spent and after the plan has ended. An account with no plan and no coupon pays from its balance as usual.

Web search and page fetch work differently. Each plan includes a daily allowance of calls, counted per UTC day. Search and fetch share it, and calls inside it are free. Beyond the allowance, each call is billed to your balance, whatever the two settings say. X search is not part of any plan. It is always billed to your balance, whatever the two settings say. See [Server tools](/en/docs/server-tools) and [Web and X search](/en/docs/web-search).

## Free cache

For some models on some plans, cache tokens do not spend quota. Cache read and cache write tokens are free, while fresh input and output tokens still count as usual. The plan table at the end of this page lists them under Free cache.

Free cache applies when a model is covered by the plan and is listed in that plan's free cache list. One model can have free cache on one plan and not on another. It also applies to the balance charge that follows a spent window when **Keep using your balance** is on. A model the plan does not cover is billed in full. The **Usage** page shows how much free cache saved you.

## Codes and coupons

A code can give time-limited plan access. That grant is a coupon. It appears as **Coupon active** on the **Plan** page and covers the models it lists. A request to a covered model is paid from the coupon the same way a plan pays from quota, so it needs no balance, and the coupon is used before your plan quota. When the coupon budget is spent, an active plan takes over for the models it covers. Without a plan, requests follow the rule for an ended plan in [When quota runs out](#when-quota-runs-out). How codes work is in [Codes and referral](/en/docs/codes-referral), and the coupon fields are in [Account quota](/en/docs/account-quota).

## Subscriber-only models

Some models are reserved for accounts with an active plan. Other accounts get HTTP 403 with code `subscribers_only`, on every endpoint that takes the model, including the media endpoints.

## Check quota from code

`GET /v1/account/quota` returns your plan name, the remaining Rupiah in each window, and any active coupon. The MCP tool `kenari_quota` returns the same data as text. See [Account quota](/en/docs/account-quota) and [MCP server](/en/docs/mcp). In the dashboard, the **Usage** page shows the same windows as percentages with reset times.

## See also

- [How billing works](/en/docs/billing)
- [Free models](/en/docs/free-models)
- [Codes and referral](/en/docs/codes-referral)
- [Account quota](/en/docs/account-quota)

## Plans

The plans below are read live from `GET /api/plans` and `GET /api/public/pricing`, so they always match what is on sale: price, quota windows, covered models, free cache, and the daily quota for free models.

The plans on sale, with their prices and quota windows, are listed as text on the [kenari homepage](https://kenari.id/#harga) and as JSON at `GET https://kenari.id/api/plans`.
