Public, no-authentication REST endpoints for F1 race data: results, standings, lap times, tyre stints, pit stops, and qualifying laps. Results and standings extend back to 1950; richer session fields depend on era and ingest. See the coverage table below. Free to use, no API key required.
✦
No authentication required. All Historical API endpoints are public. No Authorization header, no token, no sign-up needed.
Base URL
https://api.racehooks.io/v1/historical/
Auth
None
Cache
public, max-age=3600
Pagination
?limit= (max 100) · ?offset=
Response envelope
Every response wraps its payload in an RHData object. All scalar values (numbers, years, positions, milliseconds) are serialised as strings.
Field
Type
Description
RHData.series
string
Always "f1"
RHData.url
string
Canonical URL of this request
RHData.limit
string
Page size used (serialised as string)
RHData.offset
string
Page offset used (serialised as string)
RHData.total
string
Total records matching the query (serialised as string)
RHData.<Table>
object
Data payload: SeasonTable, RaceTable, DriverTable, ConstructorTable, CircuitTable, or StandingsTable
ℹ
Time formats: Lap and sector times use M:SS.mmm (or SS.mmm if under 1 minute). Race winner absolute time: H:MM:SS.mmm. Gap to leader: +S.mmm.
Lap times, sector splits, tyre compounds, and stints require per-session ingest. Pre-2019 sessions return empty arrays.
QualifyingLaps
2019+
Flying laps from Q1/Q2/Q3 (and sprint qualifying SQ1/SQ2/SQ3). Empty arrays for pre-2019 sessions.
FastestLap
varies
Lap number, time, and average speed when available. Rank is not stored.
PitStop.time
optional
Time-of-day of pit entry. Omitted when not stored.
carNumber
optional
Derived from driver's current number. Omitted for pre-modern seasons or drivers without a permanent number.
When data becomes available
Typically, as measured at the 2026 US Grand Prix (these are not guarantees):
Race per-lap rows for every driver (position, lap and sector times, compound, tyre life, gaps) are written lap by lap during the race and are complete about 1 minute after the flag.
Race and qualifying classifications appear about 20 minutes after the session.
Practice laps appear about 30 minutes after the session.
Race weather is stored per lap (/v1/data/races/:raceId/weather). Practice and qualifying weather is not stored historically; subscribe to weather.data live.
Pagination
All list endpoints support ?limit= (max 100) and ?offset=. Lap time, pit stop, stint, and qualifying lap endpoints default to limit=100; all others default to limit=30. The total field in the envelope reflects the count before pagination.
Note on lap pagination:/laps paginates by lap number, not by row. Each page contains complete timing data for all drivers on those laps.
Seasons
List seasons
GET/v1/historical/seasons
Returns all seasons in the database with the number of rounds per season.
Individual flying laps from Q1/Q2/Q3 (and sprint qualifying SQ1/SQ2/SQ3) with sector splits, tyre compound, and tyre age. Returns empty when per-session data is not available (pre-2019).
Tyre compound: SOFT, MEDIUM, HARD, INTER, WET. Omitted when unavailable
tyreAgeLaps
string
Laps on this set of tyres before this lap. Omitted when unavailable
trackStatus
string
F1 track status code (1=clear, 2=yellow, etc.). Omitted when unavailable
Lap times
Lap times
GET/v1/historical/:season/:round/laps2019+
Per-lap timing data for all drivers, grouped by lap number. Includes sector splits, tyre compound, tyre life, gap to leader, and track status. Returns empty for pre-2019 sessions.
Field
Type
Description
:season
integer
Season year
:round
integer
Round number
?driver
string
Filter to a single driver slug
?limit
integer
Number of lap numbers to return (default 100, max 100)
?offset
integer
Lap number offset (paginates by distinct lap, not by row)
Laps on current set (1 = first lap on these tyres)
Timings[].isPitOutLap
"true"
Present only on pit-out laps
Timings[].trackStatus
string
F1 track status code. Omitted when unavailable
Timings[].gapToLeader
string
+S.mmm gap to race leader. Omitted when unavailable
Timings[].gapToCarAhead
string
+S.mmm gap to the car immediately ahead. Omitted when unavailable
# All laps for a driver
curl "https://api.racehooks.io/v1/historical/2025/1/laps?driver=verstappen-max"
# Specific lap range
curl "https://api.racehooks.io/v1/historical/2025/1/laps?offset=20&limit=10"
Pit stops
Pit stops
GET/v1/historical/:season/:round/pitstops
All pit stop records for a race: stop number, lap, duration. Optional driver filter.
Laps already on these tyres when the stint began (0 = new set)
Standings
Driver standings
GET/v1/historical/:season/driverStandings
Driver championship standings for a season. The wins count is computed dynamically from race results (not a stored column), so it always reflects the authoritative finish data.
Constructor championship standings. Engine-suffix duplicates (e.g. McLaren-Mercedes and McLaren-Renault for the same lineage) are automatically collapsed into a single entry. Wins are aggregated across all constructor variants sharing a lineageId.