An elitesystem.ai tool

Prompt Cache Inspector

Paste two consecutive request bodies and find the exact byte where your cached prefix broke, whether your breakpoints are even legal, and whether caching is paying for itself at your request rate.

Scope. This models Anthropic prompt caching as documented in the Anthropic Messages API. Other providers implement caching differently (different render order, different minimums, different economics) and are out of scope here. Nothing on this page is a general cross-provider claim.

Everything runs in your browser. No request is sent anywhere, no API key is used, and no backend exists. This tool measures nothing about your actual traffic - it reasons about the bodies you paste. See How to measure it for real.

Computed from your input Byte-exact arithmetic on the bodies you pasted. No vendor numbers involved.
Computed from the rates table Depends on the dated rates block below. A stale row there makes these numbers stale, not the analysis above.

1. Inputs

No body loaded.
No body loaded.
Auto-detected from the body's model field when possible.
TTL tier
Auto-detected from any cache_control.ttl present.

How to measure it for real

Vendor field names, dated

This tool estimates. The API measures. Read these fields from the usage object on the response (or from the message_start event when streaming):

FieldWhat it actually is
cache_creation_input_tokensTokens written to the cache when creating a new entry.
cache_read_input_tokensTokens served from the cache on this request.
input_tokensOnly the tokens after the last cache breakpoint. This is the field teams misread.
cache_creation.ephemeral_5m_input_tokensPer-tier breakdown of the write: the 5-minute portion.
cache_creation.ephemeral_1h_input_tokensPer-tier breakdown of the write: the 1-hour portion.
total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens

The diagnostic that matters. If cache_read_input_tokens is zero across repeated requests that you believe share a stable prefix, a silent invalidator is at work. There is no error and no warning - the number simply stays at zero. That is the case this tool exists to localize.

A second silent case: if both cache_creation_input_tokens and cache_read_input_tokens are zero, the prompt was not cached at all, most often because the prefix fell under the model's minimum. Again, no error is returned.

Rates, floors and limits

Dated vendor data - edit freely

Every priced number and every floor verdict on this page is computed from the block below. Nothing is hardcoded in the logic. If a value changes, edit it here and the answers change with it - including the break-even count, which is derived from the multipliers rather than baked in.

Confirmed 2026-08-07 against platform.claude.com prompt caching and platform.claude.com rate limits. A stale row here produces a visibly stale answer that you can fix yourself. It cannot make the byte-level diagnosis above wrong.

Invalidation hierarchy

Vendor table, confirmed 2026-08-07

Render order is tools, then system, then messages. A change at one level invalidates that level and every level after it. valid means that tier survives the change; broken means it does not.

What changesTools cacheSystem cacheMessages cache
Tool definitions (names, descriptions, parameters, order)brokenbrokenbroken
Web search togglevalidbrokenbroken
Citations togglevalidbrokenbroken
Speed setting (fast vs standard)validbrokenbroken
Tool choicevalidvalidbroken
Images added or removed anywhere in the promptvalidvalidbroken
Thinking parametersmodel-specificmodel-specificbroken
Effort settingmodel-specificmodel-specificbroken
Non-tool results passed to extended thinking requestsvalidvalidmodel-specific

Do not read the thinking and effort rows as green. The documented table marks the tools and system columns for both of those rows as model-specific, not as preserved. The configuration is rendered into the prompt, so it always invalidates message blocks; whether it also invalidates tools and system depends on whether the model renders that configuration ahead of them. Setting effort explicitly to the model's default is equivalent to omitting it and does not invalidate.

Two escape hatches worth knowing, both documented: on the models that support it, appending a {"role": "system"} message to messages adds an instruction mid-conversation without invalidating the system or message caches, whereas editing the top-level system field does invalidate them. And a model switch has no escape hatch at all - cache entries are scoped to a model.

What this computes exactly, and what it only estimates

Exact

  • The render order walk. Every entry of tools in array order, then system, then every content block of every message in order.
  • The block index and byte offset of the first divergence. This is a character comparison over a deterministic local rendering of your two bodies. It involves no vendor constant and no estimate.
  • Breakpoint positions and counts, and where each sits relative to the divergence.
  • The lookback arithmetic once you supply the window size from the rates block.
  • The TTL arithmetic once you supply the tier duration and your two timings.

Estimated

  • Every token count on this page is an estimate from a character heuristic, rendered as a band and never as a point value. The method is printed in the analysis output.
  • OpenAI tokenizers such as tiktoken are wrong for Claude and this tool does not use one. Nor does it embed a Claude tokenizer - it has no network access and ships no model files.
  • Any prefix whose band straddles the model's floor renders BORDERLINE, never as a pass or a fail. Confirm those with the count_tokens endpoint.
  • All prices, floors, multipliers, TTL durations, the breakpoint maximum and the lookback size come from the editable rates block and carry its date.

On the render. The byte offsets reported here are offsets into this tool's own deterministic serialization of your body, not into the provider's internal wire format. What matters for diagnosis is that the serialization is stable and order-preserving, so a difference in it corresponds to a real difference in your request. Object keys are emitted in the order they appear in your JSON and are never sorted, because a non-deterministic serializer on your side is itself a real invalidator this tool needs to be able to name.

On cache_control. Markers are treated as caching directives rather than prompt content, so they are excluded from the compared bytes and tracked separately. Moving a marker changes which entry gets written; it does not change the prompt text.

No headline savings percentage appears anywhere on this page. The economics panel prints the formula and solves for the break-even request count instead, because a percentage without a request count is not a claim you can act on.

Related tools