Rankings endpoints
Weekly ATP and WTA singles rankings, point-in-time history and movers.
- /tennis/rankings · Weekly ATP/WTA Rankings Table
- /tennis/rankings/dates · List Available Ranking Dates
- /tennis/rankings/history/{player_id} · Player Career Ranking Trajectory
- /tennis/rankings/movers · Ranking Movers Between Published Lists
- /tennis/rankings/top · Top N Rankings Snapshot
- /tennis/rankings/{circuit} · Rankings by Circuit (path form)
- /tennis/standings · Tour Standings (latest singles rankings)
/tennis/rankingsWeekly ATP/WTA Rankings Table
Retrieves weekly ATP/WTA rankings. If mid-week date is provided, resolves to preceding Monday.
| Parameter | In | Type | Description |
|---|---|---|---|
| tour | query | string | Tour federation: ATP or WTA |
| circuit | query | string | Synonym for tour, matching the /rankings/{circuit} path form: ATP or WTA |
| date | query | string | Ranking publication date (YYYY-MM-DD) |
| rank_min | query | integer | Minimum rank numbermin 1 · default 1 |
| rank_max | query | integer | Maximum rank numbermin 1 · max 2000 · default 100 |
| country_code | query | string | Filter by 3-letter IOC code |
| page | query | integer | Page number (1-indexed)min 1 · default 1 |
| page_size | query | integer | Items per pagemin 1 · max 500 · default 50 |
| 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/rankings?circuit=atp&page_size=2"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"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
}/tennis/rankings/datesList Available Ranking Dates
Retrieves all distinct official ranking publication dates.
| Parameter | In | Type | Description |
|---|---|---|---|
| tour | query | string | ATP or WTA |
| circuit | query | string | Synonym for tour, matching the /rankings/{circuit} path form: ATP or WTA |
| year | query | integer | Optional year |
| limit | query | integer | Max dates to return (most recent first)min 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/rankings/dates?circuit=atp&page_size=2"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"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
}/tennis/rankings/history/{player_id}Player Career Ranking Trajectory
Retrieves career historical ranking progression and peak ranking for a player.
| Parameter | In | Type | Description |
|---|---|---|---|
| player_id* | path | string | |
| date_start | query | string | Start date |
| date_end | query | string | End date |
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.
{
"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"
}/tennis/rankings/moversRanking 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.
| Parameter | In | Type | Description |
|---|---|---|---|
| tour | query | string | ATP or WTA |
| circuit | query | string | Synonym for tour, matching the /rankings/{circuit} path form: ATP or WTA |
| date | query | string | Ranking date to compare against its predecessor (default: latest) |
| limit | query | integer | Rows per listmin 1 · max 500 · default 20 |
| page_size | query | integer | Alias for limit, matching the paginated routesmin 1 · max 500 |
| within | query | integer | Only players inside the top N on either listmin 1 · max 2000 · default 100 |
| direction | query | string | up (climbers), down (fallers), or both (largest absolute change)default up |
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.
{
"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
}/tennis/rankings/topTop N Rankings Snapshot
Instant snapshot of top ranked players.
| Parameter | In | Type | Description |
|---|---|---|---|
| tour | query | string | ATP or WTA |
| circuit | query | string | Synonym for tour, matching the /rankings/{circuit} path form: ATP or WTA |
| top_n | query | integer | Number of top players (e.g. 10, 20, 50, 100)min 1 · max 500 · default 10 |
| limit | query | integer | Alias for top_nmin 1 · max 500 |
| page_size | query | integer | Alias for top_nmin 1 · max 500 |
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.
{
"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
}/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.
| Parameter | In | Type | Description |
|---|---|---|---|
| circuit* | path | string | |
| date | query | string | |
| rank_min | query | integer | min 1 · default 1 |
| rank_max | query | integer | min 1 · max 2000 · default 100 |
| 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/rankings/atp"Real response (HTTP 200), captured from the production API; long arrays cut to two items.
{
"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
}/tennis/standingsTour 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.
| Parameter | In | Type | Description |
|---|---|---|---|
| tour | query | string | ATP or WTA |
| circuit | query | string | Synonym for tour: ATP or WTA |
| category | query | string | singles or doublesdefault singles |
| top_n | query | integer | Standings rows (e.g. 10, 20, 50, 100)min 1 · max 500 · default 10 |
| limit | query | integer | Alias for top_nmin 1 · max 500 |
| page_size | query | integer | Alias for top_nmin 1 · max 500 |
| date | query | string | Ranking publication date (YYYY-MM-DD, default: latest) |
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.
{
"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"
}