Plans & credits
The Free, Team and Enterprise plans, what spends credits, how the account wallet, top-ups and seats 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 three plans. See kortix.com/pricing for what each plan costs and grants.
| Free | Team | Enterprise | |
|---|---|---|---|
| Billed | No charge | Per seat | By contract |
| Credit grant | Every month, for the account | Every billing cycle, per seat, pooled in one wallet | By contract |
| Kortix-managed models | The platform default only | All | All |
| Buy credits and auto top-up | No | Yes | Yes |
| Projects | 1 | 200 | No limit |
| SSO, SCIM, groups and custom roles, audit log, branding | No | No | Yes |
- Every plan can use models on your own provider key or a ChatGPT subscription. See Models.
- A managed model outside your plan returns
plan_upgrade_required. - An Enterprise feature outside your plan returns
402with codeentitlement_required. See Sign-in, SSO & API keys. - An account on an older plan sees it under its family name: Free, Team or Enterprise. It keeps the terms it bought. Some older paid plans do not meter sandbox compute.
- Creating a project over the limit returns
403with codeproject_limit_reached. An archived project does not count. - To move from Free to Team, select Subscribe to Team on Billing → Plan. For Enterprise, 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. |
| 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.
- A stopped or sleeping sandbox accrues nothing. See Sessions.
- A running sandbox is billed every 5 minutes and again when it stops.
- A model request on your own provider key or a ChatGPT subscription has no Kortix charge. Your provider bills you.
Credit buckets
The wallet holds two buckets.
| Bucket | Filled by | Expires |
|---|---|---|
| Expiring | The plan grant | The next grant replaces it. Unused credits do not carry over. |
| Non-expiring | Top-ups, auto top-ups, 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 go into the non-expiring bucket.
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.
Seats and plan changes
A seat is an accepted member of a Team account. Seats follow membership: when a member joins or leaves, the seat count changes. Billing counts at most 100 seats.
| Change | Charge | Credits |
|---|---|---|
| Add a member | The seat is charged now, prorated for the rest of the cycle. | The prorated share of the seat’s grant arrives when that charge is paid. |
| Remove a member | The lower count applies from the next renewal. No refund. | Credits already granted stay in the wallet. |
| Move a paid plan to a higher plan | The difference is charged now. The upgrade applies only when that payment succeeds. | The prorated share of the new grant arrives with the payment. The next renewal grants the full amount. |
| 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 Team or wait for the next monthly grant. |
subscription_required |
A Team account has no active subscription. | 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.
- 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, seats, 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 and kortix billing transactions show credits. kortix billing costs shows money amounts. --json keeps the money amounts the API returns.
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.