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).
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 matches â all live events, live count, upcoming live-feed events and finding an event by player names and date.
- Live scores & match stats â live score (set-by-set score, current point, server), match statistics per set and for the whole match (aces, double faults, first and second serve, break points, return points, points and games in a row, tiebreaks) and the event timeline.
- Point-by-point â every point of a match, by IDs or by player names and date.
- Live odds â latest odds for all markets, best odds across bookmakers, recent movements, odds by player names and the live event with best odds.
- Odds analysis â pre-match odds, odds summary, bookmaker comparison, arbitrage and biggest movements.
Live lists are singles; doubles stay on core fixtures.
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.
- 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. matchIdfrom the live event â splitplayer1Id-player2Id-tournamentId-roundIdfor point-by-point. Not the liveid.
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
/tennis/v2/extend/api/events/liveResponse Properties
Shared objects in this response (defined once in Reusable response schemas): Player ¡ Tournament ¡ LiveEvent.
| Field | Type | Description |
|---|---|---|
success | boolean | true when the live request succeeded. |
results | array | Live matches. Empty when nothing is in play. |
count | integer | Number of events in results. |
id | string | Live event ID for odds, timeline, and live score. Not a core fixture ID. |
matchId | string | player1Id-player2Id-tournamentId-roundId. Split on - for the point-by-point path. |
status | string | Match state, e.g. InPlay, Upcoming, Ended. |
score | string | Set score, e.g. 6-4,3-2. |
points | string | Current game points, e.g. 30-15. |
indicator | string | Who is serving / which side is indicated in the current game. |
tourType | string | atp or wta. |
startTimestamp | integer | Scheduled start as Unix seconds (UTC). |
message | string | Status message, e.g. "Success". |
results[].name | string | Match name, "Player A vs Player B". |
results[].participant1 | string | First player's display name. |
results[].participant2 | string | Second player's display name. |
results[].league | string | Tournament name as shown by the live feed, e.g. "M15 Ann Arbor". |
results[].player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
results[].player1.name | string | First player's name. |
results[].player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
results[].player2.name | string | Second player's name. |
results[].tournament | object | Tournament object (id, name, date, level, surface, country, âĻ). |
results[].tournament.name | string | Tournament name. |
Live Event Count
/tennis/v2/extend/api/events/live/countResponse Properties
| Field | Type | Description |
|---|---|---|
success | boolean | true when the request succeeded. |
message | string | Status message, e.g. "Success". |
result | object | Response payload object documented in the rows below. |
result.count | number | Number of items in this response (or matching items, where stated). |
Upcoming Live-Feed Events
/tennis/v2/extend/api/events/upcoming/{atp|wta}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
| Parameter | Required | Type | Description |
|---|---|---|---|
atp|wta | Yes | string | 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
| Parameter | Required | Type | Description |
|---|---|---|---|
page | No | integer | Page number, starting at 1. Default 1. Page size is fixed at 50. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ¡ Tournament.
| Field | Type | Description |
|---|---|---|
success / message | mixed | Request status. |
results | array | Upcoming live-board events. |
results[].id | string | Live event id for odds/timeline routes. |
results[].matchId | string | player1Id-player2Id-tournamentId-roundId for point-by-point. |
pagination | object | page, limit (always 50), total, totalPages, hasNext, hasPrev. Sending limit in the query does not change page size. |
results[].name | string | Match name, "Player A vs Player B". |
results[].participant1 | string | First player's display name. |
results[].participant2 | string | Second player's display name. |
results[].league | string | Tournament name as shown by the live feed, e.g. "M15 Ann Arbor". |
results[].status | string | Event status: InPlay, Not Started or Ended. |
results[].player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
results[].player1.name | string | First player's name. |
results[].player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
results[].player2.name | string | Second player's name. |
results[].tournament | object | Tournament object (id, name, date, level, surface, country, âĻ). |
results[].tournament.name | string | Tournament name. |
results[].tourType | string | Dataset: atp (men) or wta (women). |
results[].startTimestamp | number | Scheduled start as Unix seconds. |
pagination.page | number | Current page. |
pagination.limit | number | Items per page. |
pagination.total | number | Total upcoming events. |
pagination.totalPages | number | Total pages. |
pagination.hasNext | boolean | true when a next page exists. |
pagination.hasPrev | boolean | true when a previous page exists. |
Event by Players and Date
/tennis/v2/extend/api/event/get/{player1}/{player2}/{date_only}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
player1 | Yes | string | First player display name. E.g: Jannik Sinner |
player2 | Yes | string | Second player display name. E.g: Carlos Alcaraz |
date_only | Yes | string | Target date in YYYY-MM-DD format. Example: 2026-01-01. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
odds | No | string | 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. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ¡ Tournament ¡ Plan-restricted field ¡ LiveEvent.
| Field | Type | Description |
|---|---|---|
success | boolean | true when the request succeeded. |
result | object | Response payload object documented in the rows below. |
result.id | string | Live event ID. |
result.name | string | Name of the matching player or tournament. |
result.participant1 | string | First player's display name. |
result.participant2 | string | Second player's display name. |
result.league | string | Tournament name as shown by the live feed, e.g. "M15 Ann Arbor". |
result.score | string | Set score so far, e.g. "6-4,3-2". |
result.status | string | Event status: InPlay, Not Started or Ended. |
result.points | string | Points 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.indicator | string | Who is serving, as "p1,p2": "1,0" = player 1 serving, "0,1" = player 2 serving. |
result.stats | object | Basic live statistics. |
result.stats.aces | array | Aces: [participant1, participant2] as strings. |
result.stats.double_faults | array | Double faults: [participant1, participant2] as strings. |
result.stats.win_1st_serve | array | First-serve points won %: [participant1, participant2] as strings. |
result.stats.break_point_conversions | array | Break-point conversion %: [participant1, participant2] as strings. |
result.timeline | array | Timeline events. |
result.timeline[] | object | One item of `result.timeline`; its fields are listed below. |
result.timeline[].id | string | Unique timeline event ID. |
result.timeline[].text | string | Human-readable event text, e.g. "Game 1 - Alexander Zverev - breaks to 30". |
result.player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
result.player1.name | string | First player's name. |
result.player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
result.player2.name | string | Second player's name. |
result.tournament | object | Tournament object (id, name, date, level, surface, country, âĻ). |
result.tournament.name | string | Tournament name. |
result.tourType | string | Dataset: atp (men) or wta (women). |
result.startTimestamp | number | Scheduled start as Unix seconds. |
result.roundId | number | Numeric 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.matchId | string | Core API bridge: "player1Id-player2Id-tournamentId-roundId" (equals liveMatchId on Upcoming Matches rows). Not the live id. |
message | string | Status message, e.g. "Success". |
Event by Players
/tennis/v2/extend/api/event/get/{player1}/{player2}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
player1 | Yes | string | First player display name. E.g: Jannik Sinner |
player2 | Yes | string | Second player display name. E.g: Carlos Alcaraz |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
odds | No | string | 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. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ¡ Tournament ¡ Plan-restricted field ¡ LiveEvent.
| Field | Type | Description |
|---|---|---|
success | boolean | true when the request succeeded. |
result | object | Response payload object documented in the rows below. |
result.id | string | Live event ID. |
result.name | string | Name of the matching player or tournament. |
result.participant1 | string | First player's display name. |
result.participant2 | string | Second player's display name. |
result.league | string | Tournament name as shown by the live feed, e.g. "M15 Ann Arbor". |
result.score | string | Set score so far, e.g. "6-4,3-2". |
result.status | string | Event status: InPlay, Not Started or Ended. |
result.points | string | Points 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.indicator | string | Who is serving, as "p1,p2": "1,0" = player 1 serving, "0,1" = player 2 serving. |
result.stats | object | Basic live statistics. |
result.stats.aces | array | Aces: [participant1, participant2] as strings. |
result.stats.double_faults | array | Double faults: [participant1, participant2] as strings. |
result.stats.win_1st_serve | array | First-serve points won %: [participant1, participant2] as strings. |
result.stats.break_point_conversions | array | Break-point conversion %: [participant1, participant2] as strings. |
result.timeline | array | Timeline events. |
result.timeline[] | object | One item of `result.timeline`; its fields are listed below. |
result.timeline[].id | string | Unique timeline event ID. |
result.timeline[].text | string | Human-readable event text, e.g. "Game 1 - Alexander Zverev - breaks to 30". |
result.player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
result.player1.name | string | First player's name. |
result.player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
result.player2.name | string | Second player's name. |
result.tournament | object | Tournament object (id, name, date, level, surface, country, âĻ). |
result.tournament.name | string | Tournament name. |
result.tourType | string | Dataset: atp (men) or wta (women). |
result.startTimestamp | number | Scheduled start as Unix seconds. |
result.roundId | number | Numeric 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.matchId | string | Core API bridge: "player1Id-player2Id-tournamentId-roundId" (equals liveMatchId on Upcoming Matches rows). Not the live id. |
message | string | Status message, e.g. "Success". |
Live Score by Event
/tennis/v2/extend/api/event/live-score/get/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Plan-restricted field ¡ LiveEvent.
| Field | Type | Description |
|---|---|---|
success | boolean | true when the request succeeded. |
result | object | Response payload object documented in the rows below. |
result.id | string | Live event ID. |
result.participant1 | string | First player's display name. |
result.participant2 | string | Second player's display name. |
result.indicator | string | Who is serving, as "p1,p2": "1,0" = player 1 serving, "0,1" = player 2 serving. |
result.score | string | Set score so far, e.g. "6-4,3-2". |
result.points | string | Points 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.stats | object | Basic live statistics. |
result.stats.aces | array | Aces: [participant1, participant2] as strings. |
result.stats.double_faults | array | Double faults: [participant1, participant2] as strings. |
result.stats.win_1st_serve | array | First-serve points won %: [participant1, participant2] as strings. |
result.stats.break_point_conversions | array | Break-point conversion %: [participant1, participant2] as strings. |
result.timeline | array | Timeline events. |
result.timeline[] | object | One item of `result.timeline`; its fields are listed below. |
result.timeline[].id | string | Unique timeline event ID. |
result.timeline[].text | string | Human-readable event text, e.g. "Game 1 - Alexander Zverev - breaks to 30". |
result.status | string | Event status: InPlay, Not Started or Ended. |
message | string | Status message, e.g. "Success". |
Get Point by Point
/tennis/v2/extend/api/event/data/point-by-point/{player1}/{player2}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
player1 | Yes | string | First player display name. E.g: Jannik Sinner |
player2 | Yes | string | Second player display name. E.g: Carlos Alcaraz |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
date_only | No | string | Target date in YYYY-MM-DD format. Example: date_only=2026-01-01. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ¡ Point-by-point set and game.
| Field | Type | Description |
|---|---|---|
success | boolean | true when the request succeeded. |
player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
player1.name | string | Player 1 name. |
player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
player2.name | string | Player 2 name. |
result | object | Response payload object documented in the rows below. |
result.sets | array | Sets with their games (point-by-point). |
result.sets[] | object | One item of `result.sets`; its fields are listed below. |
result.sets[].games | array | Games of the set in order. |
result.sets[].games[] | object | One item of `result.sets[].games`; its fields are listed below. |
result.sets[].games[].server | number | Who served the game: 1 = player 1, 2 = player 2, 0 = unknown. |
result.sets[].games[].tiebreak | boolean | true when this game is a tiebreak. |
result.sets[].games[].finalScore | string | Games score in the set after this game, e.g. "3-2". |
result.sets[].games[].gameNumber | number | Game number within the set (1-based). |
result.sets[].games[].fifteens_content | string | Point-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[].setScore | string | Final score of the set, e.g. "6-3" or "7-6"; empty while the set is in progress. |
result.sets[].setNumber | number | Set number (1-based). |
result.score | string | Set score so far, e.g. "6-4,3-2". |
Event Timeline
/tennis/v2/extend/api/event/timeline/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Response Properties
| Field | Type | Description |
|---|---|---|
results | array | Timeline events in chronological order. |
results[].id | string | Unique timeline event ID. |
results[].text | string | Human-readable match event, e.g. a hold, break or tiebreak result ("Game 1 - Alexander Zverev - breaks to 30"). |
success | boolean | true when the request succeeded. |
message | string | Status message, e.g. "Success". |
Get Match Statistics
/tennis/v2/extend/api/event/data/statistics/{player1}/{player2}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
player1 | Yes | string | First player display name. E.g: Jannik Sinner |
player2 | Yes | string | Second player display name. E.g: Carlos Alcaraz |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
date_only | No | string | Target date in YYYY-MM-DD format. Example: date_only=2026-01-01. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ¡ Statistics metric.
| Field | Type | Description |
|---|---|---|
success | boolean | true when the request succeeded. |
player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
player1.name | string | Player 1 name. |
player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
player2.name | string | Player 2 name. |
statistics | object | Match statistics by period, category and metric (see the statistics rows). |
statistics.{period} | object | Statistics for one period: 1ST, 2ND, âĻ = that set; ALL = whole match. |
statistics.{period}.{category}.{metric}.{player} | object | The metric for player1 and player2 (keys player1 / player2; same shape for every metric). |
statistics.{period}.{category}.{metric}.{player}.value | number | Count for the metric (e.g. aces, points won, serves landed). Present on every metric. |
statistics.{period}.{category}.{metric}.{player}.total | number | What value is out of (e.g. serves attempted, points played). Only on ratio metrics. |
statistics.{period}.{category}.{metric}.{player}.percentage | number | value as a percentage of total. Only on ratio metrics. |
statistics.{period}.games | object | Games category. |
statistics.{period}.games.maxGamesInRow | object | Most consecutive games won. |
statistics.{period}.points | object | Points category. |
statistics.{period}.points.maxPointsInRow | object | Most consecutive points won. |
statistics.{period}.points.servicePointsScored | object | Points won on own serve. |
statistics.{period}.points.receiverPointsScored | object | Points won while returning. |
statistics.{period}.return | object | Return category. |
statistics.{period}.return.returnGamesTotal | object | Return games played. |
statistics.{period}.return.breakPointsScored | object | Break points converted (break points won as returner). |
statistics.{period}.return.firstReturnPoints | object | Points won returning first serve: value = won, total = played. |
statistics.{period}.return.secondReturnPoints | object | Points won returning second serve: value = won, total = played. |
statistics.{period}.service | object | Service category. |
statistics.{period}.service.aces | object | Aces. |
statistics.{period}.service.doubleFaults | object | Double faults. |
statistics.{period}.service.breakPointsSaved | object | Break points saved: value = saved, total = faced. |
statistics.{period}.service.serviceGamesTotal | object | Service games played. |
statistics.{period}.service.firstServeAccuracy | object | First serves landed in: value = in, total = attempted (serve accuracy, not points won). |
statistics.{period}.service.secondServeAccuracy | object | Second serves landed in: value = in, total = attempted. |
statistics.{period}.service.firstServePointsAccuracy | object | Points won behind the first serve: value = won, total = first serves in. |
statistics.{period}.service.secondServePointsAccuracy | object | Points won behind the second serve: value = won, total = second serves played. |
statistics.{period}.miscellaneous | object | Other metrics (tiebreaks). |
statistics.{period}.miscellaneous.tiebreaks | object | Tiebreaks won. |
statistics.{period}.games.gamesWon | object | Games won. |
statistics.{period}.games.serviceGamesWon | object | Service games won (held). |
statistics.{period}.points.pointsTotal | object | Total points won. |
dateOnly | string | Match date (YYYY-MM-DD). |
Live Odds by Event (Recent Movements)
/tennis/v2/extend/api/event/recent-odds/get/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Odds entry.
| Field | Type | Description |
|---|---|---|
success | boolean | true when the request succeeded. |
message | string | Status message, e.g. "Success". |
result | object | Response payload object documented in the rows below. |
result.{market} | object | Odds for one market (market names are dynamic keys, e.g. "Full Time Result"). |
result.{market}.{bookmaker} | object | Latest odds from this bookmaker (bookmaker names are dynamic keys). |
result.{market}.{bookmaker}.od1 | string | Decimal odds for outcome 1 (player 1 / over), as a string. |
result.{market}.{bookmaker}.od2 | string | Decimal odds for outcome 2 (player 2 / under), as a string. |
result.{market}.{bookmaker}.odx | null | Draw odds where the market has a draw outcome; otherwise null or "0". |
result.{market}.{bookmaker}.addTime | string | When the bookmaker published these odds, as Unix seconds (string). |
result.{market}.{bookmaker}.line | null | Handicap or total line for the market (string); empty or null when not applicable. |
Latest Odds by Event (All Markets)
/tennis/v2/extend/api/event/odds/latest-all/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Odds entry.
| Field | Type | Description |
|---|---|---|
eventId | string | The live event id you sent. |
result | object | Keyed by market name. Each market is keyed by bookmaker name with od1/od2/odx, addTime, line. |
success | boolean | true when the request succeeded. |
message | string | Status message, e.g. "Success". |
result.{market} | object | Odds for one market (market names are dynamic keys, e.g. "Full Time Result"). |
result.{market}.{bookmaker} | object | Latest odds from this bookmaker (bookmaker names are dynamic keys). |
result.{market}.{bookmaker}.od1 | string | Decimal odds for outcome 1 (player 1 / over), as a string. |
result.{market}.{bookmaker}.od2 | string | Decimal odds for outcome 2 (player 2 / under), as a string. |
result.{market}.{bookmaker}.odx | null | Draw odds where the market has a draw outcome; otherwise null or "0". |
result.{market}.{bookmaker}.addTime | string | When the bookmaker published these odds, as Unix seconds (string). |
result.{market}.{bookmaker}.line | null | Handicap or total line for the market (string); empty or null when not applicable. |
Best Live Odds by Event
/tennis/v2/extend/api/event/odds/best/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Odds entry.
| Field | Type | Description |
|---|---|---|
result.Full Time Result.od1 / od2 | string | Best moneyline for participant1 / participant2. |
result.Full Time Result.od1Bookmaker / od2Bookmaker | string | Bookmaker offering that price. |
success | boolean | true when the request succeeded. |
message | string | Status message, e.g. "Success". |
result | object | Response payload object documented in the rows below. |
result.{market} | object | Odds for one market (market names are dynamic keys, e.g. "Full Time Result"). |
result.{market}.od1 | string | Decimal odds for outcome 1 (player 1 / over), as a string. On the best-odds routes this is the best price across bookmakers. |
result.{market}.od1Bookmaker | string | Bookmaker offering the best od1. |
result.{market}.od2 | string | Decimal odds for outcome 2 (player 2 / under), as a string. On the best-odds routes this is the best price across bookmakers. |
result.{market}.od2Bookmaker | string | Bookmaker offering the best od2. |
result.{market}.odx | string | Draw odds where the market has a draw outcome; otherwise null or "0". |
result.{market}.odxBookmaker | string | Bookmaker offering the best odx. |
result.{market}.line | null | Handicap/total line, or null. |
result.{market}.updatedAt | string | When these odds were last updated, as Unix seconds. |
Odds by Market Name
/tennis/v2/extend/api/event/odds/by-market/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
market | No | string | Market name. Default Full Time Result. Example: Over Under. This is not market_id. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Odds entry.
| Field | Type | Description |
|---|---|---|
result | object | Keyed by bookmaker name. Each value has od1, od2, odx, addTime, line. |
success | boolean | true when the request succeeded. |
message | string | Status message, e.g. "Success". |
result.{bookmaker} | object | Odds from this bookmaker, by market (dynamic key). |
result.{bookmaker}.od1 | string | Decimal odds for outcome 1 (player 1 / over), as a string. |
result.{bookmaker}.od2 | string | Decimal odds for outcome 2 (player 2 / under), as a string. |
result.{bookmaker}.odx | null | Draw odds where the market has a draw outcome; otherwise null or "0". |
result.{bookmaker}.addTime | string | When the bookmaker published these odds, as Unix seconds (string). |
result.{bookmaker}.line | null | Handicap or total line for the market (string); empty or null when not applicable. |
Latest Odds by Player Names
/tennis/v2/extend/api/event/odds/query/{player1}/{player2}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
player1 | Yes | string | First player display name. E.g: Jannik Sinner |
player2 | Yes | string | Second player display name. E.g: Carlos Alcaraz |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Odds entry.
| Field | Type | Description |
|---|---|---|
eventId | string | Resolved live event id. |
startTimestamp | number | Match start time of the resolved event (Unix seconds). |
results | object | Markets â bookmakers â od1/od2/addTime/line. Note the key is results, not result. |
name | string | Display name. |
success | boolean | true when the request succeeded. |
message | string | Status message, e.g. "Success". |
results.{market} | object | Odds for one market (dynamic key). |
results.{market}.{bookmaker} | object | Latest odds from this bookmaker (dynamic key). |
results.{market}.{bookmaker}.od1 | string | Decimal odds for outcome 1 (player 1 / over), as a string. |
results.{market}.{bookmaker}.od2 | string | Decimal odds for outcome 2 (player 2 / under), as a string. |
results.{market}.{bookmaker}.odx | null | Draw odds where the market has a draw outcome; otherwise null or "0". |
results.{market}.{bookmaker}.addTime | string | When the bookmaker published these odds, as Unix seconds (string). |
results.{market}.{bookmaker}.line | null | Handicap or total line for the market (string); empty or null when not applicable. |
Odds Summary by Event
/tennis/v2/extend/api/odds/summary/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Odds entry.
| Field | Type | Description |
|---|---|---|
result | object | Bookmaker â market â start / kickoff / end objects (od1, od2, odx, sourceAddTime). |
message | string | Status message, e.g. "Success". |
success | boolean | true when the request succeeded. |
result.{bookmaker} | object | Odds from this bookmaker, by market (dynamic key). |
result.{bookmaker}.{market} | object | This bookmaker's odds for the market (dynamic key). |
result.{bookmaker}.{market}.{bookmaker} | object | Latest odds from this bookmaker (dynamic key). |
result.{bookmaker}.{market}.{bookmaker}.od1 | string | Decimal odds for outcome 1 (player 1 / over), as a string. |
result.{bookmaker}.{market}.{bookmaker}.od2 | string | Decimal odds for outcome 2 (player 2 / under), as a string. |
result.{bookmaker}.{market}.{bookmaker}.odx | null | Draw odds where the market has a draw outcome; otherwise null or "0". |
result.{bookmaker}.{market}.{bookmaker}.sourceAddTime | number | When the bookmaker published these odds, as Unix seconds. |
result.{bookmaker}.{market}.start | null | Opening odds for this bookmaker and market. |
result.{bookmaker}.{market}.kickoff | null | Odds at the scheduled start. |
Last 10 Odds Movements
/tennis/v2/extend/api/odds/summary/movements/last-10/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Odds entry.
| Field | Type | Description |
|---|---|---|
success | boolean | true when the request succeeded. |
result | object | Response payload object documented in the rows below. |
result.{bookmaker} | object | Odds from this bookmaker, by market (dynamic key). |
result.{bookmaker}.{market} | array | This bookmaker's odds for the market (dynamic key). |
result.{bookmaker}.{market}[] | object | One item of `result.{bookmaker}.{market}`; its fields are listed below. |
result.{bookmaker}.{market}[].od1 | string | Decimal 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}[].od2 | string | Decimal 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}[].odx | null | Draw odds where the market has a draw outcome; otherwise null or "0". |
result.{bookmaker}.{market}[].line | string | Handicap/total line, or null. |
result.{bookmaker}.{market}[].sourceAddTime | string | When the bookmaker published these odds, as Unix seconds. |
Compare Bookmaker Odds
/tennis/v2/extend/api/odds/compare/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
market_id | Yes | string | Market ID â Required market ID used to filter the results. E.g. market_id=1 You can see available market list |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Odds entry.
| Field | Type | Description |
|---|---|---|
success | boolean | true when the request succeeded. |
count | number | Number of items in this response (or matching items, where stated). |
results | array | List of result items documented in the rows below. |
results[] | object | One item of `results`; its fields are listed below. |
results[].bookmakerId | number | Bookmaker ID (see GET /tennis/v2/extend/api/bookmakers/all). |
results[].bookmaker | string | Bookmaker name. |
results[].market | string | Market name, e.g. "Full Time Result". |
results[].line | string | Handicap or total line for the market (string); empty or null when not applicable. |
results[].od1 | string | Decimal odds for outcome 1 (player 1 / over), as a string. |
results[].od2 | string | Decimal odds for outcome 2 (player 2 / under), as a string. |
results[].sourceAddTime | string | When the bookmaker published these odds, as Unix seconds. |
Biggest Odds Movements
/tennis/v2/extend/api/odds/biggest-movements/{event_id}?market_id={marketId}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
market_id | No | string | Market â Optional market ID to filter the results. E.g market_id=1 You can see available market list |
Response Properties
| Field | Type | Description |
|---|---|---|
success | boolean | Indicates whether the request was successful. |
count | number | Total number of odds movement records returned. |
results | array | List of the biggest odds movements. |
results[].marketId | number | Unique identifier of the betting market. |
results[].market | string | Name of the betting market. |
results[].bookmakerId | number | Unique identifier of the bookmaker. |
results[].bookmaker | string | Name of the bookmaker. |
results[].openingOd1 | string | Opening decimal odds for outcome 1. |
results[].closingOd1 | string | Closing decimal odds for outcome 1. |
results[].openingOd2 | string | Opening decimal odds for outcome 2. |
results[].closingOd2 | string | Closing decimal odds for outcome 2. |
results[].movementOd1 | string | Absolute movement in odds for outcome 1. |
results[].movementOd2 | string | Absolute movement in odds for outcome 2. |
results[].biggestMovement | string | Largest absolute odds movement between the two outcomes. |
results[].selection | string | The outcome with the largest movement ("outcome1" or "outcome2"). |
Pre-Match Odds
/tennis/v2/extend/api/odds/pre-match/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
market_ids | No | string | 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_ids | No | string | 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 |
timestamp | No | string | Timestamp â Optional timestamp to filter the results. For example: 1791000296. If omitted, odds from all available timestamps are returned. E.g timestamp=1791000296 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ¡ Tournament ¡ Odds entry.
| Field | Type | Description |
|---|---|---|
id | string | Numeric ID of this item (see the parent object: match, player, tournament, live event, âĻ). |
success | boolean | true when the request succeeded. |
player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
player1.name | string | Player 1 name. |
player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
player2.name | string | Player 2 name. |
roundId | number | Numeric 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. |
tournament | object | Tournament object (id, name, date, level, surface, country, âĻ). |
tournament.name | string | Tournament name. |
startTimestamp | number | Scheduled start as Unix seconds. |
result | object | Response payload object documented in the rows below. |
result.{market} | array | Odds for one market (market names are dynamic keys, e.g. "Full Time Result"). |
result.{market}[] | object | One item of `result.{market}`; its fields are listed below. |
result.{market}[].marketId | number | Odds market ID (see GET /tennis/v2/extend/api/markets/all). |
result.{market}[].bookmaker | string | Bookmaker name. |
result.{market}[].od1 | string | Decimal odds for outcome 1 (player 1 / over), as a string. On the best-odds routes this is the best price across bookmakers. |
result.{market}[].od2 | string | Decimal odds for outcome 2 (player 2 / under), as a string. On the best-odds routes this is the best price across bookmakers. |
result.{market}[].addTime | number | When the bookmaker published these odds, as Unix seconds (string). |
result.{market}[].line | null | Handicap/total line, or null. |
Pre-Match Historical Odds
/tennis/v2/extend/api/odds/pre-match/historical/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
market_ids | No | string | 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_ids | No | string | 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 |
timestamp | No | string | Timestamp â Optional timestamp to filter the results. For example: 1791000296. If omitted, odds from all available timestamps are returned. E.g timestamp=1791000296 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ¡ Tournament ¡ Odds entry.
| Field | Type | Description |
|---|---|---|
id | string | Numeric ID of this item (see the parent object: match, player, tournament, live event, âĻ). |
success | boolean | true when the request succeeded. |
player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
player1.name | string | Player 1 name. |
player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
player2.name | string | Player 2 name. |
roundId | number | Numeric 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. |
tournament | object | Tournament object (id, name, date, level, surface, country, âĻ). |
tournament.name | string | Tournament name. |
startTimestamp | number | Scheduled start as Unix seconds. |
result | object | Response payload object documented in the rows below. |
result.{market} | array | Odds for one market (market names are dynamic keys, e.g. "Full Time Result"). |
result.{market}[] | object | One item of `result.{market}`; its fields are listed below. |
result.{market}[].marketId | number | Odds market ID (see GET /tennis/v2/extend/api/markets/all). |
result.{market}[].bookmaker | string | Bookmaker name. |
result.{market}[].od1 | string | Decimal odds for outcome 1 (player 1 / over), as a string. On the best-odds routes this is the best price across bookmakers. |
result.{market}[].od2 | string | Decimal odds for outcome 2 (player 2 / under), as a string. On the best-odds routes this is the best price across bookmakers. |
result.{market}[].addTime | number | When the bookmaker published these odds, as Unix seconds (string). |
result.{market}[].line | null | Handicap/total line, or null. |
Pre-Match Open/Close Odds by Event ID
/tennis/v2/extend/api/odds/pre-match/open-close/{event_id}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ¡ Tournament ¡ Odds entry.
| Field | Type | Description |
|---|---|---|
success | boolean | true when the request succeeded. |
id | string | Numeric ID of this item (see the parent object: match, player, tournament, live event, âĻ). |
player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
player1.name | string | Player 1 name. |
player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
player2.name | string | Player 2 name. |
tournament | object | Tournament object (id, name, date, level, surface, country, âĻ). |
tournament.name | string | Tournament name. |
roundId | number | Numeric 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. |
startTimestamp | number | Scheduled start as Unix seconds. |
results | array | List of result items documented in the rows below. |
results[] | object | One item of `results`; its fields are listed below. |
results[].marketId | number | Odds market ID (see GET /tennis/v2/extend/api/markets/all). |
results[].market | string | Market name, e.g. "Full Time Result". |
results[].bookmakers | array | Value returned by the API for this field. |
results[].bookmakers[] | object | One item of `results[].bookmakers`; its fields are listed below. |
results[].bookmakers[].bookmakerId | number | Bookmaker ID (see GET /tennis/v2/extend/api/bookmakers/all). |
results[].bookmakers[].bookmaker | string | Bookmaker name. |
results[].bookmakers[].opening | object | Value returned by the API for this field. |
results[].bookmakers[].opening.od1 | string | Decimal odds for outcome 1 (player 1 / over), as a string. |
results[].bookmakers[].opening.od2 | string | Decimal odds for outcome 2 (player 2 / under), as a string. |
results[].bookmakers[].opening.line | string | Handicap or total line for the market (string); empty or null when not applicable. |
results[].bookmakers[].opening.addTime | number | When the bookmaker published these odds, as Unix seconds (string). |
results[].bookmakers[].closing | object | Value returned by the API for this field. |
results[].bookmakers[].closing.od1 | string | Decimal odds for outcome 1 (player 1 / over), as a string. |
results[].bookmakers[].closing.od2 | string | Decimal odds for outcome 2 (player 2 / under), as a string. |
results[].bookmakers[].closing.line | string | Handicap or total line for the market (string); empty or null when not applicable. |
results[].bookmakers[].closing.addTime | number | When the bookmaker published these odds, as Unix seconds (string). |
Odds Arbitrage
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.
/tennis/v2/extend/api/odds/arbitrage/{event_id}?market_id={marketId}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
event_id | Yes | integer | Live event ID from GET /events/live (results[].id). Not a core fixture id. Example: 3815731 |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
market_id | No | string | Market â Optional market ID to filter the results. E.g market_id=1 You can see available market list |
Response Properties
| Field | Type | Description |
|---|---|---|
success | boolean | Indicates whether the request was successful. |
result | object | Contains the calculated arbitrage analysis. |
result.arbitrage | boolean | true when the best prices across bookmakers form an arbitrage, i.e. margin < 1. |
result.margin | number | Sum of implied probabilities of the best prices: 1/outcome1.odds + 1/outcome2.odds (4 decimals). Below 1 = arbitrage; 1 or more = no arbitrage. |
result.profitPercentage | number | Implied-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.bestOdds | object | The highest available odds selected for each outcome. |
result.bestOdds.outcome1 | object | Best available odds for the first outcome. |
result.bestOdds.outcome1.bookmakerId | number | Unique identifier of the bookmaker offering the best odds for outcome 1. |
result.bestOdds.outcome1.bookmaker | string | Name of the bookmaker offering the best odds for outcome 1. |
result.bestOdds.outcome1.odds | number | Highest available decimal odds for outcome 1. |
result.bestOdds.outcome2 | object | Best available odds for the second outcome. |
result.bestOdds.outcome2.bookmakerId | number | Unique identifier of the bookmaker offering the best odds for outcome 2. |
result.bestOdds.outcome2.bookmaker | string | Name of the bookmaker offering the best odds for outcome 2. |
result.bestOdds.outcome2.odds | number | Highest available decimal odds for outcome 2. |
result.bookmakersChecked | number | Total number of bookmakers included in the arbitrage calculation. |
Bookmakers
/tennis/v2/extend/api/bookmakers/allResponse Properties
| Field | Type | Description |
|---|---|---|
results[].id | string | Bookmaker ID (use as bookmakerId; numeric string). |
results[].name | string | Bookmaker display name. |
results[].slug | string | URL/code-friendly bookmaker identifier, e.g. "bet365". |
success | boolean | true when the request succeeded. |
results | array | List of result items documented in the rows below. |
results[] | object | One item of `results`; its fields are listed below. |
Odds Markets
/tennis/v2/extend/api/markets/allResponse Properties
| Field | Type | Description |
|---|---|---|
results[].id | string | Market ID (use as market_id / marketId; numeric string). |
results[].key | string | Short market key/code, e.g. "13_1". |
results[].name | string | Market name, e.g. "Full Time Result". Use this name for odds/by-market?market=âĻ |
success | boolean | true when the request succeeded. |
results | array | List of result items documented in the rows below. |
results[] | object | One item of `results`; its fields are listed below. |
WebSocket Token
MEGA required. FREE, PRO and ULTRA receive HTTP 403 and no token.
/tennis/v2/extend/api/ws-tokenResponse Properties
| Field | Type | Description |
|---|---|---|
success | boolean | true when a token was issued. |
token | string | JWT 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. |