Hierarchy Overview
Event Object
Each event represents a single game or match. Events are the top-level objects returned by/api/v2/sports/{sportID}/events/{date}.
For V2 REST endpoints and WebSocket filters, pass the
event_id value returned in event payloads. Do not substitute event_uuid.Score Object
Score metadata can be incomplete. Text fields such as
venue_name, venue_location, broadcast, and display_clock may be empty when unavailable. Period arrays can also be empty. Use score.updated_at to judge freshness.game_period of 4. Each overtime adds another entry and advances game_period: one overtime gives five entries and Final/OT; two give six entries and Final/2OT. Regulation finals use event_status_detail of Final. Exhibition exceptions are described below.
Read each side by its own array length. In baseball, the home array is one entry shorter when the home team does not bat in the bottom of the ninth or the last extra inning. Do not pad a missing entry with zero or assume both arrays have the same length.
The final scores (
score_home and score_away) and period arrays are independent fields. In the twelve months reviewed on September 8, 2026, every NFL and NBA event that reached a final state had period sums matching its final scores. game_period matched the array lengths in all but one exhibition game. These are observations, not enforced guarantees: verify completeness, each side’s sum, and the period count before deriving a result, and handle mismatches without guessing.All-Star and preseason games can be final with an empty period array or game_period of 0 or 1. Regular-season and playoff games were consistent in that review, but still need validation. Exclude preseason using the season-specific sport IDs, including NBA Preseason (23) and NFL Preseason (25).Team Object
Market Object
Each market represents a type of bet (moneyline, spread, total, player prop, etc.). Markets are nested inside events.Participant Object
Participants are the entities you can bet on within a market — teams, players, or result types (Over/Under).id is the stable, joinable identifier — join on id, not name. What id points to depends on type:TYPE_TEAM—idis the normalized team ID. It is stable across seasons and endpoints, and matchesevent.teams[].team_id. Fetch the full team atGET /api/v2/teams/{team_id}.TYPE_PLAYER—idis the player ID. Fetch the full player (team, names, position) atGET /api/v2/players/{player_id}.TYPE_RESULT—idis a small outcome index (e.g.0/1for Over/Under) and is not a team or player resource key.
id, joining on id resolves shared-name collisions that joining on name cannot. To look up an id from a name once, use the roster at GET /api/v2/teams/{team_id}/players or the team list at GET /api/v2/sports/{sportID}/teams.Line Object
A line represents a specific betting line for a participant. For spreads and totals, thevalue contains the line number. For moneylines, value is an empty string.
line_value_is_participant tells you where the meaningful selection detail lives. When it is true, the participant carries the selection and the line value may be a placeholder or label. When it is false, display the line value when present; it may be a number, threshold, method, round, or other outcome qualifier.Price Object
A price is the odds offered by a single sportsbook for a specific line.
Fields that appear in delta/history responses:
Chart responses use the optional
c field for the same closing-time semantics. A missing closing timestamp does not by itself show that a line is currently open.
Fields present on selected affiliates:
liquidity_usd is omitted entirely, never null and never a fabricated 0, when a current reading is not available. Treat a missing field as “unknown,” not as zero. See What is liquidity_usd on a price object? in the FAQ for what the number means on each affiliate and why it is not on every price.Traversing the Data
Reading a moneyline price
Reading a spread value and price
Iterating all prices for an event
Delta Responses
Delta endpoints return a different shape. Instead of the nested event → market → participant → line → price hierarchy, they return flat change records:
Use the
event_id, market_id, participant_id, and affiliate_id to locate the correct entry in your local cache and replace the price. See the Efficient Polling guide for the full update pattern.