BYTETOOLS

RATP Open Data API

Free Paris RATP open data API with no key: annual station ridership, in-station air quality measurements, drinking fountains, defibrillators and toilets. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the RATP Open Data API?

RATP Open Data is the Paris transport operator's free, key-free Opendatasoft portal. It publishes annual entry counts for every metro and RER station, continuous air quality measurements from inside several stations, and the locations of drinking fountains, defibrillators and toilets across the network.

Set expectations correctly: this is a statistics and facilities portal, not a live journey planner. RATP's real-time departure data moves through Île-de-France Mobilités under a key, so what you get here is the reference and measurement side — which happens to include some datasets nobody else publishes, such as continuous PM and CO2 readings from platform level at Châtelet and Franklin D. Roosevelt.

The ridership dataset used in the example is the one people reach for most: annual entries per station, ranked, with the interchange lines listed and, for Paris proper, the arrondissement. Gare du Nord at roughly 50 million entries a year is the busiest station in Europe by this measure. The API is standard Opendatasoft Explore v2.1, so `where`, `select`, `group_by` and `order_by` behave as they do on any Opendatasoft portal, and the same query syntax works across every dataset in the catalogue.

Quick facts

Base URL
https://data.ratp.fr/api/explore/v2.1
Authentication
No API key or account. French open data published by RATP under an open licence.
Rate limit
5,000 requests per day per IP, reported in `X-RateLimit-Limit` and `X-RateLimit-Remaining`.
Pricing
Free.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the RATP Open Data API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Fetch the busiest Paris stations by annual ridership

GET https://data.ratp.fr/api/explore/v2.1/catalog/datasets/trafic-annuel-entrant-par-station-du-reseau-ferre/records?limit=2&order_by=trafic%20DESC

curl
curl 'https://data.ratp.fr/api/explore/v2.1/catalog/datasets/trafic-annuel-entrant-par-station-du-reseau-ferre/records?limit=2&order_by=trafic%20DESC'
JavaScript (fetch)
const res = await fetch("https://data.ratp.fr/api/explore/v2.1/catalog/datasets/trafic-annuel-entrant-par-station-du-reseau-ferre/records?limit=2&order_by=trafic%20DESC");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://data.ratp.fr/api/explore/v2.1/catalog/datasets/trafic-annuel-entrant-par-station-du-reseau-ferre/records?limit=2&order_by=trafic%20DESC", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
{
  "total_count": 369,
  "results": [
    {
      "rang": 1,
      "reseau": "Métro",
      "station": "GARE DU NORD",
      "trafic": 49977513,
      "correspondance_1": "4",
      "correspondance_2": "5",
      "correspondance_3": null,
      "correspondance_4": null,
      "correspondance_5": null,
      "ville": "Paris",
      "arrondissement_pour_paris": 10
    },
    {
      "rang": 1,
      "reseau": "RER",
      "station": "GARE DU NORD-RER",
      "trafic": 46757083,
      "correspondance_1": "B",
      "correspondance_2": null,
      "correspondance_3": null,
      "correspondance_4": null,
      "correspondance_5": null,
      "ville": "Paris",
      "arrondissement_pour_paris": 10
    }
  ]
}

Parameters

ParameterTypeRequiredDescription
(dataset)pathRequired`/catalog/datasets/{dataset_id}/records` queries one dataset. trafic-annuel-entrant-par-station-du-reseau-ferre
limit / offsetqueryOptionalPage size and offset. `limit` maxes out at 100 per request. 2
order_byqueryOptionalSort expression, for example `trafic DESC`. trafic DESC
wherequeryOptionalOpendatasoft filter expression — `where=ville='Paris'` or a numeric comparison. trafic>10000000
selectqueryOptionalChoose or compute fields, including aggregates such as `sum(trafic)`. station,trafic
group_byqueryOptionalAggregate rows by a field, for totals per line or per municipality. reseau
(catalog)pathOptional`/catalog/datasets` lists every dataset RATP publishes. datasets

Response fields

total_countinteger
Total matching records across the dataset, not just this page.
resultsarray
The page of records. Fields depend on which dataset you queried.
(ridership) ranginteger
Rank within its network — note metro and RER are ranked separately, so rank 1 appears twice.
(ridership) reseaustring
Network: "Métro" or "RER".
(ridership) stationstring
Station name in upper case, as published.
(ridership) traficinteger
Annual entries at that station.
(ridership) correspondance_1 … _5string
Interchange lines available, null where fewer than five.
(ridership) ville / arrondissement_pour_parisstring / integer
Municipality, and the arrondissement number for stations inside Paris.

What you can build with the RATP Open Data API

  • Rank Paris stations by passenger volume for analysis or visualisation
  • Map drinking fountains, toilets and defibrillators across the network
  • Study in-station air quality measurements over time
  • Compare ridership across years using the per-year datasets
  • Aggregate footfall by arrondissement or by line

Common errors and how to fix them

Duplicate rank values

Metro and RER are ranked independently within the same dataset.

Fix: Group by `reseau` before interpreting `rang`, or ignore it and sort on `trafic` yourself.

404 NotFoundResource

The dataset id is wrong.

Fix: List `/catalog/datasets` first. Ids are long, hyphenated and often carry a year suffix that changes between editions.

Only 100 records returned

`limit` is capped at 100 per request.

Fix: Page with `offset`, or use `group_by` and aggregate server-side rather than pulling every row.

429 Too Many Requests

The 5,000-per-day IP quota is exhausted.

Fix: These are annual and archival datasets — cache them locally rather than querying live for each page view.

RATP Open Data API — frequently asked questions

Is the RATP API free?

Yes, free with no key or account, at 5,000 requests per day per IP. It is French open data published under an open licence.

Does it provide live metro times?

No. Real-time departures for the Paris network are distributed by Île-de-France Mobilités under a key. This portal covers ridership statistics, air quality measurements and facility locations.

What is the most useful dataset here?

Annual entries per station is the most requested — it ranks every metro and RER station by footfall, with interchange lines and arrondissement attached. The in-station air quality series is the most unusual.

How does the query syntax work?

It is standard Opendatasoft Explore v2.1, so `where`, `select`, `group_by` and `order_by` work the same way on every dataset in the catalogue and on other Opendatasoft portals.

Tools that pair with this API

RATP Open Data is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.