API Reference

Live Scores, Stats & Odds

Everything happening in a live match โ€” scores, match stats, point-by-point and odds. All endpoints on this page are REST under /tennis/v2/extend/api/; for push updates see Socket.IO Integration (MEGA).

Which identifier each route takes
  • Match ID (from upcoming, fixture or H2H rows): start with Live Match by matchId โ€” every row already has it as links.live. It returns the current status, score, server and timeline, plus the live eventId and ready-to-call statistics and point-by-point links. liveMatchId on those rows equals matchId on live rows.
  • eventId: Live Match Score, timeline, match statistics by event ID, the odds routes (recent, best, summary, history, compare, arbitrage, pre-match), and Socket.IO.
  • Player names + match date: Detailed Live Match Statistics and Point-by-Point By Players (both take date_only).
Live data workflow: from one upcoming match
  1. Score and server โ€” follow links.live (Live Match by matchId): status, score, server, timeline and the live eventId.
  2. Detailed live statistics โ€” follow links.detailedStats (Detailed Live Match Statistics): full statistics for the match, live and after the match, with set-by-set breakdowns where available.
  3. Point-by-point โ€” follow links.pointByPoint (Point-by-Point By Players), live or after the match. Point-by-Point by IDs and the legacy matchId route are kept for existing integrations.

These links come with the players and date filled in, so you never rebuild names, dates or identifier formats. Where a link is unavailable, use the relevant endpoint's documented lookup parameters. For in-play prices use Recent Odds with inplay=true.

What's included

Live lists are singles; doubles stay on core fixtures.

Plan access on this page

Every REST endpoint on this page is available on all plans (live scores, statistics, point-by-point, timeline, live and pre-match odds, odds history, comparison and arbitrage). Only Socket.IO real-time streaming is MEGA only.

Three different IDs
  • Core fixture id โ€” schedule row from /tennis/v2/{atp|wta}/fixtures. Do not send it to odds.
  • Live id (often a large number) โ€” odds, timeline, and live score on this page.
  • matchId from the live event โ€” split player1Id-player2Id-tournamentId-roundId for point-by-point. Not the live id.

Bridge names to a live event with /tennis/v2/extend/api/event/get/{player1}/{player2}/{YYYY-MM-DD}. Odds compare and arbitrage take the live id in the path and market_id as a query.

All Available Bookmakers

GET/tennis/v2/extend/api/bookmakers/all
Retrieves all available bookmakers.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/bookmakers/all' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
results[].idstringBookmaker ID (use as bookmakerId; numeric string).
results[].namestringBookmaker display name.
results[].slugstringURL/code-friendly bookmaker identifier, e.g. "bet365".
successbooleantrue when the request succeeded.
resultsarrayList of result items documented in the rows below.
results[]objectOne item of `results`; its fields are listed below.

All Available Odds Markets

GET/tennis/v2/extend/api/markets/all
Retrieves all available markets.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/markets/all' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
results[].idstringMarket ID (use as market_id / marketId; numeric string).
results[].keystringShort market key/code, e.g. "13_1".
results[].namestringMarket name, e.g. "Full Time Result". Use this name for odds/by-market?market=โ€ฆ
successbooleantrue when the request succeeded.
resultsarrayList of result items documented in the rows below.
results[]objectOne item of `results`; its fields are listed below.

Live Matches

GET/tennis/v2/extend/api/events/live
Returns a list of live singles matches. Empty results means nothing is in play right now โ€” that is a valid 200. The sample is one live row at docs time; names and scores change.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/events/live' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament ยท LiveEvent.

FieldTypeDescription
successbooleantrue when the live request succeeded.
resultsarrayLive matches. Empty when nothing is in play.
countintegerNumber of events in results.
idstringLive event ID for odds, timeline, and live score. Not a core fixture ID.
matchKeystringplayer1Id-player2Id-tournamentId-roundId. Split on - for the point-by-point path.
matchIdstringDeprecated on this route: same value as matchKey, use matchKey. Planned removal 3 December 2026.
statusstringMatch state, e.g. InPlay, Upcoming, Ended.
scorestringSet score, e.g. 6-4,3-2.
pointsstringCurrent game points, e.g. 30-15.
indicatorstringWho is serving / which side is indicated in the current game.
tourTypestringatp or wta.
startTimestampintegerScheduled start as Unix seconds (UTC).
messagestringStatus message, e.g. "Success".
results[].namestringMatch name, "Player A vs Player B".
results[].participant1stringFirst player's display name.
results[].participant2stringSecond player's display name.
results[].leaguestringTournament name as shown by the live feed, e.g. "M15 Ann Arbor".
results[].player1objectPlayer 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there.
results[].player1.namestringFirst player's name.
results[].player2objectPlayer 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order.
results[].player2.namestringSecond player's name.
results[].tournamentobjectTournament object (id, name, date, level, surface, country, โ€ฆ).
results[].tournament.namestringTournament name.

Count Live Events

GET/tennis/v2/extend/api/events/live/count
Returns how many tennis events are live right now, as a single number (result.count). Useful for a live-matches badge, or to decide whether to call Live Events. No pagination.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/events/live/count' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
successbooleantrue when the request succeeded.
messagestringStatus message, e.g. "Success".
resultobjectResponse payload object documented in the rows below.
result.countnumberNumber of items in this response (or matching items, where stated).

All Upcoming Events

GET/tennis/v2/extend/api/events/upcoming/{atp|wta}
This example uses atp. Use wta for the women's dataset.Returns upcoming events with status Not Started. Only page is a query param โ€” page size is always 50 (limit in the query string is ignored). Path dataset is atp or wta.

Path Parameter

ParameterRequiredTypeDescription
atp|wtaYesstring
Dataset to query. atp = men's tennis across all supported levels, including Grand Slams, ATP Tour, Challengers and ITF. wta = women's tennis across all supported levels, including Grand Slams, WTA Tour and ITF. There is no separate itf value.

Query Parameter

ParameterRequiredTypeDescription
pageNointeger
Page number, starting at 1. Default 1. Page size is fixed at 50.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/events/upcoming/atp' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament.

FieldTypeDescription
success / messagemixedRequest status.
resultsarrayUpcoming live-board events.
results[].idstringLive event id for odds/timeline routes.
results[].matchKeystringplayer1Id-player2Id-tournamentId-roundId for point-by-point.
results[].matchIdstringDeprecated on this route: same value as matchKey, use matchKey. Planned removal 3 December 2026.
paginationobjectpage, limit (always 50), total, totalPages, hasNext, hasPrev. Sending limit in the query does not change page size.
results[].namestringMatch name, "Player A vs Player B".
results[].participant1stringFirst player's display name.
results[].participant2stringSecond player's display name.
results[].leaguestringTournament name as shown by the live feed, e.g. "M15 Ann Arbor".
results[].statusstringEvent status: InPlay, Not Started or Ended.
results[].player1objectPlayer 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there.
results[].player1.namestringFirst player's name.
results[].player2objectPlayer 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order.
results[].player2.namestringSecond player's name.
results[].tournamentobjectTournament object (id, name, date, level, surface, country, โ€ฆ).
results[].tournament.namestringTournament name.
results[].tourTypestringDataset: atp (men) or wta (women).
results[].startTimestampnumberScheduled start as Unix seconds.
pagination.pagenumberCurrent page.
pagination.limitnumberItems per page.
pagination.totalnumberTotal upcoming events.
pagination.totalPagesnumberTotal pages.
pagination.hasNextbooleantrue when a next page exists.
pagination.hasPrevbooleantrue when a previous page exists.

Get Event

GET/tennis/v2/extend/api/event/get/{player1}/{player2}/{dateOnly}
GET/tennis/v2/extend/api/event/get/{player1}/{player2}
Retrieves event data by player names, including match details, scores, statistics, and timeline. If date_only is provided, the event matching the specified date is returned. Otherwise, the most recent matching event is returned. Use the odds=yes query parameter to include the latest available odds from multiple bookmakers, including the market, bookmaker, player odds, line, and odds update time.

Path Parameter

ParameterRequiredTypeDescription
player1Yesstring
First player display name. E.g: Jannik Sinner
player2Yesstring
Second player display name. E.g: Carlos Alcaraz
dateOnlyNostring
Target date in YYYY-MM-DD format. Example: 2026-01-01.

Query Parameter

ParameterRequiredTypeDescription
oddsNostring
Use the odds=yes query parameter to include the latest available odds for the matched event from multiple bookmakers. The response includes the market, bookmaker, player odds, line, and odds update time for each bookmaker.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/get/Alexander%20Zverev/Ben%20Shelton/2026-09-13' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament ยท Plan-restricted field ยท LiveEvent.

FieldTypeDescription
successbooleantrue when the request succeeded.
resultobjectResponse payload object documented in the rows below.
result.idstringLive event ID.
result.namestringName of the matching player or tournament.
result.participant1stringFirst player's display name.
result.participant2stringSecond player's display name.
result.leaguestringTournament name as shown by the live feed, e.g. "M15 Ann Arbor".
result.scorestringSet score so far, e.g. "6-4,3-2".
result.statusstringEvent status: InPlay, Not Started or Ended.
result.pointsstringPoints in the current game, e.g. "30-15" or "40-A". null when the feed has no point score (before the first point, between sets, or after the match).
result.indicatorstringWho is serving, as "p1,p2": "1,0" = player 1 serving, "0,1" = player 2 serving.
result.statsobjectLegacy summary (aces, double faults, first serve, break points), kept for existing integrations. For match statistics use Detailed Live Match Statistics (by players or by event ID): the full statistics for the match and by set.
result.stats.acesarrayAces: [participant1, participant2] as strings.
result.stats.double_faultsarrayDouble faults: [participant1, participant2] as strings.
result.stats.win_1st_servearrayFirst-serve points won %: [participant1, participant2] as strings.
result.stats.break_point_conversionsarrayBreak-point conversion %: [participant1, participant2] as strings.
result.timelinearrayTimeline events.
result.timeline[]objectOne item of `result.timeline`; its fields are listed below.
result.timeline[].idstringUnique timeline event ID.
result.timeline[].textstringHuman-readable event text, e.g. "Game 1 - Alexander Zverev - breaks to 30".
result.player1objectPlayer 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there.
result.player1.namestringFirst player's name.
result.player2objectPlayer 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order.
result.player2.namestringSecond player's name.
result.tournamentobjectTournament object (id, name, date, level, surface, country, โ€ฆ).
result.tournament.namestringTournament name.
result.tourTypestringDataset: atp (men) or wta (women).
result.startTimestampnumberScheduled start as Unix seconds.
result.roundIdnumberNumeric round ID (see GET /tennis/v2/round): e.g. 4 = First, 5 = Second, 9 = 1/4, 10 = 1/2, 12 = Final; 0โ€“3 are qualifying rounds.
result.matchKeystringCore API bridge: "player1Id-player2Id-tournamentId-roundId" (equals liveMatchId on Upcoming Matches rows). Not the live id.
result.matchIdstringDeprecated: same value as matchKey, use matchKey. Planned removal 3 December 2026.
messagestringStatus message, e.g. "Success".

Live Match Score

GET/tennis/v2/extend/api/event/live-score/get/{eventId}
Retrieves the live score for a specific event using its event ID. Data is returned only when the event is currently live; once it ends the response is {"success": true, "result": {}}. Take a current id from Live Events.

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/live-score/get/3979877' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Plan-restricted field ยท LiveEvent.

FieldTypeDescription
successbooleantrue when the request succeeded.
resultobjectResponse payload object documented in the rows below.
result.idstringLive event ID.
result.participant1stringFirst player's display name.
result.participant2stringSecond player's display name.
result.indicatorstringWho is serving, as "p1,p2": "1,0" = player 1 serving, "0,1" = player 2 serving.
result.scorestringSet score so far, e.g. "6-4,3-2".
result.pointsstringPoints in the current game, e.g. "30-15" or "40-A". null when the feed has no point score (before the first point, between sets, or after the match).
result.statsobjectLegacy summary (aces, double faults, first serve, break points), kept for existing integrations. For match statistics use Detailed Live Match Statistics (by players or by event ID): the full statistics for the match and by set.
result.stats.acesarrayAces: [participant1, participant2] as strings.
result.stats.double_faultsarrayDouble faults: [participant1, participant2] as strings.
result.stats.win_1st_servearrayFirst-serve points won %: [participant1, participant2] as strings.
result.stats.break_point_conversionsarrayBreak-point conversion %: [participant1, participant2] as strings.
result.timelinearrayTimeline events.
result.timeline[]objectOne item of `result.timeline`; its fields are listed below.
result.timeline[].idstringUnique timeline event ID.
result.timeline[].textstringHuman-readable event text, e.g. "Game 1 - Alexander Zverev - breaks to 30".
result.statusstringEvent status: InPlay, Not Started or Ended.
messagestringStatus message, e.g. "Success".

Live Match by matchId

Time-bound example

Returns data only while the live service holds the match: from shortly before it starts until some weeks after it ends. The example is the 2026 US Open final, Zverev v Shelton (key 24008-87562-21349-12, source=game): a stable key, because completed numeric matchIds are renumbered when the archive reloads. For a match today, take matchId (or links.live) from Upcoming Matches.

GET/tennis/v2/matches/{matchId}/live
Follow an upcoming match into play: every upcoming row has links.live, which is this route. For statistics follow links.detailedStats (Detailed Live Match Statistics: the full statistics for the match and by set). links.detailedStats and links.pointByPoint (Point-by-Point By Players) are ready-to-call links for the same match, with the players and date filled in. Live status, score, current-game points, server and timeline for an upcoming, in-play or recently completed match, plus its live eventId for the live odds routes and Socket.IO โ€” all plans. Use the matchId from upcoming or fixtures rows (or call links.live), or a completed matchId with source=game. Score, points, server indicator and statistics follow this response's player1 / player2 (the match record's order, orientation: as_match), even when the live feed lists the players the other way round; a completed match is found either way. Before the match is in the live feed, after the live service has dropped it, or for a bye, the response is {} with an X-Empty-Reason header.

Path Parameter

ParameterRequiredTypeDescription
matchIdYesstring
From matchId on upcoming or fixtures rows, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match.

Query Parameter

ParameterRequiredTypeDescription
typeNostring
atp or wta. Optional; speeds up the lookup and avoids ambiguity.
sourceNostring
today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/matches/24008-87562-21349-12/live?type=atp&source=game' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament ยท LiveEvent.

FieldTypeDescription
matchIdintegerThe resolved matchId (upcoming, fixtures or completed).
liveMatchIdstring"player1Id-player2Id-tournamentId-roundId": the live service's matchId for this match.
eventIdstringLive event id. Use it with the live odds, statistics and timeline routes and with Socket.IO join-event.
statusstringLive status from the feed, e.g. Not Started, InPlay, Ended.
orientationstringAlways as_match: score, points, indicator and stats are in the order of player1 / player2 below (the match record's order), even when the live feed lists the players the other way round. Completed matches list the winner as player1.
scorestring|nullSet scores so far, comma-separated, player1's games first ("6-4,2-2"). null before the first game.
pointsstring|nullPoints in the current game, player1 first ("30-15"). null when the feed has no point score.
indicatorstring|nullWho is serving: "1,0" = player1, "0,1" = player2.
startTimestampinteger|nullScheduled start, Unix seconds.
player1 / player2objectid and name (core player IDs, usable on every player route).
tournamentobjectid (core tournament ID) and name.
statsobject|nullLegacy summary kept for existing integrations: each key is [player1, player2] as strings (aces, double_faults, win_1st_serve %, break_point_conversions %). For match statistics use links.detailedStats (Detailed Live Match Statistics), the full statistics for the match and by set.
timelinearray|nullGame-by-game log, oldest first: id and text.
links.detailedStats / links.pointByPointstringReady-to-call Detailed Live Match Statistics (full statistics for the match and by set) and Point-by-Point By Players (recommended) for this match, with players and match day filled in. Absent when the day is unknown.
typestringDataset: atp (men) or wta (women).
player1.idnumberPlayer 1 ID.
player1.namestringPlayer 1 name.
player2.idnumberPlayer 2 ID.
player2.namestringPlayer 2 name.
tournament.idnumberTournament season ID.
tournament.namestringTournament name.
roundIdnumberNumeric round ID (see GET /tennis/v2/round): e.g. 4 = First, 5 = Second, 9 = 1/4, 10 = 1/2, 12 = Final; 0โ€“3 are qualifying rounds.
stats.acesarrayAces: [participant1, participant2] as strings.
stats.double_faultsarrayDouble faults: [participant1, participant2] as strings.
stats.win_1st_servearrayFirst-serve points won %: [participant1, participant2] as strings.
stats.break_point_conversionsarrayBreak-point conversion %: [participant1, participant2] as strings.
timeline[].idstringUnique timeline event ID.
timeline[].textstringHuman-readable event text, e.g. "Game 1 - Alexander Zverev - breaks to 30".

Point-by-Point By Players

GET/tennis/v2/extend/api/event/data/point-by-point/{player1}/{player2}
Get the available point-by-point scoring for a live or historical match. Supply both player names and date_only=YYYY-MM-DD, or follow the matchโ€™s links.pointByPoint.

Scores follow the player order returned in this responseโ€”not necessarily the winner first. A server value of 1 means the returned player1 is serving; 2 means player2.

For a game-by-game summary showing who held or broke serve, use Match Timeline (Game by Game).

Coverage: live matches, and completed matches since 2010 where recorded. Some matches have gaps in the source data, so not every match has every point.

Path Parameter

ParameterRequiredTypeDescription
player1Yesstring
First player display name. E.g: Jannik Sinner
player2Yesstring
Second player display name. E.g: Carlos Alcaraz

Query Parameter

ParameterRequiredTypeDescription
date_onlyNostring
Target date in YYYY-MM-DD format. Example: date_only=2026-01-01.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/data/point-by-point/Hubert Hurkacz/Holger Rune?date_only=2026-10-28' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player ยท Point-by-point set and game.

FieldTypeDescription
successbooleantrue when the request succeeded.
metaobjectValue returned by the API for this field.
meta.matchKeystringplayer1Id-player2Id-tournamentId-roundId of the match.
meta.matchIdstringDeprecated: same value as matchKey, use matchKey. Planned removal 3 December 2026.
meta.player1objectPlayer 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there.
meta.player1.idstringPlayer 1 ID.
meta.player1.namestringPlayer 1 name.
meta.player2objectPlayer 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order.
meta.player2.idstringPlayer 2 ID.
meta.player2.namestringPlayer 2 name.
meta.orientationstringValue returned by the API for this field.
meta.server1stringValue returned by the API for this field.
meta.server2stringValue returned by the API for this field.
meta.statusstringStatus string (see the endpoint: Active/Retired for players, InPlay / Not Started / Ended for live events).
meta.dateOnlystringMatch date (YYYY-MM-DD).
resultobjectResponse payload object documented in the rows below.
result.setsarraySets with their games (point-by-point).
result.sets[]objectOne item of `result.sets`; its fields are listed below.
result.sets[].gamesarrayGames of the set in order.
result.sets[].games[]objectOne item of `result.sets[].games`; its fields are listed below.
result.sets[].games[].servernumberWho served the game: 1 = player 1, 2 = player 2, 0 = unknown.
result.sets[].games[].tiebreakbooleantrue when this game is a tiebreak.
result.sets[].games[].finalScorestringGames score in the set after this game, e.g. "3-2".
result.sets[].games[].gameNumbernumberGame number within the set (1-based).
result.sets[].games[].fifteens_contentstringPoint-by-point score of the game, comma-separated, as "player1:player2" after each point (e.g. "15:0, 30:0, 40:15"). "BP" marks a break point; in tiebreaks the serving side is marked with * ("*1:0" = player 1 served).
result.sets[].setScorestringFinal score of the set, e.g. "6-3" or "7-6"; empty while the set is in progress.
result.sets[].setNumbernumberSet number (1-based).
result.scorestringSet score so far, e.g. "6-4,3-2".

Point-by-Point By Ids

GET/tennis/v2/extend/api/event/pbp/{player1Id}/{player2Id}/{tournamentId}/{roundId}
Get the available point-by-point scoring using the two player IDs, tournament ID and round ID.

Find these four IDs in the live eventโ€™s matchKey or the upcoming matchโ€™s liveMatchId, formatted as player1Id-player2Id-tournamentId-roundId. This is different from the live eventId used for odds and timelines.

For a game-by-game summary showing who held or broke serve, use Match Timeline (Game by Game).

Coverage: live matches, and completed matches since 2010 where recorded. Some matches have gaps in the source data, so not every match has every point.

Path Parameter

ParameterRequiredTypeDescription
player1IdYesnumber
First Player ID (โ‰ฅ 1).
player2IdYesinteger
Second Player ID (โ‰ฅ 1).
tournamentIdYesinteger
Tournament ID must be numeric value >= 1
roundIdYesinteger
Round ID Example: roundId=9
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/pbp/26473/69471/21360/5' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player ยท Point-by-point set and game.

FieldTypeDescription
successbooleantrue when the request succeeded.
metaobjectValue returned by the API for this field.
meta.matchKeystringplayer1Id-player2Id-tournamentId-roundId of the match.
meta.matchIdstringDeprecated: same value as matchKey, use matchKey. Planned removal 3 December 2026.
meta.player1objectPlayer 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there.
meta.player1.idstringPlayer 1 ID.
meta.player1.namestringPlayer 1 name.
meta.player2objectPlayer 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order.
meta.player2.idstringPlayer 2 ID.
meta.player2.namestringPlayer 2 name.
meta.orientationstringValue returned by the API for this field.
meta.server1stringValue returned by the API for this field.
meta.server2stringValue returned by the API for this field.
meta.statusstringStatus string (see the endpoint: Active/Retired for players, InPlay / Not Started / Ended for live events).
meta.dateOnlystringMatch date (YYYY-MM-DD).
resultobjectResponse payload object documented in the rows below.
result.setsarraySets with their games (point-by-point).
result.sets[]objectOne item of `result.sets`; its fields are listed below.
result.sets[].gamesarrayGames of the set in order.
result.sets[].games[]objectOne item of `result.sets[].games`; its fields are listed below.
result.sets[].games[].servernumberWho served the game: 1 = player 1, 2 = player 2, 0 = unknown.
result.sets[].games[].tiebreakbooleantrue when this game is a tiebreak.
result.sets[].games[].finalScorestringGames score in the set after this game, e.g. "3-2".
result.sets[].games[].gameNumbernumberGame number within the set (1-based).
result.sets[].games[].fifteens_contentstringPoint-by-point score of the game, comma-separated, as "player1:player2" after each point (e.g. "15:0, 30:0, 40:15"). "BP" marks a break point; in tiebreaks the serving side is marked with * ("*1:0" = player 1 served).
result.sets[].setScorestringFinal score of the set, e.g. "6-3" or "7-6"; empty while the set is in progress.
result.sets[].setNumbernumberSet number (1-based).
result.scorestringSet score so far, e.g. "6-4,3-2".

Match Timeline (Game by Game)

GET/tennis/v2/extend/api/event/timeline/{eventId}
Follow a match game by game, with a summary of who held or broke serve and how each game or tiebreak ended. Available for live and completed matches covered by our live data service.

For the scoring progression within each game, use Point-by-Point By Players.

Matches without a recorded timeline return an empty result.

Coverage: timelines come from our live data feed (BetsAPI) and depend on how long that feed data is retained.

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/timeline/3954197' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
resultsarrayTimeline events in chronological order.
results[].idstringUnique timeline event ID.
results[].textstringHuman-readable match event, e.g. a hold, break or tiebreak result ("Game 1 - Alexander Zverev - breaks to 30").
successbooleantrue when the request succeeded.
messagestringStatus message, e.g. "Success".

Detailed Live Match Statistics

Get detailed live match statistics, including set-by-set breakdowns where available (during play some matches return whole-match totals only). Some historical data is also available. For the extensive historical match statistics archive, with records dating back to 2003, use Completed Match Statistics by matchId: /tennis/v2/matches/{matchId}/stats.

GET/tennis/v2/extend/api/event/data/statistics/:player1/:player2
Retrieves match statistics for a specific tennis event, including service performance, return points, games won, points won, aces, double faults, break points, and other statistics. Statistics are provided for each set and for the entire match, where available.

Path Parameter

ParameterRequiredTypeDescription
player1Yesstring
First player display name. E.g: Jannik Sinner
player2Yesstring
Second player display name. E.g: Carlos Alcaraz

Query Parameter

ParameterRequiredTypeDescription
date_onlyNostring
Target date in YYYY-MM-DD format. Example: date_only=2026-01-01.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/data/statistics/Hubert Hurkacz/Holger Rune?date_only=2026-10-28' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player ยท Statistics metric.

FieldTypeDescription
successbooleantrue when the request succeeded.
player1objectPlayer 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there.
player1.namestringPlayer 1 name.
player2objectPlayer 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order.
player2.namestringPlayer 2 name.
statisticsobjectMatch statistics by period, category and metric (see the statistics rows).
statistics.{period}objectStatistics for one period: 1ST, 2ND, โ€ฆ = that set; ALL = whole match.
statistics.{period}.{category}.{metric}.{player}objectThe metric for player1 and player2 (keys player1 / player2; same shape for every metric).
statistics.{period}.{category}.{metric}.{player}.valuenumberCount for the metric (e.g. aces, points won, serves landed). Present on every metric.
statistics.{period}.{category}.{metric}.{player}.totalnumberWhat value is out of (e.g. serves attempted, points played). Only on ratio metrics.
statistics.{period}.{category}.{metric}.{player}.percentagenumbervalue as a percentage of total. Only on ratio metrics.
statistics.{period}.gamesobjectGames category.
statistics.{period}.games.maxGamesInRowobjectMost consecutive games won.
statistics.{period}.pointsobjectPoints category.
statistics.{period}.points.maxPointsInRowobjectMost consecutive points won.
statistics.{period}.points.servicePointsScoredobjectPoints won on own serve.
statistics.{period}.points.receiverPointsScoredobjectPoints won while returning.
statistics.{period}.returnobjectReturn category.
statistics.{period}.return.returnGamesTotalobjectReturn games played.
statistics.{period}.return.breakPointsScoredobjectBreak points converted (break points won as returner).
statistics.{period}.return.firstReturnPointsobjectPoints won returning first serve: value = won, total = played.
statistics.{period}.return.secondReturnPointsobjectPoints won returning second serve: value = won, total = played.
statistics.{period}.serviceobjectService category.
statistics.{period}.service.acesobjectAces.
statistics.{period}.service.doubleFaultsobjectDouble faults.
statistics.{period}.service.breakPointsSavedobjectBreak points saved: value = saved, total = faced.
statistics.{period}.service.serviceGamesTotalobjectService games played.
statistics.{period}.service.firstServeAccuracyobjectFirst serves landed in: value = in, total = attempted (serve accuracy, not points won).
statistics.{period}.service.secondServeAccuracyobjectSecond serves landed in: value = in, total = attempted.
statistics.{period}.service.firstServePointsAccuracyobjectPoints won behind the first serve: value = won, total = first serves in.
statistics.{period}.service.secondServePointsAccuracyobjectPoints won behind the second serve: value = won, total = second serves played.
statistics.{period}.miscellaneousobjectOther metrics (tiebreaks).
statistics.{period}.miscellaneous.tiebreaksobjectTiebreaks won.
statistics.{period}.games.gamesWonobjectGames won.
statistics.{period}.games.serviceGamesWonobjectService games won (held).
statistics.{period}.points.pointsTotalobjectTotal points won.
dateOnlystringMatch date (YYYY-MM-DD).

Detailed Live Match Statistics by Event ID

Get detailed live match statistics, including set-by-set breakdowns where available (during play some matches return whole-match totals only). Some historical data is also available. For the extensive historical match statistics archive, with records dating back to 2003, use Completed Match Statistics by matchId: /tennis/v2/matches/{matchId}/stats.

GET/tennis/v2/extend/api/event/get/statistics/{eventId}
Retrieves match statistics for a specific tennis event, including service performance, return points, games won, points won, aces, double faults, break points, and other statistics. Statistics are provided for each set and for the entire match, where available.

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/get/statistics/4411958' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player ยท Statistics metric.

FieldTypeDescription
successbooleantrue when the request succeeded.
player1objectPlayer 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there.
player1.namestringPlayer 1 name.
player2objectPlayer 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order.
player2.namestringPlayer 2 name.
statisticsobjectMatch statistics by period, category and metric (see the statistics rows).
statistics.{period}objectStatistics for one period: 1ST, 2ND, โ€ฆ = that set; ALL = whole match.
statistics.{period}.{category}.{metric}.{player}objectThe metric for player1 and player2 (keys player1 / player2; same shape for every metric).
statistics.{period}.{category}.{metric}.{player}.valuenumberCount for the metric (e.g. aces, points won, serves landed). Present on every metric.
statistics.{period}.{category}.{metric}.{player}.totalnumberWhat value is out of (e.g. serves attempted, points played). Only on ratio metrics.
statistics.{period}.{category}.{metric}.{player}.percentagenumbervalue as a percentage of total. Only on ratio metrics.
statistics.{period}.gamesobjectGames category.
statistics.{period}.games.maxGamesInRowobjectMost consecutive games won.
statistics.{period}.pointsobjectPoints category.
statistics.{period}.points.maxPointsInRowobjectMost consecutive points won.
statistics.{period}.points.servicePointsScoredobjectPoints won on own serve.
statistics.{period}.points.receiverPointsScoredobjectPoints won while returning.
statistics.{period}.returnobjectReturn category.
statistics.{period}.return.returnGamesTotalobjectReturn games played.
statistics.{period}.return.breakPointsScoredobjectBreak points converted (break points won as returner).
statistics.{period}.return.firstReturnPointsobjectPoints won returning first serve: value = won, total = played.
statistics.{period}.return.secondReturnPointsobjectPoints won returning second serve: value = won, total = played.
statistics.{period}.serviceobjectService category.
statistics.{period}.service.acesobjectAces.
statistics.{period}.service.doubleFaultsobjectDouble faults.
statistics.{period}.service.breakPointsSavedobjectBreak points saved: value = saved, total = faced.
statistics.{period}.service.serviceGamesTotalobjectService games played.
statistics.{period}.service.firstServeAccuracyobjectFirst serves landed in: value = in, total = attempted (serve accuracy, not points won).
statistics.{period}.service.secondServeAccuracyobjectSecond serves landed in: value = in, total = attempted.
statistics.{period}.service.firstServePointsAccuracyobjectPoints won behind the first serve: value = won, total = first serves in.
statistics.{period}.service.secondServePointsAccuracyobjectPoints won behind the second serve: value = won, total = second serves played.
statistics.{period}.miscellaneousobjectOther metrics (tiebreaks).
statistics.{period}.miscellaneous.tiebreaksobjectTiebreaks won.
statistics.{period}.games.gamesWonobjectGames won.
statistics.{period}.games.serviceGamesWonobjectService games won (held).
statistics.{period}.points.pointsTotalobjectTotal points won.
dateOnlystringMatch date (YYYY-MM-DD).

Latest Single Bookie Odds

Tip

This endpoint is best for getting the latest odds because it supports live odds. When a match is in play, it returns odds only for supported markets: Full Time Result, Over Under, Set Winner, and Asian Handicap. This keeps the market coverage aligned with socket odds updates. Use this endpoint to load the initial odds snapshot, then apply socket updates as they arrive.

GET/tennis/v2/extend/api/event/odds/latest/{eventId}
Retrieve event metadata and the latest stored quote for each market and line from a selected bookmaker.

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731

Query Parameter

ParameterRequiredTypeDescription
bookmaker_idNostring
Return only the selected bookmaker. By default bookmaker is Bet365.
Live market coverage

When the stored event status is exactly InPlay, only market IDs 1, 2, 3, 23 are eligible.

You can see available market list
  • Full Time Result
  • Over Under
  • Set Winner
  • Asian Handicap

Only markets with matching stored odds are returned; the endpoint does not create empty entries for missing markets. Other event statuses, including null, do not apply this market restriction.

The event-status rule limits markets. It does not filter quotes by odd_type: the latest stored quote may be pre-match or in-play.

How quotes are selected
  1. Find the event and filter its odds by the selected bookmaker.
  2. Apply the supported-market restriction when the event status is InPlay.
  3. Group quotes by market name and normalized line. A null line becomes an empty string.
  4. Select the greatest add_time in each group. Null timestamps rank last; equal timestamps are resolved by the highest row ID.

Both odds come from the same selected row. This returns the latest quote, not the highest price. Different lines may have different update timestamps.

Result keys use market when the line is empty, or market | line when a line is present, for example Over Under | 22.5. Object key order is not significant.

Despite the route name end, this endpoint also works for live events. It does not require a finished event or calculate pre-match closing odds.

Empty results
ConditionmetaresultHTTP status
Event and eligible odds existEvent detailsQuote object200
Event exists without eligible oddsEvent detailsnull200
Event does not existnullnull200
{
  "success": true,
  "meta": null,
  "result": null
}

The supplied controller does not define validation-error responses. Invalid-input handling depends on the route schema and application error handler.

Using the snapshot with socket updates
  1. Load this endpoint for the event and bookmaker you want to display.
  2. Use meta for event details and result for the initial odds display.
  3. Apply subsequent socket quotes using the same market-and-line key and the same bookmaker scope.
  4. Compare quote timestamps before replacing a value, so an older snapshot or update does not overwrite a newer quote.

Market coverage is aligned with live socket updates, but field names may differ. This endpoint uses bookmaker and bookmakerId; the earlier socket payload uses od1Bookmaker, od2Bookmaker, and oddType. Normalize those fields in the client rather than treating the payloads as identical.

Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/odds/latest/4680111' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament ยท Odds entry.

FieldTypeDescription
successbooleantrue when the request succeeded.
metaobjectValue returned by the API for this field.
meta.eventIdnumberLive event ID (the live feed's own ID, not a core fixture ID).
meta.matchKeystringplayer1Id-player2Id-tournamentId-roundId of the match.
meta.matchIdstringDeprecated: same value as matchKey, use matchKey. Planned removal 3 December 2026.
meta.player1objectPlayer 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there.
meta.player1.namestringPlayer 1 name.
meta.player2objectPlayer 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order.
meta.player2.namestringPlayer 2 name.
meta.dateOnlystringMatch date (YYYY-MM-DD).
meta.tournamentobjectTournament object (id, name, date, level, surface, country, โ€ฆ).
meta.tournament.namestringTournament name.
meta.eventStatusstringValue returned by the API for this field.
resultobjectResponse payload object documented in the rows below.
result.{market}objectOdds for one market (market names are dynamic keys, e.g. "Full Time Result").
result.{market}.od1stringDecimal odds for outcome 1 (player 1 / over), as a string. On the best-odds routes this is the best price across bookmakers.
result.{market}.od2stringDecimal odds for outcome 2 (player 2 / under), as a string. On the best-odds routes this is the best price across bookmakers.
result.{market}.linestringHandicap/total line, or null.
result.{market}.addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.{market}.bookmakerstringBookmaker name.
result.{market}.bookmakerIdnumberBookmaker ID (see GET /tennis/v2/extend/api/bookmakers/all).

Best Odds Across Multiple Bookmakers

GET/tennis/v2/extend/api/event/odds/best/{eventId}
Returns the highest eligible decimal odds for each participant in the Full Time Result market. Each participant's best price is selected independently and may come from a different bookmaker.

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731

How it works

  • Reads the event status and odds in a single SQL query using the same database snapshot.
  • Selects the odds category and freshness limit based on the event status.
  • Selects the latest stored quote per bookmaker for market 1, Full Time Result, with an empty betting line. Timestamp ties are resolved using the higher record ID.
  • Excludes quotes with missing, non-positive, or future timestamps. For active freshness policies, it also excludes stale quotes.
  • Considers only valid decimal prices greater than 1. A quote with one valid participant price can still contribute that price.
  • Selects the highest eligible price independently for od1 and od2. Equal prices favor the newer quote, then the lower bookmaker ID.

Validation happens after selecting each bookmaker's latest quote. If that quote is rejected, the endpoint does not fall back to an older quote from the same bookmaker.

Match status behavior
Event statusOdds selectedFreshness policy
InPlayLatest stored in-play quotes120 seconds
Not StartedLatest stored pre-match quotes30 minutes
EndedLatest stored in-play quotesNo age limit; marked as historical
Other statusesNo comparison returnedAvailability remains unknown

Freshness limits are configurable. The response's meta.maxAgeSeconds reports the applied limit.

Historical results compare each bookmaker's latest stored in-play quote. They are not the highest prices ever recorded during the match and are not guaranteed closing prices. Pre-match odds are not used as a fallback for ended matches.

HTTP status codes
  • 200: Request processed successfully. An existing event with no eligible odds returns result: null with an explanation.
  • 400: Invalid event ID rejected by route validation.
  • 404: Event not found.

An empty result does not prove that the endpoint or provider lacks coverage. Check meta.reason and meta.excludedQuotes for the available explanation.

These are stored prices from potentially different update times, not a synchronized market snapshot. Recent prices and an available response do not guarantee that a bookmaker currently accepts bets at those prices.

Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/odds/best/4244379' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Odds entry.

FieldTypeDescription
successbooleantrue when the request succeeded.
resultobjectResponse payload object documented in the rows below.
result.{market}objectOdds for one market (market names are dynamic keys, e.g. "Full Time Result").
result.{market}.od1stringDecimal odds for outcome 1 (player 1 / over), as a string. On the best-odds routes this is the best price across bookmakers.
result.{market}.od2stringDecimal odds for outcome 2 (player 2 / under), as a string. On the best-odds routes this is the best price across bookmakers.
result.{market}.linestringHandicap/total line, or null.
result.{market}.addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.{market}.oddTypestringValue returned by the API for this field.
result.{market}.od1AddTimenumberValue returned by the API for this field.
result.{market}.od2AddTimenumberValue returned by the API for this field.
result.{market}.od1BookmakerstringBookmaker offering the best od1.
result.{market}.od2BookmakerstringBookmaker offering the best od2.
result.{market}.od1BookmakerIdnumberValue returned by the API for this field.
result.{market}.od2BookmakerIdnumberValue returned by the API for this field.
messagestringStatus message, e.g. "Success".
metaobjectValue returned by the API for this field.
meta.eventStatusstringValue returned by the API for this field.
meta.oddTypestringValue returned by the API for this field.
meta.historicalbooleanValue returned by the API for this field.
meta.availabilitystringValue returned by the API for this field.
meta.reasonstringValue returned by the API for this field.
meta.coveragestringValue returned by the API for this field.
meta.freshnessAppliedbooleanValue returned by the API for this field.
meta.freshnessBasisstringValue returned by the API for this field.
meta.maxAgeSecondsnumberValue returned by the API for this field.
meta.checkedAtstringValue returned by the API for this field.
meta.updatedAtstringWhen the odds were last updated, as Unix seconds; null when unknown.
meta.eligibleBookmakerCountnumberValue returned by the API for this field.
meta.excludedQuotesarrayValue returned by the API for this field.
meta.excludedQuotes[]objectOne item of `meta.excludedQuotes`; its fields are listed below.
meta.excludedQuotes[].reasonstringValue returned by the API for this field.
meta.excludedQuotes[].addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
meta.excludedQuotes[].bookmakerstringBookmaker name.
meta.excludedQuotes[].bookmakerIdnumberBookmaker ID (see GET /tennis/v2/extend/api/bookmakers/all).

Odds Summary

GET/tennis/v2/extend/api/event/odds/summary/{eventId}
Opening prices, prices at match start (the kickoff field) and latest prices (the end field) per bookmaker and market. Different from Latest Odds Quotes (/odds/summary/movements/last-10/{eventId}).

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/odds/summary/3954197' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Odds entry.

FieldTypeDescription
resultobjectBookmaker โ†’ market โ†’ start (opening), kickoff (at match start) and end (latest) objects (od1, od2, addTime), plus line.
successbooleantrue when the request succeeded.
countnumberNumber of items in this response (or matching items, where stated).
result.BWinobjectValue returned by the API for this field.
result.BWin.{market}arrayValue returned by the API for this field.
result.BWin.{market}[]objectOne item of `result.BWin.{market}`; its fields are listed below.
result.BWin.{market}[].{bookmaker}objectLatest odds from this bookmaker (dynamic key).
result.BWin.{market}[].{bookmaker}.od1stringDecimal odds for outcome 1 (player 1 / over), as a string.
result.BWin.{market}[].{bookmaker}.od2stringDecimal odds for outcome 2 (player 2 / under), as a string.
result.BWin.{market}[].{bookmaker}.addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.BWin.{market}[].linestringHandicap/total line, or null.
result.{bookmaker}objectOdds from this bookmaker, by market (dynamic key).
result.{bookmaker}.{market}arrayThis bookmaker's odds for the market (dynamic key).
result.{bookmaker}.{market}[]objectOne item of `result.{bookmaker}.{market}`; its fields are listed below.
result.{bookmaker}.{market}[].{bookmaker}objectLatest odds from this bookmaker (dynamic key).
result.{bookmaker}.{market}[].{bookmaker}.od1stringDecimal odds for outcome 1 (player 1 / over), as a string.
result.{bookmaker}.{market}[].{bookmaker}.od2stringDecimal odds for outcome 2 (player 2 / under), as a string.
result.{bookmaker}.{market}[].{bookmaker}.addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.{bookmaker}.{market}[].linestringHandicap/total line, or null.
result.FonBetobjectValue returned by the API for this field.
result.FonBet.{market}arrayValue returned by the API for this field.
result.FonBet.{market}[]objectOne item of `result.FonBet.{market}`; its fields are listed below.
result.FonBet.{market}[].{bookmaker}objectLatest odds from this bookmaker (dynamic key).
result.FonBet.{market}[].{bookmaker}.od1stringDecimal odds for outcome 1 (player 1 / over), as a string.
result.FonBet.{market}[].{bookmaker}.od2stringDecimal odds for outcome 2 (player 2 / under), as a string.
result.FonBet.{market}[].{bookmaker}.addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.FonBet.{market}[].linestringHandicap/total line, or null.
result.BetFairobjectValue returned by the API for this field.
result.BetFair.{market}arrayValue returned by the API for this field.
result.BetFair.{market}[]objectOne item of `result.BetFair.{market}`; its fields are listed below.
result.BetFair.{market}[].{bookmaker}objectLatest odds from this bookmaker (dynamic key).
result.BetFair.{market}[].{bookmaker}.od1stringDecimal odds for outcome 1 (player 1 / over), as a string.
result.BetFair.{market}[].{bookmaker}.od2stringDecimal odds for outcome 2 (player 2 / under), as a string.
result.BetFair.{market}[].{bookmaker}.addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.BetFair.{market}[].linestringHandicap/total line, or null.
result.BetFair.{market}[].kickoffnullOdds at the scheduled match start.
messagestringStatus message, e.g. "Success".
metaobjectValue returned by the API for this field.
meta.eventIdstringLive event ID (the live feed's own ID, not a core fixture ID).
meta.eventStatusstringValue returned by the API for this field.
meta.startTimestampnumberScheduled start as Unix seconds.
meta.kickoffCutoffnumberValue returned by the API for this field.
meta.kickoffBasisstringValue returned by the API for this field.
meta.checkedAtstringValue returned by the API for this field.

Odds History

GET/tennis/v2/extend/api/event/odds/history/{eventId}
Returns stored pre-match and in-play odds for an event, grouped by bookmaker and market. Each market contains an array of odds updates, ordered newest first.

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731

Query Parameter

ParameterRequiredTypeDescription
market_idsNostring

Market โ€” Optional comma-separated market IDs to filter the results. For example: 1,2,3,4. If omitted, odds from all available markets are returned. E.g market_ids=1,2,3,4

You can see available market list
bookmaker_idsNostring

Bookmaker โ€” Optional comma-separated bookmaker IDs to filter the results. For example: 1,2,3,4. If omitted, odds from all available bookmakers are returned. E.g bookmaker_ids=1,2,3,4

sincetimeNonumber
Non-negative integer Unix timestamp in seconds. Returns only records whose addTime is greater than this value.

How it works

  • Validates the event ID and any supplied query parameters.
  • Applies Bet365 and Full Time Result as defaults when their respective filters are omitted.
  • Looks up the event and retrieves matching odds in a single SQL query.
  • If sincetime is supplied, includes only records where add_time > sincetime. Records exactly at the cutoff are excluded.
  • Groups records by the stored bookmaker name and market name.
  • Orders each market array by addTime descending, with missing timestamps last. Equal timestamps are ordered by record ID descending.

This endpoint returns all matching stored updates, not just the latest quote or the best price. It applies no freshness limit or match-status restriction, so ended matches are included.

Response structure

result is grouped as result[bookmakerName][marketName]. Each market array contains:

  • od1 and od2: Stored prices for the market's two outcomes, returned as strings. Missing or blank prices are represented by "-".
  • oddType: pre for pre-match odds or inplay for in-play odds.
  • line: Betting line, such as 22.5, or an empty string when no line is provided.
  • addTime: Stored quote timestamp in Unix seconds, or null if missing.

Updates for different betting lines remain in the same market array. Use line to distinguish them.

count is the total number of returned odds records across all bookmakers and markets. Requested bookmakers or markets without matching records are omitted.

Metadata
  • eventId: Requested event ID.
  • sincetime: Applied cutoff timestamp, or null when no time filter was requested.
  • bookmakerIds: Applied bookmaker IDs, including defaults.
  • marketIds: Applied market IDs, including defaults.
  • order: addTime DESC NULLS LAST, id DESC.
HTTP status codes
  • 200: Request processed successfully. If no records match, returns count: 0 and result: {}.
  • 400: Invalid event ID or query parameters.
  • 404: Event not found.

The timestamp filter uses the quote's addTime, not its database arrival time. For repeated polling, allow an overlapping time window and handle repeated records: a strict timestamp cutoff can miss updates that arrive late or share the cutoff second.

Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/odds/history/3954197' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Recent Odds

GET/tennis/v2/extend/api/event/recent-odds/get/{eventId}
The recommended live odds route: add inplay=true for in-play prices only (oddType inplay); without it, pre-match and in-play prices are returned together, as before. Returns the most recent odds for a live event, grouped by market and then bookmaker: od1, od2, line, addTime (when the price was recorded, Unix seconds) and oddType (pre or inplay). event_id is the live event ID from Live Events, not a Core fixture ID. No pagination.

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731

Query Parameter

ParameterRequiredTypeDescription
inplayNoboolean
Optional. true returns in-play prices only (oddType: inplay); false or omitted returns all prices, in-play and pre-match, as before.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/recent-odds/get/3954197?inplay=true' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Odds entry.

FieldTypeDescription
successbooleantrue when the request succeeded.
resultobjectResponse payload object documented in the rows below.
result.{market}objectOdds for one market (market names are dynamic keys, e.g. "Full Time Result").
result.{market}.{bookmaker}objectLatest odds from this bookmaker (bookmaker names are dynamic keys).
result.{market}.{bookmaker}.od1stringDecimal odds for outcome 1 (player 1 / over), as a string.
result.{market}.{bookmaker}.od2stringDecimal odds for outcome 2 (player 2 / under), as a string.
result.{market}.{bookmaker}.linestringHandicap or total line for the market (string); empty or null when not applicable.
result.{market}.{bookmaker}.addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.{market}.{bookmaker}.oddTypestringValue returned by the API for this field.

Latest Odds Quotes

GET/tennis/v2/extend/api/odds/summary/movements/last-10/{eventId}
Returns up to 10 most recent stored odds quotes (snapshots) for each bookmaker and market of the event, grouped as result[bookmaker][market] (different lines of a market share its 10). An event with 25 bookmaker-market pairs returns up to 250 quotes. They are not filtered to price changes, so a quote can repeat the previous price; the event usually has more quotes in total (see Odds History for the full history). Bet365, DraftKings and MelBet update throughout the match; Pinnacle and Marathonbet are pre-match prices only (their last quote is around the start of the match).

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731

Query Parameter

ParameterRequiredTypeDescription
inplayNoboolean
Optional. true returns in-play prices only (oddType: inplay); false or omitted returns all prices, in-play and pre-match, as before.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/odds/summary/movements/last-10/3954197' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Odds entry.

FieldTypeDescription
successbooleantrue when the request succeeded.
resultobjectResponse payload object documented in the rows below.
result.{bookmaker}objectOdds from this bookmaker, by market (dynamic key).
result.{bookmaker}.{market}arrayThis bookmaker's odds for the market (dynamic key).
result.{bookmaker}.{market}[]objectOne item of `result.{bookmaker}.{market}`; its fields are listed below.
result.{bookmaker}.{market}[].od1stringDecimal odds for outcome 1 (player 1 / over), as a string. On the best-odds routes this is the best price across bookmakers.
result.{bookmaker}.{market}[].od2stringDecimal odds for outcome 2 (player 2 / under), as a string. On the best-odds routes this is the best price across bookmakers.
result.{bookmaker}.{market}[].linestringHandicap/total line, or null.
result.{bookmaker}.{market}[].addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.{bookmaker}.{market}[].oddTypestringValue returned by the API for this field.

Odds Compare

GET/tennis/v2/extend/api/odds/compare/{eventId}
Returns the latest stored odds per bookmaker and betting line for the specified event and market. Odds are selected according to the match status and filtered by freshness.

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731

Query Parameter

ParameterRequiredTypeDescription
market_idNostring
Market โ€” Optional market ID to filter the results. E.g market_id=1. You can see available market list

How it works

  • InPlay: Returns in-play odds updated within the configured live freshness limit.
  • Not Started: Returns pre-match odds updated within the configured pre-match freshness limit.
  • Ended: Returns an empty result with This match has ended.
  • Other statuses: Returns an empty result indicating that current odds availability is unconfirmed.
The example configuration uses 120 seconds for in-play odds and 30 minutes for pre-match odds.
Response

Each result contains the bookmaker, market, line, participant odds (od1 and od2), odds type, update timestamp (addTime, Unix seconds), and quote age (ageSeconds).

Metadata includes:

  • eventStatus and oddType: Match status and selected odds category.
  • availability: available, partial, unknown, or not_applicable.
  • reason: Explanation of the response state.
  • checkedAt: Time freshness was evaluated.
  • updatedAt: Newest accepted quote timestamp, or null.
  • maxAgeSeconds: Applied freshness limit.
  • excludedQuotes: Quotes excluded because their timestamps were stale or invalid.

count represents returned quote rows. A bookmaker may appear multiple times for different lines. Compare prices only within the same market and line.

HTTP status codes
  • 200: Request processed successfully, including empty results.
  • 400: Missing or invalid parameters.
  • 404: Event not found.

Recent stored odds do not guarantee that a bookmaker currently accepts bets at those prices. An empty result does not establish that provider coverage is unavailable.

Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/odds/compare/3954197?market_id=1' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Odds entry.

FieldTypeDescription
successbooleantrue when the request succeeded.
countnumberNumber of items in this response (or matching items, where stated).
resultsarrayList of result items documented in the rows below.
results[]objectOne item of `results`; its fields are listed below.
results[].bookmakerIdnumberBookmaker ID (see GET /tennis/v2/extend/api/bookmakers/all).
results[].bookmakerstringBookmaker name.
results[].marketstringMarket name, e.g. "Full Time Result".
results[].linestringHandicap or total line for the market (string); empty or null when not applicable.
results[].od1stringDecimal odds for outcome 1 (player 1 / over), as a string.
results[].od2stringDecimal odds for outcome 2 (player 2 / under), as a string.
results[].oddTypestringValue returned by the API for this field.
results[].addTimestringWhen the bookmaker published these odds, as Unix seconds (string).
results[].ageSecondsnumberValue returned by the API for this field.
messagestringStatus message, e.g. "Success".
metaobjectValue returned by the API for this field.
meta.eventStatusstringValue returned by the API for this field.
meta.oddTypestringValue returned by the API for this field.
meta.availabilitystringValue returned by the API for this field.
meta.reasonstringValue returned by the API for this field.
meta.coveragestringValue returned by the API for this field.
meta.freshnessBasisstringValue returned by the API for this field.
meta.maxAgeSecondsnumberValue returned by the API for this field.
meta.checkedAtstringValue returned by the API for this field.
meta.updatedAtstringWhen the odds were last updated, as Unix seconds; null when unknown.
meta.excludedQuotesarrayValue returned by the API for this field.
meta.excludedQuotes[]objectOne item of `meta.excludedQuotes`; its fields are listed below.
meta.excludedQuotes[].bookmakerIdnumberBookmaker ID (see GET /tennis/v2/extend/api/bookmakers/all).
meta.excludedQuotes[].bookmakerstringBookmaker name.
meta.excludedQuotes[].linestringHandicap or total line for the market (string); empty or null when not applicable.
meta.excludedQuotes[].addTimestringWhen the bookmaker published these odds, as Unix seconds (string).
meta.excludedQuotes[].ageSecondsnumberValue returned by the API for this field.
meta.excludedQuotes[].reasonstringValue returned by the API for this field.

Pre-Match Odds

GET/tennis/v2/extend/api/odds/pre-match/{eventId}
Retrieve historical pre-match betting odds for a specific tennis event, including the latest available odds from both pre_match_odds and odds tables before the match starts.

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731

Query Parameter

ParameterRequiredTypeDescription
market_idsNostring

Market โ€” Optional comma-separated market IDs to filter the results. For example: 1,2,3,4. If omitted, odds from all available markets are returned. E.g market_ids=1,2,3,4

You can see available market list
bookmaker_idsNostring

Bookmaker โ€” Optional comma-separated bookmaker IDs to filter the results. For example: 1,2,3,4. If omitted, odds from all available bookmakers are returned. E.g bookmaker_ids=1,2,3,4

timestampNostring

Timestamp โ€” Optional timestamp to filter the results. For example: 1791000296. If omitted, odds from all available timestamps are returned. E.g timestamp=1791000296

Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/odds/pre-match/3954197' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament ยท Odds entry.

FieldTypeDescription
idstringNumeric ID of this item (see the parent object: match, player, tournament, live event, โ€ฆ).
successbooleantrue when the request succeeded.
player1objectPlayer 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there.
player1.namestringPlayer 1 name.
player2objectPlayer 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order.
player2.namestringPlayer 2 name.
roundIdnumberNumeric round ID (see GET /tennis/v2/round): e.g. 4 = First, 5 = Second, 9 = 1/4, 10 = 1/2, 12 = Final; 0โ€“3 are qualifying rounds.
tournamentobjectTournament object (id, name, date, level, surface, country, โ€ฆ).
tournament.namestringTournament name.
startTimestampnumberScheduled start as Unix seconds.
resultobjectResponse payload object documented in the rows below.
result.{market}arrayOdds for one market (market names are dynamic keys, e.g. "Full Time Result").
result.{market}[]objectOne item of `result.{market}`; its fields are listed below.
result.{market}[].marketIdnumberOdds market ID (see GET /tennis/v2/extend/api/markets/all).
result.{market}[].bookmakerstringBookmaker name.
result.{market}[].od1stringDecimal odds for outcome 1 (player 1 / over), as a string. On the best-odds routes this is the best price across bookmakers.
result.{market}[].od2stringDecimal odds for outcome 2 (player 2 / under), as a string. On the best-odds routes this is the best price across bookmakers.
result.{market}[].oddTypestringValue returned by the API for this field.
result.{market}[].addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.{market}[].linestringHandicap/total line, or null.

Open/Close Pre-Match Odds

GET/tennis/v2/extend/api/odds/pre-match/open-close/{eventId}
Returns the opening and closing pre-match odds for a given event, grouped by betting market and bookmaker. Includes opening and closing odds, betting lines, and timestamps to help track odds movements before the match starts.

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/odds/pre-match/open-close/3954197' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament ยท Odds entry.

FieldTypeDescription
successbooleantrue when the request succeeded.
idstringNumeric ID of this item (see the parent object: match, player, tournament, live event, โ€ฆ).
player1objectPlayer 1 (first-listed player). On completed archive rows (results, match history, H2H) player1 is the winner; live-service responses (point-by-point, statistics) keep the live feed's order, so map sides by name or ID there.
player1.namestringPlayer 1 name.
player2objectPlayer 2 (second-listed player). On completed archive rows player2 is the loser; live-service responses keep the live feed's order.
player2.namestringPlayer 2 name.
tournamentobjectTournament object (id, name, date, level, surface, country, โ€ฆ).
tournament.namestringTournament name.
roundIdnumberNumeric round ID (see GET /tennis/v2/round): e.g. 4 = First, 5 = Second, 9 = 1/4, 10 = 1/2, 12 = Final; 0โ€“3 are qualifying rounds.
startTimestampnumberScheduled start as Unix seconds.
resultsarrayList of result items documented in the rows below.
results[]objectOne item of `results`; its fields are listed below.
results[].marketIdnumberOdds market ID (see GET /tennis/v2/extend/api/markets/all).
results[].marketstringMarket name, e.g. "Full Time Result".
results[].bookmakersarrayValue returned by the API for this field.
results[].bookmakers[]objectOne item of `results[].bookmakers`; its fields are listed below.
results[].bookmakers[].bookmakerIdnumberBookmaker ID (see GET /tennis/v2/extend/api/bookmakers/all).
results[].bookmakers[].bookmakerstringBookmaker name.
results[].bookmakers[].openingobjectValue returned by the API for this field.
results[].bookmakers[].opening.od1stringDecimal odds for outcome 1 (player 1 / over), as a string.
results[].bookmakers[].opening.od2stringDecimal odds for outcome 2 (player 2 / under), as a string.
results[].bookmakers[].opening.linestringHandicap or total line for the market (string); empty or null when not applicable.
results[].bookmakers[].opening.addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
results[].bookmakers[].closingobjectValue returned by the API for this field.
results[].bookmakers[].closing.od1stringDecimal odds for outcome 1 (player 1 / over), as a string.
results[].bookmakers[].closing.od2stringDecimal odds for outcome 2 (player 2 / under), as a string.
results[].bookmakers[].closing.linestringHandicap or total line for the market (string); empty or null when not applicable.
results[].bookmakers[].closing.addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).

Arbitrage Opportunities

A price comparison, not a guaranteed profit

The best price for each outcome is the latest stored quote from each bookmaker, so the two sides can come from different times (quoteAgeSeconds, quoteGapSeconds). Only In Play and Not Started events are evaluated: for an ended or inactive event the result has margin and profitPercentage null and reason: "EVENT_NOT_ACTIVE". Check each bookmaker's current price before acting on it.

GET/tennis/v2/extend/api/odds/arbitrage/{eventId}?market_id={marketId}
Compares the best stored odds across bookmakers for each outcome and reports whether they form an arbitrage (margin below 1), with the implied-probability gap and the bookmakers offering those prices.

Path Parameter

ParameterRequiredTypeDescription
eventIdYesinteger
Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731

Query Parameter

ParameterRequiredTypeDescription
market_idNostring
Market โ€” Optional market ID to filter the results. E.g market_id=1. You can see available market list
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/odds/arbitrage/3954197?market_id=1' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
successbooleanIndicates whether the request was successful.
resultobjectContains the calculated arbitrage analysis.
result.arbitragebooleantrue when the best prices across bookmakers form an arbitrage, i.e. margin < 1.
result.marginnumberSum of implied probabilities of the best prices: 1/outcome1.odds + 1/outcome2.odds. Below 1 = arbitrage; 1 or more = no arbitrage. null when the event is not evaluated (see reason).
result.profitPercentagenumberReturn on total stake for equal payouts, in percent: (1 / margin โˆ’ 1) ร— 100. Positive only when arbitrage is true; negative when there is no arbitrage (e.g. margin 1.0174 โ†’ โˆ’1.71). null when the event is not evaluated (see reason). Not a guaranteed return: only if both prices are still available.
result.bestOddsobjectThe highest available odds selected for each outcome.
result.bestOdds.outcome1objectBest available odds for the first outcome.
result.bestOdds.outcome1.bookmakerIdnumberUnique identifier of the bookmaker offering the best odds for outcome 1.
result.bestOdds.outcome1.bookmakerstringName of the bookmaker offering the best odds for outcome 1.
result.bestOdds.outcome1.oddsnumberHighest available decimal odds for outcome 1.
result.bestOdds.outcome2objectBest available odds for the second outcome.
result.bestOdds.outcome2.bookmakerIdnumberUnique identifier of the bookmaker offering the best odds for outcome 2.
result.bestOdds.outcome2.bookmakerstringName of the bookmaker offering the best odds for outcome 2.
result.bestOdds.outcome2.oddsnumberHighest available decimal odds for outcome 2.
result.bookmakersCheckednumberTotal number of bookmakers included in the arbitrage calculation.
result.reasonstring | nullWhy the event was not evaluated, e.g. EVENT_NOT_ACTIVE for an ended or inactive event (only In Play and Not Started events are evaluated). null when evaluated.
result.eventStatus / eventState / matchTypestringThe event's status (InPlay, Not Started, Ended, โ€ฆ) and whether the prices compared are in-play or pre-match.
result.snapshotAt / evaluatedAtnumberUnix seconds: when the compared quotes were taken, and when the result was calculated.
result.quoteAgeSeconds / quoteGapSecondsnumberAge of the older selected quote, and the time between the two selected quotes (they can come from different moments).
result.linestringHandicap or total line for the market (string); empty or null when not applicable.
result.bestOdds.outcome1.addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.bestOdds.outcome2.addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.marketIdnumberOdds market ID (see GET /tennis/v2/extend/api/markets/all).
result.modestringValue returned by the API for this field.
result.historicalbooleanValue returned by the API for this field.
result.startTimestampnumberScheduled start as Unix seconds.