Skip to main content
GET
Fetch a single event by slug

Path Parameters

slug
string
required

Canonical event slug, e.g. fifa-world-cup-2026-winner.

Response

OK

Full event shape, returned by GET /api/events/{slug} and GET /api/events/featured: the same event-level fields as a GET /api/events row, with full MarketSummaryDto markets.

id
string<uuid>
required

Event UUID.

slug
string
required

Canonical event slug — the key for GET /api/events/{slug}.

Example:

"lithuania-vs-andorra"

title
string
required

Display title.

metaTitle
string | null
required

SEO title set by operators; null ⇒ use title.

imageUrl
string | null
required

Competition or tournament logo URL. Display-only; null ⇒ use a placeholder.

homeCountry
string | null
required

Home participant's country, ISO-3166-1 alpha-2 (tennis: the player's flag). Null when unknown — normal for events without participants and for uneven feed coverage.

awayCountry
string | null
required

Away participant's country, ISO-3166-1 alpha-2 — see homeCountry.

sport
string | null
required

Sport in the live-score vocabulary (soccer, tennis, baseball, politics, …) — the same word live.sport carries. For navigation use vertical (football is soccer here and football there). Null on legacy events.

Example:

"soccer"

vertical
string | null
required

Navigation vertical (football, tennis, crypto, politics, …) — the value ?vertical= filters on and GET /api/verticals counts. Null on legacy events.

Example:

"football"

match
object | null
required

Parent match (id, slug, title, group, stage, competition, teams, kickoffAt, state). Null for events not bound to a match: outrights, politics, and match-less fixtures such as most tennis events.

stage
enum<string> | null
required

Tournament stage: a match-less football fixture's own, or the parent match's (then equal to match.stage). Set on match-less fixtures too, so read this rather than match.stage. A value from the match can be a competition tag (fifa_friendlies, ucl, uefa_europa_conference_league). The value ?stage= filters on.

Available options:
group,
r32,
r16,
quarter_finals,
semi_finals,
third_place,
final,
fifa_friendlies,
ucl,
uefa_europa_conference_league
Example:

"group"

group
enum<string> | null
required

Group letter (A to L), from the same source as stage; a match-less fixture has one only on the group stage. The value ?group= filters on.

Available options:
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L
Example:

"A"

teamA
object | null
required

Home participant — the participant field for head-to-head events, whether or not they are bound to a match. On a match-less event code may be empty and logo null — render label first. Null on outrights, tournament events and legacy rows.

teamB
object | null
required

Away participant; same semantics as teamA.

competition
object | null
required

Effective competition (the match's, else the event's own) — set on match-less events too. Its slug is what ?competition= accepts. Null when the event has none.

tags
object[]
required

Active tags (slug, name). Always an array; empty when the event has none.

category
object
required

Category-tab bucket folded from the markets' types (GAME_LINES, TEAM_TO_ADVANCE, EXACT_SCORE, OTHER).

scheduledAt
string<date-time> | null
required

Scheduled start time of the event. For an event bound to a match this usually equals match.kickoffAt, but may differ for partial-game props. The ISO-8601 from / to filters compare against the event's start time.

endedAt
string<date-time> | null
required

When the event's outcome was determined (full time, race end, half time for partial-game props). Null until known; unlike live, it persists after the game.

scheduleStatus
enum<string>
required

Schedule state. POSTPONED keeps markets open and sets settlesByAt; CANCELLED settles positions at fair value. Read this for the badge rather than deriving it from times.

Available options:
SCHEDULED,
POSTPONED,
CANCELLED,
PLAYED
Example:

"SCHEDULED"

scheduleReason
string | null
required

Reason when scheduleStatus is not SCHEDULED.

settlesByAt
string<date-time> | null
required

POSTPONED only: if the event is not played by this time, positions settle at fair value.

volume24h
string
required

Matched notional across the event's markets over the last 24 h (USDC, decimal string).

Example:

"578.207202"

totalVolume
string
required

All-time matched notional across the event's markets (USDC, decimal string).

Example:

"1084.507287"

openMarketCount
integer
required

How many of the event's markets are on the open view (visible, launched PRE_MARKET / OPEN / PAUSED …). Not the tradeable count — a PAUSED market is counted and rejects orders. markets[] is view-filtered, so render counters from this field, never from markets.length.

Example:

2

totalMarketCount
integer
required

How many of the event's markets the public may know exist: visible, in an open-view or closed status, and past their launch time. openMarketCount <= totalMarketCount. On GET /api/events/{slug} it equals markets.length, except on short-crypto Up/Down events, whose settled windows are capped at 3 there.

Example:

5

createdAt
string<date-time>
required

Creation time.

updatedAt
string<date-time>
required

Last update time.

saved
boolean
required

True when the event is in the signed-in web-app user's saved list. Always false on anonymous and API-key requests. Always present.

live
object | null
required

Live clock + score, rolled up from the markets while the fixture is in play. After the game a finished event can keep its final-score frame (provider: "final", inPlay: false). Null when there is no frame (pre-match, no live feed) and always null for POSTPONED and CANCELLED events.

inPlay
boolean
required

True while the event is in play: kickoff passed, not ended, within a 4-hour window (a live frame's inPlay overrides this when one exists). Always false for abstract events such as "World Cup Winner". Use it instead of recomputing from market status or kickoff.

cryptoSeries
object | null
required

Short-crypto Up/Down series this event's windows belong to; null on every other event. One event holds one UTC day of windows (~96 at a 15-minute cadence) — navigate them with GET /api/crypto-series/{id}/windows rather than markets[].

cryptoLongSeries
object | null
required

Long-dated crypto series this event is one period of; null on every other event. periods lists sibling periods for period tabs (at most 24); GET /api/crypto-long-series/{id}/periods returns them all.

markets
object[]
required

The event's markets in the full MarketSummaryDto shape. GET /api/events/{slug}: every visible market in any public status, closed and settled ones included (RESOLVED / VOIDED short-crypto Up/Down windows are capped at 3 per event). GET /api/events/featured: filtered like the list's open view (closed view for the finished-event fallback with team).