F1 API: Free Jolpica and OpenF1 Endpoints for Results, Laps and Telemetry
Two free Formula 1 feeds, no key needed: we called every endpoint below on 2 November 2026.
Last updated:
What Is the F1 API?
The two free F1 APIs on this page are open-source projects, and neither needs a key for historical data. Jolpica serves results, standings and calendars back to 1950, plus lap times and pit stops, on the old Ergast URL paths. OpenF1 serves timing and telemetry from 2023 onward: lap and sector times, car speed and throttle, positions, tyres, weather and race control messages.
Formula 1 runs neither. OpenF1 says it "is not associated in any way with the Formula 1 companies", and Jolpica calls itself "volunteer-run, donation-supported". OpenF1's live data, from 30 minutes before a session until 30 minutes after it, needs an account on a paid plan.
If you came for the Ergast API: https://ergast.com/api/f1/2026.json returned HTTP 404 on 2 November 2026. Jolpica keeps "backwards compatible endpoints", so Ergast code needs a new host and little else. We made every call on this page that day, the day after the Mexico City Grand Prix.
Base URLs
| Host | What it serves | Format |
|---|---|---|
https://api.jolpi.ca/ergast/f1/ | Results, standings and calendars from 1950, plus laps, pit stops and qualifying | JSON only |
https://api.openf1.org/v1/ | Sessions, laps, car telemetry, positions, gaps, tyres, pit lane, weather, race control, 2023 onward | JSON, or CSV with csv=true |
https://ergast.com/api/f1/ | The original Ergast API | HTTP 404 (tested November 2026) |
Jolpica has one header rule. Its docs say "We require a custom user agent to be set when using our API", made of an app name and a version number, such as MyGreatF1App/1.2.3. Our probes sent sportsapis.dev-guide/1.0. OpenF1 documents no header rule, and our calls to it used curl's defaults.
What It Covers
Both feeds cover Formula 1 only. Jolpica's /seasons.json lists 77 seasons, 1950 to 2026, and /1950/1/results.json still returns the 1950 British Grand Prix. The 2026 calendar at /2026.json holds 23 races. Results run to round 19, Mexico City on 1 November, and round 20 in Brazil has no rows until it runs.
OpenF1 starts in 2023: /v1/sessions?year=2023 returned 118 sessions and year=2022 returned 404. For 2026 it lists 131 sessions, from testing days to sprints, and keeps the cancelled Bahrain and Saudi Arabian rounds with is_cancelled set to true.
ESPN carries F1 as well. Its scoreboard at https://site.api.espn.com/apis/site/v2/sports/racing/f1/scoreboard returned the Mexico City Grand Prix with five sessions, FP1 to the race, and 22 drivers in each; see the ESPN API guide. None of these sources carries betting odds, which come from a sports odds API.
Key Endpoints
Jolpica paths sit under https://api.jolpi.ca/ergast/f1. Every endpoint below answered 200 on 2 November 2026.
| Endpoint | What it returns | Example |
|---|---|---|
/{season}.json | Race calendar with session times | /2026.json: 23 races |
/{season}/results.json | Race results, paged by result row | /2026/results.json: 418 rows |
/{season}/last/results.json | The latest race | Mexico City, 22 drivers |
/{season}/driverstandings.json | Driver standings after the latest round | antonelli first on 380 points |
/{season}/constructorstandings.json | Team standings | 11 teams, Mercedes on 630 |
/drivers/{driverId}.json | One driver | max_verstappen, number "3" |
/{season}/{round}/laps.json | Lap time and position for each driver | /2026/1/laps.json: 1,003 timings |
/{season}/{round}/pitstops.json | Pit stops with lap and duration | /2026/1/pitstops.json: 32 stops |
/{season}/{round}/qualifying.json | Q1, Q2 and Q3 times | Pole: russell, 1:18.518 |
/circuits.json | Every circuit with coordinates | 78 circuits |
OpenF1 paths sit under https://api.openf1.org/v1. Session 11404 is the 2026 Mexico City Grand Prix race, and driver 1 is Lando Norris.
| Endpoint | What it returns | Example |
|---|---|---|
/sessions?year=2026 | Every session with its session_key | 131 sessions |
/meetings?year=2026 | Race weekends and tests | 27 meetings |
/drivers?session_key=latest | Drivers in the latest session | 22 drivers |
/laps?session_key=11404&driver_number=1 | Lap and sector times, speed traps | 70 rows |
/car_data?session_key=11404&driver_number=1&speed>=310 | Speed, throttle, brake, gear, RPM | 2,488 rows |
/position?session_key=11404&driver_number=1 | Position changes | 13 rows |
/stints?session_key=11404 | Tyre compound and laps per stint | 80 stints |
/pit?session_key=11404 | Pit lane times | 67 rows |
/weather?session_key=11404 | Air and track temperature, wind, rain | 205 rows |
/race_control?session_key=11404 | Flags, safety car, stewards' notes | 169 messages |
/intervals?session_key=11404&driver_number=1 | Gap to the car ahead and to the leader | 1,547 rows |
Jolpica Race Results Endpoint
The results endpoint returns the finishing order of one race or a whole season. Name a season and a round, or use last for the most recent race.
https://api.jolpi.ca/ergast/f1/{season}/{round}/results.json
https://api.jolpi.ca/ergast/f1/2026/last/results.json
Our call to the second URL returned round 19, Mexico City, with 22 rows in MRData.RaceTable.Races[0].Results. Max Verstappen won from fifth on the grid, and Lewis Hamilton finished 0.799 seconds behind.
| Field | Type | What it holds |
|---|---|---|
MRData.total | string | Rows available, "22" for one race |
Races[0].raceName | string | "Mexico City Grand Prix" |
Results[].position | string | Finishing place, "1" |
Results[].positionText | string | "R" for a retirement |
Results[].points | string | "25" |
Results[].Driver.driverId | string | The id other paths take, max_verstappen |
Results[].Driver.code | string | "VER" |
Results[].Constructor.name | string | "Red Bull" |
Results[].grid | string | Starting position, "5" |
Results[].status | string | "Finished" or "Retired" |
Results[].Time.millis | string | Race time in milliseconds, "8428772" |
Results[].Time.time | string | Winner's time "2:20:28.772", a gap such as "+0.799" for the rest |
Results[].FastestLap | object | rank, lap and Time.time |
Every value is a string, numbers included, so cast points before you add them up. The five drivers who retired had positionText "R" and no Time object. The docs also list AverageSpeed under FastestLap, but none of the 22 rows carried it.
OpenF1 Laps Endpoint
OpenF1's laps endpoint gives one row per lap, with sector times and speed traps. It needs a session_key, which you get from /v1/sessions, and usually a driver_number.
https://api.openf1.org/v1/laps?session_key=11404&driver_number=1
For Norris in Mexico City the call returned 70 rows: laps 1 to 71, with lap 5 absent. His fastest lap_duration was 79.8 on lap 50. Jolpica's FastestLap for the same race says lap 50, 1:19.800, so the two feeds agree.
| Field | Type | What it holds |
|---|---|---|
lap_number | integer | Lap in the session, from 1 |
lap_duration | number | Lap time in seconds, 79.8 on lap 50 |
duration_sector_1 to _3 | number | Sector times in seconds |
i1_speed, i2_speed | integer | Speed in km/h at the two intermediate points |
st_speed | integer or null | Speed trap in km/h, 348 on the last lap |
is_pit_out_lap | boolean | True on laps 1, 40 and 46 |
segments_sector_1 | array | Mini-sector codes: 2048 yellow, 2049 green, 2051 purple, 2064 pit lane |
date_start | string | Lap start, ISO 8601 in UTC |
session_key, driver_number | integer | 11404, 1 |
Expect some nulls. st_speed was null on 6 of the 70 laps and i1_speed on 4.
Parameters and Filters
Jolpica: limit, offset and path filters
The docs set limit at 30 by default and 100 at most; limit=200 came back as "100". The limit counts the innermost rows, such as results or lap timings: 2026/1/laps.json?limit=100 returned laps 1 to 5 with 20 timings each, and &offset=100 started at lap 6. Step offset until you reach MRData.total.
Filters go in the path. /2026/drivers/max_verstappen/results.json returned his 19 race results, and current stands in for the year. A path without .json got a 301 to a trailing slash, which returned JSON.
OpenF1: any field, with operators
OpenF1 filters on any field that is not an array, with >=, <=, > and < in the URL. Use session_key=latest for the newest session, ranges such as date_start>=2023-09-01, and csv=true for CSV.
Always filter car_data. The unfiltered call for one driver in one race returned 7.3 MB and 43,322 rows; adding speed>=310 cut it to 2,488 rows and 428 KB. The drs field was null in every 2026 row.
Code Examples
Each sample runs as written with no key. We ran all of them on 2 November 2026.
Latest race result in Python (Jolpica)
import requests
url = 'https://api.jolpi.ca/ergast/f1/2026/last/results.json'
headers = {'User-Agent': 'my-f1-app/1.0'} # Jolpica asks for an app name and version
data = requests.get(url, headers=headers, timeout=10).json()
race = data['MRData']['RaceTable']['Races'][0]
print(race['raceName'], race['date'])
for r in race['Results'][:3]:
print(r['position'], r['Driver']['code'], r['Constructor']['name'], r['points'])
It printed "Mexico City Grand Prix 2026-11-01", then VER, HAM and ANT with 25, 18 and 15 points. Put your own app name in the header.
Fastest lap in Python (OpenF1)
import requests
url = 'https://api.openf1.org/v1/laps'
params = {'session_key': 11404, 'driver_number': 1}
laps = requests.get(url, params=params, timeout=10).json()
timed = [lap for lap in laps if lap['lap_duration']]
best = min(timed, key=lambda lap: lap['lap_duration'])
print(len(laps), 'laps, fastest was lap', best['lap_number'], 'in', best['lap_duration'], 's')
Standings and telemetry with cURL
# Driver standings after the latest round
curl -A 'my-f1-app/1.0' 'https://api.jolpi.ca/ergast/f1/2026/driverstandings.json'
# Telemetry samples where car 1 hit 310 km/h or more
curl 'https://api.openf1.org/v1/car_data?session_key=11404&driver_number=1&speed>=310'
Next race in JavaScript (OpenF1)
// Node 18 or later
fetch('https://api.openf1.org/v1/sessions?year=2026&session_name=Race')
.then(r => r.json())
.then(races => {
const next = races.find(s => !s.is_cancelled && new Date(s.date_start) > new Date());
if (next) console.log(races.length, 'race sessions; next:', next.session_key, next.location, next.date_start);
else console.log(races.length, 'race sessions; none left in 2026');
});
On the day we ran it, that printed 25 race sessions and session 11412, São Paulo, on 8 November. The count includes the two cancelled rounds, which the filter skips.
Errors You Will See
Jolpica 400 Bad Request
/abcd.json returned {"detail":"Bad Request: Endpoint does not support final filter."}. /driverstandings.json with no year returned 400 with "Missing one of the required parameters ['season_year']", because Jolpica needs a season for standings.
Jolpica 200 with total "0"
/1900.json and /2026/99/results.json returned 200 with total "0" and an empty Races list. So did round 20, because the Brazilian Grand Prix had not run yet. Check total before you read Races[0].
Jolpica 404 and 429
404 came from /2026.xml, because XML is not supported. The rate limit docs describe a 429 "Request was throttled"; we never hit one.
OpenF1 404 "No results found."
OpenF1 answers an empty result with 404. A bad session key (99999999), a text key (abc), a year before 2023 and a misspelt path (/v1/lap) all returned {"detail":"No results found."}, so check the path before you blame the filter.
OpenF1 422
/v1/intervals with no filter ran for 5.6 seconds, then returned 422: "You're likely asking for too much data at once." Add a session_key and a driver_number.
Limitations and Terms
Free for non-commercial use
Jolpica's terms say "The API is freely available for non-commercial use" and license the data under CC BY-NC-SA 4.0. OpenF1 "is intended for educational purposes, personal learning projects, research, and non-commercial fan engagement", under the same licence. Both ask commercial users to contact them.
- Jolpica rate limit: 4 requests a second and 500 an hour without a token, and the docs say these "will decrease". Responses carry
cache-control: max-age=600, so a copy can be 10 minutes old. - OpenF1 rate limit: "3 req/s and 30 req/min" on the free tier. Neither host sent a rate-limit header.
- No uptime promise: Jolpica does "not guarantee uptime, availability, or correctness" and may block abuse without notice.
A betting product, a paid app or anything with an SLA needs licensed data: compare licensed sports data providers, or browse the directory for odds.
Community Resources
- FastF1 on GitHub and on PyPI: a Python package for results, schedules, timing data and telemetry, with full Jolpica support, pandas tables and a cache for every request. Version 3.9.2 shipped on 2 November 2026.
- Jolpica docs on GitHub: one page per endpoint, plus the rate limits and the terms of use.
- OpenF1 on GitHub: the server code, issues and discussions. The OpenF1 docs describe each endpoint and its fields.
- pyopenf1 on PyPI: a third-party async Python client for OpenF1, version 0.1.3 from April 2026.
For downloadable history in other sports, see our free sports datasets page.
Frequently Asked Questions
https://api.jolpi.ca/ergast/f1/ serves results, standings and calendars back to 1950, plus laps and pit stops. OpenF1 at https://api.openf1.org/v1/ serves timing and telemetry from 2023. Both are free for non-commercial use and need no key for historical data.User-Agent header with an app name and a version, such as my-f1-app/1.0. OpenF1 needs nothing for historical data, but its live data during sessions needs an account on a paid plan.https://ergast.com/api/f1/2026.json returned HTTP 404 on 2 November 2026, and the domain no longer serves F1 data. Change the host to https://api.jolpi.ca/ergast/f1/ and keep your paths. Two differences from Ergast: there is no XML, and standings calls need a season.https://api.jolpi.ca/ergast/f1/2026/last/results.json with your own User-Agent and read MRData.RaceTable.Races[0].Results. On 2 November 2026 it returned the Mexico City Grand Prix, won by Max Verstappen. The Python sample above prints the top three with requests.Need Licensed F1 Data?
Jolpica and OpenF1 suit hobby projects and research, and their terms stop at non-commercial use. A commercial app needs a licence and an SLA. Compare licensed providers in our directory.