ParlayLedger API Documentation

Access real-time sports betting odds, historical data, live results, and player statistics from bookmakers worldwide.

Get started in 3 steps
  1. Get an API key via email
    Subscribe to receive your API key.
    See plans →
  2. Get a list of in-season sports
    Use the sports endpoint to discover available sports.
  3. Fetch odds or results
    Use your sport key to query odds and scores.

Authentication

All API requests require authentication using your API key. Include it as a query parameter:

Request
GET https://api.parlayledger.com/v4/sports?apiKey=YOUR_API_KEY
!
Keep your API key secure
Never expose your API key in client-side code or public repositories.

Quick Start Example

A complete example fetching NFL odds:

CURL
curl -X GET "https://api.parlayledger.com/v4/sports/americanfootball_nfl/odds?apiKey=YOUR_API_KEY&regions=us&markets=h2h,spreads"

POST /odds/sync

Trigger odds sync for a given league + date.

POSThttps://api.parlayledger.com/odds/sync

Body

sportKeyrequired
string
leagueKeyrequired
string
seasonrequired
string
daterequired
Format (YYYY-MM-DD)

Example Response

Response
{
  gameOddsInserted: number,
  playerPropsInserted: number,
  eventsMatched: number,
  eventsMissed: number,
  missedGames: string[], 
}

GET odds/event/:eventId

Latest odds for an event (latest per bookmaker × market).

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

Parameters

eventIdrequired
string

Query

marketsoptional
string
bookmakersoptional
string

Example Response

Response
[
  {
    id: string,
    eventId: string,
    provider: string,
    bookmakerKey: string,
    marketKey: string,
    capturedAt: Date,
    sourceUpdatedAt: Date | null,
    dedupeHash: string,
    payload: any; 
  },
  {
    id: string,
    eventId: string,
    provider: string,
    bookmakerKey: string,
    marketKey: string,
    capturedAt: Date,
    sourceUpdatedAt: Date | null,
    dedupeHash: string,
    payload: any; 
  }
  ]

GET odds/event/:eventId/market/:marketKey

Latest odds for a single market across all bookmakers.

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

Parameters

eventIdrequired
string
marketKeyrequired
string

Example Response

Response
[
  {
    id: string,
    eventId: string,
    provider: string,
    bookmakerKey: string,
    marketKey: string,
    capturedAt: Date,
    sourceUpdatedAt: Date | null,
    dedupeHash: string,
    payload: any; 
  },
  {
    id: string,
    eventId: string,
    provider: string,
    bookmakerKey: string,
    marketKey: string,
    capturedAt: Date,
    sourceUpdatedAt: Date | null,
    dedupeHash: string,
    payload: any; 
  }
  ]

GET odds/event/:eventId/movement

Odds movement (time series) for one bookmaker × market.

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

Parameters

eventIdrequired
string

Query

bookmakerKeyrequired
string
marketKeyrequired
string
fromoptional
string
tooptional
string
limitoptional
string

Example Response

Response
[
  {
    id: string,
    eventId: string,
    provider: string,
    bookmakerKey: string,
    marketKey: string,
    capturedAt: Date,
    sourceUpdatedAt: Date | null,
    dedupeHash: string,
    payload: any; 
  },
  {
    id: string,
    eventId: string,
    provider: string,
    bookmakerKey: string,
    marketKey: string,
    capturedAt: Date,
    sourceUpdatedAt: Date | null,
    dedupeHash: string,
    payload: any; 
  }
  ]

GET odds/event/:eventId/best/:marketKey

Best line per outcome for a market across all bookmakers.

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

Parameters

eventIdrequired
string
marketKeyrequired
h2h | spreads | totals

Example Response

Response
{
  marketKey: string,
  best: {
    home?:      Odds,
    away?:      Odds,
    homeSpread?: Odds,
    awaySpread?: Odds,
    over?:      Odds,
    under?:     Odds,
  };
}

GET odds/events/latest

Batch latest odds for a slate of events — avoids N+1 on list pages.

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

Query

eventIdsrequired
(CSV UUIDs)
marketsoptional
string
bookmakersoptional
string

Example Response

Response
{
     "8c5a4e3b6d2c4b9e1a7f5d3e": {
      id: string,
      eventId: string,
      provider: string,
      bookmakerKey: string,
      marketKey: string,
      capturedAt: Date,
      sourceUpdatedAt: Date | null,
      dedupeHash: string,
      payload: any; 
    },
    
}

GET odds/event/:eventId/props

Latest player props for an event.

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

Parameters

eventIdrequired
string

Query

marketoptional
string
playeroptional
string
bookmakersoptional
string

Example Response

Response
[
  {
    id: string,
    eventId: string,
    provider: string,
    bookmakerKey: string,
    marketKey: string,
    capturedAt: Date,
    sourceUpdatedAt: Date | null,
    dedupeHash: string,
    payload: any; 
  },
  {
    id: string,
    eventId: string,
    provider: string,
    bookmakerKey: string,
    marketKey: string,
    capturedAt: Date,
    sourceUpdatedAt: Date | null,
    dedupeHash: string,
    payload: any; 
  }
  ]

GET stats/events

List canonical events for a league + date

GEThttps://api.parlayledger.com/stats/events

Query

leagueKeyrequired
string
daterequired
string (YYYY-MM-DD)

Example Response

Response

    {
      id: string,
      sportKey: string,  e.g. 'americanfootball', 'basketball'
      leagueKey: string, e.g. 'NFL', 'NBA' (or '1' for API-sports; pick one canonical)
      season: string, e.g '2025'
      startTime: Date, 
      status:  'scheduled'| 'live'| 'final' | 'cancelled' | 'postponed',
      homeTeamId: string | null,
      homeTeam?: TeamEntity,
      awayTeamId: string | null,
      awayTeam?: TeamEntity,
      homeTeamName: string,
      awayTeamName: string,
      displayName: string | null,
      stage: string | null,
      week: string | null,
      venueName: string | null,
      venueCity: string | null,
      meta: Record<string, any> | null,
      createdAt: Date,
      updatedAt: Date, 
    }

GET stats/events/:eventId

Get a single canonical event

GEThttps://api.parlayledger.com/stats/events/:eventId

Parameters

eventIdrequired
string

Example Response

Response

    {
      id: string,
      sportKey: string,  e.g. 'americanfootball', 'basketball'
      leagueKey: string, e.g. 'NFL', 'NBA' (or '1' for API-sports; pick one canonical)
      season: string, e.g '2025'
      startTime: Date, 
      status:  'scheduled'| 'live'| 'final' | 'cancelled' | 'postponed',
      homeTeamId: string | null,
      homeTeam?: TeamEntity,
      awayTeamId: string | null,
      awayTeam?: TeamEntity,
      homeTeamName: string,
      awayTeamName: string,
      displayName: string | null,
      stage: string | null,
      week: string | null,
      venueName: string | null,
      venueCity: string | null,
      meta: Record<string, any> | null,
      createdAt: Date,
      updatedAt: Date, 
    }

GET stats/events/resolve/by-ref

Resolve eventId from (provider, externalId) using EventProviderRefEntity

GEThttps://api.parlayledger.com/stats/events/resolve/by-ref

Query

providerrequired
string
externalIdrequired
string

Example Response

Response

    {
      eventId:  string | null;
      provider: string;
      externalId: string; 
    }

GET stats/events/:eventId/team

Team stats for a canonical event.

GEThttps://api.parlayledger.com/stats/events/:eventId/team

Parameters

eventIdrequired
string

Example Response

Response

    {
      id: string,
      eventId: string,
      event: EventEntity,
      teamId: string | null, 
      provider: string,
      externalTeamId: string,
      teamName: string,
      side: 'home' | 'away' | null,
      points: number | null,
      stats: any,
      createdAt: Date, 
    }

GET stats/events/:eventId/players

Player stats for a canonical event (optional filters).

GEThttps://api.parlayledger.com/stats/events/:eventId/players

Parameters

eventIdrequired
string

Query

teamExternalIdoptional
string
groupNameoptional
string

Example Response

Response

    {
      id: string,
      eventId: string,
      event: EventEntity, 
      provider: string,
      externalTeamId: string,
      teamName: string,
      externalPlayerId: string,
      playerName: string,
      playerImage: string | null,
      stats: any,
      createdAt: Date, 
    }

GET stats/events/:eventId/bundle

Full bundle for an event (team + player).

GEThttps://api.parlayledger.com/stats/events/:eventId/bundle

Parameters

eventIdrequired
string

Example Response

Response

    {
      eventId: string;
      teamStats: TeamStats[];
      playerStats: PlayerStats[];
    }

GET stats/events/:eventId/players/:externalPlayerId

Player stats for a single player in an event.

GEThttps://api.parlayledger.com/stats/events/:eventId/players/:externalPlayerId

Parameters

eventIdrequired
string
externalPlayerIdrequired
string

Query

groupNameoptional
string

Example Response

Response
[
    {
      id: string,
      eventId: string,
      event: EventEntity, 
      provider: string,
      externalTeamId: string,
      teamName: string,
      externalPlayerId: string,
      playerName: string,
      playerImage: string | null,
      stats: any,
      createdAt: Date, 
    },
    {
      id: string,
      eventId: string,
      event: EventEntity, 
      provider: string,
      externalTeamId: string,
      teamName: string,
      externalPlayerId: string,
      playerName: string,
      playerImage: string | null,
      stats: any,
      createdAt: Date, 
    },
      ]

Usage Quota & Rate Limits

API usage is tracked and limited based on your subscription plan:

  • Each API call counts as one request against your monthly quota
  • Quotas reset on the 1st of each month at 12AM UTC
  • Rate limits prevent abuse and ensure fair usage
  • Monitor usage in your dashboard

Response Headers

x-requests-used: 487
  x-requests-remaining: 513