Models / gradient-boosted-ensemble

Qualifying Pace

Per-sector pace deltas vs the session median, per driver.

gradient-boosted-ensembleanalytics.qualifying

How it works

Three per-sector models predict each driver's delta to the session median, adjusted for compound, track evolution and tow. Production scores each driver's last real flying lap, with earlier bests used as context. The deltas drive per-sector fastest probabilities, the projected pole battle and, in Q1 and Q2, elimination odds and a projected final qualifying position.

When to use it

  • Price or display who is fastest in each sector and who is on course for pole.
  • Show the bubble in Q1 and Q2: who is at risk of elimination as each lap comes in.
  • Explain where a driver's lap time comes from by comparing their three sector deltas.

Inputs

  • last flying lap
  • prior session bests
  • compound
  • track evolution
  • constructor pace index

Output

sectors.s{1,2,3}.drivers[].pFastestP(fastest in the sector), field-relative.
sectors.s{1,2,3}.drivers[].predictedDeltaMs / sigmaPredicted delta to the session median in milliseconds; sigma is its spread in seconds.
poleLeader / poleMarginAbove100ms / poleMarginAbove300msProjected pole sitter and the chance their margin exceeds 100 ms and 300 ms.
drivers[].sector{1,2,3}DeltaMsPer-driver sector deltas; null where not yet predicted.
drivers[].eliminationpEliminatedQ1, pEliminatedQ2, pReachesQ3 and projectedFinalQualifyingPosition. Q1/Q2 only.

Example payload

An excerpt of one analytics.qualifying delivery, trimmed to the fields this model produces. Values are illustrative. The full message shape is on the feed reference.

json
{
  "feed": "analytics.qualifying",
  "segment": "Q2",
  "sectors": {
    "s1": {
      "drivers": [
        {
          "number": "16",
          "tla": "LEC",
          "pFastest": 0.34,
          "predictedDeltaMs": -212,
          "sigma": 0.08
        }
      ]
    }
  },
  "drivers": [
    {
      "number": "16",
      "tla": "LEC",
      "sector1DeltaMs": -212,
      "sector2DeltaMs": -305,
      "sector3DeltaMs": -148,
      "elimination": {
        "pEliminatedQ1": 0,
        "pEliminatedQ2": 0.04,
        "pReachesQ3": 0.96,
        "projectedFinalQualifyingPosition": 3
      }
    }
  ]
}

Use it

Subscribe to analytics.qualifying with a webhook and read this model's fields from each delivery:

bash
curl -X POST https://api.racehooks.io/v1/webhooks \
  -H "Authorization: Bearer $RACEHOOKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"webhookUrl":"https://your-app.com/f1","feedId":"analytics.qualifying"}'

To try it without waiting for a race weekend, replay the recorded Canadian Grand Prix (2026-canada_r) from the quickstart.

How to read it

Deltas are in milliseconds against the session median; negative is faster. Because the median moves as the track rubbers in, compare drivers within the same message rather than across a whole session. pFastest is relative to the rest of the field, so it sums across the drivers in a sector. Elimination odds only appear once most of the field has a prediction, which is when the ranking means something.

Limitations

  • It is a pre-lap forecast. Information from a lap still in progress is not used.
  • Sector 3 is the hardest sector to forecast.
  • Deltas are relative to the session median, which shifts as track conditions evolve.
  • A sector block appears only when at least two drivers have a delta for it; pole fields need at least two drivers with all three sectors.

Calibration

Per-circuit calibration from the qualifying distribution model. See the calibration reference for the shared pipeline.

FAQ

When does the qualifying feed send an update?

After each personal-best lap improvement, once at least two drivers have been scored. It covers qualifying and the sprint shootout.

When do elimination odds appear?

In Q1 and Q2 only, once a near-full field has predictions.

Related models

Get the data

This model is delivered on analytics.qualifying. Subscribe by webhook or stream it over SSE. The quickstart walks through registering an endpoint and replaying a past session against it.