Manage costs
Every request Syntic Code makes uses tokens, and tokens are what plans and limits are measured in. This page explains how the CLI estimates cost, where to see it, how to cap it, and the habits that keep a team’s usage predictable.
For what your plan includes and what happens at a limit, see Usage and billing.
How cost is estimated
Each model reply comes back with its token counts: input, output, cache reads and cache writes. Syntic Code turns those into a dollar figure in one of three ways, and labels which one it used:
| Source | Meaning |
|---|---|
| reported | The platform sent the cost with the reply. |
| calculated | The token counts multiplied by the model’s known rate. Rates come from the platform’s model list, or from a built-in table for models the CLI already knows. |
| estimated | The reply had no usage numbers, or no rate is known for the model. |
Cached input is billed at a much lower rate than fresh input, so long sessions that reuse the same context cost less per turn than the raw token count suggests.
Figures in the CLI are estimates at list price. Usage covered by your plan is not charged again. They exist to compare tasks and set budgets, not to reproduce your bill.
Your organization’s rates
If your organization has agreed its own rates, an administrator can put them in the modelPricing key of a managed settings file. Cost figures then use those rates, and the wording changes from a retail estimate to an estimate at your organization’s contract rates.
{
"modelPricing": {
"Syntic Code": { "input": 2.0, "output": 10.0, "cache_hit": 0.2 },
"*": { "multiplier": 0.8 }
}
}| Field | Meaning |
|---|---|
input, output | US dollars per million input and output tokens. Both are required for a rate entry. |
cache_hit | US dollars per million cached input tokens. Optional; 0 when left out. |
multiplier | Instead of rates: list price times this number, so 0.8 is a 20% discount. |
"*" | Applies to every model without an entry of its own. |
Model names match regardless of case. An entry that does not parse, or has a negative number, is skipped. modelPricing is only read from managed policy; it has no effect in user or project settings.
See what you are spending
| Where | Shows |
|---|---|
| The footer | The session’s running cost. |
/cost | This session’s spend, split by source, by model and by agent, with Cost, Usage and Trends tabs. |
/usage | Your plan’s usage windows, the context in use, usage credits, trends and usage by plugin. |
/stats | Token counts and spend by model, with an activity view. |
/insights | What drove token use over the last day and week. |
/context | What is filling the context window right now. |
| On exit | A line such as Total cost this session: $0.42 (retail estimate; usage covered by your plan isn't charged). Very small sessions print nothing. |
-p --output-format json | total_cost_usd in the result, for scripts and CI. |
/cost adds up a record for each reply, so it agrees with the footer, survives a resume, and never counts a request twice when you branch a session. Spend copied from the session you branched from is listed as carried over but not counted in the total. Details are in Reading /cost.
Put a ceiling on spend
Scripted runs
For -p runs, especially in CI, set limits so a confused run cannot keep going:
| Flag | Effect |
|---|---|
--max-budget-usd <amount> | Stop the run once its estimated cost reaches this amount. |
--task-budget <amount> | A per-task budget. When both flags are set, the smaller one applies. |
--max-turns <n> | Stop after this many agent turns. 0 means no limit. |
syntic -p "fix the failing test in src/parser" \
--max-budget-usd 2 --max-turns 30 --output-format jsonThe budget is checked before each turn, so a run can finish the request in progress and end slightly above the cap. A run stopped by its budget ends with the result subtype error_max_budget_usd; one stopped by its turn limit ends with error_max_turns. Zero, negative or non-numeric budgets are ignored rather than stopping every run. maxTurns in settings sets a default turn limit.
See Headless mode for the rest of the scripting options.
Subagents
Subagents can do a lot of reading. Cap each one:
| Where | Key |
|---|---|
| An agent’s definition file | maxBudgetUsd |
| Settings, for every agent without its own cap | "agents": { "defaultMaxBudgetUsd": 0.5 } |
agents.defaultMaxBudgetUsd can be set by policy, so an organization can cap every subagent on every machine. More in Spend caps.
Spend less per task
Most savings come from sending less context and choosing a lighter model when the task allows.
Context
- Run
/clearbetween unrelated tasks. Old conversation is resent with every request. - Use
/compactin long sessions, or let automatic compaction do it (see Context window). - Keep
SYNTIC.mdshort and specific. It is loaded into every session. See Memory. - Turn off MCP servers and plugins you are not using; their tool descriptions take space in every request.
- Point the agent at the right files with
@mentions instead of asking it to search the whole repository. - Ask subagents to do broad searches. Their reading stays out of your main context.
Model and reasoning
- Use fast mode (
/fast) for small edits, renames and quick questions. - Lower the reasoning effort with
/effortfor routine work, and raise it only for hard problems. - Set
fallbackModelso a busy model does not stall a long task.
Working style
- Ask for a plan first on large changes. Correcting a plan is cheaper than undoing an implementation.
- Give the checks to run (“run
pnpm testwhen done”) so the agent does not guess. - Stop a turn that is going the wrong way with
Escinstead of letting it finish.
Costs across a team
Syntic Code does not include an organization-wide spend dashboard. To track a team’s usage:
- Send telemetry to your own tools. OpenTelemetry export reports
syntic.cost.usageandsyntic.token.usageper model, and you can tag every record with team or cost-centre attributes. - Use your organization’s rates with
modelPricing, so the figures match what you pay. - Set default caps by policy:
agents.defaultMaxBudgetUsdfor subagents, andmaxTurnsfor runs. - Limit the model list with
availableModels, or set the default withmodel, so most work uses the model you intend. - Use usage credits deliberately. If your organization offers credits beyond plan limits, owners and admins control whether they are on in
/usage-credits.
A reasonable starting point for a pilot is to let people work freely for two weeks, then look at the exported totals per person and per repository before setting caps. Caps set before you know normal usage tend to interrupt good work.
When the numbers look wrong
| What you see | Why |
|---|---|
/cost shows a higher figure than your bill | CLI figures are list-price estimates; usage within your plan is not billed again. |
| A row says estimated | The reply had no usage data, or the model has no known rate. Totals may be off for that row. |
| A branched session starts with a cost | That is carried over usage from the original session. It is shown, but not added to the total. |
| Costs differ between two machines | One may have a policy with modelPricing; the other uses list price. |
A -p run went a little over --max-budget-usd | The cap is checked between turns, so the last request finishes. Lower the cap slightly. |