Skip to content

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

HostWhat it servesFormat
https://api.jolpi.ca/ergast/f1/Results, standings and calendars from 1950, plus laps, pit stops and qualifyingJSON only
https://api.openf1.org/v1/Sessions, laps, car telemetry, positions, gaps, tyres, pit lane, weather, race control, 2023 onwardJSON, or CSV with csv=true
https://ergast.com/api/f1/The original Ergast APIHTTP 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.

EndpointWhat it returnsExample
/{season}.jsonRace calendar with session times/2026.json: 23 races
/{season}/results.jsonRace results, paged by result row/2026/results.json: 418 rows
/{season}/last/results.jsonThe latest raceMexico City, 22 drivers
/{season}/driverstandings.jsonDriver standings after the latest roundantonelli first on 380 points
/{season}/constructorstandings.jsonTeam standings11 teams, Mercedes on 630
/drivers/{driverId}.jsonOne drivermax_verstappen, number "3"
/{season}/{round}/laps.jsonLap time and position for each driver/2026/1/laps.json: 1,003 timings
/{season}/{round}/pitstops.jsonPit stops with lap and duration/2026/1/pitstops.json: 32 stops
/{season}/{round}/qualifying.jsonQ1, Q2 and Q3 timesPole: russell, 1:18.518
/circuits.jsonEvery circuit with coordinates78 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.

EndpointWhat it returnsExample
/sessions?year=2026Every session with its session_key131 sessions
/meetings?year=2026Race weekends and tests27 meetings
/drivers?session_key=latestDrivers in the latest session22 drivers
/laps?session_key=11404&driver_number=1Lap and sector times, speed traps70 rows
/car_data?session_key=11404&driver_number=1&speed>=310Speed, throttle, brake, gear, RPM2,488 rows
/position?session_key=11404&driver_number=1Position changes13 rows
/stints?session_key=11404Tyre compound and laps per stint80 stints
/pit?session_key=11404Pit lane times67 rows
/weather?session_key=11404Air and track temperature, wind, rain205 rows
/race_control?session_key=11404Flags, safety car, stewards' notes169 messages
/intervals?session_key=11404&driver_number=1Gap to the car ahead and to the leader1,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.

URL
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.

FieldTypeWhat it holds
MRData.totalstringRows available, "22" for one race
Races[0].raceNamestring"Mexico City Grand Prix"
Results[].positionstringFinishing place, "1"
Results[].positionTextstring"R" for a retirement
Results[].pointsstring"25"
Results[].Driver.driverIdstringThe id other paths take, max_verstappen
Results[].Driver.codestring"VER"
Results[].Constructor.namestring"Red Bull"
Results[].gridstringStarting position, "5"
Results[].statusstring"Finished" or "Retired"
Results[].Time.millisstringRace time in milliseconds, "8428772"
Results[].Time.timestringWinner's time "2:20:28.772", a gap such as "+0.799" for the rest
Results[].FastestLapobjectrank, 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.

URL
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.

FieldTypeWhat it holds
lap_numberintegerLap in the session, from 1
lap_durationnumberLap time in seconds, 79.8 on lap 50
duration_sector_1 to _3numberSector times in seconds
i1_speed, i2_speedintegerSpeed in km/h at the two intermediate points
st_speedinteger or nullSpeed trap in km/h, 348 on the last lap
is_pit_out_lapbooleanTrue on laps 1, 40 and 46
segments_sector_1arrayMini-sector codes: 2048 yellow, 2049 green, 2051 purple, 2064 pit lane
date_startstringLap start, ISO 8601 in UTC
session_key, driver_numberinteger11404, 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)

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

Python
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

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)

JavaScript
// 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.

Browse API Providers →

Community Resources

For downloadable history in other sports, see our free sports datasets page.

Frequently Asked Questions

Yes, two. Jolpica at 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.
No. Formula 1 runs neither feed. OpenF1 states that it "is not associated in any way with the Formula 1 companies". Jolpica is an open-source project run by volunteers and funded by donations. Both publish their own docs and terms of use.
No key for historical data. Jolpica requires a 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.
No. 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.
Formula 1 only. Jolpica has results for 77 seasons, 1950 to 2026, plus qualifying, sprints, standings, laps, pit stops and circuits. OpenF1 covers 2023 onward: sessions, laps, car telemetry at about 3.7 Hz, positions, gaps, tyres, pit lane times, weather and race control. Neither carries betting odds.
Jolpica allows 4 requests a second and 500 an hour without a token, and says those limits will decrease. OpenF1's free tier allows 3 a second and 30 a minute. Neither sent a rate-limit header in our tests, so cache what you fetch.
Call 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.
Not under the free terms. Jolpica is "freely available for non-commercial use", OpenF1 is meant for education, research and fan projects, and both carry the CC BY-NC-SA 4.0 licence. Ask the project for a licence, or compare licensed sports data providers and the odds APIs in our directory.

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.