# Data Explorer - Browse API Data Schema
URL: https://sockodds.com/docs/explorer/

# Data Explorer - Browse API Data Schema [#data-explorer---browse-api-data-schema]

Browse the objects the API returns and their fields, then run a real request against the live feed with your key. Nothing is stored.

## OddsHistoryTick [#oddshistorytick]

One recorded change to one bookmaker's price on one market (SockOdds extension). Odds are given as American strings (bookOdds) and decimals.

| Field | Type | Description |
| --- | --- | --- |
| `eventID` | `string` | The event |
| `oddID` | `string` | The market side, in the oddID format (statID-statEntityID-periodID-betTypeID-sideID) |
| `bookmakerID` | `string` | The bookmaker |
| `changedAt` | `string (date-time)` | When the bookmaker's quote changed |
| `kind` | `string` | open = first quote seen · move = price, line or main-line status changed · limit = only the bet limit changed (Pinnacle) · close = the quote was withdrawn |
| `bookOdds` | `string \| null` | The new price as American odds; null on a close |
| `decimalOdds` | `number \| null` | The new price as decimal odds |
| `previousBookOdds` | `string \| null` | The price this change replaced (American); null on an open |
| `previousDecimalOdds` | `number \| null` | The price this change replaced (decimal) |
| `line` | `number \| null` | The spread or total the price applies to; null for moneylines and yes/no markets |
| `isMainLine` | `boolean \| null` | Whether this line was the bookmaker's headline line at the time |
| `layOdds` | `number \| null` | Exchange lay price, where the bookmaker is an exchange |
| `maxStake` | `number \| null` | The bet limit after the change, where the bookmaker publishes one |
| `previousMaxStake` | `number \| null` | The bet limit before the change |

## Event [#event]

Contains basic information, consensus odds, results (stats & scores), team info, lineups and bookmaker links for a given event/game

| Field | Type | Description |
| --- | --- | --- |
| `eventID` | `string` | Unique identifier for the event (e.g. afl_2026-09-12_brisbane_lions_vs_adelaide_crows) |
| `sportID` | `string` | The sport (AUSSIE_RULES, RUGBY_LEAGUE, SOCCER, …) |
| `leagueID` | `string` | The league (AFL, NRL, RUGBYLEAGUE_NRLW, EPL, …) — always the feed's own key, never constructed |
| `type` | `string` | match, tournament or prop |
| `status` | `object` | started, ended, live, cancelled, delayed, finalized, completed, startsAt, oddsPresent, oddsAvailable, currentPeriodID, periods{started,ended}, displayShort/displayLong |
| `info` | `object` | displayName, commenceTime, lastUpdatedAt, stale (no source write for 45 min), bookmakersPresent, sourceBookmakerCount |
| `teams` | `object` | home/away → { teamID, names{long,medium,short}, colors, statEntityID, score } |
| `players` | `object` | playerID → { playerID, teamID, name, firstName, lastName } — the production SGO player ids |
| `results` | `object` | Nested results in the format {periodID}.{statEntityID}.{statID} → number, where the source carries them |
| `odds` | `object` | oddID → Odds object. Every market the event is priced on, all bookmakers nested under byBookmaker |
| `links` | `object` | bookmakers{bookmakerID → event URL} and betslip{bookmakerID → bet-slip strategy} deeplinks, straight from each book's own event ids |

## Odds [#odds]

One side of one market on one event, with every bookmaker's price nested inside

| Field | Type | Description |
| --- | --- | --- |
| `oddID` | `string` | {statID}-{statEntityID}-{periodID}-{betTypeID}-{sideID} |
| `opposingOddID` | `string \| null` | The oddID of the other side (over ↔ under, home ↔ away); null for pick-N markets |
| `marketName` | `string` | Human-readable market name, e.g. "Head to Head — Brisbane Lions" |
| `statID` | `string` | The statistic being wagered on |
| `statEntityID` | `string` | home, away, all, a playerID or a teamID |
| `periodID` | `string` | game, 1h, 1q, 1i, 1ix5, 1s, … |
| `betTypeID` | `string` | ml, sp, ou, ml3way, yn, eo, pick, … |
| `sideID` | `string` | home, away, over, under, yes, no, draw, … |
| `playerID` | `string` | Set when the market is a player prop |
| `bookOdds` | `string` | Consensus American price across the books pricing this side, e.g. "-108" (the vig left in) |
| `bookOddsAvailable` | `boolean` | Whether at least one bookmaker has this side open for wagering |
| `bookSpread / bookOverUnder` | `string \| null` | Consensus line for spread and total markets |
| `fairOdds` | `string \| null` | The de-vigged fair price derived from exchange and sharp-book consensus; null on plans without fair odds |
| `fairOddsAvailable` | `boolean` | Whether enough exchange/sharp data existed to compute fairOdds |
| `fairSpread / fairOverUnder` | `string \| null` | The fair line for spread and total markets |
| `started / ended / cancelled` | `boolean` | Whether the period this market settles on has started, ended or been cancelled |
| `scoringSupported` | `boolean` | Whether the source can grade this market from results |
| `byBookmaker` | `object` | bookmakerID → ByBookmakerOdds |
| `altLines` | `object` | Alternate lines keyed by line, each with its own byBookmaker (only with includeAltLines=true) |

## ByBookmakerOdds [#bybookmakerodds]

One bookmaker's price for one side of one market

| Field | Type | Description |
| --- | --- | --- |
| `bookmakerID` | `string` | The bookmaker (sportsbet, tab, pinnacle, betfairexchange, …) |
| `odds` | `string` | American price, e.g. "-108" or "+240" |
| `decimal` | `number` | The same price as decimal odds, e.g. 1.93 — Australian books quote decimal |
| `overUnder / spread` | `string` | This book's line where the market has one |
| `available` | `boolean` | Whether the book has the side open right now (a suspended market is listed with available: false) |
| `lastUpdatedAt` | `date-time` | When this book's price was last observed |
| `eventName` | `string` | The book's own name for the event |
| `deeplink` | `string` | Direct URL to the market on the book where one is known (also see Event.links) |

## Team [#team]

Contains information on a team

| Field | Type | Description |
| --- | --- | --- |
| `teamID` | `string` | e.g. BRISBANE_LIONS_AFL — defined per league |
| `sportID` | `string` |  |
| `leagueID` | `string` |  |
| `names` | `object` | { long, medium, short } |
| `colors` | `object` | { primary, secondary, primaryContrast, secondaryContrast } where known |
| `statEntityID` | `string` | home or away on the event the team was read from |

## Player [#player]

Contains information on a player

| Field | Type | Description |
| --- | --- | --- |
| `playerID` | `string` | e.g. SONNY_GRAY_1_MLB — the production SportsGameOdds id format, unique across teams in a league |
| `teamID` | `string` |  |
| `sportID` | `string` |  |
| `leagueID` | `string` |  |
| `name / firstName / lastName` | `string` |  |
| `position / jerseyNumber` | `string \| number` | Where the source carries them |

## Sport [#sport]

Contains information on a sport

| Field | Type | Description |
| --- | --- | --- |
| `sportID` | `string` |  |
| `name / shortName` | `string` |  |
| `enabled` | `boolean` | Whether your plan can read this sport |
| `activeEvents` | `number` | Events currently carried |

## League [#league]

Contains information on a specific league

| Field | Type | Description |
| --- | --- | --- |
| `leagueID` | `string` |  |
| `sportID` | `string` |  |
| `name / shortName` | `string` |  |
| `enabled` | `boolean` | Whether your plan can read this league |
| `activeEvents` | `number` | Events currently carried |

## Stat [#stat]

Contains information on a statistic (statID)

| Field | Type | Description |
| --- | --- | --- |
| `statID` | `string` |  |
| `supportedLevels` | `object` | { all, team, player } — which statEntityID classes it is priced at |
| `displays` | `object` | { short, long } |
| `isScoreStat` | `boolean` | True for `points`, the stat that decides the event |
| `supportedSports` | `object` | sportID → true |

## Market [#market]

Contains information about a betting market, including its classification and support data across leagues and bookmakers

| Field | Type | Description |
| --- | --- | --- |
| `oddID` | `string` | The unique identifier for this market |
| `statID / statEntityID / periodID / betTypeID / sideID` | `string` | The decomposed grammar |
| `playerID / teamID` | `string` | Set for player props and tournament team markets |
| `marketGroupID / marketGroupName` | `string` | The group (all sides of the market) this market belongs to, and its display name |
| `isMainMarket` | `boolean` | True for the full-game moneyline, spread and total |
| `isMainDerivative` | `boolean` | True for a sub-period of a main market |
| `isSubPeriod` | `boolean` | True when the market tracks a non-main period |
| `isProp` | `boolean` | True if this is a prop bet |
| `propType` | `string` | game_prop, team_prop, player_prop or other_prop |
| `isSupported` | `boolean` | True if at least one bookmaker prices it in at least one league |
| `activeEvents` | `number` | Unique events with this market priced right now |
| `support` | `object` | leagueID → { bookmakerID → true } |
| `bookmakers` | `string[]` | SockOdds extension: the flat list of bookmakers pricing it |

## AccountUsage [#accountusage]

Your API key's tier, rate limits and current usage

| Field | Type | Description |
| --- | --- | --- |
| `keyID` | `string` | The hashed identifier for the API key (the first 16 hex of sha256) |
| `customerID` | `string \| null` | Billing customer id where one exists |
| `email` | `string \| null` |  |
| `isActive` | `boolean` |  |
| `tier` | `string` | lite, base or internal |
| `rateLimits` | `object` | per-second / per-minute / per-hour / per-day / per-month → RateLimitInterval |

## RateLimitInterval [#ratelimitinterval]

One rate-limit window

| Field | Type | Description |
| --- | --- | --- |
| `max-requests` | `integer \| null` | Maximum allowed requests in the interval (null = unlimited) |
| `current-requests` | `integer` | Requests made so far in the interval |
| `max-entities` | `integer \| null` | Maximum objects in the interval (null = unlimited) |
| `current-entities` | `integer \| null` | Objects served so far in the interval |

## Run a live query [#run-a-live-query]

> Need help?[FAQ](https://sockodds.com/docs/faq/) · [Email](mailto:api@sockodds.com) · [Contact](https://sockodds.com/contact-us/)
