Analytics Feeds
18 independently-subscribable analytics feeds (12 analytics.* plus 6 weather.*), each answering a specific question. Available via SSE and webhooks on the Analytics tier — subscribe to all or just the ones you need.
timingdata. timingdata delivers raw F1 timing data for all tiers. Analytics models are delivered as standalone feeds so you can subscribe precisely to what your product needs. Upgrade in the console →Subscribing
Analytics feeds use the same SSE and webhook infrastructure as every other feed. Subscribe using the analytics.* feed ID:
driverNumbers filter works on analytics.strategy, analytics.race-odds, analytics.gap-projection, analytics.tire-strategy, and analytics.qualifying. For analytics.constructor, the payload is 10 constructors (~3 KB) — no filter needed. The pairs array on analytics.race-odds is always delivered in full (client-side filtering is sufficient for 10 pairs).analytics.strategy
Once per lap — race and sprint sessions
What should each driver do in the next few laps?
| Field | Type | Description |
|---|---|---|
regulationsEra | string | "2026" or "pre-2026". All 2026 models have era-specific calibration applied. |
safetyCarProbability | number | P(any SC/VSC deployment next lap). Session-level — same value for all drivers. From a LightGBM + Hawkes-process model over historical incident data. |
vscProbability | number|null | P(virtual SC specifically). null when 3-class SC model not loaded. |
fullScProbability | number|null | P(full safety car). null when 3-class SC model not loaded. |
competitorIntelligence | object | Field-level pit window estimates from the CompetitorIntelligenceEngine. Omitted for the first few laps before the engine has sufficient data. |
drivers[].pitStopProbability | number | 0–1. BiLSTM model probability of a pit stop this lap, over a 20-lap feature window. |
drivers[].pitRecommended | boolean | true when pitStopProbability ≥ session threshold. Threshold is era-adjusted (0.53 pre-2026, 0.60 for 2026 ERS adaptation). |
drivers[].overtakeProbability | number | 0–1. XGBoost probability of this driver making a position gain via overtake within 3 laps. Circuit overtake index applied. |
drivers[].undercutThreat | object | Present when car ahead is within strategic gap threshold. score (0–1), viable (boolean), gapToCarAheadSec, estimatedDeltaSec, probability. |
drivers[].paceMode | string | "PUSH" | "HOLD" | "MANAGE" | "WARM_UP" | "DELTA". Lap-time variance and LTOE-based pace classification. |
drivers[].ltoe | object | Lap Time Over Expected. ltoeSec (negative = faster than expected), expectedLapTimeSec, actualLapTimeSec, confidenceScale. |
drivers[].ltoeConfidenceFlag | string | "stable" or "2026_early". Documents reduced confidence during 2026 model calibration period. |
drivers[].tireHealth | object | tireHealth (0–1), degRateSecPerLap, stintLap. Derived from Kalman filter on lap-delta series. |
drivers[].dnfRisk | object | dnfRiskScore (0–1 bathtub-curve hazard), constructorHazardRate (team baseline), lapsTo50PctSurvival (null until RSF v2). |
Sample payload
analytics.race-odds
Once per lap — race and sprint sessions, when CTMC has produced distributions
How is this race going to finish for each driver?
| Field | Type | Description |
|---|---|---|
drivers[].positionDistribution | number[20] | 20-element CTMC probability vector. Index 0 = P(finish 1st). Sums to ≤1.0 (may be < 1.0 for retired drivers). |
drivers[].mostLikelyPosition | number | 1-based index of highest-probability position slot. |
drivers[].podiumProbability | number | P(finish P1–P3). Sum of positionDistribution[0..2]. |
drivers[].top6Probability | number | Sum of positionDistribution[0..5]. |
drivers[].top10Probability | number | Sum of positionDistribution[0..9]. Equivalent to P(score points). |
drivers[].expectedPoints | number | Expected F1 points from position distribution × points structure, plus fastest lap bonus weighted by fastestLapProbability. |
drivers[].pointsFinishProbability | number | P(finish top 10 = points-scoring). |
drivers[].lapsLedExpected | number | Expected race laps led from current position. From CTMC forward integration. |
drivers[].fastestLapProbability | number | L1-normalised probability of setting the session fastest lap. Field sums to 1.0. |
drivers[].positionChange | object | CTMC forward projection at next3Laps, next5Laps, next10Laps. Each K gives: gainAtLeast1, loseAtLeast1, holdPosition. Clamped to laps remaining. |
drivers[].h2hVsTeammate | number|null | P(this driver finishes ahead of team-mate). Null when team-mate has no position distribution. |
pairs[] | object[] | Same-team H2H pairs. One entry per constructor. Fields: constructorId, driverA/B (numbers), driverAId/BId, pABeatsB, pBBeatsA, pTie. |
Sample payload
analytics.gap-projection
Once per lap — race sessions
How far apart will drivers be when this race ends?
| Field | Type | Description |
|---|---|---|
drivers[].currentGapToLeaderSec | number | Current gap to race leader in seconds (from sessionManager state). |
drivers[].expectedGapToLeaderSec | number | Monte Carlo mean projected gap at race end. |
drivers[].p10GapSec | number | 10th-percentile projected gap — optimistic scenario (driver closes/extends advantageously). |
drivers[].p25GapSec | number | 25th-percentile projected gap. |
drivers[].p50GapSec | number | Median projected gap. |
drivers[].p75GapSec | number | 75th-percentile projected gap. |
drivers[].p90GapSec | number | 90th-percentile projected gap — pessimistic scenario. |
drivers[].probabilityLapped | number | P(driver is lapped by race end). Typically < 0.05 for active race drivers. |
analytics.tire-strategy
Per pit approach — sparse, fires only when at least one driver has pitStopProbability > 0.25
When a driver pits, what compound will they take?
| Field | Type | Description |
|---|---|---|
drivers[].pitProbability | number | Current pit stop probability for this driver from the BiLSTM model. |
drivers[].nextCompoundProbability.soft | number | P(next compound = soft). |
drivers[].nextCompoundProbability.medium | number | P(next compound = medium). |
drivers[].nextCompoundProbability.hard | number | P(next compound = hard). |
drivers[].nextCompoundProbability.inter | number | P(intermediates). Elevated when weather event approaching. |
drivers[].nextCompoundProbability.wet | number | P(wets). |
drivers[].nextCompoundProbability.dryCompoundProbabilities | object | Named probability map for dry compounds only — renormalised when P(dry) > 0. |
analytics.constructor
Once per lap — race and sprint sessions, when both drivers have position distributions
How is each constructor going to score in this race?
| Field | Type | Description |
|---|---|---|
constructors[].constructorId | string | Team identifier (e.g. "red-bull", "ferrari", "mclaren"). |
constructors[].expectedConstructorPoints | number | Expected combined points from both drivers. Computed via discrete convolution of joint position distributions — analytically exact, not Monte Carlo. |
constructors[].scoringBothDriversProbability | number | P(both drivers finish in top 10 = both scoring). Joint probability from position distribution product. |
constructors[].pointsDistribution | number[] | P(team scores exactly K combined points) for K = 0, 1, ..., 44. Length ≤ 45 elements. |
analytics.championship-probability
Once, post-race — delivered after the infer_scwp pipeline completes
Who is going to win the championship?
| Field | Type | Description |
|---|---|---|
afterRaceId | string | The race this data reflects. Check this field — the pipeline may run slightly after processPostRaceTelemetry. |
season | number | Championship season year. |
drivers[].driverId | string | Driver identifier. |
drivers[].championshipProbability | number | P(this driver wins the WDC). Field sums to ≤1.0 across all drivers. |
drivers[].currentPoints | number | Points standing after afterRaceId. |
drivers[].pointsGap | number | Points gap to the championship leader (negative = trailing). |
analytics.qualifying
Per qualifying lap improvement — fires when any driver sets a personal best, ≥ 2 drivers have pace data
Who is going to be fastest in qualifying?
| Field | Type | Description |
|---|---|---|
segment | string | Active qualifying segment: "Q1", "Q2", or "Q3". |
circuitKey | string | Circuit identifier used for conformal calibration parameter lookup. |
poleLeader | string | Driver number of the driver currently projected to take pole (lowest sum of sector deltas). |
poleMarginAbove100ms | number | P(gap between pole and P2 > 0.1s). From conformal calibrated margin model. |
poleMarginAbove300ms | number | P(gap between pole and P2 > 0.3s). |
sectors.s1.drivers[].pFastest | number | P(this driver sets fastest S1 time). L1-normalised across all drivers with pace data. From pFastestSector() with conformal sigma. |
sectors.s1.drivers[].predictedDeltaMs | number | Predicted sector time delta vs. session median in milliseconds. Negative = faster than median. |
sectors.s1.drivers[].sigma | number | Conformal calibration sigma for this circuit/sector (seconds). Same for all drivers on a circuit. |
drivers[].sector1DeltaMs | number|null | Predicted S1 delta vs. session median (ms). null when qualifying pace model not loaded. |
drivers[].sector2DeltaMs | number|null | Predicted S2 delta vs. session median (ms). |
drivers[].sector3DeltaMs | number|null | Predicted S3 delta vs. session median (ms). |
Sample payload
2026 regulation adjustments
The 2026 F1 regulations introduced structural changes — tripled ERS power, turbo lag, and active aero replacing DRS. All models required assessment: