Tournaments endpoints

The tournament catalogue, season calendar, editions, draws and schedules.

GET/tennis/competitions

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

ParameterInTypeDescription
tourquerystringATP or WTA
qquerystringName search
pagequeryintegermin 1 · default 1
page_sizequeryintegermin 1 · max 500 · default 50
bash
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.

json
{
  "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
}
GET/tennis/tournaments

List & Filter Tournaments

Retrieves catalog of tennis tournaments across history.

ParameterInTypeDescription
tourquerystringATP or WTA
qquerystringCase-insensitive name search, same as /players?q=
yearqueryintegerEdition year, e.g. 2026
levelquerystringLevel tier code: G, M, A, F, D, C
surfacequerystringSurface: Hard, Clay, Grass, Carpet
include_live_shellsquerybooleanInclude live-feed containers (s365_*) that hold archived live results; excluded by default because they are not real eventsdefault false
country_codequerystringCountry IOC code
pagequeryintegerPage number (1-indexed)min 1 · default 1
page_sizequeryintegerItems per pagemin 1 · max 500 · default 20
limitqueryintegerAlias for page_sizemin 1 · max 500
bash
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.

json
{
  "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
}
GET/tennis/tournaments/calendar

Annual Season Calendar

Retrieves annual schedule of tournaments for a given season.

ParameterInTypeDescription
year*queryintegerCalendar year (e.g. 2023, 2024)
tourquerystringATP or WTA
limitqueryintegerMax tournaments to returnmin 1 · max 500
page_sizequeryintegerAlias for limitmin 1 · max 500
bash
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.

json
{
  "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
}
GET/tennis/tournaments/{tournament_id}

Get Tournament Profile

Retrieves full profile, surface, and title records for a tournament.

ParameterInTypeDescription
tournament_id*pathstring
bash
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.

json
{
  "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
}
GET/tennis/tournaments/{tournament_id}/bracket

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

ParameterInTypeDescription
tournament_id*pathstring
yearqueryintegerOptional year edition
bash
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.

json
{
  "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"
}
GET/tennis/tournaments/{tournament_id}/draw

Get Tournament Draw Bracket

Builds interactive bracket draw tree for a tournament edition.

ParameterInTypeDescription
tournament_id*pathstring
yearqueryintegerOptional year edition
bash
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.

json
{
  "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"
}
GET/tennis/tournaments/{tournament_id}/edition

Tournament Edition Metadata

ParameterInTypeDescription
tournament_id*pathstring
bash
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.

json
{
  "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
  }
}
GET/tennis/tournaments/{tournament_id}/editions/{year}/draw

Get Specific Tournament Edition Draw

Builds interactive bracket draw tree for a specific tournament year edition.

ParameterInTypeDescription
tournament_id*pathstring
year*pathinteger
bash
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.

json
{
  "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"
}
GET/tennis/tournaments/{tournament_id}/schedule

Tournament Edition Schedule

Matches of one tournament edition in date/round order — order of play, results view.

ParameterInTypeDescription
tournament_id*pathstring
roundquerystringRound code filter: F, SF, QF, R16…
pagequeryintegermin 1 · default 1
page_sizequeryintegermin 1 · max 500 · default 50
bash
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.

json
{
  "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
}