Right now — ranking of 2026-10-28
The same ranking as a web page: coastersstats.com/cs-ranking.
Get a key
This page is public; the data endpoints need an API key. Keys are free and issued on request: tell us who you are and what you plan to build through the contact form or on our Discord.
Send the key in the X-AUTH-TOKEN header of every request. Keep it server-side: a key placed in a web page is readable by everyone. Without a valid key the API answers 401.
Endpoints
https://api.coastersstats.com/api/v1/ranking/coastershttps://api.coastersstats.com/api/v1/ranking/parks| Parameter | Meaning |
|---|---|
page | The full ranking is returned 50 rows per page. Default 1; the response tells how many pages exist. |
date | YYYY-MM-DD — the ranking as it was on that day (the latest computation of that day, or the closest one before). Default: the latest ranking. |
Example: /api/v1/ranking/coasters?page=2
How the ranking is built
Coasters are compared two by two. On each pair every member counts for one vote — from their head-to-head duels (their personal “CS Score”) when they have played them, from their ratings otherwise — and the majority wins. A coaster's score is the share of its comparisons it wins (0–100). A coaster is ranked once 3 members have an opinion on it; a park once 3 of its coasters are ranked, its score being the average of theirs. Recomputed once a day.
Response
{
"ranking": "coasters",
"date": "2026-09-21",
"computed_at": "2026-09-21T04:12:09+00:00",
"page": 1, "pages": 4, "per_page": 50, "total": 192,
"items": [
{
"rank": 1,
"previous_rank": 2,
"id": 2662,
"name": "Taron",
"park": { "id": 172, "name": "Phantasialand" },
"country": "Germany",
"score": 99.02,
"voters": 10,
"coasterpedia_url": "https://coasterpedia.net/wiki/Taron"
}
],
"about": { "source": "…", "method": "…", "license": { … }, "data_sources": [ … ], "terms": "…" }
}
| Field | Meaning |
|---|---|
rank, previous_rank | Position in this ranking, and in the previous day's (null = was not ranked). |
score | 0–100. Coaster: share of head-to-head comparisons won. Park: average score of its ranked coasters. |
voters (coasters) | Members with an opinion on this coaster. |
ranked_coasters (parks) | How many of the park's coasters are ranked. |
id, name, park / location, country | Identification. id is the Coastersstats identifier. |
coasterpedia_url | The Coasterpedia article, when known. |
Aggregated figures only: nothing about any individual member ever leaves Coastersstats.
Freshness, limits, errors
- The ranking is computed once a day; this API keeps its copy for 24 hours, so it can be up to a day behind the website. Responses carry
Cache-Control: private, max-age=3600and anETag— please cache them. - 300 requests per hour per IP address. Beyond:
429with aRetry-Afterheader. 401= missing or invalid key.400= invaliddate.404= unknown ranking.502= the ranking is temporarily unavailable (rare: a previous copy is normally served, flaggedX-Ranking-Stale: 1)./v1is a stable contract: a breaking change would ship as/v2.
Licence — two layers
The ranking itself — rank, previous_rank, score, voters, ranked_coasters — is produced by Coastersstats members and licensed under Creative Commons Attribution 4.0 (CC BY 4.0): free to share and adapt, including commercially, as long as you credit “CS Ranking — Coastersstats” with a link.
Names and places — name, park, location, country, coasterpedia_url — are not ours: they come from Coasterpedia, published under CC BY-SA 4.0. Credit Coasterpedia too, and keep that licence for that part.
The same terms are repeated in the about block of every response.
Try it
curl -H "X-AUTH-TOKEN: your-key" https://api.coastersstats.com/api/v1/ranking/coasters
# PHP
$json = file_get_contents('https://api.coastersstats.com/api/v1/ranking/parks', false, stream_context_create([
'http' => ['header' => 'X-AUTH-TOKEN: your-key'],
]));
$top5 = array_slice(json_decode($json, true)['items'], 0, 5);