Skip to content
AF
Free Tool

BLE GATT explorer: see what any Bluetooth device exposes

A web page can use a Bluetooth LE device’s services only if it named them before connecting. The Web Bluetooth specification puts it plainly: If a site uses acceptAllDevices, it will only be able to use services listed in optionalServices. This explorer asks for all 14 services in this site’s Bluetooth dataset (plus any UUID you add), connects to any device you pick, lists its characteristics by their Bluetooth SIG names, and reads or subscribes on request. 73 characteristics decode field by field against the SIG’s published structures, 18 more up to the first field the structures cannot describe, and everything else shows as raw hex.

Asks for 14 services by name.

Decode a value without a device

Pick any of the 91 characteristics this site has a SIG structure for and paste a value as hex.

Loading decoders…

The services it asks for

Every service in this site’s Bluetooth dataset (from the SIG’s assigned numbers at commit 408f4a0, read 2026-10-17) and Battery, read from the SIG’s file for the heart-rate lab. A service outside this list (a vendor’s own 128-bit service, or another SIG service) is invisible to the page unless you type its UUID in the box before connecting. The rule quoted above is from the Web Bluetooth specification, Device Discovery, read 2026-11-05.

  • 0x1808 Glucose
  • 0x1809 Health Thermometer
  • 0x180D Heart Rate
  • 0x180F Battery
  • 0x1810 Blood Pressure
  • 0x1814 Running Speed and Cadence
  • 0x1816 Cycling Speed and Cadence
  • 0x1818 Cycling Power
  • 0x181B Body Composition
  • 0x181C User Data
  • 0x181D Weight Scale
  • 0x181F Continuous Glucose Monitoring
  • 0x1822 Pulse Oximeter
  • 0x1826 Fitness Machine

What it can decode

The decoder compiles each characteristic’s structure from the SIG’s GATT Specification Supplement file: field order and sizes, the Flags bit each optional field depends on, struct members, value tables, units, and the Represented values line that sets each field’s resolution. It reads multi-octet fields little-endian, as the Web Bluetooth specification’s heart-rate example does (result.heartRate = data.getUint16(index, /*littleEndian=*/true);). It stops, and shows the rest as hex, at a medfloat16 or medfloat32 field (their encoding is not in the SIG’s YAML files), at a condition that is not a Flags bit, and at a field whose length the value does not state.

Decoded field by field (73)

Date Time 0x2A08, DST Offset 0x2A0D, Time Zone 0x2A0E, Battery Level 0x2A19, Temperature Type 0x2A1D, Measurement Interval 0x2A21, Heart Rate Measurement 0x2A37, Body Sensor Location 0x2A38, Heart Rate Control Point 0x2A39, Blood Pressure Feature 0x2A49, Glucose Feature 0x2A51, RSC Measurement 0x2A53, RSC Feature 0x2A54, CSC Measurement 0x2A5B, CSC Feature 0x2A5C, Sensor Location 0x2A5D, Cycling Power Measurement 0x2A63, Cycling Power Vector 0x2A64, Cycling Power Feature 0x2A65, Aerobic Heart Rate Lower Limit 0x2A7E, Aerobic Threshold 0x2A7F, Age 0x2A80, Anaerobic Heart Rate Lower Limit 0x2A81, Anaerobic Heart Rate Upper Limit 0x2A82, Anaerobic Threshold 0x2A83, Aerobic Heart Rate Upper Limit 0x2A84, Date of Birth 0x2A85, Date of Threshold Assessment 0x2A86, Email Address 0x2A87, Fat Burn Heart Rate Lower Limit 0x2A88, Fat Burn Heart Rate Upper Limit 0x2A89, First Name 0x2A8A, Five Zone Heart Rate Limits 0x2A8B, Gender 0x2A8C, Heart Rate Max 0x2A8D, Height 0x2A8E, Hip Circumference 0x2A8F, Last Name 0x2A90, Maximum Recommended Heart Rate 0x2A91, Resting Heart Rate 0x2A92, Sport Type for Aerobic and Anaerobic Thresholds 0x2A93, Three Zone Heart Rate Limits 0x2A94, Two Zone Heart Rate Limits 0x2A95, VO2 Max 0x2A96, Waist Circumference 0x2A97, Weight 0x2A98, Body Composition Feature 0x2A9B, Body Composition Measurement 0x2A9C, Weight Measurement 0x2A9D, Weight Scale Feature 0x2A9E, Language 0x2AA2, CGM Feature 0x2AA8, Treadmill Data 0x2ACD, Cross Trainer Data 0x2ACE, Step Climber Data 0x2ACF, Stair Climber Data 0x2AD0, Rower Data 0x2AD1, Indoor Bike Data 0x2AD2, Supported Speed Range 0x2AD4, Supported Inclination Range 0x2AD5, Supported Resistance Level Range 0x2AD6, Supported Heart Rate Range 0x2AD7, Supported Power Range 0x2AD8, Preferred Units 0x2B46, High Resolution Height 0x2B47, Middle Name 0x2B48, Stride Length 0x2B49, Handedness 0x2B4A, Device Wearing Position 0x2B4B, Four Zone Heart Rate Limits 0x2B4C, Activity Goal 0x2B4E, Sedentary Interval Notification 0x2B4F, Caloric Intake 0x2B50

Decoded up to a field it cannot read (18)

  • Glucose Measurement 0x2A18: Glucose Concentration: medfloat16 is not decoded here: the SIG's YAML files do not define its encoding
  • Temperature Measurement 0x2A1C: Temperature Measurement Value (Celsius): medfloat32 is not decoded here: the SIG's YAML files do not define its encoding
  • Intermediate Temperature 0x2A1E: Intermediate Temperature (Celsius): medfloat32 is not decoded here: the SIG's YAML files do not define its encoding
  • Glucose Measurement Context 0x2A34: Carbohydrate: medfloat16 is not decoded here: the SIG's YAML files do not define its encoding
  • Blood Pressure Measurement 0x2A35: Blood Pressure Measurement Compound Value - Systolic (mmHg): medfloat16 is not decoded here: the SIG's YAML files do not define its encoding
  • Intermediate Cuff Pressure 0x2A36: Intermediate Cuff Pressure Compound Value - Current Cuff Pressure (mmHg): medfloat16 is not decoded here: the SIG's YAML files do not define its encoding
  • Record Access Control Point 0x2A52: Operand: no struct definition for Operand in the SIG's file
  • SC Control Point 0x2A55: Parameter: no struct definition for Parameter in the SIG's file
  • Cycling Power Control Point 0x2A66: Parameter: no struct definition for Parameter in the SIG's file
  • CGM Measurement 0x2AA7: CGM Measurement Record(s): CGM Measurement Record(s) › CGM Glucose Concentration: medfloat16 (2) is not a fixed-size integer this decoder reads
  • CGM Status 0x2AA9: E2E-CRC: its condition is not a flags bit: "Present if E2E-CRC Supported bit in CGM Feature characteristic is set to 1"
  • CGM Session Start Time 0x2AAA: E2E-CRC: its condition is not a flags bit: "Present if E2E-CRC Supported bit in CGM Feature characteristic is set to 1"
  • CGM Session Run Time 0x2AAB: E2E-CRC: its condition is not a flags bit: "Present if E2E-CRC Supported bit in CGM Feature characteristic is set to 1"
  • CGM Specific Ops Control Point 0x2AAC: Operand: no struct definition for Operand in the SIG's file
  • Enhanced Blood Pressure Measurement 0x2B34: Blood Pressure Measurement Compound Value (mmHg): Blood Pressure Measurement Compound Value (mmHg) › Systolic (mmHg): medfloat16 (2) is not a fixed-size integer this decoder reads
  • Enhanced Intermediate Cuff Pressure 0x2B35: Intermediate Cuff Pressure Value: medfloat16 is not decoded here: the SIG's YAML files do not define its encoding
  • Blood Pressure Record 0x2B36: Recorded Characteristic: Determined by UUID is not decoded here: the SIG's YAML files do not define its encoding
  • High Intensity Exercise Threshold 0x2B4D: Threshold as Energy Expenditure per Hour: its condition is not a flags bit: "Present if value of Field Selector field is 1"

Named, but hex only (7)

The SIG’s repository has no gss structure for these at this commit: PLX Spot-Check Measurement (0x2A5E), PLX Continuous Measurement (0x2A5F), PLX Features (0x2A60), Fitness Machine Feature (0x2ACC), Training Status (0x2AD3), Fitness Machine Control Point (0x2AD9), Fitness Machine Status (0x2ADA).

Which browsers can connect

Web Bluetooth is a Chromium feature. MDN's compatibility data lists it in Chrome (requestDevice since version 56), Edge, Opera and Samsung Internet, with the note that Chrome's Linux support is not enabled by default, and marks the API experimental. It lists no support in Firefox, in Safari on macOS or iOS, or in Android's WebView.

Source: MDN browser-compat-data, api/Bluetooth.json, read 2026-11-05. The paste box works in any browser.

What the explorer cannot tell you

  • What a vendor’s own characteristics mean. Their bytes show as hex; nothing on this site documents a private protocol.
  • Whether a device is standard-conforming. A characteristic that decodes cleanly matches the SIG’s layout; it does not prove the values are right.
  • Anything the browser withholds. A service the page did not name, or one the browser refuses to expose, does not appear in the list.

For the common fitness devices there are focused labs: the heart-rate lab, the FTMS lab for treadmills, bikes and rowers, and the cycling power and cadence lab. Every characteristic is documented in the Bluetooth GATT reference; building against them is covered in Web Bluetooth for fitness apps and testing BLE fitness devices.

How this works, and what it sends

Nothing leaves your device. The browser’s chooser lists nearby devices; the page can reach only the one you pick and only the services it named. It reads a characteristic or turns on its notifications only when you press the button, and it never writes a value. The decoders load from a static JSON file built with the site; no device data is sent anywhere, and nothing is stored.

The value in the paste box when the page loads is synthetic: an RSC Measurement built by the decoder’s own encoder from the SIG’s field names, not recorded from a device.

The names and structures come from the Bluetooth SIG’s public repository (https://bitbucket.org/bluetooth-SIG/public), read by this site’s generator on 2026-10-17. The SIG’s text is quoted with attribution: Copyright © Bluetooth SIG, Inc., which describes these files as proprietary to it. This site is not affiliated with Bluetooth SIG.

A free tool from AIFitnessAPI. More at free tools for health-app builders.