Plans & credits
The Free and Credits plans, Enterprise, what spends credits, how the account wallet, top-ups, rollover and plan changes work, and where to track usage.
Credits are the balance of an account’s wallet. Every project in the account spends from that one wallet. This page is for the people who pay for an account and the members who watch its spend.
The API and --json output report amounts in money. Billing and the CLI show the same amounts as credits: an API amount of 1.00 is 100 credits.
To see the balance now, run kortix billing status, or open the project menu → Switch Project → Account settings → Billing → Plan.
Plans
An account is on one of two plans: Free or Credits. See kortix.com/pricing for what each plan costs and grants. Enterprise is not a plan: it turns the Enterprise features on, on either plan. See Enterprise features.
| Free | Credits | |
|---|---|---|
| Billed | No charge | A monthly amount you choose |
| Credit grant | Every month, for the account | Every billing cycle, 100 credits per dollar of the monthly amount, in one wallet |
| Members | Unlimited | Unlimited, no per-member charge |
| Kortix-managed models | None | All |
| Buy credits and auto top-up | No | Yes |
| Projects | 1 | 200 (no limit with an Enterprise license) |
| SSO, SCIM, groups and custom roles, audit log, branding | With Enterprise | With Enterprise |
- Every plan can use models on your own provider key or a ChatGPT subscription. See Models.
- On Free, every managed model returns
plan_upgrade_required. Free credits pay for compute and your own models only. - An Enterprise feature without Enterprise on returns
402with codeentitlement_required. An owner or admin can turn the Enterprise demo on. See Enterprise features. - Every older paid plan became a Credits plan at the same monthly price. A per-seat plan receives its full bill as credits in one shared wallet. Seats no longer exist: members are free and unlimited.
- Creating a project over the limit returns
403with codeproject_limit_reached. An archived project does not count. - To move from Free to Credits, choose a tier on Billing → Plan and select Subscribe. Tiers run from 5,000 credits a month to 1,000,000 credits a month, all at one rate: a bigger tier buys more credits, never a cheaper credit. For an Enterprise license, select Talk to sales in the app, or email support@kortix.com.
A self-hosted instance runs with billing off by default (KORTIX_BILLING_INTERNAL_ENABLED=false). It has no credits, no plan limits and no managed models. kortix billing status still answers there and never blocks a run. kortix billing transactions returns 404 with billing_disabled: true. See Self-hosting.
What uses credits
| What | How Kortix meters it |
|---|---|
| Kortix-managed model calls | Input, output and cache tokens of each request, at the provider’s base price plus a 5.5% platform fee. |
| Model calls on your own provider key | Nothing for the first $1,000 of usage a month at the provider’s list price. After that, 5% of each request’s list price. A ChatGPT subscription and OpenCode Go are never charged. Enterprise has no fee, and Kortix can waive it per account. |
| Sandbox compute | The reserved spec (cpu, memory, disk) multiplied by the seconds the sandbox is active. Session sandboxes, App machines and project monitors all count. |
| Kortix-proxied tools | Each web search, image search or web scraping request that goes through Kortix. |
-
Compute meters the spec the sandbox reserves, not what it uses. Set the spec in
kortix.yaml. See Sandboxes & previews. -
One compute rate applies to every sandbox provider and to every plan, billed per second for the reserved size:
Resource Rate vCPU $0.0324 per hour Memory $0.0108 per GB-hour Storage $0.0526 per GB-month The default 2 vCPU / 4 GB / 20 GB sandbox costs about $0.11 an hour, about 11 credits.
-
A stopped or sleeping sandbox accrues nothing. See Sessions.
-
A running sandbox is billed every 5 minutes and again when it stops.
-
Your provider bills a request on your own provider key. Kortix charges only the 5% fee past the monthly $1,000 allowance, after the request completes: an empty wallet never blocks your own key.
-
Model prices in the app are the provider’s base prices. The 5.5% fee is added when the request is charged.
Credit buckets
The wallet holds two buckets.
| Bucket | Filled by | Expires |
|---|---|---|
| Expiring | The plan grant | Unused credits roll over for one month. The grant after that replaces them. |
| Non-expiring | Top-ups, auto top-ups, top-up bonuses, refunds and promotional grants | Never |
- Kortix spends the expiring bucket first, then the non-expiring bucket.
- Work that finished is always recorded. When it costs more than the balance, the non-expiring bucket goes below zero. The balance stays below zero until new credits cover the difference.
- A run needs a positive balance.
kortix billing transactions --breakdownalso shows a daily bucket. No current plan fills it.
Top-ups and auto top-up
Only paid plans can buy credits. Top-ups never expire and go into the non-expiring bucket.
A top-up or auto top-up of $50 or more adds bonus credits:
| Top-up | Bonus |
|---|---|
| $50 to $99 | +1% |
| $100 to $249 | +2% |
| $250 to $499 | +3% |
| $500 to $999 | +4% |
| $1,000 or more | +5% |
The bonus is a separate topup_bonus ledger entry. A refund or a lost dispute removes the same share of the bonus.
Add credits
On Billing → Plan, select Add credits, choose an amount, and pay.
Turn on auto top-up
In Auto top-up, set the amount to add and the balance that triggers it. The threshold and the amount are each at least 100 credits. The amount must be at least 100 credits above the threshold. Auto top-up needs a saved payment method. When the balance is already at or below the threshold, the first charge runs at once.
Credits follow settled payments. A card settles at once. A bank debit can take several business days. The credits arrive when it settles, and a failed debit adds nothing. While one bank-debit auto top-up is still settling, auto top-up does not start a second charge.
When an auto top-up charge fails:
- A temporary failure is tried again on a later debit: no sooner than 5 minutes after the 1st failure, and 30 minutes after the 2nd.
- A hard decline (for example
card_declined,insufficient_fundsorexpired_card), or the 3rd failed charge in a row, turns auto top-up off. - Every owner gets an email with the reason. Auto top-up shows the date and the reason beside the switch.
- Update the payment method in Manage billing, then turn auto top-up on again. This clears the failure count.
Plan changes
Members do not change the bill. The whole account shares one wallet, and the only number you set is the monthly amount.
| Change | Charge | Credits |
|---|---|---|
| Raise the monthly amount | The difference is charged now, prorated for the rest of the cycle. The raise applies only when that payment succeeds. | The prorated share of the new grant arrives with the payment. The next renewal grants the full amount. |
| Lower the monthly amount | The lower amount applies from the next renewal. No refund. | Credits already granted stay in the wallet. |
| Choose an amount with no paid plan yet | Stripe Checkout charges the first period. | The grant arrives when the payment settles. |
| Cancel | Cancel subscription ends the plan at the end of the current billing period. Reactivate subscription undoes it until then. | The plan grant stops after the period ends. |
Manage the plan, the payment method and invoices under Billing → Plan and Manage billing. These changes need the billing.write permission, which only the owner role holds by default. Every member can read billing (billing.read). See Accounts & access.
Running out
When the balance reaches zero, agents pause and triggers stop starting sessions. Starting a session or sending a prompt returns 402:
| Code | Means | Fix |
|---|---|---|
insufficient_credits |
The wallet is empty, or the last payment failed. | Add credits, or update the payment method. On Free, subscribe to Credits or wait for the next monthly grant. |
subscription_required |
The account has no active plan. | Subscribe on Billing → Plan. |
no_account |
The account has no credit account yet. | Finish account setup, or email support@kortix.com. |
- The
402body also carriesbilling_state:out_of_credits,payment_failed,no_subscriptionorno_account. - Kortix stops the running Apps of the account. A visitor gets
402with codeapp_account_unfundedand an App paused page. See Apps. - On a paid plan with auto top-up off, every owner gets one email per UTC day when the balance reaches zero.
- Buying credits and auto top-up show only to a person who may change billing (
billing.write), on a plan that may buy credits. A member sees who can add credits instead. - A member who cannot add credits can select Ask an owner in the out-of-credits notice. Every owner gets an email with the balance and a link to billing. Each member can ask once per 24 hours per account.
Track usage
| Where | What it shows |
|---|---|
| Billing → Plan | Plan, wallet, spend this period, auto top-up |
| Billing → Usage | Kortix charges and the credit ledger |
| Customize → Models → Costs in a project | Model spend and budgets for that project. See Models. |
The CLI reads the same data. It cannot change billing.
kortix billing status # plan, credits, subscription
kortix billing transactions --summary --days 7 # credits in and out
kortix billing costs # account totals and model breakdown, last 30 days
kortix billing costs --by project --since 2026-09-01T00:00:00Z
kortix billing costs --by session --csv sessions.csv # CSV needs --by
kortix billing costs takes --project, --session, --owner, --since, --until, --sort total_desc|total_asc|recent|name_asc (name_asc with --by project only), --limit and --offset. Add --account <id> for an account other than the active one. kortix billing status, kortix billing transactions and kortix billing costs show the balance and spend in credits. Prices stay in dollars: the plan price and the auto top-up amount. --json returns the US dollar amounts of the API unchanged.
For scripts, the same reports are on the REST API. An account-wide read needs billing.read. A read with project_id needs project.gateway.spend.read on that project. A project-scoped token needs project.usage.read and its own project_id.
| Route | Returns |
|---|---|
GET /v1/usage/cost-summary |
Totals, a daily series and a model breakdown |
GET /v1/usage/cost-by-project |
Spend per project. format=csv for CSV. |
GET /v1/usage/session-costs |
Spend per session. format=csv for CSV. |
GET /v1/usage/session-costs/{sessionId} |
One session’s model usage and charges |
GET /v1/usage |
Token and cost rollup. group_by=model, provider or day. |
The cost routes take from, to (half-open, UTC) and project_id. See the REST API for every field.
Account reports count what Kortix charged: total_cost = llm_cost + compute_cost. Spend on your own provider key is left out of total_cost. The reports return it separately as llm_provider_cost. The project Costs tab and the gateway logs split each model request into kortix_cost (from the wallet), provider_cost (paid to your provider) and total_cost.
Spend less
- Match the model to the work. Send easy tasks to a smaller model.
- Write clear instructions. A well-defined task needs fewer turns.
- Stay in one session. Repeated turns in one session reuse the prompt cache.
- Right-size the sandbox. Compute meters the reserved spec, so do not reserve more
cpu,memoryordiskthan the work needs. - Check Usage.
kortix billing costs --by sessionlists the costliest sessions first. Fix those first.
For a billing question, email support@kortix.com or ask in Discord.