> ## Documentation Index
> Fetch the complete documentation index at: https://offthepace.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Laps

> Bronze-layer fact table.

Bronze-layer fact table. One row per driver per lap. \~20–30k rows per race (20 drivers × 50–70 laps). Hive-partitioned by season and race.

## Overview

| Property          | Value                                                          |
| ----------------- | -------------------------------------------------------------- |
| File pattern      | `bronze/laps/season=YYYY/race=<slug>/YYYY_<slug>_laps.parquet` |
| Example row count | 2024 Bahrain: 23 drivers × 57 laps = \~1,311 rows              |

<Note>
  LapTime is nanoseconds in Parquet; convert to seconds with / 1e9. Qualifying laps share this schema and add a session\_type='Q' column race laps have no such column at all.
</Note>

<Warning>
  **Columns that look real but aren't.** A search for one of
  these on this dataset will come up empty:

  * `session` Race laps have no session column at all; only qualifying laps get `session_type="Q"`.
</Warning>

## Columns

<ResponseField name="DriverNumber" type="integer" required>
  FIA driver number (1–99). *Source: FastF1 native.*
</ResponseField>

<ResponseField name="LapNumber" type="integer" required>
  1-indexed lap number within the session. Includes outlap (lap 0) if present. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="LapTime" type="integer">
  Lap duration in nanoseconds. Null for in-progress or invalid laps. Convert to seconds in dbt: `LapTime / 1000000000.0`. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Compound" type="string">
  Pirelli compound. Null if unknown (rare). *Source: FastF1 native.*
</ResponseField>

<ResponseField name="TyreLife" type="integer">
  Consecutive laps on current tyre set. Resets to 1 on pit stop. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="FreshTyre" type="boolean">
  True if tyre age ≤ 1 lap. FastF1 infers from pit stop data. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="TrackStatus" type="string">
  Single-digit string. 1=green, 2=yellow, 3=virtual safety car, 4=safety car, 5=red, 6=VSC, 7=red+stopped. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="PitOutLap" type="boolean">
  True if driver exited the pit lane on this lap. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="PitInLap" type="boolean">
  True if driver pitted at the end of this lap. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="PitInTime" type="int64">
  Session elapsed time at pit lane entry in nanoseconds. Null if no pit-in this lap. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="PitOutTime" type="int64">
  Session elapsed time at pit lane exit in nanoseconds. Null if no pit-out this lap. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Driver" type="string">
  Three-letter driver code (e.g. HAM, VER). *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Team" type="string">
  Constructor/team name as returned by FastF1. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Stint" type="integer">
  Stint number within the race session, 1-indexed. Resets to 1 after a pit stop. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Sector1Time" type="int64">
  Sector 1 duration in nanoseconds. Convert to seconds with / 1e9. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Sector2Time" type="int64">
  Sector 2 duration in nanoseconds. Convert to seconds with / 1e9. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Sector3Time" type="int64">
  Sector 3 duration in nanoseconds. Convert to seconds with / 1e9. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Sector1SessionTime" type="int64">
  Session elapsed time at Sector 1 exit in nanoseconds. Used for air-gap joins. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Sector2SessionTime" type="int64">
  Session elapsed time at Sector 2 exit in nanoseconds. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Sector3SessionTime" type="int64">
  Session elapsed time at Sector 3 exit in nanoseconds. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="SpeedI1" type="float32">
  Speed at intermediate trap 1 in kph. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="SpeedI2" type="float32">
  Speed at intermediate trap 2 in kph. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="SpeedFL" type="float32">
  Speed at finish line trap in kph. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="SpeedST" type="float32">
  Speed at main straight speed trap in kph. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="IsPersonalBest" type="boolean">
  True if this lap is the driver's personal best for the session. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Deleted" type="boolean">
  True if the lap time was deleted (e.g. track limits violation). *Source: FastF1 native.*
</ResponseField>

<ResponseField name="Position" type="integer">
  Race position at end of lap. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="FastF1Generated" type="boolean">
  True if this lap row was synthesised by FastF1 rather than sourced from telemetry. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="LapStartTime" type="int64">
  Session elapsed time at lap start in nanoseconds. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="IsAccurate" type="boolean">
  True if telemetry coverage is complete for the lap. FastF1 internal flag. *Source: FastF1 native.*
</ResponseField>

<ResponseField name="race_id" type="string" required>
  Format: `YYYY_RoundNumber`. Links to telemetry and race\_control. *Source: Ingestion pipeline.*
</ResponseField>

<ResponseField name="session_type" type="string">
  Only present on qualifying laps files, where it's always `"Q"`. Absent entirely from race laps; there is no `session` column on race files. *Source: Ingestion pipeline.*
</ResponseField>

<ResponseField name="season" type="integer" required>
  Hive partition key. Prune all queries with this column. *Source: Ingestion pipeline.*
</ResponseField>

## Required Columns

These columns are always present (non-null, always ingested): `DriverNumber`, `LapNumber`, `race_id`, `season`.
