Reads are cacheable and carry validators. Using them properly cuts both your latency and your bill.
GET /v1/products/prd_8Fk2xQ ETag: "obs-8812f0" Cache-Control: public, max-age=60 // next time GET /v1/products/prd_8Fk2xQ If-None-Match: "obs-8812f0" → 304 Not Modified // not billed
Conditional requests that return 304 do not consume quota. On a catalogue that mostly does not move — which is most catalogues — this is the single largest saving available to you.
| Endpoint | max-age | Why |
|---|---|---|
| /products/{id} | 60s | Identity changes rarely. |
| /products/{id}/history | 300s | Append-only; old rows never change. |
| /products/{id}/context | 120s | Recomputed as observations land. |
| /search | 30s | Ranking shifts with prices. |
| /offers | 15s | The most volatile surface. |
If you are re-reading to detect change, use a watch. Push is cheaper than any caching strategy.