Skip to content
Cache and ETags

Cache and ETags

Conditional requests save rows, not units: a 304 still costs 1 unit and returns 0 rows.

Cache headers

Starter data routes return:

Cache-Control: private, max-age=60
ETag: "…"
Vary: X-API-Key, Origin

The response is private to your key. Do not cache it in a shared or public cache.

Conditional requests

Send the previous ETag back in If-None-Match. If the representation has not changed, the API returns 304 with no body.

curl -sS https://api.foresportia.com/v1/matches/today \
  -H "X-API-Key: $FORESPORTIA_API_KEY" \
  -H 'If-None-Match: "previous-etag"'

A 304 still costs 1 unit and returns 0 rows, so it saves your daily row budget, not your unit budget.

The Python SDK models this explicitly: client.get_match(match_id, etag=previous) returns a response with not_modified == True instead of raising.