Analytics

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.

Analytics feeds are separate from 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 →
Feed IDQuestion answeredCadence
analytics.strategyWhat should each driver do in the next few laps?Once per lap
analytics.race-oddsHow is this race going to finish for each driver?Once per lap
analytics.gap-projectionHow far apart will drivers be when this race ends?Once per lap
analytics.tire-strategyWhen a driver pits, what compound will they take?Per pit approach
analytics.constructorHow is each constructor going to score in this race?Once per lap
analytics.championship-probabilityWho is going to win the championship?Once, post-race
analytics.qualifyingWho is going to be fastest in qualifying?Per qualifying lap improvement

Subscribing

Analytics feeds use the same SSE and webhook infrastructure as every other feed. Subscribe using the analytics.* feed ID:

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

# SSE — subscribe to all analytics feeds at once
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.racehooks.io/v1/stream?feeds=*"

# 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.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?

FieldTypeDescription
regulationsErastring"2026" or "pre-2026". All 2026 models have era-specific calibration applied.
safetyCarProbabilitynumberP(any SC/VSC deployment next lap). Session-level — same value for all drivers. From a LightGBM + Hawkes-process model over historical incident data.
vscProbabilitynumber|nullP(virtual SC specifically). null when 3-class SC model not loaded.
fullScProbabilitynumber|nullP(full safety car). null when 3-class SC model not loaded.
competitorIntelligenceobjectField-level pit window estimates from the CompetitorIntelligenceEngine. Omitted for the first few laps before the engine has sufficient data.
drivers[].pitStopProbabilitynumber0–1. BiLSTM model probability of a pit stop this lap, over a 20-lap feature window.
drivers[].pitRecommendedbooleantrue when pitStopProbability ≥ session threshold. Threshold is era-adjusted (0.53 pre-2026, 0.60 for 2026 ERS adaptation).
drivers[].overtakeProbabilitynumber0–1. XGBoost probability of this driver making a position gain via overtake within 3 laps. Circuit overtake index applied.
drivers[].undercutThreatobjectPresent when car ahead is within strategic gap threshold. score (0–1), viable (boolean), gapToCarAheadSec, estimatedDeltaSec, probability.
drivers[].paceModestring"PUSH" | "HOLD" | "MANAGE" | "WARM_UP" | "DELTA". Lap-time variance and LTOE-based pace classification.
drivers[].ltoeobjectLap Time Over Expected. ltoeSec (negative = faster than expected), expectedLapTimeSec, actualLapTimeSec, confidenceScale.
drivers[].ltoeConfidenceFlagstring"stable" or "2026_early". Documents reduced confidence during 2026 model calibration period.
drivers[].tireHealthobjecttireHealth (0–1), degRateSecPerLap, stintLap. Derived from Kalman filter on lap-delta series.
drivers[].dnfRiskobjectdnfRiskScore (0–1 bathtub-curve hazard), constructorHazardRate (team baseline), lapsTo50PctSurvival (null until RSF v2).

Sample payload

json
{
  "feed": "analytics.strategy",
  "sessionId": "9560",
  "raceId": "2026-monaco-r1",
  "lap": 35,
  "utc": "2026-06-08T14:32:18.441Z",
  "regulationsEra": "2026",
  "safetyCarProbability": 0.08,
  "vscProbability": 0.04,
  "fullScProbability": 0.04,
  "drivers": [
    {
      "driverNumber": "4",
      "driverId": "norris-lando",
      "pitStopProbability": 0.79,
      "pitRecommended": true,
      "overtakeProbability": 0.12,
      "paceMode": "PUSH",
      "ltoe": {
        "ltoeSec": -0.182,
        "expectedLapTimeSec": 87.594,
        "actualLapTimeSec": 87.412,
        "confidenceScale": 0.75
      },
      "ltoeConfidenceFlag": "2026_early",
      "tireHealth": {
        "tireHealth": 0.58,
        "degRateSecPerLap": 0.041,
        "stintLap": 14
      },
      "dnfRisk": {
        "dnfRiskScore": 0.012,
        "lapsTo50PctSurvival": null,
        "constructorHazardRate": 0.018
      }
    },
    {
      "driverNumber": "1",
      "driverId": "verstappen-max",
      "pitStopProbability": 0.06,
      "pitRecommended": false,
      "overtakeProbability": 0.34,
      "undercutThreat": {
        "score": 0.71,
        "viable": true,
        "gapToCarAheadSec": 4.218,
        "estimatedDeltaSec": 1.8,
        "probability": 0.62
      },
      "paceMode": "HOLD",
      "ltoe": {
        "ltoeSec": 0.048,
        "expectedLapTimeSec": 88.055,
        "actualLapTimeSec": 88.103,
        "confidenceScale": 0.75
      },
      "ltoeConfidenceFlag": "2026_early",
      "tireHealth": {
        "tireHealth": 0.91,
        "degRateSecPerLap": 0.018,
        "stintLap": 8
      },
      "dnfRisk": {
        "dnfRiskScore": 0.009,
        "lapsTo50PctSurvival": null,
        "constructorHazardRate": 0.021
      }
    }
  ]
}

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?

FieldTypeDescription
drivers[].positionDistributionnumber[20]20-element CTMC probability vector. Index 0 = P(finish 1st). Sums to ≤1.0 (may be < 1.0 for retired drivers).
drivers[].mostLikelyPositionnumber1-based index of highest-probability position slot.
drivers[].podiumProbabilitynumberP(finish P1–P3). Sum of positionDistribution[0..2].
drivers[].top6ProbabilitynumberSum of positionDistribution[0..5].
drivers[].top10ProbabilitynumberSum of positionDistribution[0..9]. Equivalent to P(score points).
drivers[].expectedPointsnumberExpected F1 points from position distribution × points structure, plus fastest lap bonus weighted by fastestLapProbability.
drivers[].pointsFinishProbabilitynumberP(finish top 10 = points-scoring).
drivers[].lapsLedExpectednumberExpected race laps led from current position. From CTMC forward integration.
drivers[].fastestLapProbabilitynumberL1-normalised probability of setting the session fastest lap. Field sums to 1.0.
drivers[].positionChangeobjectCTMC forward projection at next3Laps, next5Laps, next10Laps. Each K gives: gainAtLeast1, loseAtLeast1, holdPosition. Clamped to laps remaining.
drivers[].h2hVsTeammatenumber|nullP(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

json
{
  "feed": "analytics.race-odds",
  "sessionId": "9560",
  "raceId": "2026-monaco-r1",
  "lap": 35,
  "utc": "2026-06-08T14:32:18.441Z",
  "drivers": [
    {
      "driverNumber": "4",
      "driverId": "norris-lando",
      "position": 1,
      "positionDistribution": [
        0.47,
        0.25,
        0.16,
        0.07,
        0.03,
        0.01,
        0.01,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0
      ],
      "mostLikelyPosition": 1,
      "podiumProbability": 0.88,
      "top6Probability": 0.97,
      "top10Probability": 0.99,
      "expectedPoints": 18.9,
      "pointsFinishProbability": 0.99,
      "lapsLedExpected": 24.1,
      "fastestLapProbability": 0.28,
      "positionChange": {
        "next3Laps": {
          "gainAtLeast1": 0.03,
          "loseAtLeast1": 0.08,
          "holdPosition": 0.89
        },
        "next5Laps": {
          "gainAtLeast1": 0.05,
          "loseAtLeast1": 0.13,
          "holdPosition": 0.82
        },
        "next10Laps": {
          "gainAtLeast1": 0.08,
          "loseAtLeast1": 0.21,
          "holdPosition": 0.71
        }
      },
      "h2hVsTeammate": 0.61
    },
    {
      "driverNumber": "1",
      "driverId": "verstappen-max",
      "position": 2,
      "positionDistribution": [
        0.38,
        0.28,
        0.19,
        0.09,
        0.04,
        0.01,
        0.01,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0
      ],
      "mostLikelyPosition": 1,
      "podiumProbability": 0.85,
      "top6Probability": 0.96,
      "top10Probability": 0.99,
      "expectedPoints": 17.1,
      "pointsFinishProbability": 0.99,
      "lapsLedExpected": 18.4,
      "fastestLapProbability": 0.41,
      "positionChange": {
        "next3Laps": {
          "gainAtLeast1": 0.11,
          "loseAtLeast1": 0.06,
          "holdPosition": 0.83
        },
        "next5Laps": {
          "gainAtLeast1": 0.17,
          "loseAtLeast1": 0.1,
          "holdPosition": 0.73
        },
        "next10Laps": {
          "gainAtLeast1": 0.26,
          "loseAtLeast1": 0.16,
          "holdPosition": 0.58
        }
      },
      "h2hVsTeammate": 0.39
    }
  ],
  "pairs": [
    {
      "constructorId": "mclaren",
      "driverA": "4",
      "driverAId": "norris-lando",
      "driverB": "81",
      "driverBId": "piastri-oscar",
      "pABeatsB": 0.61,
      "pBBeatsA": 0.38,
      "pTie": 0.01
    }
  ]
}

analytics.gap-projection

Once per lap — race sessions

How far apart will drivers be when this race ends?

FieldTypeDescription
drivers[].currentGapToLeaderSecnumberCurrent gap to race leader in seconds (from sessionManager state).
drivers[].expectedGapToLeaderSecnumberMonte Carlo mean projected gap at race end.
drivers[].p10GapSecnumber10th-percentile projected gap — optimistic scenario (driver closes/extends advantageously).
drivers[].p25GapSecnumber25th-percentile projected gap.
drivers[].p50GapSecnumberMedian projected gap.
drivers[].p75GapSecnumber75th-percentile projected gap.
drivers[].p90GapSecnumber90th-percentile projected gap — pessimistic scenario.
drivers[].probabilityLappednumberP(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?

FieldTypeDescription
drivers[].pitProbabilitynumberCurrent pit stop probability for this driver from the BiLSTM model.
drivers[].nextCompoundProbability.softnumberP(next compound = soft).
drivers[].nextCompoundProbability.mediumnumberP(next compound = medium).
drivers[].nextCompoundProbability.hardnumberP(next compound = hard).
drivers[].nextCompoundProbability.internumberP(intermediates). Elevated when weather event approaching.
drivers[].nextCompoundProbability.wetnumberP(wets).
drivers[].nextCompoundProbability.dryCompoundProbabilitiesobjectNamed 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?

FieldTypeDescription
constructors[].constructorIdstringTeam identifier (e.g. "red-bull", "ferrari", "mclaren").
constructors[].expectedConstructorPointsnumberExpected combined points from both drivers. Computed via discrete convolution of joint position distributions — analytically exact, not Monte Carlo.
constructors[].scoringBothDriversProbabilitynumberP(both drivers finish in top 10 = both scoring). Joint probability from position distribution product.
constructors[].pointsDistributionnumber[]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?

FieldTypeDescription
afterRaceIdstringThe race this data reflects. Check this field — the pipeline may run slightly after processPostRaceTelemetry.
seasonnumberChampionship season year.
drivers[].driverIdstringDriver identifier.
drivers[].championshipProbabilitynumberP(this driver wins the WDC). Field sums to ≤1.0 across all drivers.
drivers[].currentPointsnumberPoints standing after afterRaceId.
drivers[].pointsGapnumberPoints 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?

FieldTypeDescription
segmentstringActive qualifying segment: "Q1", "Q2", or "Q3".
circuitKeystringCircuit identifier used for conformal calibration parameter lookup.
poleLeaderstringDriver number of the driver currently projected to take pole (lowest sum of sector deltas).
poleMarginAbove100msnumberP(gap between pole and P2 > 0.1s). From conformal calibrated margin model.
poleMarginAbove300msnumberP(gap between pole and P2 > 0.3s).
sectors.s1.drivers[].pFastestnumberP(this driver sets fastest S1 time). L1-normalised across all drivers with pace data. From pFastestSector() with conformal sigma.
sectors.s1.drivers[].predictedDeltaMsnumberPredicted sector time delta vs. session median in milliseconds. Negative = faster than median.
sectors.s1.drivers[].sigmanumberConformal calibration sigma for this circuit/sector (seconds). Same for all drivers on a circuit.
drivers[].sector1DeltaMsnumber|nullPredicted S1 delta vs. session median (ms). null when qualifying pace model not loaded.
drivers[].sector2DeltaMsnumber|nullPredicted S2 delta vs. session median (ms).
drivers[].sector3DeltaMsnumber|nullPredicted S3 delta vs. session median (ms).

Sample payload

json
{
  "feed": "analytics.qualifying",
  "sessionId": "9560",
  "raceId": "2026-monaco-r1-q",
  "utc": "2026-06-08T14:32:18.441Z",
  "segment": "Q3",
  "circuitKey": "monaco",
  "poleMarginAbove100ms": 0.71,
  "poleMarginAbove300ms": 0.31,
  "poleLeader": "1",
  "sectors": {
    "s1": {
      "drivers": [
        {
          "driverNumber": "1",
          "driverId": "verstappen-max",
          "pFastest": 0.43,
          "predictedDeltaMs": -12.4,
          "sigma": 0.032
        },
        {
          "driverNumber": "4",
          "driverId": "norris-lando",
          "pFastest": 0.31,
          "predictedDeltaMs": -8.1,
          "sigma": 0.032
        }
      ]
    },
    "s2": {
      "drivers": [
        {
          "driverNumber": "4",
          "driverId": "norris-lando",
          "pFastest": 0.38,
          "predictedDeltaMs": -10.2,
          "sigma": 0.029
        },
        {
          "driverNumber": "1",
          "driverId": "verstappen-max",
          "pFastest": 0.36,
          "predictedDeltaMs": -9.8,
          "sigma": 0.029
        }
      ]
    },
    "s3": {
      "drivers": [
        {
          "driverNumber": "1",
          "driverId": "verstappen-max",
          "pFastest": 0.49,
          "predictedDeltaMs": -14.1,
          "sigma": 0.034
        },
        {
          "driverNumber": "4",
          "driverId": "norris-lando",
          "pFastest": 0.29,
          "predictedDeltaMs": -8.3,
          "sigma": 0.034
        }
      ]
    }
  },
  "drivers": [
    {
      "driverNumber": "1",
      "driverId": "verstappen-max",
      "sector1DeltaMs": -12.4,
      "sector2DeltaMs": -9.8,
      "sector3DeltaMs": -14.1
    },
    {
      "driverNumber": "4",
      "driverId": "norris-lando",
      "sector1DeltaMs": -8.1,
      "sector2DeltaMs": -10.2,
      "sector3DeltaMs": -8.3
    }
  ]
}

2026 regulation adjustments

The 2026 F1 regulations introduced structural changes — tripled ERS power, turbo lag, and active aero replacing DRS. All models required assessment:

ModelFeedStatusAction taken
Tire Degradationanalytics.strategyRecalibratedCircuit parameters updated for new thermal loading from turbo lag. Conservative wider confidence intervals until 4+ 2026 races.
Win Probabilityanalytics.race-oddsUpdatedOvertake Mode: same 1.0s gap threshold. Transition rate β₃ adjusted 0.90 → 1.10 for electric boost.
Pit Stop Predictionanalytics.strategyAdjustedERS clipping creates saw-tooth lap-time variance that mimics cliff signatures. Decision threshold raised 0.53 → 0.60.
Safety Caranalytics.strategyOffset appliedBase SC rate +0.10 for first 6 races of 2026 (driver adaptation period).
Overtake Probabilityanalytics.strategyRecalibratedCircuit overtake indices updated for zone-independent Overtake Mode vs. DRS zone activation.
LTOEanalytics.strategySuppressedReturns with confidenceScale: 0.75 and ltoeConfidenceFlag: "2026_early" until 3+ races of 2026 data available.
← Feed catalogAPI Reference →