Age header
The Age header tells you how long a response has been sitting in a
cache, in seconds. age: 0 (or no Age header) usually means the response
just came from the origin; age: 8412 means you're looking at a copy cached
2 hours 20 minutes ago. It's the fastest single signal for "did this come from
cache?"
Reading it in practice
$ curl -sI https://example.com/ | grep -iE 'age|cache'
age: 8412
cache-control: public, max-age=60, s-maxage=86400
cf-cache-status: HIT
Cross-referencing Age with Cache-Control tells you where in its life the copy is: here the object is 8,412 s into an 86,400 s s-maxage — about 10% through its edge lifetime. An Age just below the TTL means the next request may trigger revalidation or a miss.
Nuances worth knowing
- Age is cumulative across cache layers. In a tiered setup, Age reflects time since the origin fetch — not since the edge PoP stored its copy.
- Age says cached, not fresh-from-your-deploy. After a release, a large Age on HTML tells you visitors still see the pre-deploy version — time to purge and re-warm.
- Each PoP has its own Age. The same URL can show
age: 41000in Frankfurt andage: 0in Sydney, because every PoP caches independently. One curl from your desk samples exactly one location — our cache checker reads Age and cache status from several regions at once. - Age: 0 with a HIT happens too: the copy was stored milliseconds ago (e.g. by another visitor — or by a warming pass).
Related terms
Freshness lifetime comes from TTL; what happens at expiry is shaped by stale-while-revalidate; validation without re-download uses ETags.