Feed Catalog›Race Control

Race Control

freeliveanalytics

Official race-direction output, delivered verbatim. race-control.messages is the raw FIA feed, covering safety car, VSC, red flag, track-limits warnings, overtake-system toggles, penalties, and steward decisions. It 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 →

Feed IDAccess classCadenceDescription
session.track-statusfree
All plans
Per updateTrack flag code: 1=Clear, 2=Yellow, 4=SC, 5=Red, 6=VSC, 7=VSC Ending.
race-control.messageslive
Developer plan
Per updateRaw FIA race control messages: safety car, VSC, red flag, penalties, investigations.
radio.transcriptanalytics
Custom plan
per radio clip, seconds after the broadcastTeam radio speech, transcribed: what the driver and pit wall actually said, with a confidence score.
regulatory.stewards-decisionlive
Developer plan
on publication (FIA decision documents, ~3 min poll)Parsed FIA stewards decisions: penalty type, driver, session, infringement, grid places / seconds / fine, raw decision text.
race.grid-penaltylive
Developer plan
on publication (FIA decision documents, ~3 min poll)Grid-affecting stewards decisions only (grid drop, back of grid, pit-lane start), with the number of grid places.

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

Per update

Track flag code: 1=Clear, 2=Yellow, 4=SC, 5=Red, 6=VSC, 7=VSC Ending.

Payload fields
FieldTypeDescription
data.statusstringSample: "yellow"
data.messagestringSample: "Yellow"

Every delivery carries feed, sessionId and utc.

Sample payload: recorded Canadian Grand Prix (2026-canada_r)
json
{
  "feed": "session.track-status",
  "sessionId": "2026-canada_r",
  "utc": "2026-10-05T18:49:34.525Z",
  "data": {
    "status": "yellow",
    "message": "Yellow"
  }
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

race-control.messagesRace Control Messageslive

Per update

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.

FieldTypeDescription
messages[].utcstringISO 8601 timestamp from the F1 timing server.
messages[].categorystring"Flag" | "Drs" | "SafetyCar" | "Other". FIA classification.
messages[].messagestringRaw FIA message text.
messages[].flagstring | nullFlag state if applicable: "SAFETY_CAR" | "VIRTUAL_SAFETY_CAR" | "RED" | "CLEAR" etc.
messages[].lapnumber | nullRace lap when the message was issued.
Sample payload: recorded Canadian Grand Prix (2026-canada_r)
json
{
  "feed": "race-control.messages",
  "sessionId": "2026-canada_r",
  "utc": "2026-10-05T18:48:39.015Z",
  "data": {
    "messages": [
      {
        "utc": "2026-05-24T20:46:58",
        "category": "Flag",
        "message": "WAVED BLUE FLAG FOR CAR 18 (STR) TIMED AT 16:46:58",
        "flag": "BLUE",
        "lap": 29,
        "scope": "Driver"
      }
    ]
  }
}

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

radio.transcriptTeam Radio Transcriptanalytics

per radio clip, seconds after the broadcast

Team radio speech, transcribed: what the driver and pit wall actually said, with a confidence score.

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.

FieldTypeDescription
data.carNumbernumberThe car the radio belongs to, always present; it is the feed's source key.
data.driverDriverRef | nullThe 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.textstringThe transcribed speech. "" when the clip contained no recognisable speech.
data.confidencenumberModel 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.durationMsnumberDuration of the source audio clip in milliseconds.
data.capturedAtstringISO 8601 timestamp of the radio broadcast itself. The envelope utc is delivery time.
Sample arrives with the next session.

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

regulatory.stewards-decisionStewards Decisionslive

on publication (FIA decision documents, ~3 min poll)

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.

FieldTypeDescription
data.eventstringGrand Prix name, e.g. "British Grand Prix".
data.seasonnumberChampionship year.
data.documentUrlstringURL of the FIA stewards decision PDF.
data.documentNumbernumber | nullFIA document number.
data.publishedAtstring | nullISO 8601 timestamp the decision was published.
data.driverDriverRef | nullThe penalised driver (full DriverRef).
data.carNumbernumber | nullCar number from the decision.
data.competitorstring | nullTeam / entrant.
data.sessionstring | null"Race" | "Qualifying" | "Sprint" | "Practice N" | …
data.penaltyTypestringgrid_drop | grid_back | pit_lane_start | time_penalty | stop_go | drive_through | disqualification | fine | reprimand | no_action | other.
data.isPenaltybooleanfalse only for no_action.
data.isGridPenaltybooleantrue for grid_drop / grid_back / pit_lane_start.
data.gridPenaltyPositionsnumber | nullGrid places dropped (set for grid_drop).
data.timePenaltySecondsnumber | nullSeconds (set for time_penalty / stop_go).
data.fine{ amount, currency } | nullFine amount and currency, when a fine was imposed.
data.penaltyPointsnumber | nullSuper-licence penalty points, when stated.
data.infringementstring | nullThe regulation(s) breached.
data.decisionstringThe raw FIA Decision field. Always present.
data.reasonstring | nullThe stewards' stated reason.
Sample arrives with the next session.

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

race.grid-penaltyGrid Penaltieslive

on publication (FIA decision documents, ~3 min poll)

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.

FieldTypeDescription
data.eventstringGrand Prix name.
data.seasonnumberChampionship year.
data.documentUrlstringURL of the FIA stewards decision PDF.
data.publishedAtstring | nullISO 8601 timestamp the decision was published.
data.driverDriverRef | nullThe penalised driver (full DriverRef).
data.carNumbernumber | nullCar number from the decision.
data.competitorstring | nullTeam / entrant.
data.sessionstring | nullSession the infringement occurred in.
data.penaltyTypestringgrid_drop | grid_back | pit_lane_start.
data.gridPenaltyPositionsnumber | nullGrid places dropped (set for grid_drop).
data.infringementstring | nullThe regulation(s) breached.
data.decisionstringThe raw FIA Decision field.
Sample arrives with the next session.

Subscribe: webhooks · quickstart · SDK · GET /v1/feeds

← Strategy & TyresRace Events →