You mark a short system prompt with cache_control. There is no error, but cache_read_input_tokens stays at zero. Why?
Why D is the answer
The prompt is under the minimum cacheable length for that model
Prompts below the minimum length cannot be cached even when marked, and no error is returned. The minimum varies by model, so watch the usage fields rather than assuming a hit.
In detail
- Prompts below the minimum length cannot be cached, even when marked.
- No error is returned, and the minimum varies by model.
- Watch the usage fields rather than assuming a hit.
- Look at usage fields rather than assuming a hit.
Use case
An illustrative scenario, not a real incident.
A team marks a two-line system prompt for caching and sees no error, but reads stay at zero. It is below the model's minimum length, so there is nothing to gain.
See it in different ways
stateDiagram-v2 [*] --> Written: first request Written --> Read: same prefix within the lifetime Read --> Read: reused again Read --> Expired: idle past the lifetime Written --> Expired: idle past the lifetime Expired --> Written: next request
flowchart TD
Q{"Is the prompt over the minimum for the model?"}
Q -->|"No"| A0["Not cached, and no error"]
Q -->|"Yes"| A1["Can be cached"]Key point: Below the minimum length, cache_control does nothing.
Why the other options are wrong
- A. Your API key needs a separate caching permission before reads are counted
- No separate key permission is involved.
- B. The breakpoint limit was exceeded
- Exceeding the breakpoint limit would be a request error, not a silent zero.
- C. Only images can be cached
- Text can be cached, not only images.

