#ai-research

Claude MAX Token Economics: The Invisible Meter

You're paying $200/month for unlimited AI assistance. Except it's not unlimited, the limits keep changing without notice, and nobody can tell you how close you are to hitting them.

Red Asgard AI Research
February 11, 2026
ai-securityclaudeanthropictoken-economicsllmdeveloper-tools

The Meter You Can't See

We hit the wall on a Tuesday afternoon. Mid-refactor, flow state, Claude Code humming along – then nothing. "Usage limit reached. Try again in a few hours." No warning. No percentage meter creeping toward 100%. Just a hard stop.

Here's what Anthropic doesn't explain clearly on the pricing page: Claude MAX operates a dual-limit system. The first limit is a 5-hour rolling window. Every API call you make stays in the calculation for exactly five hours, then drops off. This was the original design, discovered through reverse engineering by infrastructure teams at Portkey and TrueFoundry who monitor Anthropic's rate limit headers.

The second limit appeared on August 28, 2025: a weekly cap. Anthropic added this after discovering what they called "account sharing abuse" – people reselling MAX access or running entire dev teams off single $200 subscriptions. TechCrunch reported that some users were consuming "tens of thousands of dollars" in compute on the MAX 20x tier. The weekly cap was the response.

But the real problem isn't the existence of limits. It's the opacity. On July 17, 2025, TechCrunch ran a story titled "Anthropic tightens usage limits for Claude Code – without telling users." Limits had been silently reduced. No changelog. No announcement. Users discovered it only when their workflows broke.

The shared pool makes this worse. Claude MAX isn't a separate quota – it's shared across the web chat at claude.ai, Claude Code (the CLI), and the Chrome extension. Spend two hours analyzing a codebase in your IDE, then open the web interface to generate some documentation, and you're drawing from the same allowance. We verified this by checking ~/.claude/.credentials.json – the rateLimitTier field shows "default_claude_max_20x" but enforcement happens entirely server-side. There's no local meter to query.

We also found evidence that rate limits may be controlled through Statsig, a feature flag platform used for A/B testing. The ~/.claude/statsig/ directory contains cached feature flag evaluations, suggesting limits can be adjusted dynamically without client updates. This explains how silent changes happen.

One more thing: unlike cloud providers that auto-bill for overages, Claude MAX just stops. When you hit the limit, that's it. No "pay an extra $50 for 10 more hours" option. You wait, or you don't. PCMag's coverage called this the trade-off for the flat-rate model – predictable billing, unpredictable availability.

You can't see the meter. But once you understand the system – 5-hour window, weekly cap, shared pool, dynamic adjustments – you can start optimizing around it.

Anatomy of a Token

Most people think using Claude works like this: type a prompt, get a response, tokens consumed equals roughly the length of both. That's how it feels. It's not how it works.

Every single API call resends the entire conversation history. Not a reference to cached messages. The actual text. All of it. Plus the system prompt, which for Claude Code starts at roughly 10,000 tokens before you've said a word. That breaks down to approximately 3,000 tokens for base instructions, 5,000 for tool definitions (Bash, Read, Edit, Grep, etc.), 2,000 for your project's CLAUDE.md if present, and a few hundred for environment metadata.

Now add your conversation. First message: 10K system prompt + your 50-token question + 300-token response = 10,350 input tokens, 300 output tokens. Second message: 10K system prompt + first exchange (350 tokens) + new 50-token question + 400-token response = 10,800 input, 400 output. By the 50th exchange in a long debugging session, you're sending 50,000+ tokens as input every single time, even if your new question is five words.

Tool outputs make this exponentially worse. Run Grep to search a codebase? That output – potentially thousands of lines – gets added to context. Use Read on a large file? Added. Execute Bash and get a stack trace? Added. All of this accumulates and gets retransmitted with every subsequent call.

We pulled the real numbers from ~/.claude/stats-cache.json. For Claude Opus 4.5 usage over a typical period:

MetricValue
Input tokens9,124,068
Output tokens15,127,450
Cache creation tokens1,076,510,007
Cache read tokens12,644,891,234

That's not a typo. 12.6 billion cache read tokens versus 9.1 million input tokens. Cache reads are 1,387 times larger than raw input. Why? Because Anthropic's prompt caching system stores the context and reloads it on every call. Cache read tokens are billed at 10% of the base input rate ($0.50 per million for Opus versus $5), but the volume is so high that cache reads dominate total consumption.

The math compounds. If you're on MAX 20x, you're supposedly getting 20 times the API equivalent capacity. For Opus at $5/$25 per million tokens (input/output), that would theoretically be $4,000 worth of raw API usage per month. But context reuse via caching means you're actually processing far more than face-value token counts suggest – because those 12 billion cache reads represent the same context being reloaded hundreds or thousands of times.

Here's the punchline: on Claude MAX, costUSD in stats-cache.json shows 0.00 for all models. You're not paying per token – you're paying a flat subscription fee and Anthropic is managing the actual compute internally. The token counts don't directly bill you, but they do determine when you hit the invisible rate limit.

The 50th message in a session doesn't just cost more than the first. It costs dramatically more, because you're dragging 49 previous exchanges – and all their accumulated tool outputs – along for the ride.


Prompt Surgery – Cutting Consumption 40-60%

Every API call resends your entire conversation history. Every token in your CLAUDE.md. Every tool output ever generated. This accumulation is silent and brutal.

We tested aggressive context management across 20 sessions and found verified techniques that cut token burn by 40-60% without losing capability.

The CLAUDE.md Tax

Your CLAUDE.md is loaded at session start and injected into every single API call. This isn't cached context – this is raw prompt overhead. The hierarchy loads recursively: managed policy -> project CLAUDE.md -> user CLAUDE.md -> local CLAUDE.md -> auto memory. Plus all .claude/rules/*.md files.

We measured approximately 2,000 variable tokens per CLAUDE.md depending on content. If you have orchestrator-mode.md, agents.md, and three other rule files, that's 8,000+ tokens sent with every request.

Surgery protocol:

# Audit your CLAUDE.md token overhead
ls -lah ~/.claude/rules/*.md
wc -w ~/.claude/rules/*.md

# Move non-essential rules to docs
mv ~/.claude/rules/verbose-guide.md ~/docs/archive/

Trim ruthlessly. Every line costs you every call.

Compact Early, Compact Often

The /compact [instructions] command summarizes conversation history to free context. In our tests with sessions exceeding 100K tokens, we achieved 40-60% reduction in context size.

Don't wait for the context window to fill. We found compacting every 20-30 exchanges maintained performance while preventing quota burn.

# After completing a feature or fixing a bug
/compact keep technical decisions and file paths

# Before switching tasks
/compact summarize current state, drop conversation details

The compaction is lossy but targeted. Specify what matters. In a 50-exchange debugging session, we compacted from 85K to 38K tokens by preserving only the final fix and dropping the diagnostic conversation.

Session Discipline

The /clear command resets conversation history while keeping file changes. We use this between unrelated tasks.

# Finished debugging auth? Clear before starting docs.
/clear

# Context feels bloated mid-task?
/compact preserve current task context

In our workflow, we /clear every 3-5 distinct tasks. This prevents context pollution where an early conversation about database schema influences later frontend work.

Tool Output Discipline

Tool output accumulates forever. A cat of a 5,000-line file lives in your context until compaction or clear. We shifted to targeted reads:

# Bad: dumps entire file into context
cat src/large-module.ts

# Good: surgical read of relevant function
# Use Read tool with line ranges instead

In one test, we reduced a 45K context session to 18K by switching from full-file reads to targeted 50-line chunks.

The .claudeignore Bug

Claude Code documentation mentions .claudeignore for excluding files. It's broken. As of January 2026, Claude Code doesn't properly respect .claudeignore and reads secrets despite exclusion rules (The Register, Jan 28, 2026; GitHub issue #579).

Verified workaround:

// .claude/settings.json
{
  "permissions": {
    "deny": [
      ".env*",
      "secrets/",
      "*.key",
      "credentials.json"
    ]
  }
}

This actually works. We tested it against .env files and confirmed denial.

ROI

In a typical 2-hour coding session with heavy context (debugging, refactoring, documentation), we burned 180K tokens with no hygiene and 72K tokens with the full protocol. That's 60% reduction for approximately 30 seconds of /compact and /clear discipline.

On MAX's 2M tokens/day quota, that's the difference between 11 heavy sessions and 27.

Model Routing – Right Model, Right Task

You can switch models mid-session without losing context. We exploited this to stretch quota 3x further.

The Command Set

# During session
/model haiku
/model sonnet
/model opus

# Extended context (1M tokens)
/model sonnet[1m]

# At startup
claude --model opus

# Via environment
export ANTHROPIC_MODEL=opus

All models cost you $0 per token on MAX subscription. But they don't consume quota equally.

Quota Burn Rates

MAX gives you $200/month quota equivalent. In practice, Opus burns quota approximately 3-5x faster than Haiku per exchange. We don't have exact Anthropic-confirmed ratios, but community reports and our own testing show clear disparity.

In one experiment, we ran identical 50-exchange sessions on Opus and Haiku. Opus consumed approximately 4x the quota units for the same task.

Pricing context (API, not MAX):

ModelInputOutput
Opus$5/M$25/M
Sonnet$3/M$15/M
Haiku$1/M$5/M

Opus output costs 5x Haiku, 1.67x Sonnet. MAX internalizes these costs, but the quota consumption reflects relative API pricing.

Routing Strategy

We adopted this pattern:

Haiku for:

  • File exploration and search
  • Simple edits (typo fixes, adding log statements)
  • Running tests and reporting results
  • Writing straightforward documentation

Sonnet for:

  • Most coding tasks (features, bug fixes)
  • Refactoring multi-file changes
  • Debugging with analysis
  • Code review and security checks

Opus for:

  • Complex architecture decisions
  • Large-scale refactoring (10+ files)
  • Nuanced context-heavy analysis
  • When Sonnet fails or gives suboptimal results

Practical Example

Real session from our testing:

# Start with Opus for architecture planning
claude --model opus
> "Design the authentication module architecture"
# Opus provides detailed design (10 exchanges, heavy quota burn)

# Switch to Sonnet for implementation
/model sonnet
> "Implement the token validator based on the design"
# Sonnet writes the code (30 exchanges, moderate burn)

# Switch to Haiku for tests
/model haiku
> "Write unit tests for token validation"
# Haiku generates tests (15 exchanges, minimal burn)

# Back to Sonnet for integration
/model sonnet
> "Integrate validator with existing auth middleware"

This session used approximately 40% of the quota an all-Opus session would have consumed.

The Instant Switch

Model switching is instant. No context loss. No session restart. The entire conversation history transfers to the new model.

In practice, we switch 3-5 times per complex feature. The pattern: Opus for direction, Sonnet for execution, Haiku for grunt work, Sonnet for integration, Opus if we hit a wall.

Long Context Caveat

Extended context doubles Sonnet pricing to $6/$22.50/M and pushes Opus to approximately $10/$37.50/M. On MAX, this means extended context modes burn quota faster. Use [1m] context only when you actually need it – most tasks work fine with standard context.

We tested a large codebase exploration session. Standard Sonnet handled 15 files comfortably. We only needed extended context when simultaneously reasoning about 30+ files.

Measurement

Over 10 days of heavy MAX usage, we tracked quota consumption:

  • No routing (Sonnet default): Hit 90% quota by day 8
  • Strategic routing: Used 62% quota across same workload

The discipline is simple: ask "does this task need Opus reasoning?" If no, downshift.


Session Architecture – Working With the Clock

The 5-hour rolling window isn't a countdown timer. It's a sliding quota bucket. Every token you spend stays counted for exactly 5 hours, then falls off. This creates a deceptive cognitive trap: you think you're "starting fresh" after a break, but you're still carrying forward the last 4 hours and 59 minutes of usage.

We measured this empirically. After hitting limits, we waited 90 minutes and tried again. Still blocked. Waited another 2 hours. Still blocked. The full 5 hours must pass from your first token in the burst, not your last.

The weekly cap compounds this. Added August 28, 2025, it sits on top of the rolling window as a separate constraint. You can have quota available in your 5-hour window but be capped for the week. September 29, 2025 brought the major reduction event – GitHub issue #9094 documents users dropping from 40-80 hours per week to 6-12 hours. By January 2026, issue #16157 shows Max subscribers hitting limits after roughly 2 hours of continuous use. Issue #22435 reports quota consumption running 20-30% higher per day than previous rates.

Anthropic never published an official blog post explaining these changes. The community learned through Reddit megathreads and GitHub issues, documenting what one analysis called "largely negative" feedback between September and December 2025.

Here's what actually works:

Batch your sessions. Intense 90-minute sprints with 5+ hour gaps between them. Claude Code running idle still consumes quota on background operations (file watching, context maintenance). Close it when you're not actively coding.

Route by task complexity. Web chat for quick questions. Claude Code for actual implementation. Chrome extension for document analysis. All three draw from the same pool – spending tokens in the web interface burns your coding budget.

Plan around quota refresh. We keep high-value work (architecture decisions, complex refactors, new feature scaffolding) for periods when we know we have fresh quota. Routine tasks (documentation, simple bug fixes) can run anytime.

Maintain fallback workflows. When Claude hits limits mid-project, you need alternatives. We keep GPT-4 available for continuation, Cursor for simple refactors, and maintain the ability to code manually. Several users on GitHub report spreading work across multiple LLMs specifically because Claude's limits make single-tool workflows impractical.

The December 25-31, 2025 holiday bonus temporarily doubled limits. January 1 "return to normal" felt like a reduction even though it wasn't – it was just the temporary boost ending. The Register covered this as user confusion, but the real issue was lack of transparency. Users optimize behavior when they understand the constraints. Claude's limit system remains deliberately opaque.

Claude Code Power Moves – Platform-Specific Optimization

Claude Code (version 2.1.38 as of this analysis) ships with commands that directly control token consumption. Most users never touch them. We use them constantly.

/cost is designed to show token usage and dollar amounts – but on MAX subscriptions, it only prints "You are currently using your subscription to power your Claude Code usage." No token counts. No burn rate. Nothing actionable. It works on API billing, not subscriptions. This is one of the biggest blind spots for MAX users.

/compact [instructions] is the single most important command. It summarizes conversation history, freeing 40-60% of context. We compact every 20-30 messages, not when we hit limits. Ctrl+O toggles verbose output to show the full compact summary. This isn't just cleanup – it's active quota management.

/context visualizes current context as a colored grid. Red blocks = expensive. We've seen sessions where .claudeignore patterns failed (known bug) and node_modules consumed 40% of context. /context caught it immediately.

/usage shows plan limits. Only works for subscribers – the binary string confirms "usage is only available for subscription plans." Non-subscribers get nothing. When you're planning a 4-hour refactor, knowing you have 2 hours of quota left matters.

/model <alias> switches models mid-session: sonnet (default), opus (heavyweight), haiku (lightweight). For exploration tasks, we drop to haiku. Commands like "find all files matching X" don't need Opus. For complex architecture decisions, we explicitly escalate to opus. This is manual, but it works.

CLI flags control token spend from the start:

# Low-effort mode for simple tasks
claude --effort low "add error handling to api.ts"

# Budget cap for print mode
claude --max-budget-usd 2.00 "explain this codebase" > summary.md

# Custom system prompt (cheaper than editing CLAUDE.md)
claude --append-system-prompt "Prefer TypeScript over JavaScript"

--effort low dramatically reduces token use. We measured a 3x difference on the same task between low and default effort. Use it for everything that isn't architecture or security.

As covered in Prompt Surgery above, CLAUDE.md and .claude/rules/*.md are loaded into every request, consuming tokens continuously. We keep these files minimal – under 200 tokens total – to avoid unnecessary quota burn.

~/.claude/stats-cache.json tracks real usage: dailyActivity, dailyModelTokens, modelUsage, lifetime aggregates. This is more accurate than the in-app display because it includes background operations. We parse it weekly to identify patterns.

credentials.json contains a rateLimitTier field showing "default_claude_max_20x" for MAX subscribers. We've never seen official documentation of what the tier values mean, but monitoring this field across accounts showed correlation with usage patterns.

The real power move: treat every command as a resource decision. /compact controls context. --effort low trades quality for quota. /usage shows remaining runway. Together with stats-cache.json for historical data, they transform Claude Code from a black box into a controllable system.

We've optimized sessions to run 3-4x longer on the same quota by applying these techniques systematically. The commands exist. Most users just don't know they're sitting on the optimization layer.


The $200 Question – MAX vs API Economics

We ran Claude MAX for 65 days. Let's do the math.

The API pricing table tells the story:

ModelInput $/MOutput $/MCache ReadCache Write (5min)Cache Write (1hr)
Opus 4.6$5.00$25.00$0.50$6.25$10.00
Sonnet 4.5$3.00$15.00$0.30$3.75$6.00
Haiku 4.5$1.00$5.00$0.10$1.25$2.00

Our actual usage from stats-cache.json:

Opus 4.5: 9.1M input + 15.1M output + 12.6B cache read + 1.08B cache write Opus 4.6: 1.2M input + 1.5M output + 913M cache read + 62M cache write Sonnet 4.5: 525K input + 365K output + 779M cache read + 107M cache write

If we paid API rates, with conservative 5-minute cache TTL:

Opus 4.5:
  Input:  9.1M x $5.00 = $45.50
  Output: 15.1M x $25.00 = $377.50
  Cache read: 12.6B x $0.50 = $6,300.00
  Cache write: 1.08B x $6.25 = $6,750.00
  Subtotal: $13,473.00

Opus 4.6:
  Input: 1.2M x $5.00 = $6.00
  Output: 1.5M x $25.00 = $37.50
  Cache read: 913M x $0.50 = $456.50
  Cache write: 62M x $6.25 = $387.50
  Subtotal: $887.50

Sonnet 4.5:
  Input: 525K x $3.00 = $1.58
  Output: 365K x $15.00 = $5.48
  Cache read: 779M x $0.30 = $233.70
  Cache write: 107M x $3.75 = $401.25
  Subtotal: $642.01

Total API cost: $15,002.51

We paid: $200/month x 2.16 months = $432.

That's a 34.7x discount. Cache reads alone would have cost $6,990. This is why power users call MAX "API arbitrage."

But flip the script. What if you're a light user?

At $200/month, the break-even point is roughly 20M tokens per month at a blended rate of $10/M. Below 10M tokens per month, you're overpaying. A casual user burning 2M tokens/month would spend $20-40 on API but pays $200 for MAX.

The decision matrix:

Monthly UsageAPI CostMAX CostWinner
2M tokens$20-40$200API
10M tokens$100-150$200Toss-up
20M tokens$200-300$200MAX
50M tokens$500-800$200MAX (2.5-4x)
100M tokens$1,000-1,600$200MAX (5-8x)
Our actual$15,002$432MAX (34.7x)

Team plan ($25-30/user, min 5 users) makes sense for organizations that want seat-based billing and admin controls. Enterprise (contact sales) adds SSO, governance, custom pricing.

Key difference: MAX throttles when you hit limits. API scales infinitely but bills accordingly. There's no "extra usage" auto-billing on MAX – you get rate-limited, not invoiced.

Anthropic positions this clearly: MAX for single power users in IDE workflows with fixed costs. API for programmatic access, team control, and production scale.

We hit the sweet spot: high token burn, heavy cache usage, single-user workflow. The math works. If you're a light user or need team controls, it doesn't.

Rolling Your Own Meter – Visibility Tools

Anthropic doesn't give you a usage dashboard. So we built one.

The data lives in ~/.claude/stats-cache.json (version 2 schema):

{
  "dailyActivity": [...],
  "dailyModelTokens": [...],
  "modelUsage": {
    "claude-opus-4-5-20251101": {
      "inputTokens": 9100610,
      "outputTokens": 15127450,
      "cacheReadInputTokens": 12627988576,
      "cacheCreationInputTokens": 1076510007,
      "costUSD": 0
    }
  },
  "totalSessions": 165,
  "totalMessages": 349934,
  "longestSession": 1842,
  "firstSessionDate": "2024-12-03T..."
}

Extract useful metrics with jq:

# Total tokens burned across all models
jq '.modelUsage | to_entries[] | .value | .inputTokens + .outputTokens' \
  ~/.claude/stats-cache.json | awk '{s+=$1} END {print s}'

# Messages per day
jq '.dailyActivity[] | "\(.date): \(.messageCount)"' \
  ~/.claude/stats-cache.json

# Peak usage day
jq '[.dailyActivity[] | {date, messageCount}] | sort_by(.messageCount) | reverse | .[0]' \
  ~/.claude/stats-cache.json

Our peak day was January 23, 2026: 36,303 messages in 10 sessions. Heavy days clustered: Dec 7 (30,610), Dec 26 (22,457), Jan 12 (28,963). The data shows model transitions – Opus 4.5 dominated until February 6, when Opus 4.6 launched.

For real-time monitoring, the slash command trinity:

  • /cost – shows token costs on API billing; useless on MAX subscriptions (just says "you're on subscription")
  • /usage – plan limits and rate-limit tier
  • /context – visual context breakdown

Caveat: stats-cache.json is not updated in real time. It flushes at session end or periodically – during an active session, today's data may be missing entirely. And since /cost is useless on MAX subscriptions, you have no live token visibility at all. The script below gives you the best available picture from historical data.

Build a burn-rate tracker:

#!/bin/bash
# Daily token burn calculator

STATS=~/.claude/stats-cache.json

today=$(date +%Y-%m-%d)
yesterday=$(date -d "yesterday" +%Y-%m-%d)
day_before=$(date -d "2 days ago" +%Y-%m-%d)

get_tokens() {
  jq --arg d "$1" '.dailyModelTokens[] | select(.date==$d) | \
    .tokensByModel | to_entries[] | .value' "$STATS" | \
    awk '{s+=$1} END {print s+0}'
}

today_tokens=$(get_tokens "$today")
yesterday_tokens=$(get_tokens "$yesterday")
day_before_tokens=$(get_tokens "$day_before")

echo "Token burn:"
echo "  Today (so far): $today_tokens"
echo "  Yesterday:      $yesterday_tokens"
echo "  Day before:     $day_before_tokens"
echo "  Trend (d/d):    $((yesterday_tokens - day_before_tokens))"

Model-specific tracking:

# Opus vs Sonnet distribution
jq '.modelUsage | to_entries[] | \
  "\(.key): \(.value.inputTokens + .value.outputTokens) tokens"' \
  ~/.claude/stats-cache.json

The credentials file at ~/.claude/credentials.json reveals your subscription tier:

{
  "subscriptionType": "max",
  "rateLimitTier": "default_claude_max_20x"
}

That rateLimitTier field is server-side controlled via Statsig feature flags cached in ~/.claude/statsig/. Limits aren't hardcoded – they're dynamic.

Over 65 days, we burned 349,934 messages across 165 sessions. The longest session: 1,842 messages. Cache reads dominated the token count at 12.6 billion tokens.

Anthropic should build a proper usage dashboard. They haven't. Until then, you're reading JSON and piping to jq.


You're paying $200/month for a meter-less resource. The data exists – it's just buried in JSON. With stats-cache.json, slash commands, and basic shell scripting, you can track your burn rate, identify peak usage patterns, and understand where your tokens go. The economics work if you're a power user. The throttling is real but survivable. And now you have the instruments to prove it.

We reverse-engineered the rate limits, mapped the token economics, and built monitoring tools from cached state files. The system works – if you understand how it's built and where the boundaries are. Claude MAX is a fixed-cost API with invisible walls. Now you can see them.

Share this article

Help spread the word about security best practices.

Need Security Help?

Our team can help secure your blockchain, web applications, and infrastructure.