More
Limits
What lapbox can’t tell you yet, with the measurements behind each limit.
What lapbox can’t tell you, or can tell you only roughly — with the measurement behind each statement. A limit listed here is one the library has measured; where it has a refusal for it, the function says so at run time too.
Comparing two laps
Winning more minisectors is not being quicker
Each minisector goes to the driver who spent less time in it, and summary["more_minisectors"] counts them — but a driver can lose most minisectors and gain the lap in a few. In 2023 Bahrain qualifying Leclerc won 12 of 21 and Verstappen took pole by 0.292 s.
Many minisectors are too close to call
22–45 % of minisectors on four qualifying sessions were decided by less than 20 ms. time_a and time_b are in the table: read a few hundredths as a tie.
The time gap is exact at the line, approximate in between
The shape of each lap comes from integrating its speed; with FastF1’s telemetry (which carries Time) each lap is then scaled to its measured lap time, so the gap ends exactly at the official one. In between it is as good as the alignment: at the official sector lines it was a median of 29–42 ms off (at most 143 ms), and on the wrong side in 2–7 of 90 checks (four qualifying sessions, 45 pairs each), each time where the official gap was 59 ms or less; the median gap at those lines was 181 ms. Without a clock the integral stands alone: it ended a median of 92–113 ms from the official gap and on the wrong side in 2–9 of 45 pairs.
Over 19 qualifying sessions (2023–2026, 500-point grid) the sessions’ medians were 12–65 ms, except 2026 China: 114 / 77 ms at the two lines on laps with no frozen data, 6–9 m of misplacement. One lap’s speed reading stalled for under a second at a time while RPM and gear moved on (stalls like it occur in every season without raising the error); without it China is still 88 / 39 ms. The cause is not known.
Where time changes hands is less certain than how much
A few metres of misplacement cost the most where the car is slowest: the same lap compared with itself, with 5 m of distance error at its slowest corner, shows the gap curve gaining 0.10 s and losing 0.17 s around that corner. So read gains and losses from segment_gaps, which splits the lap at its speed peaks: in that case no segment moved by more than 49 ms. On six qualifying sessions the curve’s biggest rise and fall were a median 113 ms from a gap rebuilt from the cars’ positions, the biggest gaining and losing segments 65 ms — about that check’s own accuracy. A segment often holds several corners.
Some laps can’t be matched at all
Comparison.matched is False above 15 km/h RMS of residual. The threshold caught 32 of 33 physically impossible pairs and withheld 8 of 217 sound ones (250 pairs). When it is False, don’t use the time delta, speed delta, corner speeds, minisectors or segments.
One lap
Some 2026 laps have frozen car data
The timing feed sometimes repeats one car reading — speed, RPM, gear and throttle all unchanged, often with a throttle of 104 — for one to 25 seconds while the car’s position moves on. Distance is integrated from that speed, so the lap is misplaced (the five worst laps came out 380 m short to 85 m long), and it can’t be matched with another. detect_frozen_stretches finds these stretches. On 2026 China, Suzuka and Monza qualifying it was behind all 57 refused driver pairs (14, 16 and 5 of 22 fastest laps had one); on 183 laps from 2023, 2025 and three other 2026 sessions it flagged none.
Rebuilding the speed from the positions was tried twice and isn’t reliable: with a smoothed position speed the repaired pairs were a median 132 ms off at the sector lines at Monza (clean pairs 19 ms), 69 ms at Suzuka and 172 ms at China.
Speed-only stalls are not caught
detect_frozen_stretches needs all four channels to repeat. A speed reading that stalls while RPM or gear move on is not flagged; such stalls exist in every season and did not predict error outside one China lap.
Don’t read the peak lateral g
gforces takes lateral g from the curvature of the racing line, and the position feed bends it: on 1,008 clean qualifying laps (2023–2026) the single highest lateral reading passed 6 g on 554 (up to 105 g), usually at the same place on every lap of a session. The 95th percentile of |a_lat| stayed at 2.3–5.3 g and ranked drivers consistently from lap to lap (median Spearman 0.66, against 0.24 for the peak). Longitudinal g comes from the car’s speed and is physical.
Corners are found where the car slows down
So the count won’t match the circuit’s official corner numbering: flat-out kinks produce no speed minimum. What you get is the same corners on every lap of a circuit, which is what comparisons need. Corner classes are rough bands of apex speed: slow under 130 km/h, medium 130–210, fast above 210.
Practice and race pace
Long-run pace is indicative between teams
Fuel loads are never published, so two cars’ absolute long-run times may reflect different fuel, not different pace.
The fuel effect is assumed
Long-run slopes, race-pace correction, stint degradation and the tyre model all use 0.048 s per lap of fuel (FUEL_EFFECT_S_PER_LAP), the same for every car and race, not measured. A long-run slope also contains track evolution and the driver building up, so it can be negative: the car got quicker through the run, not the tyres younger.
Gaps to the car ahead only count cars on the same lap
A lapped car physically in front is not counted as traffic.
The 2 s dirty-air threshold is a convention, not a measurement
Pass threshold= to change it. A per-circuit curve fitted from data is planned.
An ideal lap is refused, not faked
ideal_lap returns None when a sector was never timed on a clean lap, or when the sum of best sectors comes out slower than the fastest lap (FastF1 leaves lap 1’s S1 blank after a standing start).
Thin samples move far
true_pace_ranking keeps a driver with three representative laps. A driver with few laps — a retirement, a long safety-car spell — can change many places on them: read rank_change together with laps.
Tyres
Per-compound degradation is weakly determined on low-wear circuits
TyreDegradationModel pools every driver on a compound, and the slope is small next to the noise: over 65 races of 2024–2026, 23 % of whole-race compound rates still come out negative. The library reports the fit as it comes out, with r2 and laps beside it; clamp it before planning with it.
The model’s fuel effect is fixed, not fitted
Fitting it (up to 0.1.0.dev11) could not tell fuel from tyre age, which both move with the lap number. Fitting each race’s first half and predicting the second half’s representative laps, the fixed effect with the 107 % filter cut the median error by 19 % (0.79 → 0.64 s) on 65 races and was better in 71 % of them; how lap times change inside a stint was predicted no better (−2 %, better in half the races).
Rain tyres are mostly left out in a mixed-weather race
The 107 % filter keeps laps against the driver’s best of the race, usually on slicks: of eight rain-tyre fits in those 65 races, five went and two kept under a third of their laps. Fit rain tyres on their own laps.
Stint slopes are short trends
stint_degradation uses the same assumed fuel effect, and a stint needs only three laps within 107 % of its best; a three-lap stint is a weak trend.
Data access
F1’s archive needs an account since October 2026
lapbox reads what FastF1 loads. Since about 15 October 2026 F1’s live-timing archive refuses unauthenticated downloads (FastF1 #978); FastF1 3.9.0a0 adds sign-in with an F1 TV Access subscription. See Getting session data.
No strategy engine yet
The strategy engine lives in the LapBox website for now and is planned to move into lapbox in 0.2. Its outputs have not yet been validated against real race results, and these docs won’t call them predictions until they have.
These docs describe lapbox 0.1.0. Something wrong or missing? Open an issue.