V1 / Entity model

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

SPORTLEAGUEEVENTMARKETOUTCOMEQUOTE

Participants attach to events and outcomes. Books own quotes; they do not own the canonical market definition.

OBJECT / PARTICIPANT / V1 EXAMPLE

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.
OBJECT / EVENT / V1 EXAMPLE

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.
OBJECT / MARKET / V1 EXAMPLE

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.
OBJECT / QUOTE / V1 EXAMPLE

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.

CONTINUEReview every payload