Claude Prompt Cache TTL Burn & Cost Calculator (2026)
Anthropic Claude charges a +25% write penalty ($3.75/M) to create a prompt cache, which expires every 5 minutes of inactivity. Simulate cache evictions, rewrite penalties, and determine if keep-alive pings save you money.
âī¸ Cache & Traffic Setup
đ Cost Comparison & Ping ROI
Understanding Anthropic's 5-Minute Cache Inactivity Trap
Developers migrating from OpenAI (which uses automatic, implicit caching without TTL expirations) to Anthropic Claude are often shocked by their invoices. Anthropic's prompt caching requires explicit cache_control: { "type": "ephemeral" } declarations and operates on a strict 5-minute sliding TTL.
The +25% Write Tax
Writing to the cache costs $3.75 per million tokens on Claude 3.7 Sonnet ($0.75 more than normal inference). If your users only send requests every 10 minutes, you pay the $3.75 write tax on every single query without ever benefiting from the $0.30 read discount!
The MCP Tool Invalidation Gotcha
Anthropic caches the prompt strictly sequentially from top to bottom. If your application or MCP server dynamically modifies a system prompt header or adds a new tool schema midway through, the cache prefix breaks, forcing a complete cache rewrite.
Claude Prompt Caching Architecture: 5-Minute TTL Refresh Loops & Write Penalty Economics
Anthropic's prompt caching on Claude 3.5 Sonnet and Haiku provides a massive 90% discount on cache read tokens ($0.30/1M vs $3.00/1M on Sonnet). However, writing to the cache incurs a 25% premium ($3.75/1M), and cache entries expire after an exact 5-minute time-to-live (TTL) window. If an application sends requests at 6-minute intervals, every single request pays the 25% cache-write penalty without ever reaping the 90% read discount, causing net API expenses to rise by 25% compared to completely un-cached requests.
| Request Cadence | Cache Hit Ratio | Effective Prompt Cost (20k Prefix) | Monthly Cost (10,000 Turns) | Economic Outcome |
|---|---|---|---|---|
| Every 6 Minutes (TTL Expired) | 0% (Constant Cache Miss) | $0.075 per turn ($3.75/1M write) | $750.00 / month | +25% penalty vs un-cached |
| Every 3 Minutes (Organic Flow) | 90% Cache Hits | $0.0129 per turn | $129.00 / month | 78% overall bill reduction |
| Warm Heartbeat Ping (4m 30s) | 98.5% Cache Hits | $0.0068 per turn | $68.00 / month | Maximal cache economics |
Production Pipeline: Prompt Cache Heartbeat Daemon in Node.js
For multi-tenant SaaS agents with large static system prompts (20,000+ tokens of API schemas and company policy), running a lightweight background heartbeat every 4 minutes and 30 seconds keeps the KV cache perpetually hot:
import Anthropic from '@anthropic-ai/sdk';
const anthropic = new Anthropic();
export class CacheWarmer {
private timer: NodeJS.Timeout | null = null;
private readonly staticSystemPrompt: string;
constructor(systemPrompt: string) {
this.staticSystemPrompt = systemPrompt;
}
public startHeartbeat(): void {
// 4 minutes 30 seconds: prevents 5-minute TTL eviction
this.timer = setInterval(async () => {
try {
const response = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1, // Minimize output token cost
system: [
{
type: 'text',
text: this.staticSystemPrompt,
cache_control: { type: 'ephemeral' }
}
],
messages: [{ role: 'user', content: 'ping' }]
});
console.log(`[CacheWarmer] Cache refreshed: ${response.usage.cache_read_input_tokens} read tokens`);
} catch (err) {
console.error('[CacheWarmer] Refresh failed', err);
}
}, 270000);
}
public stopHeartbeat(): void {
if (this.timer) clearInterval(this.timer);
}
}
Production Rules & Cache Breakpoint Guidelines
- Minimum 1,024 Token Threshold: Claude prompt caching does not activate on blocks shorter than 1,024 tokens (2,048 tokens on Haiku). Small prompt prefixes will be billed at standard input rates.
- Maximum 4 Cache Breakpoints: Anthropic allows a maximum of 4 `cache_control: { type: 'ephemeral' }` blocks per API call. Place breakpoints at logical boundaries: static tools schema → company handbook → conversation history.
- Audit Response Headers: Track `cache_creation_input_tokens` vs `cache_read_input_tokens` in CloudWatch/Datadog to alert on cache degradation.
Frequently Asked Claude Cache TTL & Heartbeat Questions
Q: Why is a warm heartbeat ping cost-effective for large Claude system prompts?
A: Writing a 30,000-token system prompt to cache costs $0.1125 on Claude 3.5 Sonnet. Sending a 1-token heartbeat ping every 4m 30s keeps the cache active for $0.009/ping ($1.20/day), ensuring high-frequency user requests always hit the 90% discount.
Q: How many prompt cache breakpoints can be defined in a single Claude request?
A: Anthropic allows up to 4 explicit `cache_control: { type: 'ephemeral' }` blocks per message payload, allowing modular caching of tool schemas, organizational knowledge, and session history.
Systems Architecture: Claude Prompt Caching TTL & Eviction Dynamics
Anthropic's prompt caching for Claude 3.5 Sonnet, Claude 3.7 Sonnet, and Claude 3 Opus operates on a strict 5-minute ephemeral Time-To-Live (TTL) window. Every time a prompt cache hit occurs, Anthropic resets the TTL timer for another 5 minutes. However, the economic penalty for cache misses is asymmetrical: writing a new cache entry incurs a 25% surcharge over standard base input token rates ($3.75/1M vs $3.00/1M on Claude 3.7 Sonnet). A cache hit, by contrast, yields an 80% discount ($0.30/1M vs $3.00/1M).
If incoming query intervals slip past 5 minutes and 1 second, the cache evicts from GPU High Bandwidth Memory (HBM). Your subsequent request is penalized with the 125% cache write fee. In spiky or sporadic request distributions, naive caching implementations can inadvertently increase total API spend rather than reducing it.
The 5-Minute Heartbeat 'Ping' Architecture
To prevent costly cache evictions during low-traffic periods (e.g. night hours or between human interaction turns), production systems deploy an automated background heartbeat daemon. As modeled below, dispatching a dummy 1-token query every 4 minutes and 30 seconds maintains warm cache residence indefinitely at fractional cost:
| Strategy | Monthly Requests (100k Context) | Evictions / Mo | Cache Write Cost ($3.75/1M) | Cache Read Cost ($0.30/1M) | Total Monthly Spend |
|---|---|---|---|---|---|
| Unmanaged Spiky Traffic | 500 requests (spiky) | 420 evictions | $157.50 | $2.40 | $159.90 / mo |
| Warm Heartbeat Keeper (4.5m ping) | 500 requests + 9,600 pings | 1 initial write | $0.38 | $3.03 | $3.41 / mo (97.8% Savings) |
| No Caching Baseline | 500 requests uncached | N/A | $0.00 | $150.00 | $150.00 / mo |
Production Cache-Keeper Worker Blueprint (Node.js / Python)
import anthropic
import time
import os
client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
# Shared persistent system prompt (e.g. 50,000 token codebase AST or legal corpus)
LARGE_SYSTEM_PROMPT = open("large_system_context.txt").read()
def keep_cache_warm():
"""Pings Claude every 270 seconds to reset the 300-second TTL timer."""
while True:
try:
client.messages.create(
model="claude-3-7-sonnet-20250219",
max_tokens=1,
system=[
{
"type": "text",
"text": LARGE_SYSTEM_PROMPT,
"cache_control": {"type": "ephemeral"}
}
],
messages=[{"role": "user", "content": "ping"}]
)
print("Cache TTL refreshed successfully.")
except Exception as e:
print(f"Heartbeat failed: {e}")
time.sleep(270) # 4.5 minutes