Rankings endpoints

Weekly ATP and WTA singles rankings, point-in-time history and movers.

GET/tennis/rankings

Weekly ATP/WTA Rankings Table

Retrieves weekly ATP/WTA rankings. If mid-week date is provided, resolves to preceding Monday.

ParameterInTypeDescription
tourquerystringTour federation: ATP or WTA
circuitquerystringSynonym for tour, matching the /rankings/{circuit} path form: ATP or WTA
datequerystringRanking publication date (YYYY-MM-DD)
rank_minqueryintegerMinimum rank numbermin 1 · default 1
rank_maxqueryintegerMaximum rank numbermin 1 · max 2000 · default 100
country_codequerystringFilter by 3-letter IOC code
pagequeryintegerPage number (1-indexed)min 1 · default 1
page_sizequeryintegerItems per pagemin 1 · max 500 · default 50
limitqueryintegerAlias for page_sizemin 1 · max 500
bash
curl -H "x-api-key: YOUR_API_KEY" \
  "https://api.citoapi.com/api/v1/tennis/rankings?circuit=atp&page_size=2"

Real response (HTTP 200), captured from the production API; long arrays cut to two items.

json
{
  "success": true,
  "ranking_date": "2026-09-28",
  "tour": "ATP",
  "items": [
    {
      "rank": 1,
      "player_id": "atp_206173",
      "player_name": "Jannik Sinner",
      "ioc": "ITA",
      "country_name": "Italy",
      "nationality": "Italy",
      "points": 11000,
      "rank_movement": 0,
      "previous_rank": 1,
      "tournaments_played": null,
      "id": "atp_206173",
      "name": "Jannik Sinner"
    },
    {
      "rank": 2,
      "player_id": "atp_100644",
      "player_name": "Alexander Zverev",
      "ioc": "GER",
      "country_name": "Germany",
      "nationality": "Germany",
      "points": 9630,
      "rank_movement": 0,
      "previous_rank": 2,
      "tournaments_played": null,
      "id": "atp_100644",
      "name": "Alexander Zverev"
    }
  ],
  "total": 100,
  "page": 1,
  "page_size": 2,
  "total_pages": 50,
  "has_next": true,
  "has_prev": false
}
GET/tennis/rankings/dates

List Available Ranking Dates

Retrieves all distinct official ranking publication dates.

ParameterInTypeDescription
tourquerystringATP or WTA
circuitquerystringSynonym for tour, matching the /rankings/{circuit} path form: ATP or WTA
yearqueryintegerOptional year
limitqueryintegerMax dates to return (most recent first)min 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/rankings/dates?circuit=atp&page_size=2"

Real response (HTTP 200), captured from the production API; long arrays cut to two items.

json
{
  "success": true,
  "items": [
    "2026-09-28",
    "2026-09-21"
  ],
  "total": 2347,
  "page": 1,
  "page_size": 2,
  "total_pages": 1174,
  "has_next": true,
  "has_prev": false
}
GET/tennis/rankings/history/{player_id}

Player Career Ranking Trajectory

Retrieves career historical ranking progression and peak ranking for a player.

ParameterInTypeDescription
player_id*pathstring
date_startquerystringStart date
date_endquerystringEnd date
bash
curl -H "x-api-key: YOUR_API_KEY" \
  "https://api.citoapi.com/api/v1/tennis/rankings/history/atp_206173"

Real response (HTTP 200), captured from the production API; long arrays cut to two items.

json
{
  "success": true,
  "player_id": "atp_206173",
  "player_name": "Jannik Sinner",
  "tour": "ATP",
  "career_high_rank": 1,
  "career_high_date": "2024-06-10",
  "total_weeks_at_no_1": 74,
  "history": [
    {
      "date": "2018-02-12",
      "rank": 1592,
      "points": 1,
      "starts_at": "2018-02-12T00:00:00+00:00"
    },
    {
      "date": "2018-02-19",
      "rank": 1586,
      "points": 1,
      "starts_at": "2018-02-19T00:00:00+00:00"
    }
  ],
  "id": "atp_206173",
  "name": "Jannik Sinner"
}
GET/tennis/rankings/movers

Ranking Movers Between Published Lists

Climbers, fallers, new entries and drop-outs between a published list and the one before it. The two lists can be weeks apart when the archive has gaps, which is why both dates are in the response. movement = previous_rank - rank; both dates are named so the number can be checked.

ParameterInTypeDescription
tourquerystringATP or WTA
circuitquerystringSynonym for tour, matching the /rankings/{circuit} path form: ATP or WTA
datequerystringRanking date to compare against its predecessor (default: latest)
limitqueryintegerRows per listmin 1 · max 500 · default 20
page_sizequeryintegerAlias for limit, matching the paginated routesmin 1 · max 500
withinqueryintegerOnly players inside the top N on either listmin 1 · max 2000 · default 100
directionquerystringup (climbers), down (fallers), or both (largest absolute change)default up
bash
curl -H "x-api-key: YOUR_API_KEY" \
  "https://api.citoapi.com/api/v1/tennis/rankings/movers?circuit=atp&limit=2"

Real response (HTTP 200), captured from the production API; long arrays cut to two items.

json
{
  "success": true,
  "tour": "ATP",
  "ranking_date": "2026-09-28",
  "previous_date": "2026-09-21",
  "within": 100,
  "direction": "up",
  "new_entries": [],
  "dropped": [
    {
      "player_id": "atp_208597",
      "player_name": "Chak Lam Coleman Wong",
      "ioc": "HKG",
      "country_name": "Hong Kong",
      "nationality": "Hong Kong",
      "rank": null,
      "previous_rank": 100,
      "id": "atp_208597",
      "name": "Chak Lam Coleman Wong"
    }
  ],
  "items": [
    {
      "player_id": "atp_209409",
      "player_name": "Coleman Wong",
      "ioc": "HKG",
      "country_name": "Hong Kong",
      "nationality": "Hong Kong",
      "rank": 100,
      "previous_rank": 108,
      "movement": 8,
      "points": 620,
      "id": "atp_209409",
      "name": "Coleman Wong"
    },
    {
      "player_id": "atp_111575",
      "player_name": "Karen Khachanov",
      "ioc": "RUS",
      "country_name": "Russia",
      "nationality": "Russia",
      "rank": 26,
      "previous_rank": 27,
      "movement": 1,
      "points": 1800,
      "id": "atp_111575",
      "name": "Karen Khachanov"
    }
  ],
  "total": 2,
  "page": 1,
  "page_size": 2,
  "total_pages": 1,
  "has_next": false,
  "has_prev": false
}
GET/tennis/rankings/top

Top N Rankings Snapshot

Instant snapshot of top ranked players.

ParameterInTypeDescription
tourquerystringATP or WTA
circuitquerystringSynonym for tour, matching the /rankings/{circuit} path form: ATP or WTA
top_nqueryintegerNumber of top players (e.g. 10, 20, 50, 100)min 1 · max 500 · default 10
limitqueryintegerAlias for top_nmin 1 · max 500
page_sizequeryintegerAlias for top_nmin 1 · max 500
bash
curl -H "x-api-key: YOUR_API_KEY" \
  "https://api.citoapi.com/api/v1/tennis/rankings/top?circuit=wta&limit=2"

Real response (HTTP 200), captured from the production API; long arrays cut to two items.

json
{
  "success": true,
  "tour": "WTA",
  "ranking_date": "2026-09-28",
  "items": [
    {
      "rank": 1,
      "player_id": "wta_214981",
      "player_name": "Elena Rybakina",
      "ioc": "KAZ",
      "country_name": "Kazakhstan",
      "nationality": "Kazakhstan",
      "points": 9901,
      "rank_movement": 0,
      "previous_rank": 1,
      "tournaments_played": null,
      "id": "wta_214981",
      "name": "Elena Rybakina"
    },
    {
      "rank": 2,
      "player_id": "wta_214544",
      "player_name": "Aryna Sabalenka",
      "ioc": "BLR",
      "country_name": "Belarus",
      "nationality": "Belarus",
      "points": 7810,
      "rank_movement": 0,
      "previous_rank": 2,
      "tournaments_played": null,
      "id": "wta_214544",
      "name": "Aryna Sabalenka"
    }
  ],
  "total": 2,
  "page": 1,
  "page_size": 2,
  "total_pages": 1,
  "has_next": false,
  "has_prev": false
}
GET/tennis/rankings/{circuit}

Rankings by Circuit (path form)

Circuit-style rankings path: /rankings/atp, /rankings/wta (singles).

Doubles and race standings are not in this dataset; those circuits return a structured 404 saying so rather than an empty table.

ParameterInTypeDescription
circuit*pathstring
datequerystring
rank_minqueryintegermin 1 · default 1
rank_maxqueryintegermin 1 · max 2000 · default 100
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/rankings/atp"

Real response (HTTP 200), captured from the production API; long arrays cut to two items.

json
{
  "success": true,
  "ranking_date": "2026-09-28",
  "tour": "ATP",
  "items": [
    {
      "rank": 1,
      "player_id": "atp_206173",
      "player_name": "Jannik Sinner",
      "ioc": "ITA",
      "country_name": "Italy",
      "nationality": "Italy",
      "points": 11000,
      "rank_movement": 0,
      "previous_rank": 1,
      "tournaments_played": null,
      "id": "atp_206173",
      "name": "Jannik Sinner"
    },
    {
      "rank": 2,
      "player_id": "atp_100644",
      "player_name": "Alexander Zverev",
      "ioc": "GER",
      "country_name": "Germany",
      "nationality": "Germany",
      "points": 9630,
      "rank_movement": 0,
      "previous_rank": 2,
      "tournaments_played": null,
      "id": "atp_100644",
      "name": "Alexander Zverev"
    }
  ],
  "total": 100,
  "page": 1,
  "page_size": 50,
  "total_pages": 2,
  "has_next": true,
  "has_prev": false
}
GET/tennis/standings

Tour Standings (latest singles rankings)

Current tour standings: the latest published singles list, top first.

`tour`/`circuit` pick the federation exactly as on /rankings. `category` is accepted for competitor parity; this dataset holds singles rankings only, so doubles answers the same structured 404 the circuit guard uses rather than an empty table that looks like nobody plays doubles.

ParameterInTypeDescription
tourquerystringATP or WTA
circuitquerystringSynonym for tour: ATP or WTA
categoryquerystringsingles or doublesdefault singles
top_nqueryintegerStandings rows (e.g. 10, 20, 50, 100)min 1 · max 500 · default 10
limitqueryintegerAlias for top_nmin 1 · max 500
page_sizequeryintegerAlias for top_nmin 1 · max 500
datequerystringRanking publication date (YYYY-MM-DD, default: latest)
bash
curl -H "x-api-key: YOUR_API_KEY" \
  "https://api.citoapi.com/api/v1/tennis/standings?circuit=atp&page_size=2"

Real response (HTTP 200), captured from the production API; long arrays cut to two items.

json
{
  "success": true,
  "ranking_date": "2026-09-28",
  "tour": "ATP",
  "items": [
    {
      "rank": 1,
      "player_id": "atp_206173",
      "player_name": "Jannik Sinner",
      "ioc": "ITA",
      "country_name": "Italy",
      "nationality": "Italy",
      "points": 11000,
      "rank_movement": 0,
      "previous_rank": 1,
      "tournaments_played": null,
      "id": "atp_206173",
      "name": "Jannik Sinner"
    },
    {
      "rank": 2,
      "player_id": "atp_100644",
      "player_name": "Alexander Zverev",
      "ioc": "GER",
      "country_name": "Germany",
      "nationality": "Germany",
      "points": 9630,
      "rank_movement": 0,
      "previous_rank": 2,
      "tournaments_played": null,
      "id": "atp_100644",
      "name": "Alexander Zverev"
    }
  ],
  "total": 2,
  "page": 1,
  "page_size": 2,
  "total_pages": 1,
  "has_next": false,
  "has_prev": false,
  "category": "singles"
}