Skip to main content
Browse the documentation

Control and safety

Usage and limits

Plans and their quotas, how to read where your company stands, your own spend cap, and how to tell a short throttle from a wall that needs a plan change.

Every company is on a plan. The plan sets quotas — how many agents, runs and tokens the company can use — and you can add a spend cap of your own on top. When a limit is reached, the API tells you which one, and whether it clears in seconds, at the next reset, or only with a different plan.

Plans

The current plans, as GET /api/v1/public/plans answered on 2026-10-19. That call needs no key; read it for today's numbers rather than copying this table.

FreeStarterProEnterprise
Price (USD)020 / month99 / month1,999 / month
Agents2320200
Teams (max_teams)11540
Runs per month3003,00015,000200,000
Tokens per day90,000750,0003,333,333no daily limit
Tokens per month2,700,00022,500,000100,000,0002,000,000,000
Runs at the same time241050
Queuestandardpriorityprioritypriority
Knowledge bases2310100
Workspaces2310400
MCP servers2520100
Overagenoyesyesyes

Image allowances are left out of this table on purpose: the published figures are being corrected. Read them from GET /api/v1/public/plans.

Each plan also states its reset, and it applies to tokens only: day when the plan has a daily token allowance (Free, Starter and Pro in the table above), otherwise month (Enterprise). Images and runs are counted per month on every plan.

A company can also carry quota overrides set for it on top of its plan. To see the limits that actually apply to you, read your own company rather than the price list (next section).

Where your company stands

These calls need a key with the billing:read scope. The default key scopes do not include it, so choose it when you create the key.

curl -s https://api.snaga.ai/api/v1/usage/quota \
  -H "Authorization: Bearer $SNAGA_API_KEY"

GET /api/v1/usage/quota is the one to read first. allowed says whether the company can run now (with a reason when it cannot); daily gives today's tokens with resets_at; counters lists every capped counter as {kind, used, limit, period, resets_at}; and resource_usage gives {count, limit, over_by} for agents, teams, knowledge bases and workspaces.

CallAnswers
GET /api/v1/usageTokens, runs, tool calls and cost for the current period. ?breakdown=model,source splits it; ?agent_id= gives one agent's usage.
GET /api/v1/usage/timeseriesA daily series of runs, tokens or cost over the last days (up to 90).
GET /api/v1/usage/mediaImages and videos generated against the plan's media quotas.
GET /api/v1/billing/plansThe plans, with current marking yours and checkout_available saying whether you can upgrade to it.

total_cost is what your company is billed, in USD.

Set your own spend cap

A plan limits volume; a spend cap limits money. The cap is checked before every run starts.

curl -s -X PUT https://api.snaga.ai/api/v1/billing/budget \
  -H "Authorization: Bearer $SNAGA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"limit_usd": 50, "period": "monthly"}'
FieldMeaning
limit_usdThe cap, in USD. Required.
periodmonthly (default), weekly or daily.
soft_thresholdFraction of the cap that raises a soft alert. Default 0.8.
hard_thresholdFraction of the cap where runs stop. Default 1.0.

The PUT replaces the whole setting: a field you leave out goes back to its default. GET /api/v1/billing/budget shows the cap and its live status, with soft_alert and hard_limit_reached; DELETE removes it. Changing it needs billing:write. The setup path in the web app asks for a monthly spend cap too.

Overage

On a paid plan you can let usage continue past the plan's token allowance and pay for the extra per million tokens. On 2026-10-19 the published rate was 0.42 USD per million input tokens and 1.68 USD per million output tokens (see overage in GET /api/v1/public/plans).

Overage needs a spend cap: PUT /api/v1/billing/overage with {"enabled": true} is refused on the free plan and when no cap is set. GET /api/v1/billing/overage shows the current state.

When a limit is reached

A refusal for a limit is a problem document whose code tells you what kind of limit it is. Read code, not the wording of detail.

codeWhat it meansWhat to do
rate_limit_exceededToo many requests too quickly.Wait Retry-After seconds and retry.
quota_exceededA period allowance is used up.Wait until quota.resets_at, or upgrade.
run_quota_exceededThe run allowance is used up.Wait for the reset, or upgrade.
limit_reachedA limit that does not reset on a clock, such as the number of agents.Remove something, or change plan.

quota.kind (tokens, runs, tool_calls, images, videos) and quota.period (day, month) are always present on quota_exceeded and limit_reached, often with limit, used and remaining. A period wall answers 429 with Retry-After and an X-Quota-Resets-At header. A run stopped because the run allowance ran out carries error_code: run_quota_exceeded.

Key off code, never the status, for limit_reached. It answers 403 on POST /api/v1/runs, POST /api/v1/llm/* and POST /api/v1/tools/web_search, but 429 on POST /api/v1/sessions/{sessionId}/messages and POST /api/v1/agents/{agentId}/evaluations. The split is kept for older clients, not by design.

Every response also carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, so a client can slow down before it is refused.

Changing plan

In the web app, open Settings → Plan and payment. From code, POST /api/v1/billing/checkout-session with a plan_id returns a url for payment, and POST /api/v1/billing/portal-session returns a url where invoices and payment methods are managed.