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

â„šī¸
From a fixture to its live data: follow the links

Live endpoints use the live eventId, not the core matchId. You do not need to match records by name: fixture, upcoming and H2H upcoming rows carry links.live (/tennis/v2/matches/{matchId}/live?type=atp|wta), which returns the current status, score and statistics plus the eventId for the routes on this page and Socket.IO. liveMatchId on those rows equals matchId on live rows.

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.

Live Events

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.
matchIdstringplayer1Id-player2Id-tournamentId-roundId. Split on - for the point-by-point path.
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 matches player1 is the winner.
results[].player1.namestringFirst player's name.
results[].player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
results[].player2.namestringSecond player's name.
results[].tournamentobjectTournament object (id, name, date, level, surface, country, â€Ļ).
results[].tournament.namestringTournament name.

Live Event Count

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

Upcoming Live-Feed Events

GET/tennis/v2/extend/api/events/upcoming/{atp|wta}
This example uses atp. Use wtafor 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[].matchIdstringplayer1Id-player2Id-tournamentId-roundId for point-by-point.
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 matches player1 is the winner.
results[].player1.namestringFirst player's name.
results[].player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
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.

Event by Players and Date

GET/tennis/v2/extend/api/event/get/{player1}/{player2}/{date_only}
Retrieve an event by player names and date, including match details, scores, statistics and timeline.

Path Parameter

ParameterRequiredTypeDescription
player1Yesstring
First player display name. E.g: Jannik Sinner
player2Yesstring
Second player display name. E.g: Carlos Alcaraz
date_onlyYesstring
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.statsobjectBasic live statistics.
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 matches player1 is the winner.
result.player1.namestringFirst player's name.
result.player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
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.matchIdstringCore API bridge: "player1Id-player2Id-tournamentId-roundId" (equals liveMatchId on Upcoming Matches rows). Not the live id.
messagestringStatus message, e.g. "Success".

Event by Players

GET/tennis/v2/extend/api/event/get/{player1}/{player2}
Retrieves event data by the two player names. If multiple matching events are found, the latest matched event data is returned. Use the odds=yes query parameter to include the latest available odds for the event 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

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' \
	--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.statsobjectBasic live statistics.
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 matches player1 is the winner.
result.player1.namestringFirst player's name.
result.player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
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.matchIdstringCore API bridge: "player1Id-player2Id-tournamentId-roundId" (equals liveMatchId on Upcoming Matches rows). Not the live id.
messagestringStatus message, e.g. "Success".

Live Score by Event

GET/tennis/v2/extend/api/event/live-score/get/{event_id}
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
event_idYesinteger
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.statsobjectBasic live statistics.
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".

Get Point by Point

GET/tennis/v2/extend/api/event/data/point-by-point/{player1}/{player2}
Returns the point-by-point breakdown of a tennis match, including player names, set scores, individual game results, serving player, tiebreak indicators, and point-by-point scoring progression within each game. Each set contains a list of games with the game number, cumulative set score after the game, server identifier, and scoring sequence, including advantage points and break-point indicators where available. Tiebreak games include their point progression and tiebreak status. The response also provides the final match score and an overall success status.

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/Sebastian%20Baez/Valentin%20Vacherot?date_only=2026-10-10' \
	--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.
player1objectPlayer 1 (first-listed player). On completed matches player1 is the winner.
player1.namestringPlayer 1 name.
player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
player2.namestringPlayer 2 name.
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".

Event Timeline

GET/tennis/v2/extend/api/event/timeline/{event_id}
Retrieves event timeline data.

Path Parameter

ParameterRequiredTypeDescription
event_idYesinteger
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".

Get Match Statistics

GET/tennis/v2/extend/api/event/data/statistics/{player1}/{player2}
Returns detailed statistics for both players, including serving, returning, points, games, aces, double faults, and break-point performance, broken down by set and for the overall match.

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/Sebastian%20Baez/Valentin%20Vacherot?date_only=2026-10-10' \
	--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 matches player1 is the winner.
player1.namestringPlayer 1 name.
player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
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).

Live Odds by Event (Recent Movements)

GET/tennis/v2/extend/api/event/recent-odds/get/{event_id}
Returns the most recent odds for a live event, grouped by market and then bookmaker: od1, od2, odx (draw), line and addTime (when the price was recorded, Unix seconds). event_id is the live event ID from Live Events, not a Core fixture ID. No pagination.

Path Parameter

ParameterRequiredTypeDescription
event_idYesinteger
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/recent-odds/get/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.
messagestringStatus message, e.g. "Success".
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}.odxnullDraw odds where the market has a draw outcome; otherwise null or "0".
result.{market}.{bookmaker}.addTimestringWhen the bookmaker published these odds, as Unix seconds (string).
result.{market}.{bookmaker}.linenullHandicap or total line for the market (string); empty or null when not applicable.

Latest Odds by Event (All Markets)

GET/tennis/v2/extend/api/event/odds/latest-all/{event_id}
Latest live odds for every market, grouped by market then bookmaker. event_id is the live event id from /events/live (results[].id), not a core fixture id. 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
event_idYesinteger
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/latest-all/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
eventIdstringThe live event id you sent.
resultobjectKeyed by market name. Each market is keyed by bookmaker name with od1/od2/odx, addTime, line.
successbooleantrue when the request succeeded.
messagestringStatus message, e.g. "Success".
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}.odxnullDraw odds where the market has a draw outcome; otherwise null or "0".
result.{market}.{bookmaker}.addTimestringWhen the bookmaker published these odds, as Unix seconds (string).
result.{market}.{bookmaker}.linenullHandicap or total line for the market (string); empty or null when not applicable.

Best Live Odds by Event

GET/tennis/v2/extend/api/event/odds/best/{event_id}
Best Full Time Result prices across bookmakers for this live event (highest od1 and od2). Other markets are not returned.

Path Parameter

ParameterRequiredTypeDescription
event_idYesinteger
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/best/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
result.Full Time Result.od1 / od2stringBest moneyline for participant1 / participant2.
result.Full Time Result.od1Bookmaker / od2BookmakerstringBookmaker offering that price.
successbooleantrue when the request succeeded.
messagestringStatus message, e.g. "Success".
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}.od1BookmakerstringBookmaker offering the best od1.
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}.od2BookmakerstringBookmaker offering the best od2.
result.{market}.odxstringDraw odds where the market has a draw outcome; otherwise null or "0".
result.{market}.odxBookmakerstringBookmaker offering the best odx.
result.{market}.linenullHandicap/total line, or null.
result.{market}.updatedAtstringWhen these odds were last updated, as Unix seconds.

Odds by Market Name

GET/tennis/v2/extend/api/event/odds/by-market/{event_id}
Latest odds for one market on a live event, keyed by bookmaker. Query market is the market name string (not market_id). Default is Full Time Result. Take names from /markets/all.

Path Parameter

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

Query Parameter

ParameterRequiredTypeDescription
marketNostring
Market name. Default Full Time Result. Example: Over Under. This is not market_id.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/odds/by-market/3954197?market=Full%20Time%20Result' \
	--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
resultobjectKeyed by bookmaker name. Each value has od1, od2, odx, addTime, line.
successbooleantrue when the request succeeded.
messagestringStatus message, e.g. "Success".
result.{bookmaker}objectOdds from this bookmaker, by market (dynamic key).
result.{bookmaker}.od1stringDecimal odds for outcome 1 (player 1 / over), as a string.
result.{bookmaker}.od2stringDecimal odds for outcome 2 (player 2 / under), as a string.
result.{bookmaker}.odxnullDraw odds where the market has a draw outcome; otherwise null or "0".
result.{bookmaker}.addTimestringWhen the bookmaker published these odds, as Unix seconds (string).
result.{bookmaker}.linenullHandicap or total line for the market (string); empty or null when not applicable.

Latest Odds by Player Names

GET/tennis/v2/extend/api/event/odds/query/{player1}/{player2}
Same latest-odds payload as /event/odds/latest-all/{event_id}, but looked up by URL-encoded display names. Uses the most recent matching event. Names can be in either order.

Path Parameter

ParameterRequiredTypeDescription
player1Yesstring
First player display name. E.g: Jannik Sinner
player2Yesstring
Second player display name. E.g: Carlos Alcaraz
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/event/odds/query/Alexander%20Zverev/Ben%20Shelton' \
	--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
eventIdstringResolved live event id.
startTimestampnumberMatch start time of the resolved event (Unix seconds).
resultsobjectMarkets → bookmakers → od1/od2/addTime/line. Note the key is results, not result.
namestringDisplay name.
successbooleantrue when the request succeeded.
messagestringStatus message, e.g. "Success".
results.{market}objectOdds for one market (dynamic key).
results.{market}.{bookmaker}objectLatest odds from this bookmaker (dynamic key).
results.{market}.{bookmaker}.od1stringDecimal odds for outcome 1 (player 1 / over), as a string.
results.{market}.{bookmaker}.od2stringDecimal odds for outcome 2 (player 2 / under), as a string.
results.{market}.{bookmaker}.odxnullDraw odds where the market has a draw outcome; otherwise null or "0".
results.{market}.{bookmaker}.addTimestringWhen the bookmaker published these odds, as Unix seconds (string).
results.{market}.{bookmaker}.linenullHandicap or total line for the market (string); empty or null when not applicable.

Odds Summary by Event

GET/tennis/v2/extend/api/odds/summary/{event_id}
Opening, kickoff, and latest (end) prices per bookmaker and market. Different from /odds/summary/movements/last-10/{event_id}.

Path Parameter

ParameterRequiredTypeDescription
event_idYesinteger
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/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 / kickoff / end objects (od1, od2, odx, sourceAddTime).
messagestringStatus message, e.g. "Success".
successbooleantrue when the request succeeded.
result.{bookmaker}objectOdds from this bookmaker, by market (dynamic key).
result.{bookmaker}.{market}objectThis bookmaker's odds for the market (dynamic key).
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}.odxnullDraw odds where the market has a draw outcome; otherwise null or "0".
result.{bookmaker}.{market}.{bookmaker}.sourceAddTimenumberWhen the bookmaker published these odds, as Unix seconds.
result.{bookmaker}.{market}.startnullOpening odds for this bookmaker and market.
result.{bookmaker}.{market}.kickoffnullOdds at the scheduled start.

Last 10 Odds Movements

GET/tennis/v2/extend/api/odds/summary/movements/last-10/{event_id}
Retrieves last 10 odds movement across all markets and bookmakers. 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
event_idYesinteger
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/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}[].odxnullDraw odds where the market has a draw outcome; otherwise null or "0".
result.{bookmaker}.{market}[].linestringHandicap/total line, or null.
result.{bookmaker}.{market}[].sourceAddTimestringWhen the bookmaker published these odds, as Unix seconds.

Compare Bookmaker Odds

GET/tennis/v2/extend/api/odds/compare/{event_id}
Compare the latest odds for a specific market across available bookmakers, including bookmaker details, market, line, and current odds.

Path Parameter

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

Query Parameter

ParameterRequiredTypeDescription
market_idYesstring

Market ID — Required market ID used 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/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[].sourceAddTimestringWhen the bookmaker published these odds, as Unix seconds.

Biggest Odds Movements

GET/tennis/v2/extend/api/odds/biggest-movements/{event_id}?market_id={marketId}
Returns the largest odds movements between opening and closing prices across bookmakers and markets for an event.

Path Parameter

ParameterRequiredTypeDescription
event_idYesinteger
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/biggest-movements/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.
countnumberTotal number of odds movement records returned.
resultsarrayList of the biggest odds movements.
results[].marketIdnumberUnique identifier of the betting market.
results[].marketstringName of the betting market.
results[].bookmakerIdnumberUnique identifier of the bookmaker.
results[].bookmakerstringName of the bookmaker.
results[].openingOd1stringOpening decimal odds for outcome 1.
results[].closingOd1stringClosing decimal odds for outcome 1.
results[].openingOd2stringOpening decimal odds for outcome 2.
results[].closingOd2stringClosing decimal odds for outcome 2.
results[].movementOd1stringAbsolute movement in odds for outcome 1.
results[].movementOd2stringAbsolute movement in odds for outcome 2.
results[].biggestMovementstringLargest absolute odds movement between the two outcomes.
results[].selectionstringThe outcome with the largest movement ("outcome1" or "outcome2").

Pre-Match Odds

GET/tennis/v2/extend/api/odds/pre-match/{event_id}
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
event_idYesinteger
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 matches player1 is the winner.
player1.namestringPlayer 1 name.
player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
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}[].addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.{market}[].linenullHandicap/total line, or null.

Pre-Match Historical Odds

GET/tennis/v2/extend/api/odds/pre-match/historical/{event_id}
Retrieve historical pre-match betting odds for a tennis event from available bookmakers. This endpoint allows users to explore how odds have changed over time before a match starts, with optional filters for markets, bookmakers, and timestamp.

Path Parameter

ParameterRequiredTypeDescription
event_idYesinteger
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/historical/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 matches player1 is the winner.
player1.namestringPlayer 1 name.
player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
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}[].addTimenumberWhen the bookmaker published these odds, as Unix seconds (string).
result.{market}[].linenullHandicap/total line, or null.

Pre-Match Open/Close Odds by Event ID

GET/tennis/v2/extend/api/odds/pre-match/open-close/{event_id}
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
event_idYesinteger
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 matches player1 is the winner.
player1.namestringPlayer 1 name.
player2objectPlayer 2 (second-listed player). On completed matches player2 is the loser.
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).

Odds Arbitrage

âš ī¸
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, and an ended or suspended event can still return arbitrage: true. Check the event status (Live Scores, Stats & Odds) and each bookmaker's current price before acting on it.

GET/tennis/v2/extend/api/odds/arbitrage/{event_id}?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
event_idYesinteger
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 (4 decimals). Below 1 = arbitrage; 1 or more = no arbitrage.
result.profitPercentagenumberImplied-probability gap in percent when arbitrage is true: (1 − margin) × 100, 2 decimals. Always 0 when arbitrage is false (never negative). Not a guaranteed return: the return on total stake for equal payouts is (1 / margin − 1) × 100, and 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.

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.

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.

WebSocket Token

âš ī¸
MEGA plan only

MEGA required. FREE, PRO and ULTRA receive HTTP 403 and no token.

GET/tennis/v2/extend/api/ws-token
Returns a Socket.IO auth token for Mega plan subscribers. Use this token (not the RapidAPI key) when connecting to https://live.matchstat.com. Full connect examples are on the Socket.IO page.
Example Request: CURL
curl --request GET \
	--url 'https://tennis-api-atp-wta-itf.p.rapidapi.com/tennis/v2/extend/api/ws-token' \
	--header 'X-RapidAPI-Host: tennis-api-atp-wta-itf.p.rapidapi.com' \
	--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY'

Response Properties

FieldTypeDescription
successbooleantrue when a token was issued.
tokenstringJWT for the Socket.IO handshake (auth.token). Valid for 24 hours. When the socket reports TOKEN_EXPIRED, call this endpoint again and reconnect with the new token.