Live Events
GET /events/live returns all currently in-play events, optionally filtered by sport:
clock object with the current match clock. The same clock field also appears on live events returned by GET /events?status=live and GET /events/{id}.
The Clock Object
Live events carry an optionalclock field:
| Field | Type | Description |
|---|---|---|
minute | integer | Cumulative match minute (elapsed play, not time remaining) |
playedSeconds | integer | Seconds of play elapsed |
period | integer | Current period number (half, quarter, set) |
running | boolean | Whether the clock is currently ticking |
statusDetail | string | Human-readable phase, e.g. "2nd half", "Break" |
serve | string | "home" or "away": the current server, or in turn-based sports (snooker, darts) the player at the table |
injuryTime | integer | Announced stoppage time in minutes (football) |
clockis omitted entirely when no clock data is available for an event. Treat it as optional.minuteandplayedSecondsare extrapolated server-side from the live feed, so they stay accurate even when the response is served from cache.- The clock only advances while
runningistrue. During half-time and other breaks it freezes at the last played second. - For a per-second ticker in your UI, extrapolate client-side from
playedSecondsat the moment you received the response, whilerunningistrue.
statusDetail values
statusDetail is the live feed’s phase description passed through as-is. The exact
strings vary by sport; treat it as display text rather than an enum, and use
period + running for any betting logic. Values you can expect:
| Sport | Typical values |
|---|---|
| Football | "1st half", "Halftime", "2nd half", "Awaiting extra time", "Penalties" |
| Basketball | "1st quarter" … "4th quarter", "Break" |
| Tennis, volleyball, badminton | "1st set", "2nd set", "3rd set", … |
| Esports | "Map 1", "Map 2", "Map 3", … |
| Baseball | "1st inning" … "9th inning" (no clock seconds; baseball is untimed) |
| Cricket | "First innings, home team", … |
| Snooker, darts | "Started" |
Rendering a football clock the conventional way
minute is cumulative elapsed play, so first-half stoppage time reads 46, 47,
48… To render the conventional 45+X / 90+X style, cap the minute at the
period boundary:
injuryTime carries the announced stoppage minutes when the fourth official
raises the board, so 45+2 with injuryTime: 4 tells you about two more
minutes of the half remain.
Participant Logos
GET /participants/{id}/logo returns the team or player crest as a PNG, served directly from the Odds-API domain:
homeId / awayId fields from event responses as the participant id, or look ids up via GET /participants.
- Responses include
Cache-Control: public, max-age=86400, so browsers and CDNs cache them for a day. You can hotlink the URL in an<img>tag. - Returns
404when no logo exists for the participant. Misses are cached server-side, so repeated lookups for logo-less participants stay fast. - Logos are served from our infrastructure; no third-party provider URLs are exposed to your users.
Next Steps
- Stream live scores and match status over WebSocket instead of polling, see the WebSocket guide
- Fetch odds for live events with Fetching Odds