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.