Skip to content

← iRacing Telemetry SDK for C# .NET

iRSDK Data Format Reference

This reference documents the iRacing SDK (iRSDK) data formats: the live shared-memory map and the IBT (iRacing Binary Telemetry) file structure. It's independent of any particular client library — useful if you're writing your own telemetry reader, debugging a data layout issue, or just curious how iRacing exposes this data under the hood.

How iRacing Telemetry Data Is Laid Out

Live iRacing telemetry comes from the Windows shared-memory map Local\IRSDKMemMapFileName at 60 Hz. Recorded IBT files use the same core iRacing SDK structures, which is why a single reader implementation can decode live sessions and historical files through one API.

In both formats, irsdk_header is an index of offsets and counts. It points to session information stored as YAML, an array of irsdk_varHeader metadata, and the telemetry data. Each variable header describes a field's name, type, byte offset, and element count.

Live shared-memory layout

The live map reserves fixed-capacity regions. iRacing rotates writes across three telemetry buffers while header offsets remain stable for the session.

0
irsdk_header
112 B
112
session info (YAML) ...null padded...
512 KB reserved
524,400
irsdk_varHeader[numVars] room for 4,096 entries
576 KB reserved
1,114,224
telemetry buffer 0
24 KB reserved
1,138,800
telemetry buffer 1
24 KB reserved
1,163,376
telemetry buffer 2
24 KB reserved
= 1,187,952

IBT file layout

An IBT file adds a 32-byte disk subheader, packs its metadata without alignment padding, and stores a contiguous sequence of telemetry records after the session YAML.

0
irsdk_header
112 B
112
irsdk_diskSubHeader
32 B — IBT only
144
irsdk_varHeader[numVars]
numVars × 144 B
sessionInfoOffset
session info (YAML)
sessionInfoLen B
varBuf[0].bufOffset
record 0
bufLen B
record 1
bufLen B
record n-1
n = sessionRecordCount
= end of file

How a telemetry row is read

Each row contains bufLen packed bytes. For every requested variable, its irsdk_varHeader identifies where the value starts and how to decode it. Character and Boolean values occupy one byte; integers, bit fields, and floats occupy four bytes; doubles occupy eight bytes. A count greater than one represents an array, including the per-car CarIdx* variables.

For live data, a reader should select the newest completed buffer, copy the sample into a reused buffer, and check iRacing's tick counters for a concurrent write. If a write overlapped the copy, it should retry rather than expose a torn telemetry sample.

See the iRacing memory map and IBT data-layout reference in the iRacingTelemetrySDK repository for structure sizes, offset formulas, buffer fields, and a worked IBT example.

Using this format from C#

iRacingTelemetrySDK is a modern, async-first .NET SDK built on top of this format. It handles buffer selection, torn-read retries, and field decoding for you, and exposes telemetry as a compile-time typed, high-throughput async stream instead of raw offsets.