Anthropic prompt caching: minimums, pricing and the mistakes that void it
Anthropic caching is explicit — you place cache_control breakpoints yourself. That means it is also explicitly breakable, and nothing warns you when you break it.
The numbers
| Value | |
|---|---|
| Base input price | $3.00 / MTok |
| Cache read | 0.1× base → $0.30 / MTok |
| Cache write | 1.25× base → $3.75 / MTok |
| Minimum cacheable prefix | 1,024 tokens |
| Breakeven | 0.28 reads per cached write |
Breakeven is not one read. At 1.25× write and
0.1× read, caching only pays for itself after 0.28 reads of the same
prefix. Derived as (writeMult − 1) ÷ (1 − readMult). Below that, caching costs you money.
Minimum cacheable prefix, per model
The floor is per model, and it runs backwards from price — the cheapest model has the
highest floor. Below it, cache_control is silently ignored: no error, no caching, and you
still pay the 1.25× write premium.
| Minimum | Models |
|---|---|
| 512 | Fable 5, Mythos 5 (1,024 on Amazon Bedrock) |
| 1,024 | Opus 4.8, Sonnet 5, Sonnet 4.6, Sonnet 4.5, Opus 4.1, Opus 4 |
| 2,048 | Opus 4.7, Haiku 3.5, Haiku 3 |
| 4,096 | Haiku 4.5, Opus 4.6, Opus 4.5 |
In a study of 236 production system prompts, 68 (28.8%) were below the 1,024-token floor. The 25th percentile was 810 tokens.
What breaks the cache
Caching is an exact-prefix match. The first changed byte invalidates everything after it, and no provider raises an error. In 236 production system prompts:
- 76 (32.2%) rendered a date or time inside the cached prefix
- 68 (28.8%) were below the minimum cacheable length
- 36 (15.3%) carried a prefix far larger than it needed to be
- 27 (11.4%) kept mutable working memory inside the prefix
The fix
Order the request so the cached span is byte-identical on every call:
static system instructions ← cached tool definitions ← cached, breakpoint here --- cache breakpoint --- volatile context, dates, IDs ← after the breakpoint user message ← never cached
Content after the breakpoint costs only its own write. The same content before it invalidates everything downstream. Same bytes, different order, completely different bill.
Check your own prompt
Paste a system prompt or a raw API request. Get a score, the offending lines, and a modelled monthly cost. Runs in your browser — no API keys, no account, nothing leaves the page.
Run the audit →Or gate it in CI: npx prefix-audit prompts/ --provider anthropic