API Reference
Upcoming Matches (With Predictions & Odds Data)
Use this section when you need upcoming matches enriched with basic bookmaker odds and prediction-related data. Only the SportsAPI365 model win probabilities (modelPrediction) require ULTRA or MEGA. If you only need scheduled matches and factual match/H2H data, use Upcoming Matches.
- All plans: every endpoint and field on this page except the two rules below, including full-market
odds,preMatchOdds, bookmaker-impliedpredictionSummaryand Match Odds (All Markets). - ULTRA / MEGA: the SportsAPI365 model win probabilities โ
modelPredictionon upcoming rows and H2H Model Prediction. On FREE / PRO,modelPredictionstays visible as aplan_restrictedobject ("Upgrade Plan to see this", HTTP 200). - MEGA only: the written analysis โ Match Prediction & Analysis Paragraph (also by matchId) and H2H Prediction Analysis.
Upcoming rows carry links.match and links.live (/tennis/v2/matches/{matchId}/live?type=atp|wta), which returns the current status, score and statistics plus the live eventId used by the live endpoints and Socket.IO. liveMatchId on upcoming rows equals matchId on live rows. You do not need to match records by player names, tournament and date.
predictionSummary is the bookmaker-implied view (legacy key kept for compatibility). SportsAPI365 model win probabilities are exposed separately as modelPrediction when available. Do not mix the two.
All Upcoming Matches
Available on all plans, including full-market odds, preMatchOdds and predictionSummary (these two are opt-in: add include=preMatchOdds,predictionSummary). Only the SportsAPI365 modelPrediction (win probabilities) requires ULTRA or MEGA; on FREE / PRO it is a plan_restricted object. On ULTRA / MEGA it shows available: false for matches the model has not scored (doubles, and matches without a scheduled start time).
/tennis/v2/upcoming/matchesQuery Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
date | No | string | Lower bound, not a single day: returns upcoming matches that start after this date/time (plus matches with no time set yet). Default: now. YYYY-MM-DD or an ISO-8601 date-time; an invalid date returns 400. For one day's schedule use Fixtures by Date. Example: date=2026-09-15. |
group | No | string | singles or doubles only on upcoming lists. |
sortBy | No | string | Set sortBy=h2h to order by head-to-head interest. |
rank | No | string | Tournament level name from /upcoming/filters. Example: ATP 250. |
playerRank | No | string | Filter by player ranking band when the list supports it. Example: playerRank=1-50. |
autoPost | No | boolean | Optional flag. Default false. Example: autoPost=true. |
tournament | No | string | Filter by tournament name. Example: Monte-Carlo Rolex Masters - Monte-Carlo |
includeAll | No | boolean | Include Challenger/ITF and full history where supported. Example: includeAll=true |
include | No | string | Additive only. Comma-separated: preMatchOdds, predictionSummary, all. Default already includes matchId and h2hSummary. Example: include=preMatchOdds,predictionSummary. |
page | No | integer | Page number, starting at 1. pageNo is accepted as an alias on every route. Example: page=1 |
limit | No | integer | Results per page. pageSize is accepted as an alias on every route. Default varies by endpoint. Example: limit=10 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament ยท Plan-restricted field.
| Field | Type | Description |
|---|---|---|
total | integer | Total matches matching the filter. |
matches | array | Page of upcoming matches. |
page / pageNo / pageSize / limit / hasNextPage / totalPages | mixed | Pagination (advanced family uses page + limit; pageNo/pageSize are also returned). |
matches[].id / matchId | integer | Match ID for this upcoming row. Use with GET /tennis/v2/matches/{matchId} and /prediction, /odds, /stats, /live. |
matches[].liveMatchId | string | This match's key in the live service and Socket.IO: "player1Id-player2Id-tournamentId-roundId". Equals matchId on live rows and event-update. |
matches[].links.match / links.live | string | Ready-to-call paths: the match detail route, and the live route that returns the live score, statistics, timeline and live eventId once the match is in the live feed ({} before). |
matches[].tournament | object | id, name, date, rankId, country, court. |
matches[].date | string | Scheduled start ISO-8601 UTC. |
matches[].player1 / player2 | object | id, name, odd, countryAcr, seed, image. player1 is first-listed, not predicted winner. |
matches[].odds | object | Full bookmaker markets when present (k1, k2, total, ktm, ktb, โฆ) โ see odds glossary. All plans; preMatchOdds repeats the match-winner prices. |
matches[].h2h | string | Career H2H as player1Wins-player2Wins string, e.g. 4-1. |
matches[].h2hSummary | object | Additive factual H2H: matchCount, player1Wins, player2Wins (always present on upcoming lists). |
matches[].preMatchOdds | object | Additive. Only when include=preMatchOdds (or include=all): player1, player2 (match-winner odds) and updatedAt, which is always null because the odds source has no update time. |
matches[].predictionSummary | object | Additive when include=predictionSummary|all. Bookmaker-implied view (source=oddsImplied): predictedWinnerId, bookmakerOdds, player1ImpliedProbability, player2ImpliedProbability, normalized. |
matches[].modelPrediction | object | Always present. ULTRA/MEGA: SportsAPI365 model view (available, source, predictedWinnerId, player1WinProbability, player2WinProbability). FREE/PRO: plan_restricted stub with message "Upgrade Plan to see this" (field kept visible; not null). Separate from predictionSummary. |
matches[].links | object | Ready-made URLs for this match's detail routes. |
matches[].tournament.id | number | Tournament season ID. |
matches[].tournament.name | string | Tournament name. |
matches[].tournament.date | string | Tournament start date (ISO-8601 UTC). |
matches[].tournament.rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, โฆ |
matches[].tournament.country | string | Country of the tournament: three-letter code, or { name, acronym }. |
matches[].tournament.court | object | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
matches[].tournament.court.name | string | Court surface name, e.g. Hard, Clay, Grass, I.hard. |
matches[].court | string | Court surface of the match as a name, e.g. "Hard". |
matches[].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. |
matches[].rank | number | Tournament level ID of the match (TourRank). |
matches[].type | string | Dataset: atp or wta. |
matches[].odds.id_b_o | number | Archive bookmaker ID: 1 = Marathonbet, 2 = Pinnacle. Archive IDs are their own namespace (live-service bookmaker IDs differ). |
matches[].odds.total | number | Games-total line that ktb (over) and ktm (under) refer to, or null. |
matches[].odds.k1 | number | Match-winner odds for player 1 (decimal). |
matches[].odds.k2 | number | Match-winner odds for player 2 (decimal). |
matches[].odds.ktb | number | Over odds for the games-total line in total, or null. |
matches[].odds.ktm | number | Under odds for the games-total line in total, or null. |
matches[].player1.name | string | Player 1 name. |
matches[].player1.odd | string | Pre-match match-winner odds for this player (decimal), as a string; null when not available. |
matches[].player1.countryAcr | string | Player 1 country code. |
matches[].player1.seed | null | Tournament seed as a string, or null when unseeded. |
matches[].player1.image | string | Player photo path on this API (append to the base URL). |
matches[].player1.image_p_name | string | Player photo path keyed by player name (alternative to image). |
matches[].player1.id | number | Player 1 ID. |
matches[].player2.id | number | Player 2 ID. |
matches[].player2.name | string | Player 2 name. |
matches[].player2.odd | string | Pre-match match-winner odds for this player (decimal), as a string; null when not available. |
matches[].player2.countryAcr | string | Player 2 country code. |
matches[].player2.seed | null | Tournament seed as a string, or null when unseeded. |
matches[].player2.image | string | Player photo path on this API (append to the base URL). |
matches[].player2.image_p_name | string | Player photo path keyed by player name (alternative to image). |
matches[].h2hSummary.matchCount | number | Career meetings between the two players. |
matches[].h2hSummary.player1Wins | number | Career head-to-head wins of player 1. |
matches[].h2hSummary.player2Wins | number | Career head-to-head wins of player 2. |
matches[].preMatchOdds.player1 | number | Match-winner odds for player 1 (decimal). |
matches[].preMatchOdds.player2 | number | Match-winner odds for player 2 (decimal). |
matches[].preMatchOdds.updatedAt | null | Always null: the pre-match odds source does not record when prices were updated. Kept for a stable shape. |
matches[].predictionSummary.available | boolean | true when both headline odds exist and a favourite can be derived. |
matches[].predictionSummary.source | string | Always "oddsImplied": derived from bookmaker odds. |
matches[].predictionSummary.predictedWinnerId | number | Player ID of the predicted winner. |
matches[].predictionSummary.bookmakerOdds | object | Headline bookmaker odds used for the implied probabilities: player1, player2. |
matches[].predictionSummary.bookmakerOdds.player1 | number | Bookmaker match-winner odds for player 1. |
matches[].predictionSummary.bookmakerOdds.player2 | number | Bookmaker match-winner odds for player 2. |
matches[].predictionSummary.player1ImpliedProbability | number | Implied win probability for player 1 in percent (normalised). |
matches[].predictionSummary.player2ImpliedProbability | number | Implied win probability for player 2 in percent (normalised). |
matches[].predictionSummary.normalized | boolean | true when the implied probabilities were normalised to sum to 100 (bookmaker margin removed). |
matches[].modelPrediction.available | boolean | true when model probabilities are present; false when not yet available or plan-restricted. |
matches[].modelPrediction.source | string | Always "sportsapi365" (proprietary model). |
matches[].modelPrediction.predictedWinnerId | number | Player ID of the predicted winner. |
matches[].modelPrediction.player1WinProbability | number | Model win probability for player 1 in percent; null when not available. |
matches[].modelPrediction.player2WinProbability | number | Model win probability for player 2 in percent; null when not available. |
Upcoming Matches by Tour
Available on all plans, including full-market odds, preMatchOdds and predictionSummary (these two are opt-in: add include=preMatchOdds,predictionSummary). Only the SportsAPI365 modelPrediction (win probabilities) requires ULTRA or MEGA; on FREE / PRO it is a plan_restricted object. On ULTRA / MEGA it shows available: false for matches the model has not scored (doubles, and matches without a scheduled start time).
/tennis/v2/upcoming/matches/{atp|wta}atp. Use wtafor the women's dataset.Returns all upcoming scheduled matches by tour type.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 |
|---|---|---|---|
date | No | string | Lower bound, not a single day: returns upcoming matches that start after this date/time (plus matches with no time set yet). Default: now. YYYY-MM-DD or an ISO-8601 date-time; an invalid date returns 400. For one day's schedule use Fixtures by Date. Example: date=2026-09-15. |
group | No | string | singles or doubles only on upcoming lists. |
sortBy | No | string | Set sortBy=h2h to order by head-to-head interest. |
rank | No | string | Tournament level name from /upcoming/filters. Example: ATP 250. |
playerRank | No | string | Filter by player ranking band when the list supports it. Example: playerRank=1-50. |
autoPost | No | boolean | Optional flag. Default false. Example: autoPost=true. |
tournament | No | string | Filter by tournament name. Example: Monte-Carlo Rolex Masters - Monte-Carlo |
includeAll | No | boolean | Include Challenger/ITF and full history where supported. Example: includeAll=true |
include | No | string | Additive only. Comma-separated: preMatchOdds, predictionSummary, all. Default already includes matchId and h2hSummary. Example: include=preMatchOdds,predictionSummary. |
page | No | integer | Page number, starting at 1. pageNo is accepted as an alias on every route. Example: page=1 |
limit | No | integer | Results per page. pageSize is accepted as an alias on every route. Default varies by endpoint. Example: limit=10 |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament ยท Plan-restricted field.
| Field | Type | Description |
|---|---|---|
total | integer | Total matches matching the filter. |
matches | array | Page of upcoming matches. |
page / pageNo / pageSize / limit / hasNextPage / totalPages | mixed | Pagination (advanced family uses page + limit; pageNo/pageSize are also returned). |
matches[].id / matchId | integer | Match ID for this upcoming row. Use with GET /tennis/v2/matches/{matchId} and /prediction, /odds, /stats, /live. |
matches[].liveMatchId | string | This match's key in the live service and Socket.IO: "player1Id-player2Id-tournamentId-roundId". Equals matchId on live rows and event-update. |
matches[].links.match / links.live | string | Ready-to-call paths: the match detail route, and the live route that returns the live score, statistics, timeline and live eventId once the match is in the live feed ({} before). |
matches[].tournament | object | id, name, date, rankId, country, court. |
matches[].date | string | Scheduled start ISO-8601 UTC. |
matches[].player1 / player2 | object | id, name, odd, countryAcr, seed, image. player1 is first-listed, not predicted winner. |
matches[].odds | object | Full bookmaker markets when present (k1, k2, total, ktm, ktb, โฆ) โ see odds glossary. All plans; preMatchOdds repeats the match-winner prices. |
matches[].h2h | string | Career H2H as player1Wins-player2Wins string, e.g. 4-1. |
matches[].h2hSummary | object | Additive factual H2H: matchCount, player1Wins, player2Wins (always present on upcoming lists). |
matches[].preMatchOdds | object | Additive. Only when include=preMatchOdds (or include=all): player1, player2 (match-winner odds) and updatedAt, which is always null because the odds source has no update time. |
matches[].predictionSummary | object | Additive when include=predictionSummary|all. Bookmaker-implied view (source=oddsImplied): predictedWinnerId, bookmakerOdds, player1ImpliedProbability, player2ImpliedProbability, normalized. |
matches[].modelPrediction | object | Always present. ULTRA/MEGA: SportsAPI365 model view (available, source, predictedWinnerId, player1WinProbability, player2WinProbability). FREE/PRO: plan_restricted stub with message "Upgrade Plan to see this" (field kept visible; not null). Separate from predictionSummary. |
matches[].links | object | Ready-made URLs for this match's detail routes. |
matches[].tournament.id | number | Tournament season ID. |
matches[].tournament.name | string | Tournament name. |
matches[].tournament.date | string | Tournament start date (ISO-8601 UTC). |
matches[].tournament.rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, โฆ |
matches[].tournament.country | string | Country of the tournament: three-letter code, or { name, acronym }. |
matches[].tournament.court | object | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
matches[].tournament.court.name | string | Court surface name, e.g. Hard, Clay, Grass, I.hard. |
matches[].court | string | Court surface of the match as a name, e.g. "Hard". |
matches[].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. |
matches[].rank | number | Tournament level ID of the match (TourRank). |
matches[].type | string | Dataset: atp or wta. |
matches[].odds.id_b_o | number | Archive bookmaker ID: 1 = Marathonbet, 2 = Pinnacle. Archive IDs are their own namespace (live-service bookmaker IDs differ). |
matches[].odds.total | number | Games-total line that ktb (over) and ktm (under) refer to, or null. |
matches[].odds.k1 | number | Match-winner odds for player 1 (decimal). |
matches[].odds.k2 | number | Match-winner odds for player 2 (decimal). |
matches[].odds.ktb | number | Over odds for the games-total line in total, or null. |
matches[].odds.ktm | number | Under odds for the games-total line in total, or null. |
matches[].player1.name | string | Player 1 name. |
matches[].player1.odd | string | Pre-match match-winner odds for this player (decimal), as a string; null when not available. |
matches[].player1.countryAcr | string | Player 1 country code. |
matches[].player1.seed | null | Tournament seed as a string, or null when unseeded. |
matches[].player1.image | string | Player photo path on this API (append to the base URL). |
matches[].player1.image_p_name | string | Player photo path keyed by player name (alternative to image). |
matches[].player1.id | number | Player 1 ID. |
matches[].player2.id | number | Player 2 ID. |
matches[].player2.name | string | Player 2 name. |
matches[].player2.odd | string | Pre-match match-winner odds for this player (decimal), as a string; null when not available. |
matches[].player2.countryAcr | string | Player 2 country code. |
matches[].player2.seed | null | Tournament seed as a string, or null when unseeded. |
matches[].player2.image | string | Player photo path on this API (append to the base URL). |
matches[].player2.image_p_name | string | Player photo path keyed by player name (alternative to image). |
matches[].h2hSummary.matchCount | number | Career meetings between the two players. |
matches[].h2hSummary.player1Wins | number | Career head-to-head wins of player 1. |
matches[].h2hSummary.player2Wins | number | Career head-to-head wins of player 2. |
matches[].preMatchOdds.player1 | number | Match-winner odds for player 1 (decimal). |
matches[].preMatchOdds.player2 | number | Match-winner odds for player 2 (decimal). |
matches[].preMatchOdds.updatedAt | null | Always null: the pre-match odds source does not record when prices were updated. Kept for a stable shape. |
matches[].predictionSummary.available | boolean | true when both headline odds exist and a favourite can be derived. |
matches[].predictionSummary.source | string | Always "oddsImplied": derived from bookmaker odds. |
matches[].predictionSummary.predictedWinnerId | number | Player ID of the predicted winner. |
matches[].predictionSummary.bookmakerOdds | object | Headline bookmaker odds used for the implied probabilities: player1, player2. |
matches[].predictionSummary.bookmakerOdds.player1 | number | Bookmaker match-winner odds for player 1. |
matches[].predictionSummary.bookmakerOdds.player2 | number | Bookmaker match-winner odds for player 2. |
matches[].predictionSummary.player1ImpliedProbability | number | Implied win probability for player 1 in percent (normalised). |
matches[].predictionSummary.player2ImpliedProbability | number | Implied win probability for player 2 in percent (normalised). |
matches[].predictionSummary.normalized | boolean | true when the implied probabilities were normalised to sum to 100 (bookmaker margin removed). |
matches[].modelPrediction.available | boolean | true when model probabilities are present; false when not yet available or plan-restricted. |
matches[].modelPrediction.source | string | Always "sportsapi365" (proprietary model). |
matches[].modelPrediction.predictedWinnerId | number | Player ID of the predicted winner. |
matches[].modelPrediction.player1WinProbability | number | Model win probability for player 1 in percent; null when not available. |
matches[].modelPrediction.player2WinProbability | number | Model win probability for player 2 in percent; null when not available. |
Match by matchId (detail aliases)
Take matchId from upcoming, fixtures or results rows. The response's links are ready-to-call paths for this match: each one is a documented endpoint below (or, for point-by-point, the live PBP route).
Upcoming โ live in one call: every upcoming row has links.live (/tennis/v2/matches/{matchId}/live). It returns the live score, statistics, timeline and the live eventId for the live odds routes and Socket.IO. liveMatchId on the same row equals matchId on live rows, so live data can also be matched without a call.
Live โ final result: once the match is completed it moves to results with a new matchId. /tennis/v2/matches/{liveMatchId}?type=atp|wta finds the same match at every stage (schedule, then completed), so keep liveMatchId to follow a fixture to its result.
/tennis/v2/matches/{matchId}Path Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
matchId | Yes | string | From upcoming matchId / fixtures matchId / results matchId, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
type | No | string | atp or wta. Optional; speeds up the lookup and avoids ambiguity: the same number can be a men's and a women's match. |
source | No | string | today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player.
| Field | Type | Description |
|---|---|---|
matchId | integer | Resolved match ID from the upcoming schedule or completed results. |
source | string | today = still on the upcoming schedule; game = completed archive. |
type | string | atp or wta. |
player1 / player2 | object | id and name. |
liveMatchId | string | This match's key in the live service and Socket.IO: "player1Id-player2Id-tournamentId-roundId" (matchId on live rows and event-update). Absent for a bye. |
links | object | Ready-to-call paths: prediction (upcoming matches only, MEGA), odds, stats, live and pointByPoint (live Get Point By Point, by player names and match day; absent without a date) โ all plans. Empty ({}) for a bye, which has no opponent. |
date | string | Date/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date. |
result | string | Score string, e.g. "6-3 6-4"; empty string until the match is played. |
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. |
tournamentId | number | Numeric tournament season ID (one edition of an event). |
player1.id | number | Player 1 ID. |
player1.name | string | Player 1 name. |
player2.id | number | Player 2 ID. |
player2.name | string | Player 2 name. |
links.prediction | string | URL of the match prediction route (MEGA). |
links.odds | string | URL of the archived pre-match odds for this match (both bookmakers); present when oddsAvailable is true. |
links.stats | string | URL of the completed-match statistics route (all plans). |
links.live | string | URL of the match's live route: live score, statistics, timeline and the live eventId ({} until the match is in the live feed). |
links.pointByPoint | string | URL of the live Get Point By Point route for these players on the match day; absent when the match has no date. |
Live Match by matchId
/tennis/v2/matches/{matchId}/livePath Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
matchId | Yes | string | From matchId on upcoming or fixtures rows, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
type | No | string | atp or wta. Optional; speeds up the lookup and avoids ambiguity. |
source | No | string | today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament ยท LiveEvent.
| Field | Type | Description |
|---|---|---|
matchId | integer | The matchId you called with (upcoming or fixtures). |
liveMatchId | string | "player1Id-player2Id-tournamentId-roundId": the live service's matchId for this match. |
eventId | string | Live event id. Use it with the live odds, statistics and timeline routes and with Socket.IO join-event. |
status | string | Live status from the feed, e.g. Not Started, InPlay, Ended. |
score | string|null | Set scores so far, comma-separated ("6-4,2-2"). null before the first game. |
points | string|null | Points in the current game ("30-15"). null when the feed has no point score. |
indicator | string|null | Who is serving: "1,0" = player 1, "0,1" = player 2. |
startTimestamp | integer|null | Scheduled start, Unix seconds. |
player1 / player2 | object | id and name (core player IDs, usable on every player route). |
tournament | object | id (core tournament ID) and name. |
stats | object|null | Live summary stats: each key is [player1, player2] as strings (aces, double_faults, win_1st_serve %, break_point_conversions %). |
timeline | array|null | Game-by-game log, oldest first: id and text. |
type | string | Dataset: atp (men) or wta (women). |
player1.id | number | Player 1 ID. |
player1.name | string | Player 1 name. |
player2.id | number | Player 2 ID. |
player2.name | string | Player 2 name. |
tournament.id | number | Tournament season ID. |
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. |
stats.aces | array | Aces: [participant1, participant2] as strings. |
stats.double_faults | array | Double faults: [participant1, participant2] as strings. |
stats.win_1st_serve | array | First-serve points won %: [participant1, participant2] as strings. |
stats.break_point_conversions | array | Break-point conversion %: [participant1, participant2] as strings. |
timeline[].id | string | Unique timeline event ID. |
timeline[].text | string | Human-readable event text, e.g. "Game 1 - Alexander Zverev - breaks to 30". |
Match Prediction by matchId
MEGA required. FREE, PRO and ULTRA receive HTTP 403 with error: "plan_restricted".
Only for upcoming (today) matches: a completed matchId returns 400. Same response as Match Prediction & Analysis Paragraph.
/tennis/v2/matches/{matchId}/predictionPath Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
matchId | Yes | string | From matchId on upcoming, fixtures or results rows, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
type | No | string | atp or wta. Optional; speeds up the lookup and avoids ambiguity. |
source | No | string | today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match. |
Response Properties
| Field | Type | Description |
|---|---|---|
paragraph | string | Match Prediction & Analysis Paragraph as an HTML list (<ul><li>โฆ</li></ul>). Render as HTML or strip the tags. |
Match Odds by matchId
k1 is the price of the player in id1_o, k2 of the player in id2_o. That order can differ from the match row: completed matches list the winner as player1. Example, match 64511042: the match row has player1 Thiago Seyboth Wild (36858), player2 Francisco Comesana (61971); the Marathonbet row has id1_o 61971 with k1 2.08 and id2_o 36858 with k21.65, so Seyboth Wild's price is 1.65 and Comesana's 2.08.
prices = { [Number(o.id1_o)]: o.k1, [Number(o.id2_o)]: o.k2 }
player1Price = prices[match.player1.id]Handicap (f1/kf1, f2/kf2) and correct-score fields follow the same id1_o/id2_o sides.
/tennis/v2/matches/{matchId}/oddsPath Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
matchId | Yes | string | From matchId on upcoming, fixtures or results rows, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
type | No | string | atp or wta. Optional; speeds up the lookup and avoids ambiguity. |
source | No | string | today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match. |
Response Properties
| Field | Type | Description |
|---|---|---|
odds[].id_b_o | string | Bookmaker ID as a numeric string: "1" = Marathonbet, "2" = Pinnacle. |
odds[].id1_o / id2_o | string | Player 1 / player 2 IDs for this odds row (numeric strings). |
odds[].id_t_o | string | Tournament season ID (numeric string). |
odds[].id_r_o | integer | Round ID. |
odds[].k1 / k2 | number | Match-winner (moneyline) odds: k1 is the price of the player in id1_o, k2 of the player in id2_o. This order can differ from the match row (completed matches list the winner as player1), so map prices by ID, never by position: { [id1_o]: k1, [id2_o]: k2 }. Compare IDs as numbers (id1_o/id2_o are numeric strings). Handicap (f1/kf1, f2/kf2) and correct-score fields follow the same id1_o/id2_o sides. |
odds[].total | number | null | Games-total line that ktb/ktm refer to (e.g. 21.5); null when the market is not offered. |
odds[].ktb / ktm | number | null | Over (ktb) and under (ktm) odds for that total line; null when not offered. |
odds[].f1 / f2 | number | null | Games handicap for player 1 / player 2; null when not offered. |
odds[].kf1 / kf2 | number | null | Odds for the corresponding handicap; null when not offered. |
odds[].k20 / k21 / k12 / k02 | number | null | Correct set score 2โ0, 2โ1, 1โ2, 0โ2 odds; null when not offered. |
odds[].k30 / k31 / k32 / k23 / k13 / k03 | number | null | Correct set score 3โ0 โฆ 0โ3 odds (best of five); null when not offered. |
odds | array | Odds object documented in the rows below. |
odds[] | object | One item of `odds`; its fields are listed below. |
odds[].bookmaker | string | Bookmaker name. |
Match Statistics by matchId
/tennis/v2/matches/{matchId}/statsPath Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
matchId | Yes | string | From matchId on upcoming, fixtures or results rows, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
type | No | string | atp or wta. Optional; speeds up the lookup and avoids ambiguity. |
source | No | string | today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match. |
Response Properties
| Field | Type | Description |
|---|---|---|
data | object | Response payload: the list or object documented in the rows below. |
data.player1Stats | object | Aggregated statistics of player 1 in the selected meetings. |
data.player1Stats.player1Id | number | Numeric ID of player 1. |
data.player1Stats.aces | number | Aces served. Counted over the matches in this selection. |
data.player1Stats.doubleFaults | number | Double faults. Counted over the matches in this selection. |
data.player1Stats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
data.player1Stats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
data.player1Stats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
data.player1Stats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
data.player1Stats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
data.player1Stats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
data.player1Stats.breakPointFacedGm | number | Break points faced on serve. Counted over the matches in this selection. |
data.player1Stats.breakPointSavedGm | number | Break points saved on serve. Counted over the matches in this selection. |
data.player1Stats.breakPointChanceGm | number | Break-point chances on return. Counted over the matches in this selection. |
data.player1Stats.breakPointWonGm | number | Break points converted on return. Counted over the matches in this selection. |
data.player1Stats.winners | null | Winners (where tracked). Counted over the matches in this selection. |
data.player1Stats.unforcedErrors | null | Unforced errors (where tracked). Counted over the matches in this selection. |
data.player1Stats.netApproaches | null | Net approaches won (where tracked). Counted over the matches in this selection. |
data.player1Stats.netApproachesOf | null | Net approaches made (where tracked). Counted over the matches in this selection. |
data.player1Stats.totalPointsWon | number | Total points won. Counted over the matches in this selection. |
data.player1Stats.fastestServe | null | Fastest serve in km/h (where tracked). |
data.player1Stats.averageFirstServeSpeed | null | Average first-serve speed in km/h (where tracked). |
data.player1Stats.averageSecondServeSpeed | null | Average second-serve speed in km/h (where tracked). |
data.player2Stats | object | Aggregated statistics of player 2 in the selected meetings. |
data.player2Stats.player2Id | number | Numeric ID of player 2. |
data.player2Stats.aces | number | Aces served. Counted over the matches in this selection. |
data.player2Stats.doubleFaults | number | Double faults. Counted over the matches in this selection. |
data.player2Stats.firstServe | number | First serves landed in. Counted over the matches in this selection. |
data.player2Stats.firstServeOf | number | First-serve attempts (total service points). Counted over the matches in this selection. |
data.player2Stats.winningOnFirstServe | number | Points won on first serve. Counted over the matches in this selection. |
data.player2Stats.winningOnFirstServeOf | number | Points played on first serve (first serves in). Counted over the matches in this selection. |
data.player2Stats.winningOnSecondServe | number | Points won on second serve. Counted over the matches in this selection. |
data.player2Stats.winningOnSecondServeOf | number | Points played on second serve. Counted over the matches in this selection. |
data.player2Stats.breakPointFacedGm | number | Break points faced on serve. Counted over the matches in this selection. |
data.player2Stats.breakPointSavedGm | number | Break points saved on serve. Counted over the matches in this selection. |
data.player2Stats.breakPointChanceGm | number | Break-point chances on return. Counted over the matches in this selection. |
data.player2Stats.breakPointWonGm | number | Break points converted on return. Counted over the matches in this selection. |
data.player2Stats.winners | null | Winners (where tracked). Counted over the matches in this selection. |
data.player2Stats.unforcedErrors | null | Unforced errors (where tracked). Counted over the matches in this selection. |
data.player2Stats.netApproaches | null | Net approaches won (where tracked). Counted over the matches in this selection. |
data.player2Stats.netApproachesOf | null | Net approaches made (where tracked). Counted over the matches in this selection. |
data.player2Stats.totalPointsWon | number | Total points won. Counted over the matches in this selection. |
data.player2Stats.fastestServe | null | Fastest serve in km/h (where tracked). |
data.player2Stats.averageFirstServeSpeed | null | Average first-serve speed in km/h (where tracked). |
data.player2Stats.averageSecondServeSpeed | null | Average second-serve speed in km/h (where tracked). |
Point-by-Point by matchId
/tennis/v2/matches/{matchId}/point-by-pointPath Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
matchId | Yes | string | From matchId on upcoming, fixtures or results rows, or a liveMatchId (player1Id-player2Id-tournamentId-roundId), which stays the same from the schedule to the completed match. |
Query Parameter
| Parameter | Required | Type | Description |
|---|---|---|---|
type | No | string | atp or wta. Optional; speeds up the lookup and avoids ambiguity: the same number can be a men's and a women's match. |
source | No | string | today (upcoming schedule) or game (completed matches). Optional: upcoming and completed matches are numbered separately, so links from schedule rows pass source=today and links from draws and results for completed matches pass source=game. Without it, an upcoming number that has left the schedule can match a different, archived match. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ยท Point-by-point set and game.
| Field | Type | Description |
|---|---|---|
matchId | integer | The requested matchId. |
available | boolean | true when point-by-point data was found. |
source | string | live (the live service, recent matches) or archive (older matches). |
player1 / player2 | object | source live: player names in the order of the point-by-point data (server 1 is player1). This can be the reverse of player1/player2 on the match row, so join by name. |
result.sets[].games[] | array | source live: one row per game: gameNumber, server (1 or 2), tiebreak, finalScore (games after this game) and fifteens_content (the score after each point; BP marks a break point). |
result.score | string | Set scores, e.g. 3-6 5-7. |
matchInfo / data | object / array | Only when source is archive (in place of player1, player2 and result): the archived match keys and its point rows. |
type | string | Dataset: atp (men) or wta (women). |
player1.name | string | Player 1 name. |
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[].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). |
Match Odds (All Markets)
Keys such as k1, ktb, and f1 are not renamed (existing clients depend on them). Meanings are listed in the response properties below. total is the game line for over/under; ktb = over, ktm = under.
/tennis/v2/upcoming/matchodds/{atp|wta}atp. Use wtafor the women's dataset.Returns bookmaker odds for one upcoming matchup (moneyline, game totals, handicaps, set scores when offered).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 |
|---|---|---|---|
player1Id | Yes | string | First player: numeric ID or display name. Example player1Id=40434 or player1Id=Jannik Sinner |
player2Id | No | string | Second player: numeric ID or display name. Example player2Id=68074 or player2Id=Carlos Alcaraz |
tournamentId | Yes | integer | Filter by tournament id. Example: tournamentId=21331 |
roundId | Yes | integer | Filter by round ID. Example: roundId=9 |
Response Properties
| Field | Type | Description |
|---|---|---|
odds | array | One object per bookmaker row (typically Marathonbet then Pinnacle). |
odds[].id_b_o | string | Bookmaker ID as a numeric string: "1" = Marathonbet, "2" = Pinnacle. |
odds[].id1_o / id2_o | string | Player 1 / player 2 IDs for this odds row (numeric strings). |
odds[].id_t_o | string | Tournament season ID (numeric string). |
odds[].id_r_o | integer | Round ID. |
odds[].k1 / k2 | number | Match-winner (moneyline) odds: k1 is the price of the player in id1_o, k2 of the player in id2_o. This order can differ from the match row (completed matches list the winner as player1), so map prices by ID, never by position: { [id1_o]: k1, [id2_o]: k2 }. Compare IDs as numbers (id1_o/id2_o are numeric strings). Handicap (f1/kf1, f2/kf2) and correct-score fields follow the same id1_o/id2_o sides. |
odds[].total | number | null | Games-total line that ktb/ktm refer to (e.g. 21.5); null when the market is not offered. |
odds[].ktb / ktm | number | null | Over (ktb) and under (ktm) odds for that total line; null when not offered. |
odds[].f1 / f2 | number | null | Games handicap for player 1 / player 2; null when not offered. |
odds[].kf1 / kf2 | number | null | Odds for the corresponding handicap; null when not offered. |
odds[].k20 / k21 / k12 / k02 | number | null | Correct set score 2โ0, 2โ1, 1โ2, 0โ2 odds; null when not offered. |
odds[].k30 / k31 / k32 / k23 / k13 / k03 | number | null | Correct set score 3โ0 โฆ 0โ3 odds (best of five); null when not offered. |
odds[].bookmaker | string | Bookmaker name. |
Top Matches Today
Available on all plans, including full-market odds, preMatchOdds and predictionSummary (these two are opt-in: add include=preMatchOdds,predictionSummary). Only the SportsAPI365 modelPrediction (win probabilities) requires ULTRA or MEGA; on FREE / PRO it is a plan_restricted object. On ULTRA / MEGA it shows available: false for matches the model has not scored (doubles, and matches without a scheduled start time).
/tennis/v2/upcoming/top-tennis-matches-today/{atp|wta}atp. Use wtafor the women's dataset.Returns todayโs most significant singles matches (those with a prior H2H). modelPrediction (win probabilities) is ULTRA / MEGA; every other field is on all plansPath 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. |
Response Properties
Shared objects in this response (defined once in Reusable response schemas): Player ยท Tournament ยท Plan-restricted field.
| Field | Type | Description |
|---|---|---|
[] | object | One item of the response; its fields are listed below. |
[].id | number | Numeric ID of this item (see the parent object: match, player, tournament, live event, โฆ). |
[].matchId | number | Match ID (same value as id on core match rows). |
[].liveMatchId | string | Key of this match in the live service and Socket.IO: "player1Id-player2Id-tournamentId-roundId". Equals matchId on live rows and event-update. |
[].links | object | Ready-made URLs for this match's detail routes. |
[].links.match | string | URL of the match detail route (/tennis/v2/matches/{matchId}); source=game marks a completed match. |
[].links.live | string | URL of the match's live route: live score, statistics, timeline and the live eventId ({} until the match is in the live feed). |
[].tournament | object | Tournament object (id, name, date, level, surface, country, โฆ). |
[].tournament.id | number | Tournament season ID. |
[].tournament.name | string | Tournament name. |
[].tournament.date | string | Tournament start date (ISO-8601 UTC). |
[].tournament.rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, โฆ |
[].tournament.country | string | Country of the tournament: three-letter code, or { name, acronym }. |
[].tournament.court | object | Court surface of the tournament: { id, name } (some routes return only { name }), e.g. { "name": "Hard" }. |
[].tournament.court.name | string | Court surface name, e.g. Hard, Clay, Grass, I.hard. |
[].court | string | Court surface name, e.g. "Hard". |
[].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. |
[].rank | number | Tournament level ID (TourRank). |
[].date | string | Date/time as ISO-8601 UTC. On match rows this is the scheduled or played start; on tournaments, the start date. |
[].type | string | Dataset: atp (men) or wta (women). |
[].odds | object | Odds object documented in the rows below. |
[].odds.id_b_o | number | Archive bookmaker ID: 1 = Marathonbet, 2 = Pinnacle. Archive IDs are their own namespace (live-service bookmaker IDs differ). |
[].odds.total | number | Games-total line that ktb (over) and ktm (under) refer to, or null. |
[].odds.k1 | number | Match-winner odds for player 1 (decimal). |
[].odds.k2 | number | Match-winner odds for player 2 (decimal). |
[].odds.ktb | number | Over odds for the games-total line in total, or null. |
[].odds.ktm | number | Under odds for the games-total line in total, or null. |
[].player1 | object | Player 1 (first-listed player). On completed matches player1 is the winner. |
[].player1.name | string | Player 1 name. |
[].player1.odd | string | Pre-match match-winner odds for this player (decimal), as a string; null when not available. |
[].player1.countryAcr | string | Player 1 country code. |
[].player1.seed | string | Tournament seed as a string, or null when unseeded. |
[].player1.image | string | Player photo path on this API (append to the base URL). |
[].player1.image_p_name | string | Player photo path keyed by player name (alternative to image). |
[].player1.id | number | Player 1 ID. |
[].player2 | object | Player 2 (second-listed player). On completed matches player2 is the loser. |
[].player2.id | number | Player 2 ID. |
[].player2.name | string | Player 2 name. |
[].player2.odd | string | Pre-match match-winner odds for this player (decimal), as a string; null when not available. |
[].player2.countryAcr | string | Player 2 country code. |
[].player2.seed | null | Tournament seed as a string, or null when unseeded. |
[].player2.image | string | Player photo path on this API (append to the base URL). |
[].player2.image_p_name | string | Player photo path keyed by player name (alternative to image). |
[].h2h | string | Career head-to-head as "player1Wins-player2Wins", e.g. "4-1". |
[].h2hSummary | object | Factual career head-to-head: matchCount, player1Wins, player2Wins. |
[].h2hSummary.matchCount | number | Career meetings between the two players. |
[].h2hSummary.player1Wins | number | Career head-to-head wins of player 1. |
[].h2hSummary.player2Wins | number | Career head-to-head wins of player 2. |
[].modelPrediction | object | SportsAPI365 model win probabilities (ULTRA / MEGA). On FREE / PRO this field is a plan_restricted object (available: false, error, message, requiredPlan: "ULTRA", upgradeUrl). |
[].modelPrediction.available | boolean | true when model probabilities are present; false when not yet available or plan-restricted. |
[].modelPrediction.source | string | Always "sportsapi365" (proprietary model). |
[].modelPrediction.predictedWinnerId | number | Player ID of the predicted winner. |
[].modelPrediction.player1WinProbability | number | Model win probability for player 1 in percent; null when not available. |
[].modelPrediction.player2WinProbability | number | Model win probability for player 2 in percent; null when not available. |
Match Prediction & Analysis Paragraph
This endpoint only returns data for matches currently scheduled (today or upcoming). If the example players have already played, use two players from Upcoming Matches.
The Match Prediction & Analysis Paragraph endpoint is available exclusively to MEGA plan subscribers and is not included with PRO or ULTRA plans. Restricted calls return HTTP 403 with error: plan_restricted.
/tennis/v2/upcoming/match-prediction/{atp|wta}/{player1}/{player2}atp. Use wtafor the women's dataset.Returns the Match Prediction & Analysis Paragraph for this matchup: the H2H Stats Prediction Insights narrative as an HTML list (<ul><li>โฆ</li></ul>, one insight per item) โ render it as HTML or strip the tags for plain text. MEGA only. Optional onlyImp=true keeps the high-signal insights.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. |
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 |
|---|---|---|---|
includeAll | No | boolean | Include Challenger/ITF and full history where supported. Example: includeAll=true |
onlyImp | No | boolean | When true, returns only the high-signal prediction bullets. Example: onlyImp=true. |
Response Properties
| Field | Type | Description |
|---|---|---|
paragraph | string (HTML) | H2H Stats Prediction Insights narrative as an HTML list: <ul> with one <li> per insight (H2H record, career-best year, recent form, surface, pressure points, opponent quality). Render as HTML, or strip the tags for plain text. |
H2H Prediction Analysis by Player Names
This written matchup analysis is part of the Match Prediction & Analysis Paragraph, available exclusively to MEGA plan subscribers. It is not included with FREE, PRO or ULTRA plans. FREE, PRO and ULTRA receive HTTP 403 with error: "plan_restricted".
/tennis/v2/aggregate/head-to-head/prediction/rawQuery 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 | No | string | Target date in YYYY-MM-DD format. Example: 2026-01-01. |
Response Properties
| Field | Type | Description |
|---|---|---|
success | boolean | false when a required parameter is missing (player1 and player2 are both required). |
result | object | null | Prediction analysis for the matchup, or null when none is available for these players / date. |
result.player1 | string | First player as stored for the match (may be either of the names you sent). |
result.player2 | string | Second player as stored for the match. |
result.date | string (ISO-8601 UTC) | Scheduled start of the match the analysis is for. |
result.prediction | string | Plain-text analysis in titled sections (e.g. Second Serve & Return Patterns, Under Pressure & Performance Record, Surface Strength & Player Level, Match Opportunities & Deciding Sets, Event Insights), separated by blank lines. |
result.lastUpdatedAt | string (Unix seconds) | When the analysis was last generated. |
H2H Model Prediction (Win Probabilities) by Player Names
SportsAPI365 model win probabilities require the ULTRA or MEGA plan. FREE / PRO receive HTTP 403 (plan_restricted).
This endpoint only returns data for matches currently scheduled (today or upcoming). If the example players have already played, use two players from Upcoming Matches.
/tennis/v2/aggregate/head-to-head/model/predictionQuery 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 | No | string | Target date in YYYY-MM-DD format. Example: 2026-01-01. |
Response Properties
| Field | Type | Description |
|---|---|---|
success | boolean | false when a required parameter is missing (player1 and player2 are both required). |
result | object | null | null when the matchup is not found. |
result.prediction | object | null | Model prediction for the matchup, or null when none is available yet for these players / date. |
result.prediction.source | string | Always sportsapi365 (proprietary model, not bookmaker-implied). |
result.prediction.player1 / player2 | string | Players in scheduled match order (may differ from the order you sent). |
result.prediction.available | boolean | true when probabilities are present. |
result.prediction.predictedWinner | string | Name of the player the model favours. |
result.prediction.predictedWinnerId | integer | Player ID of the favoured player (same IDs as the rest of the API). |
result.prediction.player1WinProbability / player2WinProbability | number | Win probability in percent for result.prediction.player1 / player2; the two add up to 100. |
Upcoming Filters by Tour
/tennis/v2/upcoming/filters/{atp|wta}atp. Use wtafor the women's dataset.Returns available filter values (tournaments, rounds, surfaces) for upcoming matchesPath 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. |
Response Properties
| Field | Type | Description |
|---|---|---|
[] | object | One item of the response; its fields are listed below. |
[].rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, โฆ |
[].name | string | Display name. |
All Upcoming Filters
/tennis/v2/upcoming/filtersResponse Properties
| Field | Type | Description |
|---|---|---|
[] | object | One item of the response; its fields are listed below. |
[].rankId | number | Tournament level ID (TourRank, see GET /tennis/v2/ranking): 0 ITF $10K, 1 Challenger/ITF > $10K, 2 Main tour, 3 Masters, 4 Grand Slam, 5 Davis/Fed Cup, 7 Tour finals, โฆ |
[].name | string | Display name. |