Tournaments endpoints
The tournament catalogue, season calendar, editions, draws and schedules.
- /tennis/competitions · Competitions Index
- /tennis/tournaments · List & Filter Tournaments
- /tennis/tournaments/calendar · Annual Season Calendar
- /tennis/tournaments/{tournament_id} · Get Tournament Profile
- /tennis/tournaments/{tournament_id}/bracket · Get Tournament Bracket (draw-tree alias)
- /tennis/tournaments/{tournament_id}/draw · Get Tournament Draw Bracket
- /tennis/tournaments/{tournament_id}/edition · Tournament Edition Metadata
- /tennis/tournaments/{tournament_id}/editions/{year}/draw · Get Specific Tournament Edition Draw
- /tennis/tournaments/{tournament_id}/schedule · Tournament Edition Schedule
/tennis/competitionsCompetitions Index
Distinct competitions across editions (name + tour), with edition counts and year span.
A 'competition' here is the recurring event (e.g. Wimbledon), whereas /tournaments lists individual yearly editions.
Each item carries an `id`: the most recent real tournament_id sharing that exact name+tour, so a caller (or the MCP's resolve_entity, which reads this route for tennis tournament search) always gets a usable, chainable id -- never a bare name with nothing to look up next.
| Parameter | In | Type | Description |
|---|---|---|---|
| tour | query | string | ATP or WTA |
| q | query | string | Name search |
| page | query | integer | min 1 · default 1 |
| page_size | query | integer | min 1 · max 500 · default 50 |
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.citoapi.com/api/v1/tennis/competitions?page_size=2"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"success": true,
"items": [
{
"id": "atp_2026_M-ITF-TUN-2026-027",
"name": "M15 Monastir",
"tour": "ATP",
"editions": 296,
"first_year": 2019,
"last_year": 2026,
"recent_surface": "Hard",
"tier": "Other"
},
{
"id": "wta_2026_W-ITF-TUN-2026-018",
"name": "W15 Monastir",
"tour": "WTA",
"editions": 274,
"first_year": 2019,
"last_year": 2026,
"recent_surface": "Hard",
"tier": "Other"
}
],
"total": 20764,
"page": 1,
"page_size": 2
}/tennis/tournamentsList & Filter Tournaments
Retrieves catalog of tennis tournaments across history.
| Parameter | In | Type | Description |
|---|---|---|---|
| tour | query | string | ATP or WTA |
| q | query | string | Case-insensitive name search, same as /players?q= |
| year | query | integer | Edition year, e.g. 2026 |
| level | query | string | Level tier code: G, M, A, F, D, C |
| surface | query | string | Surface: Hard, Clay, Grass, Carpet |
| include_live_shells | query | boolean | Include live-feed containers (s365_*) that hold archived live results; excluded by default because they are not real eventsdefault false |
| country_code | query | string | Country IOC code |
| page | query | integer | Page number (1-indexed)min 1 · default 1 |
| page_size | query | integer | Items per pagemin 1 · max 500 · default 20 |
| limit | query | integer | Alias for page_sizemin 1 · max 500 |
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.citoapi.com/api/v1/tennis/tournaments?q=wimbledon&page_size=2"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"success": true,
"items": [
{
"id": "wta_2026_540",
"name": "Wimbledon",
"tour": "WTA",
"level": "G",
"category": "grand_slam",
"tier": "Grand Slam",
"surface": "Grass",
"draw_size": 128,
"year": 2026,
"city": "London",
"country_code": "GBR",
"first_edition_year": 2016,
"most_recent_edition_year": 2026,
"all_time_title_leader": null
},
{
"id": "atp_2026_540",
"name": "Wimbledon",
"tour": "ATP",
"level": "G",
"category": "grand_slam",
"tier": "Grand Slam",
"surface": "Grass",
"draw_size": 128,
"year": 2026,
"city": "London",
"country_code": "GBR",
"first_edition_year": 1877,
"most_recent_edition_year": 2026,
"all_time_title_leader": null
}
],
"total": 219,
"page": 1,
"page_size": 2,
"total_pages": 110,
"has_next": true,
"has_prev": false
}/tennis/tournaments/calendarAnnual Season Calendar
Retrieves annual schedule of tournaments for a given season.
| Parameter | In | Type | Description |
|---|---|---|---|
| year* | query | integer | Calendar year (e.g. 2023, 2024) |
| tour | query | string | ATP or WTA |
| limit | query | integer | Max tournaments to returnmin 1 · max 500 |
| page_size | query | integer | Alias for limitmin 1 · max 500 |
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.citoapi.com/api/v1/tennis/tournaments/calendar?year=2026&page_size=2"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"success": true,
"items": [
{
"id": "wta_2026_800",
"name": "Brisbane",
"year": 2026,
"tour": "WTA",
"level": "P",
"category": "wta_tour",
"tier": "Other",
"surface": "Hard",
"start_date": "2026-01-04",
"end_date": null,
"draw_size": 32,
"city": "Brisbane",
"country_code": "AUS",
"is_live_shell": false
},
{
"id": "atp_2026_0339",
"name": "Brisbane",
"year": 2026,
"tour": "ATP",
"level": "A",
"category": "atp_tour",
"tier": "Other",
"surface": "Hard",
"start_date": "2026-01-04",
"end_date": null,
"draw_size": 32,
"city": "Brisbane",
"country_code": "AUS",
"is_live_shell": false
}
],
"total": 1231,
"page": 1,
"page_size": 2,
"total_pages": 616,
"has_next": true,
"has_prev": false
}/tennis/tournaments/{tournament_id}Get Tournament Profile
Retrieves full profile, surface, and title records for a tournament.
| Parameter | In | Type | Description |
|---|---|---|---|
| tournament_id* | path | string |
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.citoapi.com/api/v1/tennis/tournaments/atp_2026_540"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"success": true,
"id": "atp_2026_540",
"name": "Wimbledon",
"tour": "ATP",
"level": "G",
"category": "grand_slam",
"tier": "Grand Slam",
"surface": "Grass",
"draw_size": 128,
"city": "London",
"country_code": "GBR",
"first_edition_year": 1877,
"most_recent_edition_year": 2026,
"all_time_title_leader": {
"player_id": "atp_103819",
"player_name": "Roger Federer",
"titles": 8,
"id": "atp_103819",
"name": "Roger Federer"
},
"year": 2026,
"is_live_shell": false
}/tennis/tournaments/{tournament_id}/bracketGet Tournament Bracket (draw-tree alias)
Bracket-tree alias of the draw endpoint: the same verified R128-to-Final tree with seeds and entry designations (WC/Q/LL/PR), under the requested /bracket path. Additive alias; the /draw routes are untouched.
| Parameter | In | Type | Description |
|---|---|---|---|
| tournament_id* | path | string | |
| year | query | integer | Optional year edition |
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.citoapi.com/api/v1/tennis/tournaments/atp_2026_540/bracket"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"success": true,
"tournament_id": "atp_2026_540",
"tournament_name": "Wimbledon",
"year": 2026,
"draw_size": 128,
"surface": "Grass",
"rounds": [
{
"round_code": "F",
"round_name": "Final",
"matches": [
{
"match_id": "s365_2026_4764920",
"match_num": 64920,
"player1": {
"id": "atp_206173",
"name": "Jannik Sinner",
"ioc": "ITA",
"seed": "1",
"entry": null,
"is_winner": true
},
"player2": {
"id": "atp_100644",
"name": "Alexander Zverev",
"ioc": "GER",
"seed": "2",
"entry": null,
"is_winner": false
},
"score": "6-7 7-6 6-3 6-4",
"next_match_id": null,
"id": "s365_2026_4764920"
}
]
},
{
"round_code": "SF",
"round_name": "Semi-Finals",
"matches": [
{
"match_id": "s365_2026_4762041",
"match_num": 62041,
"player1": {
"id": "atp_206173",
"name": "Jannik Sinner",
"ioc": "ITA",
"seed": "1",
"entry": null,
"is_winner": true
},
"player2": {
"id": "atp_104925",
"name": "Novak Djokovic",
"ioc": "SRB",
"seed": "7",
"entry": null,
"is_winner": false
},
"score": "6-4 6-4 6-4",
"next_match_id": null,
"id": "s365_2026_4762041"
},
{
"match_id": "s365_2026_4762320",
"match_num": 62320,
"player1": {
"id": "atp_100644",
"name": "Alexander Zverev",
"ioc": "GER",
"seed": "2",
"entry": null,
"is_winner": true
},
"player2": {
"id": "atp_209259",
"name": "Arthur Fery",
"ioc": "GBR",
"seed": null,
"entry": null,
"is_winner": false
},
"score": "7-6 6-2 6-4",
"next_match_id": null,
"id": "s365_2026_4762320"
}
]
}
],
"surface_badge": {
"label": "Grass",
"hex": "#16A34A",
"name": "Grass"
},
"id": "atp_2026_540",
"name": "Wimbledon"
}/tennis/tournaments/{tournament_id}/drawGet Tournament Draw Bracket
Builds interactive bracket draw tree for a tournament edition.
| Parameter | In | Type | Description |
|---|---|---|---|
| tournament_id* | path | string | |
| year | query | integer | Optional year edition |
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.citoapi.com/api/v1/tennis/tournaments/atp_2026_540/draw"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"success": true,
"tournament_id": "atp_2026_540",
"tournament_name": "Wimbledon",
"year": 2026,
"draw_size": 128,
"surface": "Grass",
"rounds": [
{
"round_code": "F",
"round_name": "Final",
"matches": [
{
"match_id": "s365_2026_4764920",
"match_num": 64920,
"player1": {
"id": "atp_206173",
"name": "Jannik Sinner",
"ioc": "ITA",
"seed": "1",
"entry": null,
"is_winner": true
},
"player2": {
"id": "atp_100644",
"name": "Alexander Zverev",
"ioc": "GER",
"seed": "2",
"entry": null,
"is_winner": false
},
"score": "6-7 7-6 6-3 6-4",
"next_match_id": null,
"id": "s365_2026_4764920"
}
]
},
{
"round_code": "SF",
"round_name": "Semi-Finals",
"matches": [
{
"match_id": "s365_2026_4762041",
"match_num": 62041,
"player1": {
"id": "atp_206173",
"name": "Jannik Sinner",
"ioc": "ITA",
"seed": "1",
"entry": null,
"is_winner": true
},
"player2": {
"id": "atp_104925",
"name": "Novak Djokovic",
"ioc": "SRB",
"seed": "7",
"entry": null,
"is_winner": false
},
"score": "6-4 6-4 6-4",
"next_match_id": null,
"id": "s365_2026_4762041"
},
{
"match_id": "s365_2026_4762320",
"match_num": 62320,
"player1": {
"id": "atp_100644",
"name": "Alexander Zverev",
"ioc": "GER",
"seed": "2",
"entry": null,
"is_winner": true
},
"player2": {
"id": "atp_209259",
"name": "Arthur Fery",
"ioc": "GBR",
"seed": null,
"entry": null,
"is_winner": false
},
"score": "7-6 6-2 6-4",
"next_match_id": null,
"id": "s365_2026_4762320"
}
]
}
],
"surface_badge": {
"label": "Grass",
"hex": "#16A34A",
"name": "Grass"
},
"id": "atp_2026_540",
"name": "Wimbledon"
}/tennis/tournaments/{tournament_id}/editionTournament Edition Metadata
| Parameter | In | Type | Description |
|---|---|---|---|
| tournament_id* | path | string |
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.citoapi.com/api/v1/tennis/tournaments/atp_2026_540/edition"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"success": true,
"id": "atp_2026_540",
"name": "Wimbledon",
"year": 2026,
"tour": "ATP",
"surface": "Grass",
"level": "G",
"tier": "Grand Slam",
"start_date": "2026-06-29",
"end_date": null,
"venue": {
"city": "London",
"country_code": "GBR",
"timezone": null
},
"draw_size": 128,
"prize_money": null,
"entry_list": [
{
"player_id": "atp_202385",
"seed": null,
"entry": null,
"id": "atp_202385"
},
{
"player_id": "atp_126846",
"seed": null,
"entry": null,
"id": "atp_126846"
}
],
"seeds": [
{
"player_id": "atp_212588",
"seed": "23",
"entry": null,
"id": "atp_212588"
},
{
"player_id": "atp_209860",
"seed": "31",
"entry": null,
"id": "atp_209860"
}
],
"qualifiers": [],
"withdrawals": [],
"coverage": {
"withdrawals": false,
"prize_money": false,
"timezone": false
}
}/tennis/tournaments/{tournament_id}/editions/{year}/drawGet Specific Tournament Edition Draw
Builds interactive bracket draw tree for a specific tournament year edition.
| Parameter | In | Type | Description |
|---|---|---|---|
| tournament_id* | path | string | |
| year* | path | integer |
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.citoapi.com/api/v1/tennis/tournaments/atp_2026_540/editions/2025/draw"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"success": true,
"tournament_id": "atp_2025_540",
"tournament_name": "Wimbledon",
"year": 2025,
"draw_size": 32,
"surface": "Grass",
"rounds": [
{
"round_code": "Q1",
"round_name": "Q1",
"matches": [
{
"match_id": "atp_2025_540_700",
"match_num": 700,
"player1": {
"id": "atp_105916",
"name": "Marton Fucsovics",
"ioc": "HUN",
"seed": "1",
"entry": null,
"is_winner": true
},
"player2": {
"id": "atp_200514",
"name": "Jurij Rodionov",
"ioc": "AUT",
"seed": null,
"entry": null,
"is_winner": false
},
"score": "6-4 6-3",
"next_match_id": "atp_2025_540_764",
"id": "atp_2025_540_700"
},
{
"match_id": "atp_2025_540_701",
"match_num": 701,
"player1": {
"id": "atp_208260",
"name": "Zachary Svajda",
"ioc": "USA",
"seed": null,
"entry": null,
"is_winner": true
},
"player2": {
"id": "atp_209903",
"name": "Lukas Neumayer",
"ioc": "AUT",
"seed": null,
"entry": null,
"is_winner": false
},
"score": "6-2 6-3",
"next_match_id": "atp_2025_540_764",
"id": "atp_2025_540_701"
}
]
},
{
"round_code": "Q2",
"round_name": "Q2",
"matches": [
{
"match_id": "atp_2025_540_764",
"match_num": 764,
"player1": {
"id": "atp_105916",
"name": "Marton Fucsovics",
"ioc": "HUN",
"seed": "1",
"entry": null,
"is_winner": true
},
"player2": {
"id": "atp_208260",
"name": "Zachary Svajda",
"ioc": "USA",
"seed": null,
"entry": null,
"is_winner": false
},
"score": "7-6(5) 6-3",
"next_match_id": "atp_2025_540_796",
"id": "atp_2025_540_764"
},
{
"match_id": "atp_2025_540_765",
"match_num": 765,
"player1": {
"id": "atp_208210",
"name": "Chris Rodesch",
"ioc": "LUX",
"seed": null,
"entry": null,
"is_winner": true
},
"player2": {
"id": "atp_210136",
"name": "Mark Lajal",
"ioc": "EST",
"seed": null,
"entry": null,
"is_winner": false
},
"score": "6-1 6-3",
"next_match_id": "atp_2025_540_796",
"id": "atp_2025_540_765"
}
]
}
],
"surface_badge": {
"label": "Grass",
"hex": "#16A34A",
"name": "Grass"
},
"id": "atp_2025_540",
"name": "Wimbledon"
}/tennis/tournaments/{tournament_id}/scheduleTournament Edition Schedule
Matches of one tournament edition in date/round order — order of play, results view.
| Parameter | In | Type | Description |
|---|---|---|---|
| tournament_id* | path | string | |
| round | query | string | Round code filter: F, SF, QF, R16… |
| page | query | integer | min 1 · default 1 |
| page_size | query | integer | min 1 · max 500 · default 50 |
curl -H "x-api-key: YOUR_API_KEY" \
"https://api.citoapi.com/api/v1/tennis/tournaments/atp_2026_540/schedule"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"success": true,
"items": [
{
"id": "s365_2026_4764920",
"tournament_id": "atp_2026_540",
"tournament_name": "Wimbledon",
"level": "G",
"category": "grand_slam",
"year": 2026,
"match_date": "2026-07-12",
"tour": "ATP",
"surface": "Grass",
"round": "F",
"round_name": "Final",
"best_of": 5,
"score": "6-7 7-6 6-3 6-4",
"outcome": "COMPLETED",
"status": "COMPLETED",
"duration_minutes": null,
"winner_id": "atp_206173",
"loser_id": "atp_100644",
"winner": {
"id": "atp_206173",
"name": "Jannik Sinner",
"ioc": "ITA",
"seed": "1",
"rank": 1,
"is_winner": true
},
"loser": {
"id": "atp_100644",
"name": "Alexander Zverev",
"ioc": "GER",
"seed": "2",
"rank": 3,
"is_winner": false
},
"player1": {
"id": "atp_206173",
"name": "Jannik Sinner",
"ioc": "ITA",
"seed": "1",
"rank": 1,
"is_winner": true
},
"player2": {
"id": "atp_100644",
"name": "Alexander Zverev",
"ioc": "GER",
"seed": "2",
"rank": 3,
"is_winner": false
},
"name": "Wimbledon",
"starts_at": "2026-07-12T00:00:00+00:00"
},
{
"id": "s365_2026_4762041",
"tournament_id": "atp_2026_540",
"tournament_name": "Wimbledon",
"level": "G",
"category": "grand_slam",
"year": 2026,
"match_date": "2026-07-10",
"tour": "ATP",
"surface": "Grass",
"round": "SF",
"round_name": "Semi-Finals",
"best_of": 5,
"score": "6-4 6-4 6-4",
"outcome": "COMPLETED",
"status": "COMPLETED",
"duration_minutes": null,
"winner_id": "atp_206173",
"loser_id": "atp_104925",
"winner": {
"id": "atp_206173",
"name": "Jannik Sinner",
"ioc": "ITA",
"seed": "1",
"rank": 1,
"is_winner": true
},
"loser": {
"id": "atp_104925",
"name": "Novak Djokovic",
"ioc": "SRB",
"seed": "7",
"rank": 7,
"is_winner": false
},
"player1": {
"id": "atp_206173",
"name": "Jannik Sinner",
"ioc": "ITA",
"seed": "1",
"rank": 1,
"is_winner": true
},
"player2": {
"id": "atp_104925",
"name": "Novak Djokovic",
"ioc": "SRB",
"seed": "7",
"rank": 7,
"is_winner": false
},
"name": "Wimbledon",
"starts_at": "2026-07-10T00:00:00+00:00"
}
],
"total": 125,
"page": 1,
"page_size": 50,
"total_pages": 3,
"has_next": true,
"has_prev": false
}