Heart Rate Measurement (0x2A37): byte layout
GATT characteristic · org.bluetooth.characteristic.heart_rate_measurement · read from the Bluetooth SIG’s repository on 2026-10-17 · commit 408f4a0 (2026-10-14)
Heart Rate Measurement is Bluetooth GATT characteristic 0x2A37, org.bluetooth.characteristic.heart_rate_measurement in the Bluetooth SIG's assigned numbers. The SIG's GATT Specification Supplement file lays its value out as 5 fields: Flags, Heart Rate Measurement Value (8 bit resolution), Heart Rate Measurement Value (16 bit resolution), Energy Expended and RR-interval. The first, Flags, is a boolean[8]; 4 of the others are present only when a bit of it is set as the field's text states, so after the first field whose size can change, offsets depend on the fields before them.
- UUID
- 0x2A37
- Identifier
org.bluetooth.characteristic.heart_rate_measurement- The SIG’s description
- The Heart Rate Measurement characteristic is used to represent data related to a heart rate measurement.The structure of this characteristic is defined below.
- Service the SIG’s files tie it to
- None: no file in the repository lists this characteristic under a service.
- Source file
- gss/org.bluetooth.characteristic.heart_rate_measurement.yaml
Byte layout: 5 fields
In the order the SIG’s structure lists them. Type and size are as published; sizes count octets except where a struct is marked as sized in bits. The offset is printed only where every earlier field has a fixed size; where an earlier field can be absent or vary, the cell names what it depends on. “Present when” is read from the field’s own “Present if” line, shown in full in the field notes below.
| Offset | Field | Type | Size | Present when | Unit |
|---|---|---|---|---|---|
| 0 | Flags | boolean[8] | 1 | Always (fixed size) | — |
| 1 | Heart Rate Measurement Value (8 bit resolution) | uint8 | 0 or 1 | Bit 0 of Flags is 0 | period (beats per minute)org.bluetooth.unit.period.beats_per_minute |
| Depends on Flags (bit 0) | Heart Rate Measurement Value (16 bit resolution) | uint16 | 0 or 2 | Bit 0 of Flags is 1 | period (beats per minute)org.bluetooth.unit.period.beats_per_minute |
| Depends on Flags (bit 0) | Energy Expended | uint16 | 0 or 2 | Bit 3 of Flags is 1 | energy (joule)org.bluetooth.unit.energy.joule |
| Depends on Flags (bits 0 and 3) | RR-interval | uint16[n] | 0 or n*2 | Bit 4 of Flags is 1 | — |
Field notes
Each field’s text in the SIG’s file, line by line.
- Flags boolean[8] · 1
- See Flags
- Heart Rate Measurement Value (8 bit resolution) uint8 · 0 or 1
- Unit: org.bluetooth.unit.period.beats_per_minutePresent if bit 0 of Flags field is set to 0
- Heart Rate Measurement Value (16 bit resolution) uint16 · 0 or 2
- Unit: org.bluetooth.unit.period.beats_per_minutePresent if bit 0 of Flags field is set to 1
- Energy Expended uint16 · 0 or 2
- Unit: org.bluetooth.unit.energy.joulePresent if bit 3 of Flags field is set to 1
- RR-interval uint16[n] · 0 or n*2
- See RR-IntervalPresent if bit 4 of Flags field is set to 1
Flags and value tables
The definitions the SIG’s file gives for its fields, every row as published. On a flags table the last column lists the fields whose “Present if” line names that bit.
Flags
The bits of this field are defined below.
| Bit | Description | Fields its condition names |
|---|---|---|
| 0 | Heart Rate Value Format:0 = Heart Rate Value Format is set to uint81 = Heart Rate Value Format is set to uint16 | Heart Rate Measurement Value (8 bit resolution) when 0Heart Rate Measurement Value (16 bit resolution) when 1 |
| 1 | Sensor Contact detected | — |
| 2 | Sensor Contact Supported | — |
| 3 | Energy Expended present | Energy Expended when 1 |
| 4 | RR-Interval present | RR-interval when 1 |
| 5–7 | Reserved for Future Use | — |
RR-Interval
The RR-Interval value represents the time between two R-Wave detections. Each RR-Interval value is represented by a uint16 with 1/1024 second as the unit. Because it is possible to measure several RR-Intervals between transmissions of the Heart Rate Measurement characteristic, multiple RR-Interval sub-fields can be present in the characteristic. The number of RR-Interval sub-fields present is determined by a combination of the overall length of the characteristic and whether or not the characteristic contains the Energy Expended field.Where there are multiple RR-Interval values transmitted in the Heart Rate Measurement characteristic, the structure of this field is defined below.
| RR-Interval Field | Description |
|---|---|
| RR-Interval Value 0 | Oldest RR-Interval value |
| RR-Interval Value 1 | |
| RR-Interval Value 2 | |
| … | |
| RR-Interval Value n | Newest RR-Interval value |
Guides on this site
The metric Heart Rate Measurement carries, on every platform this site covers — each type quoted in its platform's own words:
The connected-device guides that name 0x2A37:
Questions
- What is the UUID of the Heart Rate Measurement characteristic?
- 0x2A37. The Bluetooth SIG's characteristic_uuids.yaml lists Heart Rate Measurement as 0x2A37 with the identifier org.bluetooth.characteristic.heart_rate_measurement. No file in the SIG's repository ties it to a service: the repository lists service and characteristic UUIDs separately.
- Which Heart Rate Measurement fields are optional?
- 4 of its 5 fields have a published size that can be zero: Heart Rate Measurement Value (8 bit resolution) (0 or 1; Present if bit 0 of Flags field is set to 0); Heart Rate Measurement Value (16 bit resolution) (0 or 2; Present if bit 0 of Flags field is set to 1); Energy Expended (0 or 2; Present if bit 3 of Flags field is set to 1); RR-interval (0 or n*2; Present if bit 4 of Flags field is set to 1). Flags (1) has a fixed size.
- What units does Heart Rate Measurement use?
- The SIG's text names a unit for 3 of the 5 fields: Heart Rate Measurement Value (8 bit resolution): period (beats per minute) (org.bluetooth.unit.period.beats_per_minute); Heart Rate Measurement Value (16 bit resolution): period (beats per minute) (org.bluetooth.unit.period.beats_per_minute); Energy Expended: energy (joule) (org.bluetooth.unit.energy.joule).
- What do the bits of the Heart Rate Measurement Flags field mean?
- The SIG defines them as: bit 0, Heart Rate Value Format: 0 = Heart Rate Value Format is set to uint8; 1 = Heart Rate Value Format is set to uint16 (Heart Rate Measurement Value (8 bit resolution) when 0, Heart Rate Measurement Value (16 bit resolution) when 1); bit 1, Sensor Contact detected; bit 2, Sensor Contact Supported; bit 3, Energy Expended present (Energy Expended when 1); bit 4, RR-Interval present (RR-interval when 1). The remaining bits are reserved for future use.
- Which values does the Heart Rate Measurement RR-Interval table define?
- RR-Interval Value 0: Oldest RR-Interval value; RR-Interval Value n: Newest RR-Interval value. The other rows are reserved for future use or carry no text.
Source
Read on 2026-10-17 from gss/org.bluetooth.characteristic.heart_rate_measurement.yaml and assigned_numbers/uuids/characteristic_uuids.yaml in the Bluetooth SIG’s public repository (branch main, commit 408f4a0, committed 2026-10-14), by scripts/fetch-bluetooth-gatt.mjs. The file’s notice says it is proprietary to Bluetooth SIG, that furnishing it grants no licence, and that it is subject to change without notice; it is © Bluetooth SIG, Inc., and its text is quoted here for identification. Generated by AIFitnessAPI, which is not affiliated with Bluetooth SIG; the SIG’s file remains the authority. The full notice and the conventions used on these pages are on the reference hub.