API reference
Odds
Odds are stored as snapshots: one row per bookmaker and market, each time the prices change. Prices are American odds (for example -110 or +154). Spreads and totals carry the line in point.
Odds are refreshed for you
ParlayLedger pulls odds from its sources on a schedule. The sync endpoint that older docs listed is internal now, so there is nothing to trigger.
Every request needs your API key in the X-API-Key header and counts as one call against your monthly quota. See Authentication and Quotas and limits.
| Endpoint | What it returns |
|---|---|
| GET /odds/event/:eventId | Latest odds for an event |
| GET /odds/event/:eventId/market/:marketKey | Compare one market across bookmakers |
| GET /odds/event/:eventId/movement | Line movement |
| GET /odds/event/:eventId/best/:marketKey | Best line per outcome |
| GET /odds/events/latest | Latest odds for a slate |
| GET /odds/event/:eventId/props | Player props |
Latest odds for an event
https://api.parlayledger.com/odds/event/:eventIdThe newest snapshot for every bookmaker and market on an event.
- Auth X-API-Key header
- Quota 1 call per request
Path parameters
eventIdstring (UUID)requiredParlayLedger event id. Must be a UUID, otherwise the request returns 400.
Query parameters
marketsstring (comma-separated)optionalOnly these markets, for example h2h,spreads,totals. Omit for all.
bookmakersstring (comma-separated)optionalOnly these bookmakers, for example draftkings,fanduel. Omit for all.
Request
curl "https://api.parlayledger.com/odds/event/3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10?markets=h2h,spreads&bookmakers=draftkings" \
-H "X-API-Key: $PARLAYLEDGER_API_KEY"Response 200 application/json
[
{
"id": "b71e0d4c-5a2f-4c8e-a3d9-6e0f1b2c3d4e",
"eventId": "3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10",
"provider": "odds_api_io",
"bookmakerKey": "draftkings",
"marketKey": "h2h",
"capturedAt": "2026-10-21T18:00:04.512Z",
"sourceUpdatedAt": "2026-10-21T17:58:40.000Z",
"dedupeHash": "5d41c0b9e2f7a8634b1e9d0c7a2f5e8b3c6d9a0f1e4b7c2d5a8f3e6b9c0d1a2f",
"payload": {
"sport_key": "basketball",
"league_key": "NBA",
"commence_time": "2026-10-21T23:30:00.000Z",
"home_team": "Boston Celtics",
"away_team": "New York Knicks",
"bookmaker": {
"key": "draftkings",
"title": "DraftKings"
},
"market": {
"key": "h2h",
"last_update": "2026-10-21T17:58:40.000Z"
},
"outcomes": [
{
"name": "Boston Celtics",
"price": -185
},
{
"name": "New York Knicks",
"price": 154
}
]
}
},
{
"id": "4a8f2c6e-1b9d-4e73-a05c-8d3f6b1e9a27",
"eventId": "3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10",
"provider": "odds_api_io",
"bookmakerKey": "draftkings",
"marketKey": "spreads",
"capturedAt": "2026-10-21T18:00:04.512Z",
"sourceUpdatedAt": "2026-10-21T17:58:40.000Z",
"dedupeHash": "5d41c0b9e2f7a8634b1e9d0c7a2f5e8b3c6d9a0f1e4b7c2d5a8f3e6b9c0d1a2f",
"payload": {
"sport_key": "basketball",
"league_key": "NBA",
"commence_time": "2026-10-21T23:30:00.000Z",
"home_team": "Boston Celtics",
"away_team": "New York Knicks",
"bookmaker": {
"key": "draftkings",
"title": "DraftKings"
},
"market": {
"key": "spreads",
"last_update": "2026-10-21T17:58:40.000Z"
},
"outcomes": [
{
"name": "Boston Celtics",
"price": -110,
"point": -4.5
},
{
"name": "New York Knicks",
"price": -110,
"point": 4.5
}
]
}
}
]Errors
- 400Validation failed (uuid is expected)
- 404Event not found: <eventId>
- 401Valid X-API-Key required
- 429Monthly API quota exceeded
Compare one market across bookmakers
https://api.parlayledger.com/odds/event/:eventId/market/:marketKeyThe newest snapshot of one market from every bookmaker that prices it, for side-by-side comparison.
- Auth X-API-Key header
- Quota 1 call per request
Path parameters
eventIdstring (UUID)requiredParlayLedger event id. Must be a UUID, otherwise the request returns 400.
marketKeystringrequiredh2h, spreads, totals, or a player prop market such as player_points.
Request
curl "https://api.parlayledger.com/odds/event/3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10/market/h2h" \
-H "X-API-Key: $PARLAYLEDGER_API_KEY"Response 200 application/json
[
{
"id": "b71e0d4c-5a2f-4c8e-a3d9-6e0f1b2c3d4e",
"eventId": "3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10",
"provider": "odds_api_io",
"bookmakerKey": "draftkings",
"marketKey": "h2h",
"capturedAt": "2026-10-21T18:00:04.512Z",
"sourceUpdatedAt": "2026-10-21T17:58:40.000Z",
"dedupeHash": "5d41c0b9e2f7a8634b1e9d0c7a2f5e8b3c6d9a0f1e4b7c2d5a8f3e6b9c0d1a2f",
"payload": {
"sport_key": "basketball",
"league_key": "NBA",
"commence_time": "2026-10-21T23:30:00.000Z",
"home_team": "Boston Celtics",
"away_team": "New York Knicks",
"bookmaker": {
"key": "draftkings",
"title": "DraftKings"
},
"market": {
"key": "h2h",
"last_update": "2026-10-21T17:58:40.000Z"
},
"outcomes": [
{
"name": "Boston Celtics",
"price": -185
},
{
"name": "New York Knicks",
"price": 154
}
]
}
},
{
"id": "e2c47a91-3d6b-4f08-9b5e-1a7c3e9d2f60",
"eventId": "3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10",
"provider": "odds_api_io",
"bookmakerKey": "fanduel",
"marketKey": "h2h",
"capturedAt": "2026-10-21T18:00:04.512Z",
"sourceUpdatedAt": "2026-10-21T17:58:40.000Z",
"dedupeHash": "5d41c0b9e2f7a8634b1e9d0c7a2f5e8b3c6d9a0f1e4b7c2d5a8f3e6b9c0d1a2f",
"payload": {
"sport_key": "basketball",
"league_key": "NBA",
"commence_time": "2026-10-21T23:30:00.000Z",
"home_team": "Boston Celtics",
"away_team": "New York Knicks",
"bookmaker": {
"key": "fanduel",
"title": "FanDuel"
},
"market": {
"key": "h2h",
"last_update": "2026-10-21T17:58:40.000Z"
},
"outcomes": [
{
"name": "Boston Celtics",
"price": -178
},
{
"name": "New York Knicks",
"price": 150
}
]
}
}
]Errors
- 400Validation failed (uuid is expected)
- 404Event not found: <eventId>
- 401Valid X-API-Key required
- 429Monthly API quota exceeded
Line movement
https://api.parlayledger.com/odds/event/:eventId/movementEvery stored snapshot for one bookmaker and market, oldest first. A new snapshot is stored only when the prices change.
- Auth X-API-Key header
- Quota 1 call per request
Path parameters
eventIdstring (UUID)requiredParlayLedger event id. Must be a UUID, otherwise the request returns 400.
Query parameters
bookmakerKeystringrequiredBookmaker, for example draftkings.
marketKeystringrequiredh2h, spreads or totals.
fromstring (ISO 8601)optionalOnly snapshots captured at or after this time.
tostring (ISO 8601)optionalOnly snapshots captured at or before this time.
limitintegeroptionalAccepted and validated as an integer, but not applied yet. Use from and to to narrow the range.
Request
curl "https://api.parlayledger.com/odds/event/3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10/movement?bookmakerKey=draftkings&marketKey=h2h&from=2026-10-20T00:00:00Z" \
-H "X-API-Key: $PARLAYLEDGER_API_KEY"Response 200 application/json
[
{
"id": "1c7e4a9d-6b2f-4e80-93a5-0d8f2b6c4e17",
"eventId": "3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10",
"provider": "odds_api_io",
"bookmakerKey": "draftkings",
"marketKey": "h2h",
"capturedAt": "2026-10-20T12:00:03.207Z",
"sourceUpdatedAt": "2026-10-21T17:58:40.000Z",
"dedupeHash": "5d41c0b9e2f7a8634b1e9d0c7a2f5e8b3c6d9a0f1e4b7c2d5a8f3e6b9c0d1a2f",
"payload": {
"sport_key": "basketball",
"league_key": "NBA",
"commence_time": "2026-10-21T23:30:00.000Z",
"home_team": "Boston Celtics",
"away_team": "New York Knicks",
"bookmaker": {
"key": "draftkings",
"title": "DraftKings"
},
"market": {
"key": "h2h",
"last_update": "2026-10-21T17:58:40.000Z"
},
"outcomes": [
{
"name": "Boston Celtics",
"price": -175
},
{
"name": "New York Knicks",
"price": 146
}
]
}
},
{
"id": "b71e0d4c-5a2f-4c8e-a3d9-6e0f1b2c3d4e",
"eventId": "3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10",
"provider": "odds_api_io",
"bookmakerKey": "draftkings",
"marketKey": "h2h",
"capturedAt": "2026-10-21T18:00:04.512Z",
"sourceUpdatedAt": "2026-10-21T17:58:40.000Z",
"dedupeHash": "5d41c0b9e2f7a8634b1e9d0c7a2f5e8b3c6d9a0f1e4b7c2d5a8f3e6b9c0d1a2f",
"payload": {
"sport_key": "basketball",
"league_key": "NBA",
"commence_time": "2026-10-21T23:30:00.000Z",
"home_team": "Boston Celtics",
"away_team": "New York Knicks",
"bookmaker": {
"key": "draftkings",
"title": "DraftKings"
},
"market": {
"key": "h2h",
"last_update": "2026-10-21T17:58:40.000Z"
},
"outcomes": [
{
"name": "Boston Celtics",
"price": -185
},
{
"name": "New York Knicks",
"price": 154
}
]
}
}
]Errors
- 400bookmakerKey is required
- 400marketKey is required
- 400Invalid date: <value>
- 400Invalid integer: <value>
- 400Validation failed (uuid is expected)
- 404Event not found: <eventId>
- 401Valid X-API-Key required
- 429Monthly API quota exceeded
Best line per outcome
https://api.parlayledger.com/odds/event/:eventId/best/:marketKeyFor each outcome, the bookmaker snapshot with the highest price. h2h fills home and away, spreads fills homeSpread and awaySpread, totals fills over and under. An outcome no bookmaker prices is left out.
- Auth X-API-Key header
- Quota 1 call per request
Path parameters
eventIdstring (UUID)requiredParlayLedger event id. Must be a UUID, otherwise the request returns 400.
marketKeyh2h | spreads | totalsrequiredThe market to compare.
Request
curl "https://api.parlayledger.com/odds/event/3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10/best/h2h" \
-H "X-API-Key: $PARLAYLEDGER_API_KEY"Response 200 application/json
{
"marketKey": "h2h",
"best": {
"home": {
"id": "e2c47a91-3d6b-4f08-9b5e-1a7c3e9d2f60",
"eventId": "3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10",
"provider": "odds_api_io",
"bookmakerKey": "fanduel",
"marketKey": "h2h",
"capturedAt": "2026-10-21T18:00:04.512Z",
"sourceUpdatedAt": "2026-10-21T17:58:40.000Z",
"dedupeHash": "5d41c0b9e2f7a8634b1e9d0c7a2f5e8b3c6d9a0f1e4b7c2d5a8f3e6b9c0d1a2f",
"payload": {
"sport_key": "basketball",
"league_key": "NBA",
"commence_time": "2026-10-21T23:30:00.000Z",
"home_team": "Boston Celtics",
"away_team": "New York Knicks",
"bookmaker": {
"key": "fanduel",
"title": "FanDuel"
},
"market": {
"key": "h2h",
"last_update": "2026-10-21T17:58:40.000Z"
},
"outcomes": [
{
"name": "Boston Celtics",
"price": -178
},
{
"name": "New York Knicks",
"price": 150
}
]
}
},
"away": {
"id": "b71e0d4c-5a2f-4c8e-a3d9-6e0f1b2c3d4e",
"eventId": "3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10",
"provider": "odds_api_io",
"bookmakerKey": "draftkings",
"marketKey": "h2h",
"capturedAt": "2026-10-21T18:00:04.512Z",
"sourceUpdatedAt": "2026-10-21T17:58:40.000Z",
"dedupeHash": "5d41c0b9e2f7a8634b1e9d0c7a2f5e8b3c6d9a0f1e4b7c2d5a8f3e6b9c0d1a2f",
"payload": {
"sport_key": "basketball",
"league_key": "NBA",
"commence_time": "2026-10-21T23:30:00.000Z",
"home_team": "Boston Celtics",
"away_team": "New York Knicks",
"bookmaker": {
"key": "draftkings",
"title": "DraftKings"
},
"market": {
"key": "h2h",
"last_update": "2026-10-21T17:58:40.000Z"
},
"outcomes": [
{
"name": "Boston Celtics",
"price": -185
},
{
"name": "New York Knicks",
"price": 154
}
]
}
}
}
}Errors
- 400marketKey must be one of: h2h, spreads, totals
- 400Validation failed (uuid is expected)
- 404Event not found: <eventId>
- 401Valid X-API-Key required
- 429Monthly API quota exceeded
Latest odds for a slate
https://api.parlayledger.com/odds/events/latestLatest odds for many events in one call, keyed by eventId. Use it for list pages instead of one request per event. Events with no odds are not in the response.
- Auth X-API-Key header
- Quota 1 call per request
Query parameters
eventIdsstring (comma-separated UUIDs)requiredThe events to fetch. Every id must be a UUID.
marketsstring (comma-separated)optionalOnly these markets, for example h2h,totals. Omit for all.
bookmakersstring (comma-separated)optionalOnly these bookmakers, for example draftkings,fanduel. Omit for all.
Request
curl "https://api.parlayledger.com/odds/events/latest?eventIds=3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10,7a2d9e41-0c6b-4f3a-8e17-5d9b2c4a6f03&markets=totals&bookmakers=draftkings" \
-H "X-API-Key: $PARLAYLEDGER_API_KEY"Response 200 application/json
{
"3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10": [
{
"id": "0d6b3e9a-7c2f-4a15-8e4b-9f1a5c7d3e82",
"eventId": "3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10",
"provider": "odds_api_io",
"bookmakerKey": "draftkings",
"marketKey": "totals",
"capturedAt": "2026-10-21T18:00:04.512Z",
"sourceUpdatedAt": "2026-10-21T17:58:40.000Z",
"dedupeHash": "5d41c0b9e2f7a8634b1e9d0c7a2f5e8b3c6d9a0f1e4b7c2d5a8f3e6b9c0d1a2f",
"payload": {
"sport_key": "basketball",
"league_key": "NBA",
"commence_time": "2026-10-21T23:30:00.000Z",
"home_team": "Boston Celtics",
"away_team": "New York Knicks",
"bookmaker": {
"key": "draftkings",
"title": "DraftKings"
},
"market": {
"key": "totals",
"last_update": "2026-10-21T17:58:40.000Z"
},
"outcomes": [
{
"name": "Over",
"price": -112,
"point": 221.5
},
{
"name": "Under",
"price": -108,
"point": 221.5
}
]
}
}
],
"7a2d9e41-0c6b-4f3a-8e17-5d9b2c4a6f03": [
{
"id": "8b3f6d1e-4a9c-4e25-b7d0-6c2e8a4f1b93",
"eventId": "7a2d9e41-0c6b-4f3a-8e17-5d9b2c4a6f03",
"provider": "odds_api_io",
"bookmakerKey": "draftkings",
"marketKey": "totals",
"capturedAt": "2026-10-21T18:00:04.512Z",
"sourceUpdatedAt": "2026-10-21T17:58:40.000Z",
"dedupeHash": "5d41c0b9e2f7a8634b1e9d0c7a2f5e8b3c6d9a0f1e4b7c2d5a8f3e6b9c0d1a2f",
"payload": {
"sport_key": "basketball",
"league_key": "NBA",
"commence_time": "2026-10-22T02:00:00.000Z",
"home_team": "Los Angeles Lakers",
"away_team": "Golden State Warriors",
"bookmaker": {
"key": "draftkings",
"title": "DraftKings"
},
"market": {
"key": "totals",
"last_update": "2026-10-21T17:58:40.000Z"
},
"outcomes": [
{
"name": "Over",
"price": -110,
"point": 229.5
},
{
"name": "Under",
"price": -110,
"point": 229.5
}
]
}
}
]
}Errors
- 400eventIds is required (CSV UUIDs)
- 400Invalid UUID: <id>
- 401Valid X-API-Key required
- 429Monthly API quota exceeded
Player props
https://api.parlayledger.com/odds/event/:eventId/propsPlayer prop snapshots for an event (markets starting with player_). Each row is one player line at one bookmaker; the player is in payload.player_name.
- Auth X-API-Key header
- Quota 1 call per request
Rows are ordered by market, then bookmaker, newest first, and earlier snapshots of the same line can appear. For the current price keep the first row per market, bookmaker and player.
Path parameters
eventIdstring (UUID)requiredParlayLedger event id. Must be a UUID, otherwise the request returns 400.
Query parameters
marketstringoptionalOne prop market, for example player_points or player_rebounds.
bookmakersstring (comma-separated)optionalOnly these bookmakers, for example draftkings,fanduel. Omit for all.
playerstringoptionalAccepted but not applied yet. Filter on payload.player_name in your code.
Request
curl "https://api.parlayledger.com/odds/event/3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10/props?market=player_points&bookmakers=draftkings" \
-H "X-API-Key: $PARLAYLEDGER_API_KEY"Response 200 application/json
[
{
"id": "6f1d8b3a-2e9c-4d57-b8a0-3c5e7f9d1b46",
"eventId": "3f6c2a9e-8d1b-4e7a-9c55-1b2d4e6f8a10",
"provider": "odds_api_io",
"bookmakerKey": "draftkings",
"marketKey": "player_points",
"capturedAt": "2026-10-21T18:00:04.512Z",
"sourceUpdatedAt": "2026-10-21T17:58:40.000Z",
"dedupeHash": "5d41c0b9e2f7a8634b1e9d0c7a2f5e8b3c6d9a0f1e4b7c2d5a8f3e6b9c0d1a2f",
"payload": {
"sport_key": "basketball",
"league_key": "NBA",
"commence_time": "2026-10-21T23:30:00.000Z",
"home_team": "Boston Celtics",
"away_team": "New York Knicks",
"bookmaker": {
"key": "draftkings",
"title": "DraftKings"
},
"market": {
"key": "player_points",
"last_update": "2026-10-21T17:58:40.000Z"
},
"player_name": "Jayson Tatum",
"outcomes": [
{
"name": "Over",
"price": -115,
"point": 26.5
},
{
"name": "Under",
"price": -105,
"point": 26.5
}
]
}
}
]Errors
- 400Validation failed (uuid is expected)
- 404Event not found: <eventId>
- 401Valid X-API-Key required
- 429Monthly API quota exceeded