// blog/how-many-tokens-does-claude-code-send-per-request
How Many Tokens Does Claude Code Send Per Request?


The team at Systima spliced a logging proxy between two coding harnesses and a model endpoint, ran both on the same model and the same tasks, and published what each one actually sends. When asked for a one-line reply, Claude Code shipped roughly 33,000 tokens of harness payload before the user's prompt arrived. OpenCode shipped about 7,000. The measurements show where the tokens go during a Claude Code session.
How the numbers were measured
Systima placed a proxy between each harness and the API so it could record two things per request: the raw JSON payload the harness emitted (system blocks, tool schemas, messages) and the usage block the API returned (input tokens, cache writes, cache reads, output). Payload capture shows what the harness sends; the usage block shows what got metered.
They tested Claude Code 2.1.207 against OpenCode 1.17.18, both pinned to claude-sonnet-4-5 in July 2026, with a reduced set of runs later repeated on claude-fable-5. Baselines used fresh config directories: no MCP servers, no user settings, no instruction files, an empty workspace. Each cost multiplier was then added one variable at a time. They also disclosed a confound: their traffic passed through a local gateway called Meridian, whose envelope they calibrated at roughly 6,200 tokens on the Sonnet path and subtracted from every metered figure.
Most complaints about agent token costs come from billing pages. Measuring at the API boundary, with the harness's own payloads as evidence, turns "Claude Code feels expensive" into numbers you can act on.
The 33,000-token baseline before your prompt arrives
The floor task asked each harness to reply with the string "OK". The prompt was 22 characters. The payloads contained:
| Component | Claude Code | OpenCode |
|---|---|---|
| System prompt | 27,344 chars, 3 blocks | 9,324 chars, 1 block |
| Tool schemas | 27 tools, 99,778 chars | 10 tools, 20,856 chars |
| First-message scaffolding | 7,997 chars of <system-reminder> blocks | none |
| First-turn payload | ~32,800 tokens | ~6,900 tokens |
Tool schemas dominate both columns. Roughly 24,000 of Claude Code's 33,000 tokens are tool definitions, against about 4,800 of OpenCode's 6,900. OpenCode carries ten classic coding tools behind a single system block that opens with "You are OpenCode, the best coding agent on the planet." Claude Code carries the coding core plus a full background-agent and orchestration suite, from CronCreate and Monitor through the Task family, worktree management, and push notifications. It bootstraps a platform, and you pay for it whether or not the session uses it.
Systima also ran a zero-tools variant to isolate the system prompts themselves. Claude Code's instruction set alone is 26,891 characters, about 6.5k tokens; OpenCode's is 8,811 characters, about 2.0k. With every tool stripped, Claude Code sends over three times the behavioural doctrine.
Prompt caching does not erase the gap
A large baseline gets cached once and read back at a tenth of the input price afterward. The study's cache findings show why the floor still matters.
OpenCode's request prefix was byte-identical in every captured run. It paid to cache its payload once per session and read it back cheaply from then on. Across the entire study, OpenCode produced a single mid-session cache write, one event of roughly 6,000 tokens. Claude Code re-wrote tens of thousands of prompt-cache tokens mid-session, run after run, and on the same task wrote up to 54x more cache tokens than OpenCode. Cache writes are billed at a premium, so a dashboard can climb when most traffic should be discounted reads.
Claude Code injects <system-reminder> blocks that grow with the conversation: three on the first turn, four by the first tool round trip. A prefix that mutates cannot stay cached. OpenCode's per-turn marginal payload, around 400 to 2,200 characters, was pure conversation content.
Baseline tokens also occupy the context window. A 33k-token floor means every turn starts a sixth of the way into a 200k window before any code enters the conversation. Harness payload spends context before the agent can use it for the task.
A real working setup adds more tokens
The floor numbers came from sterile configs. Systima then added the things a production setup has, one at a time.
A 72KB instruction file from a real production repository added just over 20,000 tokens to every request, for both harnesses. OpenCode's metered total on the trivial task went from 13,152 to 33,336 tokens; Claude Code's went from 39,005 to 59,243. Claude Code 2.1.207 ignored AGENTS.md entirely and only ingested the file once renamed to CLAUDE.md, injecting it into the first user message, while OpenCode reads either filename into the system prompt. An ignored instruction file fails silently, so verify which filename your harness honours.
Five modest MCP servers added another 5,000 to 7,000 tokens, since every server's tool schemas join the payload of every request. Systima estimates that a realistic working setup uses 75,000 to 85,000 tokens per request before the user has typed a word.
A small task that cost 121,000 tokens done directly cost 513,000 tokens when fanned out to two subagents, because each subagent is its own agent re-reading its own system prompt and tool schemas on every turn it takes. The parent only ingests each subagent's returned result. Fan-out remains useful when you need isolation or parallelism, but it costs about 4x for a task one context could hold.
Claude Code's cost advantage depends on task and model
Claude Code cost less on the multi-step task, a write-run-test-fix loop. It batched the whole job, two file writes and two script executions, into a single parallel tool round trip and finished in 3 model requests at roughly 121,000 cumulative input tokens. OpenCode made one tool call per turn, took 9 requests, and landed at roughly 132,000. The big-baseline harness came out cheaper.
Whole-task input roughly equals baseline times request count, plus conversation growth. A 33k baseline paid three times beat a 7k baseline paid nine times. Claude Code's tool batching reduced request count.
When Systima re-ran the same task on claude-fable-5, the result changed. The newer model took six requests, triggered an 85,686-token mid-session cache re-write, and finished at roughly 298,000 tokens against OpenCode's 133,000. This result depended on model behaviour and can change with a model upgrade.
The model swap also showed that Claude Code's system prompt is model-conditional. It sent 27,787 characters of instructions to Sonnet but only 10,526 to Fable, with tool schemas trimmed from 99,778 to 82,283 characters. It retained all 27 tools while sending less doctrine, and the floor gap narrowed from 4.7x to about 3.3x. OpenCode's payload was byte-identical across both models. Systima flags that the Fable lanes were small samples, two runs for the floor and one for the multi-step task, so those figures are directional. Anthropic is tuning how much scaffolding each model tier needs, and per-harness cost comparisons also depend on the model.
How these numbers affect a working setup
-
Weigh your instruction file. At roughly 4 characters per token, every kilobyte of
CLAUDE.mdadds about 250 tokens to every request. A 72KB file adds 20k tokens per request; most of that is reference material the agent rarely needs on a given turn. -
Audit MCP servers per project. Each connected server's schemas ride on every request whether or not a tool gets called. Five modest servers add 5,000 to 7,000 tokens each time.
-
Subagents re-pay the full baseline. Use them when isolation or parallel wall-clock time justifies it, and skip them for work a single context holds comfortably.
-
Re-measure after model changes. The Sonnet-to-Fable re-run changed a 121k-vs-132k result into a 298k-vs-133k result on the identical task. Request count, batching behaviour, and the harness's system prompt all moved.