Stable objects beneath moving prices.
Provider records are normalized into canonical OddsLoom entities. High-frequency quotes reference these objects by ID instead of repeating descriptive data on every update.
Relationship map
Participants attach to events and outcomes. Books own quotes; they do not own the canonical market definition.
Participant
A participant can represent a team, player, pairing, or field entry. This keeps team sports ergonomic without forcing every sport into a home-versus-away model.
{
"id": "participant_nba_min",
"type": "team",
"name": "Minnesota Timberwolves",
"sportId": "sport_basketball",
"leagueId": "league_nba"
}idstringStable OddsLoom participant ID.typeenumteam, player, pairing, field, or unknown.namestringCanonical display name.sportIdstringParent sport reference.leagueIdstring?Primary league reference when applicable.Event
The scheduled or active contest. Roles belong to the event relationship, not the participant, because the same team can be home in one event and away in another.
{
"id": "event_nba_20260808_min_den",
"sportId": "sport_basketball",
"leagueId": "league_nba",
"name": "Minnesota Timberwolves at Denver Nuggets",
"startsAt": "2026-08-08T00:10:00Z",
"phase": "pregame",
"status": "scheduled",
"participants": [
{ "participantId": "participant_nba_min", "role": "away" },
{ "participantId": "participant_nba_den", "role": "home" }
]
}idstringStable OddsLoom event ID.sportIdstringCanonical sport reference.leagueIdstringCanonical league reference.startsAtRFC 3339?Current scheduled start when known.phaseenumpregame, live, or complete.statusenumscheduled, active, suspended, final, or unknown.participantsarrayParticipant IDs and event-specific roles.Market and outcome
A market defines the proposition being priced. Outcomes are separate canonical objects referencing the market. A sportsbook changing price or line does not create a new event object.
{
"id": "market_evt_min_den_full_game_spread",
"eventId": "event_nba_20260808_min_den",
"type": "spread",
"period": "full_game",
"variant": "standard",
"status": "open",
"normalization": "canonical"
}idstringCanonical market ID.eventIdstringEvent being priced.typestringCanonical market family; every classified family in released scope is eligible.periodstringCanonical contest segment.variantstringCanonical market variant.statusenumopen, suspended, or closed.normalizationenumCustomer output is always canonical.Quote
The quote is the mutable edge: one book’s current offer for one outcome in one jurisdiction. Each upsert carries the full replacement state; the containing envelope’s emitted_at is its OddsLoom publication time.
{
"id": "quote_book_a_market_123_outcome_min",
"eventId": "event_nba_20260808_min_den",
"marketId": "market_evt_min_den_full_game_spread",
"outcomeId": "outcome_min",
"bookId": "draftkings",
"jurisdiction": "US-IL",
"availability": "open",
"line": 5.5,
"price": { "american": -105, "decimal": 1.9524 },
"source": { "eventId": "src_evt_123", "marketId": "src_mkt_123", "selectionId": "src_sel_123" },
"observedAt": "2026-08-07T05:20:00.432Z"
}idstringIdentity for the book/market/outcome offer.marketIdstringCanonical market reference.outcomeIdstringCanonical outcome reference.bookIdstringBook offering the price.jurisdictionstringRegion from which the offer was observed.availabilityenumopen, suspended, or closed.linenumber?Handicap or total where applicable.priceobjectAmerican and/or decimal forms supplied by normalization.observedAtRFC 3339Time OddsLoom observed the source state.Canonicalization boundary
Every canonical market observed within the released live manifest can enter the customer product. provider_specific and unresolved offers remain internal: OddsLoom does not present them as comparable canonical markets.