🎢 CS Ranking API

The roller coasters and theme parks that Coastersstats members prefer — as read-only JSON. Free, with an API key on request.

Right now — ranking of 2026-10-28

#1
Zadra
Energylandia · Poland
99.49% · 6 voters
#2
Taron
Phantasialand · Germany
98.87% · 11 voters
#3
The Ride to Happiness by Tomorrowland
Plopsaland Belgium · Belgium
98.46% · 11 voters

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

GEThttps://api.coastersstats.com/api/v1/ranking/coasters
GEThttps://api.coastersstats.com/api/v1/ranking/parks
ParameterMeaning
pageThe full ranking is returned 50 rows per page. Default 1; the response tells how many pages exist.
dateYYYY-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": "…" }
}
FieldMeaning
rank, previous_rankPosition in this ranking, and in the previous day's (null = was not ranked).
score0–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, countryIdentification. id is the Coastersstats identifier.
coasterpedia_urlThe Coasterpedia article, when known.

Aggregated figures only: nothing about any individual member ever leaves Coastersstats.

Freshness, limits, errors

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);