Skip to main content

Overview

Race Control Messages (RCM) are official communications sent by race officials to teams about track status, flags, DRS availability, penalties, and incidents. These messages dictate the rules of engagement during the session and directly impact strategy decisions.
Race control messages are the official record of track conditions. They determine when drivers can overtake, when DRS is available, and when the session is under caution or stopped.

File Location

Race control messages are stored once per session:
Pre-Season Testing 2/Practice 3/rcm.json
Example:
  • Pre-Season Testing 2/Practice 3/rcm.json
  • Bahrain Grand Prix/Race/rcm.json
  • Monaco Grand Prix/Qualifying/rcm.json

Data Structure

The JSON file contains parallel arrays where each index represents one message:
{
  "time": ["2026-02-20T06:48:12.000000000", "2026-02-20T07:00:00.000000000", ...],
  "cat": ["Other", "Flag", "Drs", "CarEvent", ...],
  "msg": ["SESSION WILL START AT 09:00", "GREEN LIGHT - PIT EXIT OPEN", ...],
  "status": ["None", "ENABLED", "DISABLED", ...],
  "flag": ["None", "GREEN", "YELLOW", "RED", ...],
  "scope": ["Track", "Sector", "Driver", ...],
  "sector": ["None", "None", 11, ...],
  "dNum": ["None", "None", "44", ...],
  "lap": ["None", 5, 12, ...]
}

Field Reference

Core Message Information

time
array<string>
required
Timestamp when this message was issued by race control.Format: ISO 8601 timestamp
Example: ["2026-02-20T06:48:12.000000000", "2026-02-20T07:00:00.000000000", ...]
cat
array<string>
required
Category of the message being sent.Values:
  • "Other" - General session information
  • "Flag" - Flag-related messages (Yellow, Red, Green, etc.)
  • "Drs" - DRS status changes
  • "CarEvent" - Driver-specific events (penalties, unsafe release, etc.)
Example: ["Other", "Flag", "Drs", "CarEvent", ...]
msg
array<string>
required
Human-readable description of the event.Examples:
  • "GREEN LIGHT - PIT EXIT OPEN"
  • "YELLOW IN TRACK SECTOR 11"
  • "DRS ENABLED"
  • "RED FLAG - RACE SUSPENDED"
  • "CAR 44 - UNSAFE RELEASE"
  • "CHEQUERED FLAG"
Example array: ["SESSION WILL START AT 09:00", "GREEN LIGHT - PIT EXIT OPEN", ...]
status
array<string|null>
Additional context about the message state, depends on category.Common values:
  • "ENABLED" - DRS/feature enabled
  • "DISABLED" - DRS/feature disabled
  • "CLEAR" - Condition cleared
  • null - No specific status
Example: [null, "ENABLED", "DISABLED", "CLEAR", ...]

Flag Information

flag
array<string|null>
Type of flag being waved (if category is “Flag”).Values:
  • "GREEN" - Track clear, session active
  • "YELLOW" - Caution, hazard on track
  • "RED" - Session stopped
  • "CLEAR" - Previous flag condition cleared
  • "CHEQUERED" - Session ended
  • null - Not a flag message
Example: [null, "GREEN", "YELLOW", "CLEAR", "RED", ...]

Scope and Location

scope
array<string|null>
How wide the impact of this message is.Values:
  • "Track" - Entire circuit affected
  • "Sector" - Specific sector(s) affected
  • "Driver" - Single driver affected
  • null - Not applicable
Example: ["Track", "Sector", "Driver", ...]
sector
array<number|null>
Which mini-sector is affected (if scope is “Sector”).
The track is divided into 3 main sectors, each subdivided into 8 mini-sectors, giving 24 total mini-sectors (numbered 1-24).
Range: 1-24
Example: [null, null, 11, 12, null, ...]
dNum
array<string|null>
Driver number affected by the message (if scope is “Driver”).Format: String car number
Example: [null, null, "44", "1", "63", null, ...]
lap
array<number|null>
Which lap number this message refers to (context-dependent).Example: [null, null, 5, 12, null, ...]

Real Data Example

Here’s actual race control message data from Pre-Season Testing 2, Practice 3:
{
  "time": [
    "2026-02-20T06:48:12.000000000",
    "2026-02-20T07:00:00.000000000",
    "2026-02-20T09:11:03.000000000",
    "2026-02-20T09:11:25.000000000",
    "2026-02-20T09:13:18.000000000",
    "2026-02-20T09:13:20.000000000",
    "2026-02-20T09:16:01.000000000",
    "2026-02-20T09:16:10.000000000"
  ],
  "cat": [
    "Other",
    "Flag",
    "Flag",
    "Other",
    "Flag",
    "Flag",
    "Flag",
    "Other"
  ],
  "msg": [
    "PINK HEAD PADDING MATERIAL MUST BE USED",
    "GREEN LIGHT - PIT EXIT OPEN",
    "YELLOW IN TRACK SECTOR 11",
    "RED FLAG - RACE SUSPENDED",
    "TRACK CLEAR",
    "YELLOW IN TRACK SECTOR 11",
    "CLEAR IN TRACK SECTOR 11",
    "SESSION WILL RESUME AT 12:17"
  ],
  "status": [
    null,
    "ENABLED",
    null,
    null,
    "CLEAR",
    null,
    "CLEAR",
    null
  ],
  "flag": [
    null,
    "GREEN",
    "YELLOW",
    "RED",
    "CLEAR",
    "YELLOW",
    "CLEAR",
    null
  ],
  "scope": [
    "Track",
    "Track",
    "Sector",
    "Track",
    "Track",
    "Sector",
    "Sector",
    "Track"
  ],
  "sector": [
    null,
    null,
    11,
    null,
    null,
    11,
    11,
    null
  ],
  "dNum": [
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null
  ],
  "lap": [
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null
  ]
}
What happened in this session:
  1. 06:48:12 - Pre-session equipment requirement notification
  2. 07:00:00 - Pit lane opens (GREEN), session can begin
  3. 09:11:03 - YELLOW flag in sector 11 (mini-sector, likely debris or incident)
  4. 09:11:25 - RED FLAG - Session stopped due to serious incident
  5. 09:13:18 - Track cleared, ready to resume
  6. 09:13:20 - Another YELLOW in sector 11 (follow-up inspection)
  7. 09:16:01 - Sector 11 CLEAR
  8. 09:16:10 - Session will resume at 12:17 (delayed restart)

Message Categories Explained

Category: "Flag"Flag messages communicate track safety status:

Green Flag

  • Meaning: Track is clear, racing can begin/resume
  • Driver action: Full racing speed allowed
  • Example: {"cat": "Flag", "msg": "GREEN LIGHT - PIT EXIT OPEN", "flag": "GREEN", "scope": "Track"}

Yellow Flag

  • Meaning: Hazard on track (debris, stopped car, marshal activity)
  • Driver action: Slow down, no overtaking in affected sector
  • Scope: Usually sector-specific (1-24 mini-sectors)
  • Example: {"cat": "Flag", "msg": "YELLOW IN TRACK SECTOR 11", "flag": "YELLOW", "scope": "Sector", "sector": 11}

Red Flag

  • Meaning: Session stopped, unsafe to continue
  • Driver action: Return to pit lane immediately
  • Reasons: Major accident, barrier damage, severe weather
  • Example: {"cat": "Flag", "msg": "RED FLAG - RACE SUSPENDED", "flag": "RED", "scope": "Track"}

Chequered Flag

  • Meaning: Session ended
  • Driver action: Complete current lap and return to pits
  • Example: {"cat": "Flag", "msg": "CHEQUERED FLAG", "flag": "CHEQUERED", "scope": "Track"}

Clear

  • Meaning: Previous flag condition resolved
  • Driver action: Resume normal racing
  • Example: {"cat": "Flag", "msg": "CLEAR IN TRACK SECTOR 11", "flag": "CLEAR", "scope": "Sector", "sector": 11}

Track Status Codes

Race control messages correlate with track status codes found in the Lap Times status field:
CodeStatusCorresponding MessageImpact
1Track Clear”TRACK CLEAR”, “CLEAR IN SECTOR X”Normal racing
2Yellow Flag”YELLOW IN TRACK SECTOR X”No overtaking, reduced speed
3Unknown/UnusedRarely observedSystem reserved
4Safety Car”SAFETY CAR DEPLOYED”All cars bunch up
5Red Flag”RED FLAG - RACE SUSPENDED”Session stopped
6VSC Deployed”VIRTUAL SAFETY CAR”Controlled speed delta
7VSC Ending”VIRTUAL SAFETY CAR ENDING”Prepare for restart

Use Cases

Strategic Analysis

Pit Window Optimization
# Identify safety car periods (opportunity for "free" pit stops)
safety_car_periods = [
    msg for msg in rcm_data 
    if msg['cat'] == 'Flag' and 'SAFETY CAR' in msg['msg']
]

# Correlate with pit stop timing from lap times data
# Teams that pit during SC lose less time
Yellow Flag Impact
# Find yellow flag periods and affected sectors
yellow_flags = [
    (msg['time'], msg['sector']) 
    for msg in rcm_data 
    if msg['flag'] == 'YELLOW'
]

# Cross-reference with lap times to measure lap time loss
# in affected sectors during yellow flag periods

Race Reconstruction

Timeline Visualization
  • Plot message timestamps on a timeline
  • Color-code by category (flags, DRS, car events)
  • Overlay with lap times to show impact on pace
  • Identify chaotic periods with multiple incidents
Incident Analysis
  • Filter for RED FLAG messages to identify major incidents
  • Look at preceding YELLOW flags to trace incident development
  • Correlate with telemetry data to understand what happened

Penalty Tracking

Driver Penalties
# Extract all car event messages
car_events = [msg for msg in rcm_data if msg['cat'] == 'CarEvent']

# Group by driver number
from collections import defaultdict
penalties_by_driver = defaultdict(list)

for event in car_events:
    if event['dNum']:
        penalties_by_driver[event['dNum']].append(event['msg'])

# Identify drivers with most infractions

DRS Zone Analysis

DRS Availability Timeline
  • Track when DRS is enabled/disabled throughout session
  • Correlate with yellow flags (DRS auto-disables)
  • Measure overtaking success rate during DRS-enabled periods
  • Compare with Telemetry DRS usage data

Data Quality Notes

Race control messages are timestamped with wall-clock time (ISO 8601), not session time. To correlate with lap times or telemetry (which use session time), you’ll need to calculate the session start time and convert accordingly.
Some messages may be issued retroactively or updated. The message stream represents the official record as finalized after the session.

Mini-Sector Reference

The track is divided into 24 mini-sectors (3 main sectors × 8 mini-sectors each):
Main SectorMini-SectorsDescription
Sector 11-8First third of track
Sector 29-16Middle third of track
Sector 317-24Final third of track
Example: “YELLOW IN TRACK SECTOR 11” refers to mini-sector 11, which is the 3rd mini-sector of Sector 2.
  • Lap Times - Track status codes and lap timing impact
  • Weather - Weather conditions triggering red flags or wet flags
  • Telemetry - Detailed driver response to flags and incidents
  • Drivers - Driver information for penalty tracking

Build docs developers (and LLMs) love