Race Control
Official race-direction output, delivered verbatim. race-control.messages is the raw FIA feed — safety car, VSC, red flag, track-limits warnings, overtake-system toggles, penalties, and steward decisions — and is often the most commercially important feed for in-play products. session.track-status carries the live flag code.
For pre-parsed structured events derived from these messages (investigation.opened, penalty.applied, lap.time.deleted, overtake.enabled, …) see the Race Events reference →
Subscribe with the feedId via webhook or SSE. The badge shows the feed's access class: free feeds are open to every plan, live feeds require the Developer plan, and analytics feeds require the Custom plan.
session.track-statusTrack Statusfree
Track flag code: 1=Clear, 2=Yellow, 4=SC, 5=Red, 6=VSC, 7=VSC Ending.
race-control.messagesRace Control Messageslive
Raw FIA race control messages: safety car, VSC, red flag, penalties, investigations.
Each delivery is a batch of all messages since the last update — dedupe on utc.
| Field | Type | Description |
|---|---|---|
messages[].utc | string | ISO 8601 timestamp from the F1 timing server. |
messages[].category | string | "Flag" | "Drs" | "SafetyCar" | "Other" — FIA classification. |
messages[].message | string | Raw FIA message text. |
messages[].flag | string | null | Flag state if applicable: "SAFETY_CAR" | "VIRTUAL_SAFETY_CAR" | "RED" | "CLEAR" etc. |
messages[].lap | number | null | Race lap when the message was issued. |
radio.transcriptTeam Radio Transcriptanalytics
Team radio speech, transcribed: what the driver and pit wall actually said, with a confidence score.
Backed by: faster-whisper large-v3-turbo. How the models work →
Speech, not audio: each team-radio clip is transcribed and the text is delivered — the audio file itself is not. Delivery follows the broadcast by the transcription time, typically seconds. Transcription is machine output over noisy radio; treat text as a best-effort reading and gate on confidence.
| Field | Type | Description |
|---|---|---|
data.carNumber | number | The car the radio belongs to — always present; it is the feed's source key. |
data.driver | DriverRef | null | The driver in that car (full DriverRef), resolved from the session entrant list. null when the session has no entrant row for the car — never guessed. |
data.text | string | The transcribed speech. "" when the clip contained no recognisable speech. |
data.confidence | number | Model confidence in [0, 1]. 0 means no speech segments survived voice-activity detection — pair a 0 with an empty text, not with a transcript you can trust. |
data.durationMs | number | Duration of the source audio clip in milliseconds. |
data.capturedAt | string | ISO 8601 timestamp of the radio broadcast itself. The envelope utc is delivery time. |
regulatory.stewards-decisionStewards Decisionslive
Parsed FIA stewards decisions: penalty type, driver, session, infringement, grid places / seconds / fine, raw decision text.
Fires once per newly-published FIA stewards decision. Carries penaltyType: "no_action" too (with isPenalty: false) so a cleared investigation is distinguishable from silence — filter on penaltyType or isGridPenalty.
| Field | Type | Description |
|---|---|---|
data.event | string | Grand Prix name, e.g. "British Grand Prix". |
data.season | number | Championship year. |
data.documentUrl | string | URL of the FIA stewards decision PDF. |
data.documentNumber | number | null | FIA document number. |
data.publishedAt | string | null | ISO 8601 timestamp the decision was published. |
data.driver | DriverRef | null | The penalised driver (full DriverRef). |
data.carNumber | number | null | Car number from the decision. |
data.competitor | string | null | Team / entrant. |
data.session | string | null | "Race" | "Qualifying" | "Sprint" | "Practice N" | … |
data.penaltyType | string | grid_drop | grid_back | pit_lane_start | time_penalty | stop_go | drive_through | disqualification | fine | reprimand | no_action | other. |
data.isPenalty | boolean | false only for no_action. |
data.isGridPenalty | boolean | true for grid_drop / grid_back / pit_lane_start. |
data.gridPenaltyPositions | number | null | Grid places dropped (set for grid_drop). |
data.timePenaltySeconds | number | null | Seconds (set for time_penalty / stop_go). |
data.fine | { amount, currency } | null | Fine amount and currency, when a fine was imposed. |
data.penaltyPoints | number | null | Super-licence penalty points, when stated. |
data.infringement | string | null | The regulation(s) breached. |
data.decision | string | The raw FIA Decision field — always present. |
data.reason | string | null | The stewards' stated reason. |
race.grid-penaltyGrid Penaltieslive
Grid-affecting stewards decisions only (grid drop, back of grid, pit-lane start), with the number of grid places.
The grid-affecting subset of regulatory.stewards-decision — only grid drops, back-of-grid, and pit-lane starts. Subscribe to this if you only care about starting-grid impact.
| Field | Type | Description |
|---|---|---|
data.event | string | Grand Prix name. |
data.season | number | Championship year. |
data.documentUrl | string | URL of the FIA stewards decision PDF. |
data.publishedAt | string | null | ISO 8601 timestamp the decision was published. |
data.driver | DriverRef | null | The penalised driver (full DriverRef). |
data.carNumber | number | null | Car number from the decision. |
data.competitor | string | null | Team / entrant. |
data.session | string | null | Session the infringement occurred in. |
data.penaltyType | string | grid_drop | grid_back | pit_lane_start. |
data.gridPenaltyPositions | number | null | Grid places dropped (set for grid_drop). |
data.infringement | string | null | The regulation(s) breached. |
data.decision | string | The raw FIA Decision field. |