Odds API

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.

Note:

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.

EndpointWhat it returns
GET /odds/event/:eventIdLatest odds for an event
GET /odds/event/:eventId/market/:marketKeyCompare one market across bookmakers
GET /odds/event/:eventId/movementLine movement
GET /odds/event/:eventId/best/:marketKeyBest line per outcome
GET /odds/events/latestLatest odds for a slate
GET /odds/event/:eventId/propsPlayer props

Latest odds for an event

GEThttps://api.parlayledger.com/odds/event/:eventId

The newest snapshot for every bookmaker and market on an event.

  • Auth X-API-Key header
  • Quota 1 call per request

Path parameters

  • eventIdstring (UUID)required

    ParlayLedger event id. Must be a UUID, otherwise the request returns 400.

Query parameters

  • marketsstring (comma-separated)optional

    Only these markets, for example h2h,spreads,totals. Omit for all.

  • bookmakersstring (comma-separated)optional

    Only 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

200 OK
[
  {
    "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

GEThttps://api.parlayledger.com/odds/event/:eventId/market/:marketKey

The 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)required

    ParlayLedger event id. Must be a UUID, otherwise the request returns 400.

  • marketKeystringrequired

    h2h, 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

200 OK
[
  {
    "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

GEThttps://api.parlayledger.com/odds/event/:eventId/movement

Every 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)required

    ParlayLedger event id. Must be a UUID, otherwise the request returns 400.

Query parameters

  • bookmakerKeystringrequired

    Bookmaker, for example draftkings.

  • marketKeystringrequired

    h2h, spreads or totals.

  • fromstring (ISO 8601)optional

    Only snapshots captured at or after this time.

  • tostring (ISO 8601)optional

    Only snapshots captured at or before this time.

  • limitintegeroptional

    Accepted 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

200 OK
[
  {
    "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

GEThttps://api.parlayledger.com/odds/event/:eventId/best/:marketKey

For 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)required

    ParlayLedger event id. Must be a UUID, otherwise the request returns 400.

  • marketKeyh2h | spreads | totalsrequired

    The 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

200 OK
{
  "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

GEThttps://api.parlayledger.com/odds/events/latest

Latest 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)required

    The events to fetch. Every id must be a UUID.

  • marketsstring (comma-separated)optional

    Only these markets, for example h2h,totals. Omit for all.

  • bookmakersstring (comma-separated)optional

    Only 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

200 OK
{
  "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

GEThttps://api.parlayledger.com/odds/event/:eventId/props

Player 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
Note:

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)required

    ParlayLedger event id. Must be a UUID, otherwise the request returns 400.

Query parameters

  • marketstringoptional

    One prop market, for example player_points or player_rebounds.

  • bookmakersstring (comma-separated)optional

    Only these bookmakers, for example draftkings,fanduel. Omit for all.

  • playerstringoptional

    Accepted 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

200 OK
[
  {
    "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