Feed Catalog›Analytics

Analytics

analyticslap

17 independently-subscribable analytics.* feeds. They are the real-time outputs of 14 production ML models and the algorithmic layer on top of them. Each feed answers one question and is delivered as its own stream, so you subscribe to exactly what your product needs. For how each model is built and calibrated, see the Models reference →

bash
# SSE, stream two analytics feeds together
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.racehooks.io/v1/stream?feeds=analytics.strategy,analytics.race-odds"

# Webhook, register analytics.race-odds for a driver filter
curl -X POST "https://api.racehooks.io/v1/webhooks" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"feedId":"analytics.race-odds","webhookUrl":"https://example.com/hook","filters":{"driverNumbers":["1","4"]}}'
✦
The driverNumbers filter works on analytics.strategy, analytics.race-odds, analytics.gap-projection, analytics.tire-strategy, and analytics.qualifying. For analytics.team-points the payload is small (10 constructors); no filter needed.
Feed IDAccess classCadenceDescription
analytics.strategyanalytics
Custom plan
Per lapPer-driver decision surfaces: pit (probability, window, plan, call), threat (undercut/overcut/overtake), pace (LTOE, clean pace, tyre health), reliability (DNF risk); plus session-level raceState (safety car probability, strategy leverage, pit-cycle openness T(L)).
strategy.recommendationanalytics
Custom plan
Per lapPrescriptive counterfactual strategy ranking for the front-runners: candidate pit-and-compound schedules simulated under common random numbers and ranked by outcome distribution — P(win), P(podium), expected finish, expected championship points, p10–p90 robustness spread — with the emergent-strategy baseline for honest comparison.
analytics.race-oddsanalytics
Custom plan
Per lapMonte Carlo position distribution, podium/points odds, expected points, fastest-lap probability, H2H vs teammate, and same-team pairs — plus, during the opening laps, the glass-box combined win-prob line (model prior pooled with the pre-race market line) that anchors the early race.
lite.race-oddslap
Per lap, one lap behindIn-race win, podium and points chance for every driver plus safety-car chance for the rest of the race, rounded to 5% and released one lap behind (Developer Live+).
analytics.true-paceanalytics
Custom plan
Per lapWho's genuinely fastest: each car's session pace stripped of fuel load, tyre age, and traffic (dirty air), ranked — the public-data proxy for hidden long-run pace.
analytics.gap-projectionanalytics
Custom plan
Per lapProjected gap to the race leader at race end for every driver: five percentile bands (p10–p90) plus P(lapped) from Monte Carlo simulation.
analytics.winning-marginanalytics
Custom plan
Per lapSession-level race outlook: projected winning margin (P1–P2) with percentile bands, the probability the margin lands above 5s / 10s / below 3s, and the safety-car collapse risk that resets the lead.
analytics.race-previewanalytics
Custom plan
Twice per race weekend (post-final-practice, post-qualifying)Pre-race projections in two stages: post-final-practice (long-run pace ranking, circuit strategy priors, weather outlook) and post-qualifying (classification with measured pole margin, pace-vs-grid deltas, derived race distance, pre-race pit-stop-count distributions, and — when a market line is available — the glass-box combined win-prob line pooling the model prior with the market).
analytics.ml-resultanalytics
Custom plan
Per inference result (about every 1-2 s in a race, per model stream)Every ML model result as its own update the moment it lands: per model stream, ordered and gapless, with the per-driver predictions exactly as the inference server returned them (no coalescing).
analytics.race-durationanalytics
Custom plan
Per lapProjected total race time with p10/p90 bands, expected winner lap time, red-flag probability, and P(race exceeds the 2-hour FIA limit).
analytics.tire-strategyanalytics
Custom plan
Per pit approachNext-compound probabilities for drivers approaching a pit window (pitStopProbabilityNext3Laps > 0.25 — the within-3 scale, not the per-lap pitStopProbability). Sparse — fires only when relevant.
analytics.team-pointsanalytics
Custom plan
Per lapConstructor-level expected points from discrete joint position-distribution convolution, with P(both drivers score) and full points distribution.
analytics.championship-probabilityanalytics
Custom plan
Once, post-racePost-race championship win probability for every driver (WDC) and constructor (WCC). afterRaceId identifies which race the data reflects.
analytics.qualifyinganalytics
Custom plan
Per lap improvementPer-sector fastest probabilities and per-driver pace deltas during qualifying, with pole-margin probability. Fires after each personal best.
analytics.sector-paceanalytics
Custom plan
On sector anomalyPer-sector pace deltas with anomaly detection; fires when a sector-pace anomaly is detected.
analytics.battleanalytics
Custom plan
On battle state changeOn-track battle status between a driver and the car directly ahead (closing, holding, defending).
analytics.pit-windowanalytics
Custom plan
On window open/urgentPit-window status (OPEN / URGENT) combining pit probability, undercut viability, tyre cliff risk, and gap context.
analytics.track-conditionsanalytics
Custom plan
Per lapTrack evolution and grip-condition analytics derived from field pace trends.
analytics.pit-qualityanalytics
Custom plan
On pit completionPit-stop execution quality assessment (stationary time vs. expected) after a stop completes.

Subscribe with the feedId via webhook or SSE. The badge shows the feed's access class: free feeds are open to every plan, live feeds require the Developer plan, and analytics feeds require the Custom plan.

analytics.strategyRace Strategy Analyticsanalytics

Per lap · Race, Sprint

Per-driver decision surfaces: pit (probability, window, plan, call), threat (undercut/overcut/overtake), pace (LTOE, clean pace, tyre health), reliability (DNF risk); plus session-level raceState (safety car probability, strategy leverage, pit-cycle openness T(L)).

Model outputs on this feed: Pit Stop Prediction, Safety Car Probability, Overtake Probability, Pace Mode, Pace Normalization (LTOE), Tyre Cliff, Undercut, Overcut Threat, DNF Risk, Pit Stop Count, Pit Window Survival.

FieldTypeDescription
regulationsErastring"2026" or "pre-2026". All 2026 models have era-specific calibration applied.
raceState.pSafetyCarnumberP(any SC/VSC active on the next lap). Same value as scProbabilityNextLap. Session-level; same value for all drivers. Gradient-boosted classifier with a self-exciting component over historical incident data.
raceState.scProbabilityNextLapnumberP(SC or VSC active on the next lap). Explicit name for raceState.pSafetyCar.
raceState.scProbabilitySettlenumberP(an actual safety car on the next lap), 0-1. Matches how sportsbooks settle the safety-car prop: a virtual safety car or red flag does not count. pSafetyCar still counts SC, VSC and red.
raceState.scProbabilityNext5numberP(at least one SC or VSC lap in the next 5 laps). The same model rolled forward over the next five laps; it is not 5x the next-lap value.
raceState.pVscnumberP(virtual SC specifically). Absent (not null) when the 3-class SC model is not loaded.
raceState.pFullScnumberP(full safety car). Absent (not null) when the 3-class SC model is not loaded.
raceState.strategyLeverageobjectField-level aggression-favored signal (strategy pocket): the pocket score (0 to 1, high only when BOTH SC probability and field degradation are high), inPocket, leaning ("aggressive" | "neutral"), note.
competitorIntelligenceobjectField-level pit-window estimates. Omitted for the first few laps before the engine has data.
drivers[].pitobjectThe pit decision surface. pNextLap: 0–1 probability of a green-flag pit stop on the next lap; stops under safety car, VSC or red flag are not counted. pWithin3Laps: derived window framing, 1 − (1 − pNextLap)^3. pNextLapAnyStop: 0–1 probability of ANY pit-lane entry on the next lap (green, safety car, VSC or red flag), the quantity an any-pit-entry market settles on; reads the measured caution-window rate on a neutralised lap. recommended: true when the probability clears the session's era-adjusted decision threshold.
drivers[].pit.windowobjectPit-window state from the survival composition: medianStintLength, pWithin5Laps, expectedResidualLaps, survivalPWithin3Laps (survival-model estimate; a different estimator from the binomial pit.pWithin3Laps).
drivers[].pit.planobjectRace-plan context: mostLikelyStops, expectedStops, and pByStops keyed "1" | "2" | "3+" (sums to 1.0). Multiclass gradient-boosted model over circuit, grid, weather, and starting compound, conditioned on the race so far (stops taken, tyre age, track status, laps remaining), re-estimated once per lap. The pre-race distribution is on analytics.race-preview.
drivers[].pit.callobjectFeedback-Stackelberg pit-sequencing recommendation vs the rival: action, rivalResponse, equilibriumGapSec (null once both cars have completed mandatory stops), rivalPosition, why { label, detail, tone }.
drivers[].threat.undercutobjectPresent when the car ahead is within the strategic gap threshold: score, viable, gapToCarAheadSec, estimatedDeltaSec, pSuccess.
drivers[].threat.undercut.callobjectCalibrated undercut-timing call (race only, target tyre age known): recommend ("UNDERCUT_NOW" | "WAIT" | "HOLD"), strikeInLaps, pSuccess, pNow. The recommendation gates on the worst case (target covers next lap); pSuccess/pNow are calibrated against realized outcomes with the target's reaction marginalized.
drivers[].threat.overcutobject|absentFirst-class slot for the overcut model; absent until its rebuilt predictor is serving. Absent means "not served", never "no threat".
drivers[].threat.overtakeobject|absentpNextLap: 0–1 probability of a clean on-track pass on the next lap (per-lap scale, not a multi-lap window). Absent until the forecast model clears its gate. Absent means "not served", never "no threat".
drivers[].paceobjectThe pace surface. mode: "PUSH" | "HOLD" | "MANAGE" | "WARM_UP" | "DELTA" (lap-time variance and LTOE-based classification). ltoeSec (Lap Time Over Expected, negative = faster than expected), expectedLapTimeSec, actualLapTimeSec, confidenceScale (1.0 once 3+ races of the season's data exist), cleanPaceSec (fuel-corrected lap time).
drivers[].pace.tyreobjectTyre condition: health (0–1), healthPct, degRateSecPerLap, stintLaps, cliffLapPredicted, remainingUsefulLife, cliffRisk, and cliff { p, withinLaps, detected, lapsToCliff }. Derived from a Kalman filter on the lap-delta series.
drivers[].reliabilityobjectdnfRisk (0–1 retirement hazard), constructorHazardRate, lapsTo50PctSurvival.
Sample payload: recorded Canadian Grand Prix (2026-canada_r)

recorded production pit-model output for lap 18 (company/marketing/evidence/export_canada_tiles.py), one driver row

json
{
  "feed": "analytics.strategy",
  "sessionId": "2026-canada_r",
  "lap": 18,
  "drivers": [
    {
      "number": "12",
      "tla": "ANT",
      "pit": {
        "pNextLap": 0.09,
        "pWithin3Laps": 0.248
      }
    }
  ]
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

strategy.recommendationStrategy Recommendationanalytics

Per lap · Race, Sprint

Prescriptive counterfactual strategy ranking for the front-runners: candidate pit-and-compound schedules simulated under common random numbers and ranked by outcome distribution — P(win), P(podium), expected finish, expected championship points, p10–p90 robustness spread — with the emergent-strategy baseline for honest comparison.

Payload fields
FieldTypeDescription
raceIdstringContract field
lapnumberContract field
objectivestringContract field
drivers[].recommended.labelstringContract field
drivers[].recommended.stops[].lapnumberContract field
drivers[].recommended.stops[].compoundstringContract field
drivers[].recommended.winProbabilitynumberContract field
drivers[].recommended.podiumProbabilitynumberContract field
drivers[].recommended.expectedFinishnumberContract field
drivers[].recommended.expectedChampPointsnumberContract field
drivers[].recommended.finishP10numberContract field
drivers[].recommended.finishP90numberContract field
drivers[].alternatives[].labelstringContract field
drivers[].alternatives[].winProbabilitynumberContract field
drivers[].alternatives[].podiumProbabilitynumberContract field
drivers[].alternatives[].expectedFinishnumberContract field
drivers[].alternatives[].expectedChampPointsnumberContract field
drivers[].alternatives[].finishP10numberContract field
drivers[].alternatives[].finishP90numberContract field
drivers[].baseline.labelstringContract field
drivers[].baseline.stopsarrayContract field
drivers[].baseline.winProbabilitynumberContract field
drivers[].baseline.podiumProbabilitynumberContract field
drivers[].baseline.expectedFinishnumberContract field
drivers[].baseline.expectedChampPointsnumberContract field
drivers[].baseline.finishP10numberContract field
drivers[].baseline.finishP90numberContract field
drivers[].rankReason.codestringContract field
drivers[].rankReason.textstringContract field

Every delivery carries feed, sessionId and utc. Each driver object also carries driverId, constructorId, number, tla, name and team.

Sample arrives with the next session.

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.race-oddsRace Outcome Probabilitiesanalytics

Per lap · Race, Sprint

Monte Carlo position distribution, podium/points odds, expected points, fastest-lap probability, H2H vs teammate, and same-team pairs — plus, during the opening laps, the glass-box combined win-prob line (model prior pooled with the pre-race market line) that anchors the early race.

Model outputs on this feed: Fastest Lap Probability.

FieldTypeDescription
drivers[].positionDistributionnumber[20]20-element Monte Carlo probability vector. Index 0 = P(finish 1st). Sums to ≤1.0 (lower for retired drivers).
drivers[].mostLikelyPositionnumber1-based index of the highest-probability position slot.
drivers[].podiumProbabilitynumberP(finish P1–P3). Sum of positionDistribution[0..2].
drivers[].top10ProbabilitynumberSum of positionDistribution[0..9]. Equivalent to P(score points).
drivers[].expectedPointsnumberExpected F1 points from the distribution × points structure, plus fastest-lap bonus weighted by fastestLapProbability.
drivers[].lapsLedExpectednumberExpected race laps led from the current position. Monte Carlo forward integration.
drivers[].fastestLapProbabilitynumberL1-normalised P(set the session fastest lap). Field sums to 1.0.
drivers[].positionChangeobjectMonte Carlo forward projection at next3Laps/next5Laps/next10Laps: gainAtLeast1, loseAtLeast1, holdPosition.
drivers[].h2hVsTeammatenumber|nullP(this driver finishes ahead of team-mate). null when team-mate has no distribution.
drivers[].gridPositionnumberStarting grid slot. Present once real qualifying data is loaded. Never a fallback value.
drivers[].expectedPlaceDifferentialnumberExpected places gained vs. grid (positive = gaining): grid − E[finish] from the position distribution. The fantasy place-differential projection.
pairs[]object[]Same-team H2H pairs: constructorId, driverA/B, pABeatsB, pBBeatsA, pTie.
combinedLineobject|absentGlass-box decomposition of the pre-race grid anchor still shaping the opening-lap win probs: rule "log", members[] (each a name, "model"/"market", and its pool weight), and outcomes[] (a full DriverRef per driver plus forecasts [model, market] and the assembled pooled probability). Absent once the anchor decays or when no market line was available.
Sample payload: recorded Canadian Grand Prix (2026-canada_r)

frame of the stored full-profile replay of the 2026 Canadian Grand Prix, generated 2026-11-04 by the production Simulate writer (artifact format 11); real model output on a past race, not live accuracy; driver identity fields completed from the driver registry; utc is the replay run time, not the race clock; trimmed to 3 driver rows

json
{
  "feed": "analytics.race-odds",
  "sessionId": "2026-canada_r",
  "raceId": "2026-canada",
  "lap": 27,
  "utc": "2026-11-04T21:05:41.117Z",
  "mc": {
    "state": "fresh",
    "lap": 31
  },
  "drivers": [
    {
      "driverId": "verstappen-max",
      "constructorId": "red-bull-racing",
      "number": "3",
      "tla": "VER",
      "name": "Max Verstappen",
      "team": "Red Bull Racing",
      "position": 2,
      "positionDistribution": [
        0.03372,
        0.15283,
        0.22185,
        0.18899,
        0.20213,
        0.07723,
        0.01807,
        0.0115,
        0.00164,
        0.00493,
        0.00164,
        0.00164,
        0.00164,
        0.00164,
        0.00164,
        0.0115,
        0.00164,
        0.00493,
        0.00493,
        0.02794,
        0.02794
      ],
      "mostLikelyPosition": 3,
      "expectedPoints": 12.09,
      "pointsFinishProbability": 0.9129,
      "finishPositionInterval": {
        "low": 1,
        "high": 10,
        "level": 0.9,
        "method": "conformal"
      },
      "gridPosition": 6,
      "expectedPlaceDifferential": 0.84,
      "podiumProbability": 0.77051,
      "top6Probability": 0.89369,
      "top10Probability": 0.90719,
      "lapsLedExpected": 6.13,
      "positionChange": {
        "next3Laps": {
          "gainAtLeast1": 0.20247,
          "loseAtLeast1": 0.1257,
          "holdPosition": 0.67183
        },
        "next5Laps": {
          "gainAtLeast1": 0.23301,
          "loseAtLeast1": 0.1524,
          "holdPosition": 0.61459
        },
        "next10Laps": {
          "gainAtLeast1": 0.17012,
          "loseAtLeast1": 0.16973,
          "holdPosition": 0.66015
        }
      },
      "h2hVsTeammate": 0.7474722331417358,
      "fastestLapProbability": 0.10761
    },
    {
      "driverId": "russell-george",
      "constructorId": "mercedes",
      "number": "63",
      "tla": "RUS",
      "name": "George Russell",
      "team": "Mercedes",
      "position": 13,
      "positionDistribution": [
        0.44368,
        0.25462,
        0.11627,
        0.07507,
        0.01324,
        0.0103,
        0.00441,
        0.00441,
        0.00147,
        0.00441,
        0.00147,
        0.00736,
        0.00147,
        0.00147,
        0.00147,
        0.00147,
        0.00441,
        0.00441,
        0.00736,
        0.01913,
        0.02207
      ],
      "mostLikelyPosition": 1,
      "expectedPoints": 18.83,
      "pointsFinishProbability": 0.92789,
      "finishPositionInterval": {
        "low": 1,
        "high": 8,
        "level": 0.9,
        "method": "conformal"
      },
      "gridPosition": 1,
      "expectedPlaceDifferential": -2.18,
      "podiumProbability": 0.0607,
      "top6Probability": 0.27068,
      "top10Probability": 0.89903,
      "lapsLedExpected": 0.03,
      "positionChange": {
        "next3Laps": {
          "gainAtLeast1": 0.45037,
          "loseAtLeast1": 0.05,
          "holdPosition": 0.49963
        },
        "next5Laps": {
          "gainAtLeast1": 0.53154,
          "loseAtLeast1": 0.08333,
          "holdPosition": 0.38513
        },
        "next10Laps": {
          "gainAtLeast1": 0.78044,
          "loseAtLeast1": 0.04683,
          "holdPosition": 0.17273
        }
      },
      "h2hVsTeammate": 0.053960741863304636,
      "fastestLapProbability": 0.26264
    },
    {
      "driverId": "antonelli-kimi",
      "constructorId": "mercedes",
      "number": "12",
      "tla": "ANT",
      "name": "Kimi Antonelli",
      "team": "Mercedes",
      "position": 1,
      "positionDistribution": [
        0.43509,
        0.26271,
        0.09567,
        0.08656,
        0.03797,
        0.0167,
        0.00759,
        0.00152,
        0.00152,
        0.00152,
        0.00152,
        0.00152,
        0.00152,
        0.00152,
        0.00152,
        0.00455,
        0.00152,
        0.00152,
        0.00455,
        0.02582,
        0.00759
      ],
      "mostLikelyPosition": 1,
      "expectedPoints": 18.9,
      "pointsFinishProbability": 0.94685,
      "finishPositionInterval": {
        "low": 1,
        "high": 7,
        "level": 0.9,
        "method": "conformal"
      },
      "gridPosition": 2,
      "expectedPlaceDifferential": -0.97,
      "podiumProbability": 0.92534,
      "top6Probability": 0.94649,
      "top10Probability": 0.95147,
      "lapsLedExpected": 29.16,
      "positionChange": {
        "next3Laps": {
          "gainAtLeast1": 0.00079,
          "loseAtLeast1": 0.15209,
          "holdPosition": 0.84712
        },
        "next5Laps": {
          "gainAtLeast1": 0.00086,
          "loseAtLeast1": 0.22536,
          "holdPosition": 0.77378
        },
        "next10Laps": {
          "gainAtLeast1": 0.0002,
          "loseAtLeast1": 0.16973,
          "holdPosition": 0.83008
        }
      },
      "h2hVsTeammate": 0.9291889824254784,
      "fastestLapProbability": 0.26264
    }
  ]
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

lite.race-oddsIn-race Chanceslap

Per lap, one lap behind · Race, Sprint

In-race win, podium and points chance for every driver plus safety-car chance for the rest of the race, rounded to 5% and released one lap behind (Developer Live+).

Payload fields
FieldTypeDescription
raceIdstringSample: "2026-canada"
lapnumberSample: 52
releasedAtLapnumberSample: 53
safetyCarRemainingPctnumberSample: 95
safetyCarRemainingBoundstringSample: ">95%"
drivers[].codestringSample: "ALB"
drivers[].winPctnumberSample: 5
drivers[].podiumPctnumberSample: 5
drivers[].pointsPctnumberSample: 5
drivers[].bounds.winPctstringSample: "<5%"
drivers[].bounds.podiumPctstringSample: "<5%"
drivers[].bounds.pointsPctstringSample: "<5%"

Every delivery carries feed, sessionId and utc.

Sample payload: recorded Canadian Grand Prix (2026-canada_r)

frame of the stored full-profile replay of the 2026 Canadian Grand Prix, generated 2026-11-04 by the production Simulate writer (artifact format 11); real model output on a past race, not live accuracy; driver identity fields completed from the driver registry; utc is the replay run time, not the race clock; trimmed to 3 driver rows

json
{
  "feed": "lite.race-odds",
  "sessionId": "2026-canada_r",
  "raceId": "2026-canada",
  "lap": 52,
  "releasedAtLap": 53,
  "safetyCarRemainingPct": 95,
  "safetyCarRemainingBound": ">95%",
  "utc": "2026-11-04T21:40:51.174Z",
  "drivers": [
    {
      "code": "ALB",
      "winPct": 5,
      "podiumPct": 5,
      "pointsPct": 5,
      "bounds": {
        "winPct": "<5%",
        "podiumPct": "<5%",
        "pointsPct": "<5%"
      }
    },
    {
      "code": "ALO",
      "winPct": 5,
      "podiumPct": 5,
      "pointsPct": 5,
      "bounds": {
        "winPct": "<5%",
        "podiumPct": "<5%",
        "pointsPct": "<5%"
      }
    },
    {
      "code": "ANT",
      "winPct": 95,
      "podiumPct": 95,
      "pointsPct": 95,
      "bounds": {
        "podiumPct": ">95%",
        "pointsPct": ">95%"
      }
    }
  ]
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.true-paceTrue Pace Rankinganalytics

Per lap · Race, Sprint

Who's genuinely fastest: each car's session pace stripped of fuel load, tyre age, and traffic (dirty air), ranked — the public-data proxy for hidden long-run pace.

FieldTypeDescription
drivers[].truePaceSecnumberDeconvolved lap pace (s): the session's trailing clean-lap mean with fuel load, tyre age and traffic (dirty air) stripped, the car's fresh-tyre clean-air pace.
drivers[].truePaceRelSecnumberTrue pace relative to the FIELD MEDIAN (s/lap); negative = faster than the field. Comparable across sessions. Compute gap-to-fastest from truePaceSec if needed.
drivers[].ranknumber1 = genuinely fastest. Field-relative true pace predicts finish position ~2× better than raw fuel-corrected pace.
Sample payload: recorded Canadian Grand Prix (2026-canada_r)

frame of the stored full-profile replay of the 2026 Canadian Grand Prix, generated 2026-11-04 by the production Simulate writer (artifact format 11); real model output on a past race, not live accuracy; driver identity fields completed from the driver registry; utc is the replay run time, not the race clock; trimmed to 3 driver rows

json
{
  "feed": "analytics.true-pace",
  "sessionId": "2026-canada_r",
  "raceId": "2026-canada",
  "lap": 14,
  "utc": "2026-11-04T20:49:10.499Z",
  "mc": {
    "state": "fresh",
    "lap": 19
  },
  "drivers": [
    {
      "driverId": "russell-george",
      "constructorId": "mercedes",
      "number": "63",
      "tla": "RUS",
      "name": "George Russell",
      "team": "Mercedes",
      "truePaceSec": 73.796,
      "truePaceRelSec": -2.923,
      "rank": 1
    },
    {
      "driverId": "antonelli-kimi",
      "constructorId": "mercedes",
      "number": "12",
      "tla": "ANT",
      "name": "Kimi Antonelli",
      "team": "Mercedes",
      "truePaceSec": 73.909,
      "truePaceRelSec": -2.81,
      "rank": 2
    },
    {
      "driverId": "verstappen-max",
      "constructorId": "red-bull-racing",
      "number": "3",
      "tla": "VER",
      "name": "Max Verstappen",
      "team": "Red Bull Racing",
      "truePaceSec": 74.198,
      "truePaceRelSec": -2.522,
      "rank": 3
    }
  ]
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.gap-projectionGap to Leader Projectionanalytics

Per lap · Race, Sprint

Projected gap to the race leader at race end for every driver: five percentile bands (p10–p90) plus P(lapped) from Monte Carlo simulation.

FieldTypeDescription
drivers[].currentGapToLeaderSecnumberCurrent gap to the race leader (seconds).
drivers[].expectedGapToLeaderSecnumberMonte Carlo mean projected gap at race end.
drivers[].p10GapSecnumber10th-percentile projected gap (optimistic scenario).
drivers[].p50GapSecnumberMedian projected gap.
drivers[].p90GapSecnumber90th-percentile projected gap (pessimistic scenario).
drivers[].probabilityLappednumberP(driver is lapped by race end). Typically < 0.05 for active drivers.
Sample payload: recorded Canadian Grand Prix (2026-canada_r)

frame of the stored full-profile replay of the 2026 Canadian Grand Prix, generated 2026-11-04 by the production Simulate writer (artifact format 11); real model output on a past race, not live accuracy; driver identity fields completed from the driver registry; utc is the replay run time, not the race clock; trimmed to 3 driver rows

json
{
  "feed": "analytics.gap-projection",
  "sessionId": "2026-canada_r",
  "raceId": "2026-canada",
  "lap": 40,
  "utc": "2026-11-04T21:22:59.076Z",
  "mc": {
    "state": "fresh",
    "lap": 45
  },
  "drivers": [
    {
      "driverId": "antonelli-kimi",
      "constructorId": "mercedes",
      "number": "12",
      "tla": "ANT",
      "name": "Kimi Antonelli",
      "team": "Mercedes",
      "currentGapToLeaderSec": 0,
      "expectedGapToLeaderSec": 0,
      "p10GapSec": 0,
      "p25GapSec": 0,
      "p50GapSec": 0,
      "p75GapSec": 0,
      "p90GapSec": 0,
      "probabilityLapped": 0
    },
    {
      "driverId": "verstappen-max",
      "constructorId": "red-bull-racing",
      "number": "3",
      "tla": "VER",
      "name": "Max Verstappen",
      "team": "Red Bull Racing",
      "currentGapToLeaderSec": 5.737,
      "expectedGapToLeaderSec": 54.65,
      "p10GapSec": 20.96,
      "p25GapSec": 43.95,
      "p50GapSec": 61.3,
      "p75GapSec": 74.37,
      "p90GapSec": 74.37,
      "probabilityLapped": 0
    },
    {
      "driverId": "hamilton-lewis",
      "constructorId": "ferrari",
      "number": "44",
      "tla": "HAM",
      "name": "Lewis Hamilton",
      "team": "Ferrari",
      "currentGapToLeaderSec": 9.366,
      "expectedGapToLeaderSec": 56.66,
      "p10GapSec": 23.76,
      "p25GapSec": 45.92,
      "p50GapSec": 59.31,
      "p75GapSec": 78,
      "p90GapSec": 78,
      "probabilityLapped": 0
    }
  ]
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.winning-marginWinning Margin Projectionanalytics

Per lap · Race, Sprint

Session-level race outlook: projected winning margin (P1–P2) with percentile bands, the probability the margin lands above 5s / 10s / below 3s, and the safety-car collapse risk that resets the lead.

FieldTypeDescription
leadBattle.leader / leadBattle.runnerUpobjectCurrent P1 and P2 (each a full DriverRef: number, driverId, tla, name, team).
leadBattle.currentMarginSecnumberCurrent P1–P2 gap in seconds.
leadBattle.expectedFinalMarginSecnumberExpected P1 to P2 gap at race end. Mixture of the no-SC linear drift and the post-SC reset distribution.
leadBattle.p10MarginSec / p50MarginSec / p90MarginSecnumberPercentile bands from 5,000 Monte Carlo samples.
leadBattle.probabilityMarginAbove5 / Above10numberP(final margin > 5s) / P(> 10s).
leadBattle.probabilityMarginBelow3numberP(final margin < 3s): close-finish probability.
leadBattle.scCollapseRisknumberP(safety car before race end); the dominant driver of margin collapse. Gaps reset toward ~1.5s at an SC restart.
Sample payload: recorded 2026-great-britain_r (2026-great-britain_r)

frame of the stored replay of the 2026 British Grand Prix; driver identity fields completed from the driver registry; utc is the replay run time, not the race clock

json
{
  "feed": "analytics.winning-margin",
  "sessionId": "2026-great-britain_r",
  "raceId": "2026-great-britain",
  "lap": 51,
  "utc": "2026-07-07T05:13:20.269Z",
  "leadBattle": {
    "leader": {
      "driverId": "leclerc-charles",
      "constructorId": "ferrari",
      "number": "16",
      "tla": "LEC",
      "name": "Charles Leclerc",
      "team": "Ferrari"
    },
    "runnerUp": {
      "driverId": "russell-george",
      "constructorId": "mercedes",
      "number": "63",
      "tla": "RUS",
      "name": "George Russell",
      "team": "Mercedes"
    },
    "currentMarginSec": 1.592,
    "expectedFinalMarginSec": 1.59,
    "p10MarginSec": 1.46,
    "p50MarginSec": 1.59,
    "p90MarginSec": 1.72,
    "probabilityMarginAbove5": 0,
    "probabilityMarginAbove10": 0,
    "probabilityMarginBelow3": 1,
    "scCollapseRisk": 0
  }
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.race-previewPre-Race Previewanalytics

Twice per race weekend (post-final-practice, post-qualifying) · Practice, Qualifying

Pre-race projections in two stages: post-final-practice (long-run pace ranking, circuit strategy priors, weather outlook) and post-qualifying (classification with measured pole margin, pace-vs-grid deltas, derived race distance, pre-race pit-stop-count distributions, and — when a market line is available — the glass-box combined win-prob line pooling the model prior with the market).

FieldTypeDescription
stagestring"practice" (final practice ended) or "grid" (qualifying ended).
circuitIdstringCanonical RaceHooks circuit slug (e.g. "monaco").
drivers[]objectEach entry is a full DriverRef (number, driverId, tla, name, team) plus the stage-specific fields below.
drivers[].practicePaceobjectrelPacePct (lower = faster), longRunDone, primaryCompound, lapsCompleted, sessionType, paceRank. Long-run drivers rank ahead of short-run-only drivers; long-run pace is the race-pace signal.
strategy.compoundDeg[]objectPer-compound degradation prior (sec/lap) for this circuit, from the post-weekend prior pipeline.
strategy.pitLaneDeltaSecnumberCircuit pit-lane time loss in seconds.
strategy.scTimeCostSecPerLapnumberTime cost of a safety-car lap at this circuit vs green pace.
strategy.redFlagBaseRatenumberFraction of sessions at this circuit with at least one red flag (2018–2025).
qualifyingobjectGrid stage: session classification (order with segments), pole lap, and the MEASURED pole margin in ms. The official grid may differ after penalties.
drivers[].paceVsGridDeltanumberGrid stage: practice pace rank minus qualifying position; positive = raced faster in practice than qualified (a classic recovery-drive signal).
drivers[].pitStopCountobjectGrid stage: pre-race stop-count distribution (pOneStop/pTwoStop/pThreePlusStop/expectedStops) assuming a medium-compound start; race distance derived from the FIA 305 km rule.
scheduledRaceLapsnumber|nullGrid stage: derived race distance in laps (FIA 305 km rule; Monaco 260 km). null when circuit length is unknown.
combinedLineobject|absentGrid stage: glass-box pre-race combined win-prob line pooling the model prior with the de-vigged market line. rule "log", members[] (name "model"/"market" + weight), outcomes[] (full DriverRef + forecasts [model, market] + assembled pooled probability). Absent when no market line was available for the race.
Sample arrives with the next session.

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.ml-resultML Resultsanalytics

Per inference result (about every 1-2 s in a race, per model stream)

Every ML model result as its own update the moment it lands: per model stream, ordered and gapless, with the per-driver predictions exactly as the inference server returned them (no coalescing).

Payload fields
FieldTypeDescription
raceIdstringContract field
lapnumberContract field
slotstringContract field
seqnumberContract field
epochnumberContract field
producedAtstringContract field
results[].driverstringContract field
results[].predictions.pit_stop_count.pOneStopnumberContract field
results[].predictions.pit_stop_count.pTwoStopnumberContract field
results[].predictions.pit_stop_count.pThreePlusStopnumberContract field
results[].predictions.pit_stop_count.expectedStopsnumberContract field

Every delivery carries feed, sessionId and utc.

Sample arrives with the next session.

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.race-durationRace Duration Projectionanalytics

Per lap · Race, Sprint

Projected total race time with p10/p90 bands, expected winner lap time, red-flag probability, and P(race exceeds the 2-hour FIA limit).

FieldTypeDescription
expectedRaceTimeMinutesnumberExpected total race duration in minutes: elapsed + remaining racing time + expected SC and red-flag time loss.
p10RaceTimeMinutes / p90RaceTimeMinutesnumber10th/90th percentile race-duration band.
expectedWinnerLapTimeSecnumberExpected winner average lap time over the remaining laps: the median of the leader's clean laps (no lap 1, safety car, VSC, red flag, pit-in or pit-out lap), adjusted for degradation.
probabilityRedFlagnumberRule-based P(red flag before race end): circuit base rate boosted by wet running, lap-1 chaos, SC history, and retirements.
probabilityOvertimeSessionnumberP(race exceeds the 2-hour FIA time limit).
scDeployedCountnumberSafety-car deployments so far this race.
Sample arrives with the next session.

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.tire-strategyTyre Strategy Probabilityanalytics

Per pit approach · Race, Sprint

Next-compound probabilities for drivers approaching a pit window (pitStopProbabilityNext3Laps > 0.25 — the within-3 scale, not the per-lap pitStopProbability). Sparse — fires only when relevant.

Model outputs on this feed: Tire Compound.

FieldTypeDescription
drivers[].pitProbabilitynumberCurrent pit-stop probability. This is why the driver is in the sparse set.
drivers[].nextCompoundProbability.softnumberP(next compound = soft).
drivers[].nextCompoundProbability.mediumnumberP(next compound = medium).
drivers[].nextCompoundProbability.hardnumberP(next compound = hard).
drivers[].nextCompoundProbability.wetWeathernumberHigh-recall merged Inter+Wet class. Zeroed on a dry track; raised when a weather event is approaching.
drivers[].nextCompoundProbability.dryCompoundProbabilitiesobjectDry-only renormalised view { soft, medium, hard } summing to 1. Use on a dry track where wetWeather is 0.
Sample payload: recorded Canadian Grand Prix (2026-canada_r)

frame of the stored full-profile replay of the 2026 Canadian Grand Prix, generated 2026-11-04 by the production Simulate writer (artifact format 11); real model output on a past race, not live accuracy; driver identity fields completed from the driver registry; utc is the replay run time, not the race clock

json
{
  "feed": "analytics.tire-strategy",
  "sessionId": "2026-canada_r",
  "raceId": "2026-canada",
  "lap": 25,
  "utc": "2026-11-04T21:03:16.551Z",
  "mc": {
    "state": "fresh",
    "lap": 30
  },
  "drivers": [
    {
      "driverId": "antonelli-kimi",
      "constructorId": "mercedes",
      "number": "12",
      "tla": "ANT",
      "name": "Kimi Antonelli",
      "team": "Mercedes",
      "pitProbability": 0.14367,
      "nextCompoundProbability": {
        "soft": 0.06255,
        "medium": 0.87901,
        "hard": 0.05072,
        "wetWeather": 0.00773,
        "dryCompoundProbabilities": {
          "hard": 0.051114,
          "medium": 0.885852,
          "soft": 0.063035
        }
      }
    },
    {
      "driverId": "verstappen-max",
      "constructorId": "red-bull-racing",
      "number": "3",
      "tla": "VER",
      "name": "Max Verstappen",
      "team": "Red Bull Racing",
      "pitProbability": 0.14367,
      "nextCompoundProbability": {
        "soft": 0.06255,
        "medium": 0.87901,
        "hard": 0.05072,
        "wetWeather": 0.00773,
        "dryCompoundProbabilities": {
          "hard": 0.051114,
          "medium": 0.885852,
          "soft": 0.063035
        }
      }
    },
    {
      "driverId": "hamilton-lewis",
      "constructorId": "ferrari",
      "number": "44",
      "tla": "HAM",
      "name": "Lewis Hamilton",
      "team": "Ferrari",
      "pitProbability": 0.10972,
      "nextCompoundProbability": {
        "soft": 0.06255,
        "medium": 0.87901,
        "hard": 0.05072,
        "wetWeather": 0.00773,
        "dryCompoundProbabilities": {
          "hard": 0.051114,
          "medium": 0.885852,
          "soft": 0.063035
        }
      }
    }
  ]
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.team-pointsTeam Points Analyticsanalytics

Per lap · Race, Sprint

Constructor-level expected points from discrete joint position-distribution convolution, with P(both drivers score) and full points distribution.

FieldTypeDescription
constructors[].constructorIdstringTeam identifier (e.g. "red-bull", "ferrari", "mclaren").
constructors[].expectedConstructorPointsnumberExpected combined points from both drivers, via discrete convolution of joint position distributions; analytically exact.
constructors[].scoringBothDriversProbabilitynumberP(both drivers finish top 10). Joint probability from the distribution product.
constructors[].podiumBothDriversProbabilitynumberP(both drivers finish on the podium). Same independence product over P1 to P3.
constructors[].pointsDistributionnumber[]P(team scores exactly K combined points) for K = 0…44.
Sample arrives with the next session.

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.championship-probabilityChampionship Win Probabilityanalytics

Once, post-race · Season

Post-race championship win probability for every driver (WDC) and constructor (WCC). afterRaceId identifies which race the data reflects.

FieldTypeDescription
seasonYearnumberChampionship season the projection covers.
afterRaceIdstringThe most recent official race the probabilities are computed through.
simulationsRunnumberMonte Carlo iterations behind the projection.
drivers[]objectWDC row: a full DriverRef (number, driverId, tla, name, team) plus the fields below.
drivers[].scwpnumberP(this driver wins the WDC). Field sums to ≤1.0.
drivers[].scwpTop3numberP(this driver finishes top-3 in the championship).
drivers[].expectedFinalPointsnumberExpected end-of-season points total.
drivers[].championshipDeficitnumberPoints behind the current championship leader (0 for the leader).
constructors[].constructorIdstringCanonical team slug (e.g. "mclaren").
constructors[].ccwpnumberP(this team wins the WCC). Field sums to ≤1.0.
constructors[].ccwpTop3numberP(this team finishes top-3 in the constructors' championship).
constructors[].expectedFinalPointsnumberExpected end-of-season combined points.
constructors[].championshipDeficitnumberPoints behind the leading constructor.
Sample arrives with the next session.

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.qualifyingQualifying Analyticsanalytics

Per lap improvement · Qualifying

Per-sector fastest probabilities and per-driver pace deltas during qualifying, with pole-margin probability. Fires after each personal best.

Model outputs on this feed: Qualifying Pace.

FieldTypeDescription
segmentstringActive segment: "Q1", "Q2", or "Q3".
poleLeaderstringDriver number currently projected to take pole (lowest sum of sector deltas).
poleMarginAbove100msnumberP(gap between pole and P2 > 0.1s). From the calibrated margin model.
sectors.s1.drivers[].pFastestnumberP(this driver sets fastest S1). L1-normalised across drivers with pace data.
sectors.s1.drivers[].predictedDeltaMsnumberPredicted S1 delta vs. session median (ms). Negative = faster.
drivers[].sector1DeltaMsnumber|nullPredicted S1 delta vs. session median (ms). null when the qualifying pace model is not loaded.
drivers[].eliminationobjectQ1/Q2 only, once most of the field has predictions: pEliminatedQ1, pEliminatedQ2, pReachesQ3, projectedFinalQualifyingPosition, rank-based order statistics over the predicted field.
Sample arrives with the next session.

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.sector-paceSector Pace Analyticsanalytics

On sector anomaly · Race, Sprint

Per-sector pace deltas with anomaly detection; fires when a sector-pace anomaly is detected.

FieldTypeDescription
data.driverobjectThe driver the anomaly is for (full DriverRef: number, driverId, tla, name, team).
data.s1 / s2 / s3object|nullPer-sector reading: deltaSec vs the rolling median baseline, baselineMs, currentMs, cleanLapCount.
data.anomalyDetectedbooleantrue when a sector departs its baseline beyond the warning threshold.
data.anomalySector / anomalyLevelnumber|stringWhich sector (1–3) and severity ("WARNING" | "CRITICAL").
data.classifiedCausestring|null"RAIN" | "TIRE_CLIFF" | "INCIDENT" | "UNKNOWN". Rule-based cause classification.
data.rainConfidencenumber0–1 confidence the anomaly is rain-driven.
data.crossDriverCorrelatedbooleantrue when ≥3 cars show the same-sector anomaly on the same lap (weather, not car-specific).
data.driversAffectedSameSectorobject[]Other cars flagged in the same sector this lap. Each is a full DriverRef.
Sample payload: recorded Canadian Grand Prix (2026-canada_r)

frame of the stored full-profile replay of the 2026 Canadian Grand Prix, generated 2026-11-04 by the production Simulate writer (artifact format 11); real model output on a past race, not live accuracy; driver identity fields completed from the driver registry; utc is the replay run time, not the race clock

json
{
  "feed": "analytics.sector-pace",
  "sessionId": "2026-canada_r",
  "lap": 36,
  "utc": "2026-11-04T21:12:17.363Z",
  "data": {
    "driver": {
      "driverId": "hamilton-lewis",
      "constructorId": "ferrari",
      "number": "44",
      "tla": "HAM",
      "name": "Lewis Hamilton",
      "team": "Ferrari"
    },
    "raceLap": 36,
    "s1": null,
    "s2": null,
    "s3": {
      "deltaSec": 24.041,
      "baselineMs": 30379,
      "cleanLapCount": 5,
      "currentMs": 54420
    },
    "anomalyDetected": true,
    "anomalySector": 3,
    "anomalyLevel": "CRITICAL",
    "classifiedCause": "UNKNOWN",
    "rainConfidence": 0.8,
    "crossDriverCorrelated": true,
    "driversAffectedSameSector": [
      {
        "driverId": "leclerc-charles",
        "constructorId": "ferrari",
        "number": "16",
        "tla": "LEC",
        "name": "Charles Leclerc",
        "team": "Ferrari"
      },
      {
        "driverId": "hadjar-isack",
        "constructorId": "red-bull-racing",
        "number": "6",
        "tla": "HAD",
        "name": "Isack Hadjar",
        "team": "Red Bull Racing"
      },
      {
        "driverId": "piastri-oscar",
        "constructorId": "mclaren",
        "number": "81",
        "tla": "PIA",
        "name": "Oscar Piastri",
        "team": "McLaren"
      },
      {
        "driverId": "bottas-valtteri",
        "constructorId": "cadillac",
        "number": "77",
        "tla": "BOT",
        "name": "Valtteri Bottas",
        "team": "Cadillac"
      },
      {
        "driverId": "hulkenberg-nico",
        "constructorId": "audi",
        "number": "27",
        "tla": "HUL",
        "name": "Nico Hulkenberg",
        "team": "Audi"
      },
      {
        "driverId": "bortoleto-gabriel",
        "constructorId": "audi",
        "number": "5",
        "tla": "BOR",
        "name": "Gabriel Bortoleto",
        "team": "Audi"
      },
      {
        "driverId": "ocon-esteban",
        "constructorId": "haas",
        "number": "31",
        "tla": "OCO",
        "name": "Esteban Ocon",
        "team": "Haas F1 Team"
      },
      {
        "driverId": "colapinto-franco",
        "constructorId": "alpine",
        "number": "43",
        "tla": "COL",
        "name": "Franco Colapinto",
        "team": "Alpine"
      },
      {
        "driverId": "lawson-liam",
        "constructorId": "racing-bulls",
        "number": "30",
        "tla": "LAW",
        "name": "Liam Lawson",
        "team": "Racing Bulls"
      },
      {
        "driverId": "perez-sergio",
        "constructorId": "cadillac",
        "number": "11",
        "tla": "PER",
        "name": "Sergio Perez",
        "team": "Cadillac"
      },
      {
        "driverId": "gasly-pierre",
        "constructorId": "alpine",
        "number": "10",
        "tla": "GAS",
        "name": "Pierre Gasly",
        "team": "Alpine"
      },
      {
        "driverId": "stroll-lance",
        "constructorId": "aston-martin",
        "number": "18",
        "tla": "STR",
        "name": "Lance Stroll",
        "team": "Aston Martin"
      },
      {
        "driverId": "norris-lando",
        "constructorId": "mclaren",
        "number": "1",
        "tla": "NOR",
        "name": "Lando Norris",
        "team": "McLaren"
      },
      {
        "driverId": "antonelli-kimi",
        "constructorId": "mercedes",
        "number": "12",
        "tla": "ANT",
        "name": "Kimi Antonelli",
        "team": "Mercedes"
      },
      {
        "driverId": "verstappen-max",
        "constructorId": "red-bull-racing",
        "number": "3",
        "tla": "VER",
        "name": "Max Verstappen",
        "team": "Red Bull Racing"
      },
      {
        "driverId": "sainz-jr-carlos",
        "constructorId": "williams",
        "number": "55",
        "tla": "SAI",
        "name": "Carlos Sainz",
        "team": "Williams"
      },
      {
        "driverId": "bearman-oliver",
        "constructorId": "haas",
        "number": "87",
        "tla": "BEA",
        "name": "Oliver Bearman",
        "team": "Haas F1 Team"
      },
      {
        "driverId": "hamilton-lewis",
        "constructorId": "ferrari",
        "number": "44",
        "tla": "HAM",
        "name": "Lewis Hamilton",
        "team": "Ferrari"
      }
    ]
  }
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.battleStrategy Battle Alertanalytics

On battle state change · Race, Sprint

On-track battle status between a driver and the car directly ahead (closing, holding, defending).

FieldTypeDescription
data.attacker / defenderobjectThe two cars in the on-track fight (each a full DriverRef: number, driverId, tla, name, team).
data.currentGapSecnumberCurrent gap between the pair (seconds).
data.catchRateSecPerLapnumberPositive = attacker closing; negative = defender pulling away.
data.lapsToStrikingDistancenumber|nullProjected laps until the attacker is in range; null when not catching or already there.
data.battleStatusstringLifecycle of the battle (forming, in-range, resolved…).
Sample payload: recorded Canadian Grand Prix (2026-canada_r)

frame of the stored full-profile replay of the 2026 Canadian Grand Prix, generated 2026-11-04 by the production Simulate writer (artifact format 11); real model output on a past race, not live accuracy; driver identity fields completed from the driver registry; utc is the replay run time, not the race clock

json
{
  "feed": "analytics.battle",
  "sessionId": "2026-canada_r",
  "lap": 13,
  "utc": "2026-11-04T20:42:08.763Z",
  "mc": {
    "state": "fresh",
    "lap": 13
  },
  "data": {
    "currentGapSec": 1.127,
    "catchRateSecPerLap": 0.08750000000000002,
    "lapsToStrikingDistance": 1.451428571428571,
    "battleStatus": "EQUAL_PACE",
    "attacker": {
      "driverId": "piastri-oscar",
      "constructorId": "mclaren",
      "number": "81",
      "tla": "PIA",
      "name": "Oscar Piastri",
      "team": "McLaren"
    },
    "defender": {
      "driverId": "ocon-esteban",
      "constructorId": "haas",
      "number": "31",
      "tla": "OCO",
      "name": "Esteban Ocon",
      "team": "Haas F1 Team"
    },
    "forecast": {
      "passProbabilityPerLap": 0.008772,
      "pPassWithinHorizon": 0.026,
      "horizonLaps": 5
    }
  }
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.pit-windowPit Window Alertanalytics

On window open/urgent · Race, Sprint

Pit-window status (OPEN / URGENT) combining pit probability, undercut viability, tyre cliff risk, and gap context.

FieldTypeDescription
data.driverobjectThe driver the alert is for (full DriverRef: number, driverId, tla, name, team).
data.statusstring"OPEN" | "URGENT". The alert is only sent in these two states, every lap while the window is open. URGENT when pitProbability ≥ 0.30, the stint is ≥ 90% through its estimated tyre life (a stint past 100% of its estimated life stays URGENT whatever pitProbability says), or a VSC/SC is out; OPEN when pitProbability ≥ 0.15 or the stint is ≥ 70% through. Nothing is sent when the window is clearly shut.
data.pitProbabilitynumber0–1 probability of a green-flag pit stop within the next 3 laps (stops under safety car, VSC or red flag are not counted): the 3-lap framing 1 − (1 − pNextLap)³ of the per-lap pit stop model (same number as analytics.strategy pit.pWithin3Laps), not the per-lap value.
data.undercutViablebooleanWhether an undercut on the car ahead is currently viable.
data.cliffRiskstringTyre-cliff proximity classification: NONE | GRAINING | THERMAL | BLISTERING_RISK | BLISTERING.
data.overrideReasonstring|null"VSC_WINDOW" | "SC_WINDOW" | "LEADER_PITTED". Event overrides that open a window early.
data.vscNetDeltaSecnumber|nullEstimated time saved by pitting under the current VSC/SC, when applicable.
data.pitCountnumberThe driver's current pit-stop count.
Sample payload: recorded Canadian Grand Prix (2026-canada_r)

frame of the stored full-profile replay of the 2026 Canadian Grand Prix, generated 2026-11-04 by the production Simulate writer (artifact format 11); real model output on a past race, not live accuracy; driver identity fields completed from the driver registry; utc is the replay run time, not the race clock

json
{
  "feed": "analytics.pit-window",
  "sessionId": "2026-canada_r",
  "lap": 31,
  "utc": "2026-11-04T21:04:18.458Z",
  "mc": {
    "state": "fresh",
    "lap": 31
  },
  "data": {
    "raceLap": 31,
    "status": "URGENT",
    "pitProbability": 0.11443430077299988,
    "undercutViable": true,
    "cliffRisk": "NONE",
    "overrideReason": "SC_WINDOW",
    "vscNetDeltaSec": 21.6,
    "driver": {
      "driverId": "piastri-oscar",
      "constructorId": "mclaren",
      "number": "81",
      "tla": "PIA",
      "name": "Oscar Piastri",
      "team": "McLaren"
    },
    "pitCount": 2
  }
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.track-conditionsTrack Conditions Analyticsanalytics

Per lap · Race, Sprint

Track evolution and grip-condition analytics derived from field pace trends.

FieldTypeDescription
data.sector1 / sector2 / sector3stringPer-sector surface condition classification.
data.fullCircuitWetbooleanAll three sectors classified wet.
data.intermediateWindowOpenbooleanAny sector wet AND slick runners losing more than ~2s (the inter window).
data.crossoverRecommendedbooleanSlick cars now faster than intermediates in at least one sector (the crossover call).
data.lastUpdatedLapnumberRace lap this classification was last updated.
Sample arrives with the next session.

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

analytics.pit-qualityPit Quality Alertanalytics

On pit completion · Race, Sprint

Pit-stop execution quality assessment (stationary time vs. expected) after a stop completes.

FieldTypeDescription
data.driverobjectThe driver whose stop this grades (full DriverRef: number, driverId, tla, name, team).
data.stationaryTimeSecnumberMeasured stationary time for the completed stop.
data.teamSessionAverageSecnumberThe team's rolling average stationary time this session (before this stop).
data.vsTeamSessionAverageSecnumberThis stop minus the team average; positive = slower than the crew's norm.
data.qualitystringGrade for the stop relative to session norms.
data.stopNumbernumberNth stop this session for this driver.
Sample payload: recorded Canadian Grand Prix (2026-canada_r)

frame of the stored full-profile replay of the 2026 Canadian Grand Prix, generated 2026-11-04 by the production Simulate writer (artifact format 11); real model output on a past race, not live accuracy; driver identity fields completed from the driver registry; utc is the replay run time, not the race clock

json
{
  "feed": "analytics.pit-quality",
  "sessionId": "2026-canada_r",
  "lap": 12,
  "utc": "2026-11-04T20:42:18.918Z",
  "data": {
    "driver": {
      "driverId": "piastri-oscar",
      "constructorId": "mclaren",
      "number": "81",
      "tla": "PIA",
      "name": "Oscar Piastri",
      "team": "McLaren"
    },
    "raceLap": 12,
    "stationaryTimeSec": 14.5,
    "teamSessionAverageSec": 2.45,
    "vsTeamSessionAverageSec": 12.05,
    "fieldSessionAverageSec": 3.28,
    "vsFieldSessionAverageSec": 11.22,
    "fieldRank": 6,
    "totalFieldStopsSoFar": 6,
    "quality": "CRITICAL",
    "stopNumber": 2
  }
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

← TelemetryResults & Standings →