Skip to main content
All data in the TracingInsights repository is stored in JSON format with consistent structures and field naming conventions. This guide covers the format of each data type and how to parse them.

JSON Structure Overview

Every JSON file follows a predictable structure where data is organized in arrays, with each array representing a specific field across all samples.

Array-Based Format

Rather than storing each sample as an object, data is stored in parallel arrays for efficiency:
{
  "tel": {
    "time": [0.0, 0.26, 0.52, 0.78, ...],
    "speed": [0, 42, 89, 134, ...],
    "throttle": [0, 45, 78, 100, ...]
  }
}
This means:
  • Index 0 across all arrays = first sample
  • Index 1 across all arrays = second sample
  • Index n across all arrays = nth sample

Telemetry Data Format

File: X_tel.json

Contains second-by-second sensor data for a single lap (~3.7 Hz sampling rate, approximately every 270ms).
{
  "tel": {
    "time": [0.0, 0.26, 0.52, ...],
    "rpm": [11245, 11567, 11892, ...],
    "speed": [0, 42, 89, ...],
    "gear": [1, 2, 3, ...],
    "throttle": [0, 45, 78, ...],
    "brake": [false, false, true, ...],
    "drs": [0, 0, 12, ...],
    "distance": [0.0, 12.4, 28.9, ...],
    "rel_distance": [0.0, 0.002, 0.005, ...],
    "x": [-3650.5, -3648.2, -3645.8, ...],
    "y": [1193.7, 1195.3, 1197.1, ...],
    "z": [2.1, 2.3, 2.5, ...],
    "acc_x": [5.2, 4.8, 4.5, ...],
    "acc_y": [0.3, 0.5, 1.2, ...],
    "acc_z": [0.1, 0.2, 0.3, ...],
    "DriverAhead": ["VER", "VER", "VER", ...],
    "DistanceToDriverAhead": [125.4, 123.8, 122.1, ...],
    "dataKey": "2026-Australian Grand Prix-Practice 1-NOR-1"
  }
}
Important: Acceleration data (acc_x, acc_y, acc_z) is computed from position and speed data, not raw IMU sensors. Values are smoothed and outliers are filtered.

Data Key Format

The dataKey field uniquely identifies each lap:
"Year-EventName-Session-DriverCode-LapNumber"
Examples:
  • "2026-Australian Grand Prix-Race-VER-9"
  • "2026-PreSeasonTesting1-Practice 1-NOR-5"

Lap Times Data Format

File: laptimes.json

Contains comprehensive timing and performance data for all laps completed by a driver.
{
  "time": [101.411, 84.906, 84.391, ...],
  "lap": [1, 2, 3, ...],
  "compound": ["MEDIUM", "MEDIUM", "SOFT", ...],
  "stint": [1, 1, 2, ...],
  "s1": [29.609, 29.862, 29.637, ...],
  "s2": [18.321, 18.361, 17.959, ...],
  "s3": [36.976, 36.168, 35.795, ...],
  "life": [5, 6, 1, ...],
  "pos": [1, 1, 2, ...],
  "status": ["1", "1", "2", ...],
  "pb": [true, false, false, ...],
  "fresh": [false, false, true, ...],
  "drv": ["NOR", "NOR", "NOR", ...],
  "dNum": ["1", "1", "1", ...],
  "team": ["McLaren", "McLaren", "McLaren", ...]
}

Track Status Codes

CodeMeaningDescription
"1"Track ClearNormal racing conditions
"2"Yellow FlagHazard on track, no overtaking
"4"Safety CarPhysical safety car deployed
"5"Red FlagSession stopped
"6"VSC DeployedVirtual Safety Car active
"7"VSC EndingVSC about to end
Multiple status codes may appear together (e.g., "126" = Track Clear + Yellow + VSC). Each digit represents a different status.

Weather Data Format

File: weather.json

Environmental conditions sampled approximately once per minute.
{
  "wT": [3.099, 63.102, 123.101, ...],
  "wAT": [20.1, 20.2, 20.2, ...],
  "wH": [73.2, 72.9, 72.3, ...],
  "wP": [1015.0, 1015.1, 1015.0, ...],
  "wR": [false, false, false, ...],
  "wTT": [25.3, 25.8, 26.1, ...],
  "wWD": [180, 185, 190, ...],
  "wWS": [2.5, 2.8, 3.1, ...]
}
FieldFull NameUnitDescription
wTTimesecondsSession time when sampled
wATAir Temperature°CAmbient air temperature
wHHumidity%Relative humidity
wPPressurembarAtmospheric pressure
wRRainfallbooleanIs it raining?
wTTTrack Temperature°CAsphalt surface temperature
wWDWind DirectiondegreesCompass bearing (0-359)
wWSWind Speedm/sWind velocity

Race Control Messages Format

File: rcm.json

Official messages from race control about flags, incidents, and track status.
{
  "time": ["2026-03-06T01:15:21.000000000", ...],
  "cat": ["Flag", "Other", "SafetyCar", ...],
  "msg": ["GREEN", "DRS ENABLED", ...],
  "status": ["ENABLED", "DISABLED", ...],
  "flag": ["GREEN", "YELLOW", "RED", ...],
  "scope": ["Track", "Sector", "Driver", ...],
  "sector": [null, 2, null, ...],
  "dNum": [null, null, "1", ...],
  "lap": [null, 5, null, ...]
}
FieldTypeDescription
timeISO datetimeWhen message was issued
catstring”Flag”, “Other”, “SafetyCar”, “Drs”, “CarEvent”
msgstringHuman-readable message text
statusstringAdditional context (“ENABLED”, “DISABLED”, etc.)
flagstringFlag type if applicable
scopestring”Track”, “Sector”, or “Driver”
sectorinteger/nullMini-sector number (1-24) if scope is “Sector”
dNumstring/nullDriver number if scope is “Driver”
lapinteger/nullLap number if applicable

Corners Data Format

File: corners.json

Circuit layout information with corner positions and angles.
{
  "CornerNumber": [1, 2, 3, 4, 5, ...],
  "X": [-3650.59, -3555.05, -7194.97, ...],
  "Y": [1193.78, 1992.75, 7101.94, ...],
  "Angle": [-176.63, -1.52, 162.26, ...],
  "Distance": [350.25, 424.90, 1067.86, ...],
  "Rotation": 44.0
}
FieldTypeUnitDescription
CornerNumberinteger-Sequential corner identifier (1, 2, 3…)
XfloatmetersHorizontal position on track map
YfloatmetersHorizontal position on track map
AnglefloatdegreesVisual offset angle for map markers
DistancefloatmetersDistance from start/finish line
Rotationfloat/nulldegreesTrack rotation to match official map

Drivers Data Format

File: drivers.json

Metadata about all drivers participating in the session.
{
  "drivers": [
    {
      "driver": "NOR",
      "team": "McLaren",
      "dn": "1",
      "fn": "Lando",
      "ln": "Norris",
      "tc": "F47600",
      "url": "https://media.formula1.com/.../lannor01.png"
    },
    ...
  ]
}
FieldFull NameTypeDescription
driverDriver Codestring3-letter identifier (“NOR”, “VER”, etc.)
teamTeam NamestringConstructor name
dnDriver NumberstringCar number
fnFirst NamestringDriver’s first name
lnLast NamestringDriver’s last name
tcTeam ColorstringHex color code (without #)
urlHeadshot URLstringLink to driver photo
Unlike other files, drivers.json uses an object-based format with an array of driver objects rather than parallel arrays.

Field Naming Conventions

The data uses abbreviations consistently:
  • Prefixes:
    • w = Weather (e.g., wT, wAT, wH)
    • s = Sector (e.g., s1, s2, s3)
    • v = Speed/Velocity (e.g., vi1, vfl, vst)
    • p = Pit (e.g., pin, pout)
    • l = Lap (e.g., lST, lSD)
    • d = Driver (e.g., dNum, drv)
  • Suffixes:
    • T = Time/Temperature (context-dependent)
    • D = Date/Direction/Distance (context-dependent)
    • S = Speed/Start (context-dependent)

Parsing Tips

Handle Missing Values

Many fields can be null or "None" (as a string):
# Check for missing lap time
if lap_time != "None" and lap_time is not None:
    print(f"Lap time: {lap_time}s")

Align Array Indices

When working with telemetry or laptimes, remember all arrays share the same indices:
for i in range(len(tel['time'])):
    sample = {
        'time': tel['time'][i],
        'speed': tel['speed'][i],
        'throttle': tel['throttle'][i],
        'brake': tel['brake'][i]
    }
    process_sample(sample)

Convert Data Types

JSON doesn’t distinguish between int and float - handle accordingly:
import json

data = json.load(f)

# Ensure integers where needed
lap_number = int(data['lap'][0])

# Handle boolean strings
is_raining = data['wR'][0]  # Already boolean in JSON

Next Steps

Field Reference

Complete field-by-field reference documentation

Python Examples

Code examples for common analysis tasks

Build docs developers (and LLMs) love