Feed CatalogRace Control

Race Control

freeliveanalytics

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 →

Feed IDTierCadenceDescription
session.track-statusfreePer updateTrack flag code: 1=Clear, 2=Yellow, 4=SC, 5=Red, 6=VSC, 7=VSC Ending.
race-control.messageslivePer updateRaw FIA race control messages: safety car, VSC, red flag, penalties, investigations.
radio.transcriptanalyticsper radio clip, seconds after the broadcastTeam radio speech, transcribed: what the driver and pit wall actually said, with a confidence score.
regulatory.stewards-decisionliveon 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-penaltyliveon 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.

Sample payload
json
{
  "feed": "session.track-status",
  "sessionId": "9560",
  "utc": "2026-06-08T14:32:18.441Z",
  "data": {
    "status": "safetyCar",
    "message": "SAFETY CAR"
  }
}

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
json
{
  "feed": "race-control.messages",
  "sessionId": "9560",
  "utc": "2026-06-08T14:32:18.441Z",
  "data": {
    "messages": [
      {
        "utc": "2026-06-08T14:22:31.000Z",
        "category": "Flag",
        "message": "SAFETY CAR DEPLOYED",
        "flag": "SAFETY_CAR",
        "lap": 42
      },
      {
        "utc": "2026-06-08T13:58:00.000Z",
        "category": "Other",
        "message": "TURN 6 - INCIDENT INVOLVING CARS 4 (NOR) AND 63 (RUS) NOTED - NO FURTHER ACTION",
        "flag": "CLEAR",
        "lap": 21
      }
    ]
  }
}

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.

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.

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 payload
json
{
  "feed": "radio.transcript",
  "sessionId": "9560",
  "utc": "2026-06-08T14:32:18.441Z",
  "data": {
    "carNumber": 4,
    "driver": {
      "driverId": "norris-lando",
      "constructorId": "mclaren",
      "number": "4",
      "tla": "NOR",
      "name": "Lando Norris",
      "team": "McLaren F1 Team"
    },
    "text": "Box this lap, box box. We're going to the hard, Lando, hard tyre.",
    "confidence": 0.94,
    "durationMs": 4320,
    "capturedAt": "2026-06-08T14:32:11.900Z"
  }
}

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 payload
json
{
  "feed": "regulatory.stewards-decision",
  "sessionId": null,
  "utc": "2026-06-08T14:32:18.441Z",
  "data": {
    "event": "British Grand Prix",
    "season": 2026,
    "documentUrl": "https://www.fia.com/system/files/decision-document/2026_british_grand_prix_-_infringement_-_car_4_-_pu_elements_changed.pdf",
    "documentNumber": 72,
    "publishedAt": "2026-07-05T12:18:00.000Z",
    "driver": {
      "driverId": "norris-lando",
      "constructorId": "mclaren",
      "number": "4",
      "tla": "NOR",
      "name": "Lando Norris",
      "team": "McLaren F1 Team"
    },
    "carNumber": 4,
    "competitor": "McLaren F1 Team",
    "session": "Qualifying",
    "penaltyType": "grid_drop",
    "isPenalty": true,
    "isGridPenalty": true,
    "gridPenaltyPositions": 10,
    "timePenaltySeconds": null,
    "fine": null,
    "penaltyPoints": null,
    "infringement": "Breaches of Article B8.2.2 (read with B8.2.3) of the FIA F1 Regulations.",
    "decision": "Drop of 10 grid positions for the next Race in which the driver participates.",
    "reason": "The penalty is imposed in accordance with Article B8.2.8 of the FIA F1 Regulations. The use of each additional element in this case carries a 5 grid place penalty therefore there is an accumulation of 10 places."
  }
}

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 payload
json
{
  "feed": "race.grid-penalty",
  "sessionId": null,
  "utc": "2026-06-08T14:32:18.441Z",
  "data": {
    "event": "British Grand Prix",
    "season": 2026,
    "documentUrl": "https://www.fia.com/system/files/decision-document/2026_british_grand_prix_-_infringement_-_car_4_-_pu_elements_changed.pdf",
    "publishedAt": "2026-07-05T12:18:00.000Z",
    "driver": {
      "driverId": "norris-lando",
      "constructorId": "mclaren",
      "number": "4",
      "tla": "NOR",
      "name": "Lando Norris",
      "team": "McLaren F1 Team"
    },
    "carNumber": 4,
    "competitor": "McLaren F1 Team",
    "session": "Qualifying",
    "penaltyType": "grid_drop",
    "gridPenaltyPositions": 10,
    "infringement": "Breaches of Article B8.2.2 (read with B8.2.3) of the FIA F1 Regulations.",
    "decision": "Drop of 10 grid positions for the next Race in which the driver participates."
  }
}
Strategy & TyresRace Events