Sports & Fitness — entry 019 of 34

OpenF1

Verified Jul 2026

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.

formula-1motorsporttelemetryreal-timeopen-source
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreemiumA usable free tier exists, with paid plans for more volume.
FormatsJSON, CSVResponses can be requested as JSON or CSV.

GreatAPIs Score

Score77out of 100
Authentication25/25No authentication required
Pricing17/20Freemium tier available
Docs0/20No docs or spec available
Formats15/15Supports 2 response formats
Freshness20/20Verified within 6 months

Embed this badge

Scored 77 on greatapis.com
<a href="https://greatapis.com/api/openf1/"><img src="https://greatapis.com/badge/openf1.svg" alt="Scored 77 on greatapis.com"></a>

Auth quickstart

  1. 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.
Stored keyNo key stored

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

200 application/json

[{"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

Base URLhttps://api.openf1.org/v1
Key endpoints
  • 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.