ParlayLedger API Documentation
Access real-time sports betting odds, historical data, live results, and player statistics from bookmakers worldwide.
- Get an API key via emailSubscribe to receive your API key.See plans →
- Get a list of in-season sportsUse the sports endpoint to discover available sports.
- Fetch odds or resultsUse your sport key to query odds and scores.
Authentication
All API requests require authentication using your API key. Include it as a query parameter:
GET https://api.parlayledger.com/v4/sports?apiKey=YOUR_API_KEYQuick Start Example
A complete example fetching NFL odds:
curl -X GET "https://api.parlayledger.com/v4/sports/americanfootball_nfl/odds?apiKey=YOUR_API_KEY®ions=us&markets=h2h,spreads"POST /odds/sync
Trigger odds sync for a given league + date.
https://api.parlayledger.com/odds/syncBody
sportKeyrequiredleagueKeyrequiredseasonrequireddaterequiredExample Response
{
gameOddsInserted: number,
playerPropsInserted: number,
eventsMatched: number,
eventsMissed: number,
missedGames: string[],
}GET odds/event/:eventId
Latest odds for an event (latest per bookmaker × market).
https://api.parlayledger.com/odds/event/:eventIdParameters
eventIdrequiredQuery
marketsoptionalbookmakersoptionalExample 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.
https://api.parlayledger.com/odds/event/:eventId/market/:marketKeyParameters
eventIdrequiredmarketKeyrequiredExample 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.
https://api.parlayledger.com/odds/event/:eventId/movementParameters
eventIdrequiredQuery
bookmakerKeyrequiredmarketKeyrequiredfromoptionaltooptionallimitoptionalExample 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.
https://api.parlayledger.com/odds/event/:eventId/best/:marketKeyParameters
eventIdrequiredmarketKeyrequiredExample 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.
https://api.parlayledger.com/odds/events/latestQuery
eventIdsrequiredmarketsoptionalbookmakersoptionalExample 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.
https://api.parlayledger.com/odds/event/:eventId/propsParameters
eventIdrequiredQuery
marketoptionalplayeroptionalbookmakersoptionalExample 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
https://api.parlayledger.com/stats/eventsQuery
leagueKeyrequireddaterequiredExample 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
https://api.parlayledger.com/stats/events/:eventIdParameters
eventIdrequiredExample 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
https://api.parlayledger.com/stats/events/resolve/by-refQuery
providerrequiredexternalIdrequiredExample Response
{
eventId: string | null;
provider: string;
externalId: string;
}GET stats/events/:eventId/team
Team stats for a canonical event.
https://api.parlayledger.com/stats/events/:eventId/teamParameters
eventIdrequiredExample 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).
https://api.parlayledger.com/stats/events/:eventId/playersParameters
eventIdrequiredQuery
teamExternalIdoptionalgroupNameoptionalExample 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).
https://api.parlayledger.com/stats/events/:eventId/bundleParameters
eventIdrequiredExample Response
{
eventId: string;
teamStats: TeamStats[];
playerStats: PlayerStats[];
}GET stats/events/:eventId/players/:externalPlayerId
Player stats for a single player in an event.
https://api.parlayledger.com/stats/events/:eventId/players/:externalPlayerIdParameters
eventIdrequiredexternalPlayerIdrequiredQuery
groupNameoptionalExample 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