Sports & Fitness — entry 019 of 34
OpenF1
OpenF1 is an open-source F1 data API spanning 18 endpoints -- car telemetry at up to 3.7Hz, lap and sector times, race-control flags, pit stops, team radio, and championship standings -- returned as JSON or, by appending a query flag, CSV. Historical data back to the 2023 season is free with no API key, credit card, or signup at all; a paid Sponsor tier (about €9.90/month) only adds access during live sessions, roughly 3 seconds after real-world events. A live request confirmed the public endpoint responds keyless and echoes permissive CORS headers, matching its "zero friction" pitch.
OpenF1 exposes 18 flat, keyless endpoints -- sessions, laps, car telemetry, drivers, pit stops, team radio, and more -- each returning a bare JSON array of objects filtered entirely through query-string parameters, including comparison-operator suffixes on the field name itself (e.g. `date_start>=`) rather than a separate operator param. A live GET this run confirmed the public host answers keyless with wide-open CORS, and that appending `csv=true` switches the same query to a downloadable CSV instead of changing the endpoint.
GreatAPIs Score
Auth quickstart
- No API key, signup, or credit card is required for any of the free historical endpoints used below. A live GET this run confirmed the public host answers keyless with `access-control-allow-origin: *`. OpenF1's optional paid Sponsor tier (about €9.90/month) only unlocks access during live sessions (data arrives roughly 3 seconds after real-world events) via a Bearer token issued at openf1.org/auth -- not needed for anything historical, which is what this quickstart uses.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
List this year's Sprint sessions
GEThttps://api.openf1.org/v1/sessions?year=2024&session_name=Sprint
[{"session_key":9672,"session_type":"Race","session_name":"Sprint","date_start":"2024-04-20T03:00:00+00:00","date_end":"2024-04-20T04:00:00+00:00","meeting_key":1233,"circuit_key":49,"circuit_short_name":"Shanghai","country_key":53,"country_code":"CHN","country_name":"China","location":"Shanghai","gmt_offset":"08:00:00","year":2024,"is_cancelled":false},{"...":"5 more Sprint sessions in 2024, same shape"}]Try it
Developer reference
https://api.openf1.org/v1- GET/sessions?year={year}
- GET/drivers?session_key={session_key}
- GET/laps?session_key={session_key}&driver_number={driver_number}
Gotchas & limits
- An empty result set is a genuine HTTP 404 with `{"detail":"No results found."}` -- not a 200 with an empty array: a live `GET /v1/laps?session_key=99999999` (an invalid key) this run returned exactly that, and the identical 404 body reproduced for a valid-but-zero-match filter too (`GET /v1/sessions?year=1990` this run), so 404 here means "no matching rows," not "missing endpoint."
- Appending `csv=true` changes the wire format but re-sorts the columns: a live `GET /v1/sessions?year=2024&session_name=Sprint&csv=true` this run returned `content-type: text/csv; charset=utf-8` with a `content-disposition: attachment; filename=sessions.csv` header, and its header row is alphabetically ordered (`circuit_key,circuit_short_name,country_code,...`) rather than matching the JSON response's field order (`session_key` first).
- Range filters are a comparison operator suffixed directly onto the field name in the query string, not a separate operator parameter: a live `GET /v1/laps?session_key=9161&driver_number=63&date_start%3E=2023-09-16T13:03:35` (URL-encoded `>=`) this run returned only laps at or after that timestamp, confirming `>=`/`<=`/`>`/`<` all work as literal query-key suffixes across endpoints.
- CORS is wide open unconditionally: a live GET with `Origin: https://greatapis.com` this run returned `access-control-allow-origin: *` alongside `access-control-allow-credentials: true`, so no proxy is required for browser-side calls.