> This page is for Firmware, version 4.0 (default).
> For other versions, use one of these documentation indexes:
> - 4.0 (default): https://docs.ouster.com/sensor-docs/firmware/4.0/llms.txt
> - 3.2: https://docs.ouster.com/sensor-docs/firmware/3.2/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.ouster.com/sensor-docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.ouster.com/sensor-docs/_mcp/server.

# Lidar Data

> Configurable lidar UDP packet profiles, packet structure, and data rate reference for Ouster sensors.

![](/sensor-docs/_fern-files/ouster.docs.buildwithfern.com/b321fb1acf5c6ffac4b489d350647b7eee3817c74c366115fa73c549d5d40338/assets/firmware/packets/packet-renderer.html)

Users configure the lidar data packet format via `udp_profile_lidar`. The default is `RNG19_RFL8_SIG16_NIR16`.

* [`RNG19_RFL8_SIG16_NIR16`](#rng19_rfl8_sig16_nir16) — Single Return (default)
* [`RNG15_RFL8_NIR8`](#rng15_rfl8_nir8) — Low Data Rate
* [`RNG19_RFL8_SIG16_NIR16_DUAL`](#rng19_rfl8_sig16_nir16_dual) — Dual Return
* [`RNG15_RFL8_NIR8_DUAL`](#rng15_rfl8_nir8_dual) — Low Data Rate Dual Return
* [`RNG19_RFL8_SIG16_NIR16_ZONE16`](#rng19_rfl8_sig16_nir16_zone16) — Zone Monitor
* [`RNG15_RFL8_NIR8_ZONE16`](#rng15_rfl8_nir8_zone16) — Zone Monitor Low Rate
* [`RNG19_RFL8_SIG16_ZONE16_DUAL`](#rng19_rfl8_sig16_zone16_dual) — Zone Monitor Dual Return
* [`RNG19_RFL8_SIG16_NIR16_RGB16`](#rng19_rfl8_sig16_nir16_rgb16) — RGB Single Return
* [`RNG19_RFL8_SIG16_NIR16_RGB16_DUAL`](#rng19_rfl8_sig16_nir16_rgb16_dual) — RGB Dual Return
* [`RNG15_RFL8_WIN8`](#rng15_rfl8_win8) — Low Data Rate Window

## Overview

Each lidar UDP packet contains a Packet Header, one or more Columns, and a Packet Footer. Each Column contains a Column Header followed by one Channel Data Block per lidar channel. Words are 32 bits, little-endian. By default, lidar UDP data is forwarded to port `7502`.

Packet header type is set with the `header_type` sensor configuration parameter. `STANDARD` is the default; `FUSA` is used for functional safety applications.

> **Note**
>
> OS1-MAX sensors (Firmware 4.0+, Rev8) provide 256 lidar channels per column (`pixels_per_column` = 256). Other OS-series products use 32, 64, or 128 channels. Query `GET /api/v1/sensor/metadata/lidar_data_format` for the channel count on your sensor.

## Packet Header

Both `STANDARD` and `FUSA` headers are 256 bits (8 words). The field layout in bits \[127:0] is different.

### Standard

`STANDARD` is the default `header_type`. Packet type is 16 bits. Frame ID is 16 bits and comes before Init ID.

```mermaid
---
title: "Packet Header — Standard"
---
packet-beta
+16: "Packet Type"
+16: "Frame ID"
+24: "Init ID"
+8: "Serial No L"
+32: "Serial No H"
+8: "Alert Flags"
+24: "Reserved"
+8: "Thermal Shutdown Countdown"
+8: "Shot Limiting Countdown"
+8: "Thermal Shutdown State"
+8: "Shot Limiting Level"
+32: "Reserved"
+32: "Reserved"
+32: "Reserved"
```

| Word |       Bits | Field                      | Description                                                                                                                |
| :--: | ---------: | -------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|   0  |    \[15:0] | Packet Type                | `0x01` for lidar packets.                                                                                                  |
|   0  |   \[31:16] | Frame ID                   | Low 16 bits of the scan index. Increments each rotation at the zero azimuth crossing.                                      |
|   1  |   \[55:32] | Init ID                    | Updates on every reinit or reboot. Also available via the [sensor-info endpoint](/sensor-docs/firmware/api-reference#sensor-metadata). |
|   1  |   \[63:56] | Serial No L                | Low 8 bits of sensor serial number.                                                                                        |
|   2  |   \[95:64] | Serial No H                | High 32 bits. Combined with Serial No L = 40-bit serial number.                                                            |
|   3  |  \[103:96] | Alert Flags                | `bits[5:0]` alert_cursors; `bit[6]` cursor_overflow; `bit[7]` alerts_active.                                               |
|   3  | \[127:104] | Reserved                   | —                                                                                                                          |
|   4  | \[135:128] | Thermal Shutdown Countdown | Seconds to thermal shutdown (30 when imminent, 0 otherwise).                                                               |
|   4  | \[143:136] | Shot Limiting Countdown    | Seconds to shot limiting onset (30 when imminent, 0 otherwise).                                                            |
|   4  | \[151:144] | Thermal Shutdown State     | `0` = normal; `1` = shutdown imminent.                                                                                     |
|   4  | \[159:152] | Shot Limiting Level        | `0x00` = normal; `0x01` = imminent; `0x02`–`0x09` = active levels.                                                         |
|  5–7 | \[255:160] | Reserved                   | —                                                                                                                          |

### FUSA

Set `header_type` to `FUSA` for functional safety applications. The layout differs from Standard in bits \[127:0]. Packet type is 8 bits. Init ID comes before a 32-bit Frame ID. Word 2 includes `safe_state_id`.

> **Note**
>
> The `FUSA_RNG15_RFL8_NIR8_DUAL` `udp_profile_lidar` option is deprecated. FUSA profile selection is now controlled by `header_type`.

```mermaid
---
title: "Packet Header — FUSA"
---
packet-beta
+8: "Packet Type"
+24: "Init ID"
+32: "Frame ID"
+8: "Alert Flags"
+8: "Reserved"
+8: "Safe State ID"
+8: "Serial No L"
+32: "Serial No H"
+8: "Thermal Shutdown Countdown"
+8: "Shot Limiting Countdown"
+8: "Thermal Shutdown State"
+8: "Shot Limiting Level"
+32: "Reserved"
+32: "Reserved"
+32: "Reserved"
```

| Word |       Bits | Field                      | Description                                                                                                                |
| :--: | ---------: | -------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|   0  |     \[7:0] | Packet Type                | `0x01` for lidar packets.                                                                                                  |
|   0  |    \[31:8] | Init ID                    | Updates on every reinit or reboot. Also available via the [sensor-info endpoint](/sensor-docs/firmware/api-reference#sensor-metadata). |
|   1  |   \[63:32] | Frame ID                   | 32-bit scan index. Increments each rotation at the zero azimuth crossing.                                                  |
|   2  |   \[71:64] | Alert Flags                | `bits[5:0]` alert_cursors; `bit[6]` cursor_overflow; `bit[7]` alerts_active.                                               |
|   2  |   \[79:72] | Reserved                   | —                                                                                                                          |
|   2  |   \[87:80] | Safe State ID              | Sensor functional safety state.                                                                                            |
|   2  |   \[95:88] | Serial No L                | Low 8 bits of sensor serial number.                                                                                        |
|   3  |  \[127:96] | Serial No H                | High 32 bits. Combined with Serial No L = 40-bit serial number.                                                            |
|   4  | \[135:128] | Thermal Shutdown Countdown | Seconds to thermal shutdown (30 when imminent, 0 otherwise).                                                               |
|   4  | \[143:136] | Shot Limiting Countdown    | Seconds to shot limiting onset (30 when imminent, 0 otherwise).                                                            |
|   4  | \[151:144] | Thermal Shutdown State     | `0` = normal; `1` = shutdown imminent.                                                                                     |
|   4  | \[159:152] | Shot Limiting Level        | `0x00` = normal; `0x01` = imminent; `0x02`–`0x09` = active levels.                                                         |
|  5–7 | \[255:160] | Reserved                   | —                                                                                                                          |

In FUSA mode, `safe_state_id` (word 2, bits \[87:80]) carries the sensor functional safety state for safety-critical host systems.

## Column Header

Each column begins with a 96-bit (3-word) Column Header.

```mermaid
---
title: "Column Header"
---
packet-beta
+32: "Timestamp L"
+32: "Timestamp H"
+16: "Measurement ID"
+1: "STA"
+15: "Reserved"
```

| Word |     Bits | Field          | Description                                                       |
| :--: | -------: | -------------- | ----------------------------------------------------------------- |
|   0  |  \[31:0] | Timestamp L    | Low 32 bits of column timestamp in nanoseconds.                   |
|   1  | \[63:32] | Timestamp H    | High 32 bits.                                                     |
|   2  | \[79:64] | Measurement ID | Column index from 0 to scan_width − 1 (511, 1023, 2047, or 4095). |
|   2  |    \[80] | Status (STA)   | `1` = valid; `0` = dropped or azimuth-masked.                     |
|   2  | \[95:81] | Reserved       | —                                                                 |

## Channel Block

The diagrams below show the Channel Data Block layout for each profile. The Packet Header, Column Header, and Footer are identical across all profiles.

> **Note**
>
> Calibrated reflectivity has certain hardware requirements. See the [Calibrated Reflectivity](/sensor-docs/firmware/calibrated-reflectivity) page for details.

|                   | [RNG19_RFL8_SIG16_NIR16](#rng19_rfl8_sig16_nir16) | [RNG15_RFL8_NIR8](#rng15_rfl8_nir8) | [RNG19_RFL8_SIG16_NIR16_DUAL](#rng19_rfl8_sig16_nir16_dual) | [RNG15_RFL8_NIR8_DUAL](#rng15_rfl8_nir8_dual) |
| ----------------- | ------------------------------------------------- | ----------------------------------- | ----------------------------------------------------------- | --------------------------------------------- |
| Words per channel | 3                                                 | 1                                   | 4                                                           | 2                                             |
| Range RET1        | 19 bits                                           | 15 bits                             | 19 bits                                                     | 15 bits                                       |
| Reflectivity RET1 | 8 bits                                            | 8 bits                              | 8 bits                                                      | 8 bits                                        |
| Signal RET1       | 16 bits                                           | —                                   | 16 bits                                                     | —                                             |
| Range RET2        | —                                                 | —                                   | 19 bits                                                     | 15 bits                                       |
| Reflectivity RET2 | —                                                 | —                                   | 8 bits                                                      | 8 bits                                        |
| Signal RET2       | —                                                 | —                                   | 16 bits                                                     | —                                             |
| NIR               | 16 bits                                           | 8 bits                              | 16 bits                                                     | 8 bits                                        |
| Window            | 8 bits                                            | —                                   | 8 bits                                                      | 8 bits                                        |

> **Note**
>
> Window field supported in firmware v3.2 or later.

### RNG19_RFL8_SIG16_NIR16

All sensors default to this profile. **Channel Data Block: 96 bits (3 words), single return.**

* **Range** \[19 bit] — Range in mm, 1 mm resolution, max 524 m. Returns 0 if no detection.
* **Reflectivity** \[8 bit] — Calibrated reflectivity.
* **Signal** \[16 bit] — Signal intensity photons.
* **NIR** \[16 bit] — Ambient near-infrared photons.
* **Window** \[8 bit] — Raw near-range signal photons. Indicates potential window blockage regardless of `min_range_threshold_cm`.

```mermaid
---
title: "RNG19_RFL8_SIG16_NIR16"
---
packet-beta
+19: "Range"
+13: "Reserved"
+8: "Reflectivity"
+8: "Reserved"
+16: "Signal"
+16: "NIR"
+8: "Reserved"
+8: "Window"
```

### RNG15_RFL8_NIR8

**Channel Data Block: 32 bits (1 word), single return.** Smallest packet size and data rate of any profile.

* **Range** \[15 bit] — Range scaled by 8 mm/LSB; max 262 m.
* **RSV** \[1 bit] — Reserved.
* **Reflectivity** \[8 bit] — Calibrated reflectivity.
* **NIR** \[8 bit] — Ambient NIR photons, scaled down by 16× relative to standard profiles.

```mermaid
---
title: "RNG15_RFL8_NIR8"
---
packet-beta
+15: "Range"
+1: "RSV"
+8: "Reflectivity"
+8: "NIR"
```

### RNG19_RFL8_SIG16_NIR16_DUAL

**Channel Data Block: 128 bits (4 words), dual return.** Reports up to 2 returns per beam (strongest and second strongest), enabling detection through semi-transparent obscurants.

> **Note**
>
> Valid for `1024x20` and `2048x10` lidar mode (firmware v3.0.0+).

* **Range RET1/2** \[19 bit] — Range in mm, max 524 m.
* **Reflectivity RET1/2** \[8 bit] — Calibrated reflectivity per return.
* **Signal RET1/2** \[16 bit] — Signal intensity photons per return.
* **NIR** \[16 bit] — Ambient NIR photons.
* **Window** \[8 bit] — Window blockage indicator.

```mermaid
---
title: "RNG19_RFL8_SIG16_NIR16_DUAL"
---
packet-beta
+19: "Range RET1"
+5: "Reserved"
+8: "Reflectivity RET1"
+19: "Range RET2"
+5: "Reserved"
+8: "Reflectivity RET2"
+16: "Signal RET1"
+16: "Signal RET2"
+16: "NIR"
+8: "Reserved"
+8: "Window"
```

### RNG15_RFL8_NIR8_DUAL

**Channel Data Block: 64 bits (2 words), dual return.**

* **Range RET1/2** \[15 bit] — Range scaled by 8 mm/LSB; max 262 m.
* **RSV** \[1 bit] — Reserved, per return.
* **Reflectivity RET1/2** \[8 bit] — Calibrated reflectivity per return.
* **NIR** \[8 bit] — Ambient NIR photons (with first return).
* **Window** \[8 bit] — Window blockage indicator.

```mermaid
---
title: "RNG15_RFL8_NIR8_DUAL"
---
packet-beta
+15: "Range RET1"
+1: "RSV"
+8: "Reflectivity RET1"
+8: "NIR"
+15: "Range RET2"
+1: "RSV"
+8: "Reflectivity RET2"
+8: "Window"
```

### RNG19_RFL8_SIG16_NIR16_ZONE16

Zone Monitor lidar profiles introduce zone occupancy data to the channel data block via the ZONE16 field. This field is a 16-bit series of boolean flags indicating if a pixel resides within the physical boundaries of a live monitored Zone.

Unlike Zone Triggers, which depend on point/frame thresholds and occupancy modes, these bits strictly reflect spatial boundaries. The Least Significant Bit (LSB) represents the first live Zone (slot 0, at the start of the UDP packet), while the Most Significant Bit (MSB) represents the last live Zone (slot 15, at the end of the UDP packet). See the [Zone Monitor](/sensor-docs/firmware/zone-monitor) page for zone configuration.

**Channel Data Block: 96 bits (3 words), single return.**

* **Range** \[19 bit] — Range in mm, 1 mm resolution, max 524 m. Returns 0 if no detection.
* **Reflectivity** \[8 bit] — Calibrated reflectivity.
* **Window** \[8 bit] — Raw near-range signal photons. Indicates potential window blockage regardless of `min_range_threshold_cm`.
* **Signal** \[16 bit] — Signal intensity photons.
* **NIR** \[16 bit] — Ambient near-infrared photons.
* **Zone Occupancy** \[16 bit] — Bitmask indicating which live zone slots contain this pixel. LSB = slot 0, MSB = slot 15.

```mermaid
---
title: "RNG19_RFL8_SIG16_NIR16_ZONE16"
---
packet-beta
+19: "Range"
+13: "Reserved"
+8: "Reflectivity"
+8: "Window"
+16: "Signal"
+16: "NIR"
+16: "Zone Occupancy"
```

### RNG15_RFL8_NIR8_ZONE16

**Channel Data Block: 64 bits (2 words), single return.**

* **Range** \[15 bit] — Range scaled by 8 mm/LSB; max 262 m.
* **RSV** \[1 bit] — Reserved.
* **Reflectivity** \[8 bit] — Calibrated reflectivity.
* **NIR** \[8 bit] — Ambient NIR photons, scaled down by 16× relative to standard profiles.
* **Zone Occupancy** \[16 bit] — Bitmask indicating which live zone slots contain this pixel. LSB = slot 0, MSB = slot 15.
* **Window** \[8 bit] — Raw near-range signal photons. Indicates potential window blockage regardless of `min_range_threshold_cm`.

```mermaid
---
title: "RNG15_RFL8_NIR8_ZONE16"
---
packet-beta
+15: "Range"
+1: "RSV"
+8: "Reflectivity"
+8: "NIR"
+16: "Zone Occupancy"
+8: "Window"
+8: "Reserved"
```

### RNG19_RFL8_SIG16_ZONE16_DUAL

Dual-return Zone Monitor profile. **Channel Data Block: 128 bits (4 words), dual return.**

* **Range RET1/2** \[19 bit] — Range in mm, max 524 m.
* **Reflectivity RET1/2** \[8 bit] — Calibrated reflectivity per return.
* **Signal RET1/2** \[16 bit] — Signal intensity photons per return.
* **Zone Occupancy** \[16 bit] — Bitmask indicating which live zone slots contain this pixel. LSB = slot 0, MSB = slot 15.
* **Window** \[8 bit] — Window blockage indicator.

```mermaid
---
title: "RNG19_RFL8_SIG16_ZONE16_DUAL"
---
packet-beta
+19: "Range RET1"
+5: "Reserved"
+8: "Reflectivity RET1"
+19: "Range RET2"
+5: "Reserved"
+8: "Reflectivity RET2"
+16: "Signal RET1"
+16: "Signal RET2"
+16: "Zone Occupancy"
+8: "Reserved"
+8: "Window"
```

### RNG19_RFL8_SIG16_NIR16_RGB16

> **Note**
>
> Rev8 sensors with Firmware 4.0 or later only.

**Channel Data Block: 128 bits (4 words), single return with per-pixel RGB.**

* **Range** \[19 bit] — Range in mm, max 524 m.
* **Reflectivity** \[8 bit] — Calibrated reflectivity.
* **Signal** \[16 bit] — Signal intensity photons.
* **NIR** \[16 bit] — Ambient NIR photons.
* **RGB Red/Green/Blue** \[16 bit float each] — Per-pixel color values.

```mermaid
---
title: "RNG19_RFL8_SIG16_NIR16_RGB16"
---
packet-beta
+19: "Range"
+5: "Reserved"
+8: "Reflectivity"
+16: "Signal"
+16: "NIR"
+16: "RGB Red"
+16: "RGB Green"
+16: "RGB Blue"
+16: "Reserved"
```

### RNG19_RFL8_SIG16_NIR16_RGB16_DUAL

> **Note**
>
> Rev8 sensors with Firmware 4.0 or later only.

**Channel Data Block: 160 bits (5 words), dual return with per-pixel RGB.**

* **Range RET1/2** \[19 bit] — Range in mm, max 524 m.
* **Reflectivity RET1/2** \[8 bit] — Calibrated reflectivity per return.
* **Signal RET1/2** \[16 bit] — Signal intensity photons per return.
* **NIR** \[16 bit] — Ambient NIR photons.
* **RGB Red/Green/Blue** \[16 bit float each] — Per-pixel color values.

```mermaid
---
title: "RNG19_RFL8_SIG16_NIR16_RGB16_DUAL"
---
packet-beta
+19: "Range RET1"
+5: "Reserved"
+8: "Reflectivity RET1"
+19: "Range RET2"
+5: "Reserved"
+8: "Reflectivity RET2"
+16: "Signal RET1"
+16: "Signal RET2"
+16: "NIR"
+16: "RGB Red"
+16: "RGB Green"
+16: "RGB Blue"
```

### RNG15_RFL8_WIN8

> **Note**
>
> Hidden from the sensor operator UI. Set via HTTP API only. Firmware v3.2 or later.

Same 32-bit (1 word) size as `RNG15_RFL8_NIR8` but replaces NIR with a Window field. Use when window blockage detection is the priority and NIR data is not needed.

* **Range** \[15 bit] — Range scaled by 8 mm/LSB; max 262 m.
* **RSV** \[1 bit] — Reserved.
* **Reflectivity** \[8 bit] — Calibrated reflectivity.
* **Window** \[8 bit] — Raw near-range signal photons. Indicates potential window blockage regardless of `min_range_threshold_cm`.

```mermaid
---
title: "RNG15_RFL8_WIN8"
---
packet-beta
+15: "Range"
+1: "RSV"
+8: "Reflectivity"
+8: "Window"
```

## Footer

Each packet ends with a 256-bit (8-word) Packet Footer. In Standard mode, words 6–7 contain the E2E CRC64 and words 0–5 are reserved. In FUSA mode, all 8 words carry an HMAC authentication code.

```mermaid
---
title: "Packet Footer"
---
packet-beta
+32: "Reserved"
+32: "Reserved"
+32: "Reserved"
+32: "Reserved"
+32: "Reserved"
+32: "Reserved"
+32: "CRC64 / HMAC L"
+32: "CRC64 / HMAC H"
```

## CRC Calculation

The CRC64 is calculated over the full UDP payload excluding the final 64 bits (the encoded CRC), in received bit order:

| Parameter             | Value                |
| --------------------- | -------------------- |
| CRC Result Width      | 64 bits              |
| Polynomial            | `0x42f0e1eba9ea3693` |
| Initial Value         | `0xffffffffffffffff` |
| Input data reflected  | Yes                  |
| Result data reflected | Yes                  |
| XOR Value             | `0xffffffffffffffff` |

The CRC64 is encoded little-endian. Reverse the last 8 bytes of the packet before comparing against a locally computed CRC64.

## Data Rate Calculation

Packet size in bytes:

```
packet_header_size + columns_per_packet × (column_header_size + pixels_per_column × channel_block_size) + packet_footer_size
```

With default settings (16 columns per packet):

```
32 + 16 × (12 + n × s) + 32
```

Where **n** = `pixels_per_column` and **s** = channel data block size in bytes. OS1-MAX defaults to `columns_per_packet = 8` at 256 channels.

**Packet Size (Bytes), Product vs Profile**

| Product  | Single Return | Dual Return | Low Data Rate | Low Data Rate Dual |
| -------- | ------------: | ----------: | ------------: | -----------------: |
| OS-x-32  |          6400 |        8448 |          2304 |               4352 |
| OS-x-64  |         12544 |       16640 |          4352 |               8448 |
| OS-x-128 |         24832 |       33024 |          8448 |              16640 |
| OS1-MAX  |         24736 |       32928 |          8352 |              16544 |

**Packet Rate (Hz), Product vs Lidar Mode**

| Product  | 512×10 | 1024×10 / 512×20 | 2048×10 / 1024×20 |
| -------- | -----: | ---------------: | ----------------: |
| OS-x-32  |    320 |              640 |              1280 |
| OS-x-64  |    320 |              640 |              1280 |
| OS-x-128 |    320 |              640 |              1280 |
| OS1-MAX  |    640 |             1280 |              2560 |

**Data Rate (Mbps) in 2048×10 / 1024×20 Mode**

| Product  | Single Return | Dual Return | Low Data Rate | Low Data Rate Dual |
| -------- | ------------: | ----------: | ------------: | -----------------: |
| OS-x-32  |         65.57 |       86.55 |         23.63 |              44.56 |
| OS-x-64  |        128.49 |      170.43 |         44.60 |              86.55 |
| OS-x-128 |        254.32 |      338.20 |         86.55 |              170.4 |
| OS1-MAX  |        506.50 |      674.18 |        171.09 |             338.66 |