Reference
Quote freshness
Every outcome inside /api/v1/events/{eventId}/odds ships with a lastUpdatedAt ISO-8601 timestamp from the source observation.
lastUpdatedAt semantics
Public current-odds endpoints only return outcomes whose source row was polled within the last 24 hours. Bet365 uses a shorter limit of 9 minutes per outcome. The API still does not return a stale=true flag; rows outside that server window are omitted from event discovery and event-odds responses. An omitted quote can reappear after a new source observation; omission does not mean the provider closed the market.
Bet365 Live freshness
Bet365 Live subscriptions receive odds.freshness messages with the full quote, observedAt, expiresAt and freshness: current | stale. A stale quote is no longer current; its provider quoteStatus remains unchanged. A new observation can renew freshness even when the price is unchanged.
On odds.freshness.reset or disconnect, invalidate cached live freshness. Apply controls per quote in observation-time order; ignore older observations and let a stale control expire the matching timestamp. Enforce expiresAt locally as well. Historical replay and odds.update messages alone never establish current freshness. These controls have no sequence and do not advance your replay cursor.
Close code 1013 requires reconnecting and synchronizing current state. Reset does not send an initial snapshot: use an entitled current-odds request or wait for a new current observation.
Client-side cutoff
For live decisioning, apply a stricter client-side cutoff: inspect lastUpdatedAt per outcome and drop quotes older than 30–60 minutes. Widen the window only for historical or offline analysis.
Bookmaker coverage varies by event and league. Currently 0 product-verified bookmakers form the entitlement pool while every source is under review. Coverage is not a per-event guarantee — a single match may carry no quotes from a given bookmaker, and a bookmaker may be missing some markets even when it covers others on the same event.