RaceHooks-computed synthetic event streams. Instead of receiving raw position arrays and computing events yourself, you subscribe once and receive pre-detected, structured events. This family has three feeds: raceevent (40+ event types — overtakes, pit stops, safety cars, fastest laps, retirements, and more), sessiontiming (aggregated session state), and qualifyingevent (qualifying-scoped events). Currently available for F1; equivalent feeds for other sports will be documented here as they launch.
Feed ID
raceevent
live
Cadence: event-driven · available on Live tier and above
Unofficial race results are available — derived from live lap timing data immediately after session end. official: false.
json
// data field
{
"raceId": "2026-monaco-r7",
"raceName": "2026 Monaco Grand Prix",
"resultCount": 20,
"official": false
}
standings.updatedRace / Sprint
Official race results have been confirmed and written — sourced from the Wikipedia post-race scrape. official: true. Replaces any prior unofficial standings.
json
// data field
{
"raceId": "2026-monaco-r7",
"raceName": "2026 Monaco Grand Prix",
"resultCount": 20,
"official": true
}
investigation.openedAll
An FIA stewards investigation is opened against one or more drivers (UNDER INVESTIGATION or WILL BE INVESTIGATED race control message).
json
// data field
{
"cars": [
{
"driverId": "norris-lando",
"constructorId": "mclaren",
"number": "4",
"tla": "NOR",
"name": "Lando Norris",
"team": "McLaren F1 Team"
},
{
"driverId": "russell-george",
"constructorId": "mercedes",
"number": "63",
"tla": "RUS",
"name": "George Russell",
"team": "Mercedes-AMG Petronas F1 Team"
}
],
"deferred": false,
"rawMessage": "CAR 4 (NOR) AND CAR 63 (RUS) - UNDER INVESTIGATION AFTER THE RACE"
}
penalty.appliedAll
A time, drive-through, or stop-and-go penalty is issued to a driver by the stewards.
json
// data field
{
"driver": {
"driverId": "russell-george",
"constructorId": "mercedes",
"number": "63",
"tla": "RUS",
"name": "George Russell",
"team": "Mercedes-AMG Petronas F1 Team"
},
"penaltyType": "time",
"seconds": 5,
"reason": "LEAVING THE TRACK AND GAINING A LASTING ADVANTAGE",
"rawMessage": "FIA STEWARDS: 5 SECOND TIME PENALTY FOR CAR 63 (RUS) - LEAVING THE TRACK AND GAINING A LASTING ADVANTAGE"
}
penalty.servedAll
A previously issued penalty has been served by the driver.
json
// data field
{
"driver": {
"driverId": "russell-george",
"constructorId": "mercedes",
"number": "63",
"tla": "RUS",
"name": "George Russell",
"team": "Mercedes-AMG Petronas F1 Team"
},
"penaltyType": "time",
"seconds": 5,
"reason": null,
"rawMessage": "FIA STEWARDS: PENALTY SERVED - 5 SECOND TIME PENALTY FOR CAR 63 (RUS)"
}
lap.time.deletedAll
A lap time is deleted by the stewards for a track limits violation.
json
// data field
{
"driver": {
"driverId": "verstappen-max",
"constructorId": "red-bull-racing",
"number": "1",
"tla": "VER",
"name": "Max Verstappen",
"team": "Red Bull Racing"
},
"lapTime": "1:08.931",
"turn": 12,
"lapNumber": 17,
"isPitLap": false,
"rawMessage": "CAR 1 (VER) TIME 1:08.931 DELETED - TRACK LIMITS AT TURN 12 LAP 17"
}
overtake.enabledRace / Sprint
The overtake system (DRS / Overtake Mode) is enabled for the field.
json
// data field
{
"enabled": true
}
overtake.disabledRace / Sprint
The overtake system (DRS / Overtake Mode) is disabled for the field (safety car, red flag, etc.).
json
// data field
{
"enabled": false
}
team.double.stopRace / Sprint
Both drivers from the same constructor pit on the same lap (stacked or simultaneous stops).
An undercut or overcut outcome is confirmed — the pitting driver either emerged ahead (undercut) or behind (overcut) the car they were following before their stop.
// Express endpoint
app.post("/race-events", express.raw({ type: "application/json" }), (req, res) => {
const payload = JSON.parse(req.body.toString());
switch (payload.event) {
case "overtake":
console.log(
`${payload.data.overtakingDriver.tla} (P${payload.data.overtakingDriver.newPosition}) overtook ${payload.data.overtakenDriver.tla}`
);
break;
case "pit.entry":
console.log(`${payload.data.driver.tla} into the pits on lap ${payload.lap}`);
break;
case "fastest.lap":
console.log(`Fastest lap: ${payload.data.driver.tla} ${payload.data.lapTime.display}`);
break;
case "safety.car.deployed":
console.log(`${payload.data.type} deployed — leader: ${payload.data.leader.tla}`);
break;
case "retirement":
console.log(`${payload.data.driver.tla} has retired after ${payload.data.pitsCompleted} stops`);
break;
case "qualifying.pole_position":
console.log(
`POLE: ${payload.data.driver.tla} — ${payload.data.lapTime.display} (+${(payload.data.marginToP2Ms / 1000).toFixed(3)}s to P2)`
);
break;
}
res.sendStatus(200);
});
Filtering race events
Use filters.drivers to scope race events to specific drivers. This is especially useful for fantasy scoring engines or fan apps that only care about a specific team or driver combination.
ℹ
Position filters (positions.min / positions.max) are not applied to raceevent deliveries, since events like safety.car.deployed are session-wide and have no single position to filter on.
sessiontiming — aggregated session state live
sessiontiming aggregates TrackStatus, ExtrapolatedClock, LapCount, SessionData, and RaceControlMessages into a single coherent snapshot, delivered on every state change — so you have an up-to-date picture of the session without subscribing to multiple raw feeds. Every delivery is a full snapshot, not a diff.
Session clock: remaining time, extrapolating boolean, F1 server UTC. null before session start.
clock.remaining
string
Remaining session time in "H:MM:SS" format.
clock.extrapolating
boolean
true when F1 is extrapolating the clock (paused periods, formation lap) — the value is an estimate.
resumeAt
string | null
Local time ("HH:MM") of an announced restart after a red flag. null otherwise.
qualifyingSegment
number | null
1, 2, or 3 for the active qualifying segment (Q1/Q2/Q3). null outside qualifying.
State values
The state field is derived from the track status code, session started/finished flags, lap number, and qualifying segment. It is the recommended field for branching your integration logic.
State
Description
pre_session
Before the session has officially started.
formation_lap
Race/Sprint only — after session.start, before lap 1 begins.
racing
Green flag, lap ≥ 1.
yellow_flag
TrackStatus code 2 — yellow flag sector.
safety_car
TrackStatus code 4 — Safety Car deployed.
sc_ending
TrackStatus code 7 — Safety Car returning this lap.
virtual_safety_car
TrackStatus code 6 — Virtual Safety Car.
red_flag
TrackStatus code 5 — session suspended.
qualifying_q1
Q1 segment active.
qualifying_q2
Q2 segment active.
qualifying_q3
Q3 segment active.
paused
Session suspended but not red-flagged (e.g. practice delay).
finished
Session ended.
qualifyingevent — qualifying-scoped events live
qualifyingevent delivers the qualifying-specific synthetic events — lap improvements, eliminations, pole position, front row, and session complete — as their own subscribable stream scoped to Qualifying and Sprint Shoot-out sessions. The same events also appear inline on raceevent (the qualifying.* types above); subscribe to qualifyingevent when you want only the qualifying stream.