---
title: "BLE GATT explorer: see what any Bluetooth device exposes"
canonical: "https://aifitnessapi.com/tools/ble-gatt-explorer"
markdown: "https://aifitnessapi.com/tools/ble-gatt-explorer.md"
type: "tool"
last_reviewed: "2026-11-05"
description: "Connect any Bluetooth LE device in the browser, list its services and characteristics by SIG name, read or subscribe, and decode values the SIG defines."
publisher: "AIFitnessAPI — funded by KinesteX; first-party pages disclose it"
cite_as: "\"BLE GATT explorer: see what any Bluetooth device exposes\", AIFitnessAPI, https://aifitnessapi.com/tools/ble-gatt-explorer"
---

# 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.

- Canonical: https://aifitnessapi.com/tools/ble-gatt-explorer
- Last reviewed: 2026-11-05
- Publisher: AIFitnessAPI (https://aifitnessapi.com)
- Cite as: "BLE GATT explorer: see what any Bluetooth device exposes", AIFitnessAPI, https://aifitnessapi.com/tools/ble-gatt-explorer

---

*[Interactive: the Web Bluetooth connection, service list, reads, notifications and paste box, in the browser at https://aifitnessapi.com/tools/ble-gatt-explorer; not reproduced in this mirror.]*

## 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](https://aifitnessapi.com/tools/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](https://webbluetoothcg.github.io/web-bluetooth/#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](https://webbluetoothcg.github.io/web-bluetooth/#example-heart-rate-monitor) 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](https://aifitnessapi.com/bluetooth-fitness/date-time) `0x2A08`
- [DST Offset](https://aifitnessapi.com/bluetooth-fitness#char-dst-offset) `0x2A0D`
- [Time Zone](https://aifitnessapi.com/bluetooth-fitness#char-time-zone) `0x2A0E`
- [Battery Level](https://aifitnessapi.com/tools/heart-rate-lab) `0x2A19`
- [Temperature Type](https://aifitnessapi.com/bluetooth-fitness#char-temperature-type) `0x2A1D`
- [Measurement Interval](https://aifitnessapi.com/bluetooth-fitness#char-measurement-interval) `0x2A21`
- [Heart Rate Measurement](https://aifitnessapi.com/bluetooth-fitness/heart-rate-measurement) `0x2A37`
- [Body Sensor Location](https://aifitnessapi.com/bluetooth-fitness#char-body-sensor-location) `0x2A38`
- [Heart Rate Control Point](https://aifitnessapi.com/bluetooth-fitness#char-heart-rate-control-point) `0x2A39`
- [Blood Pressure Feature](https://aifitnessapi.com/bluetooth-fitness#char-blood-pressure-feature) `0x2A49`
- [Glucose Feature](https://aifitnessapi.com/bluetooth-fitness#char-glucose-feature) `0x2A51`
- [RSC Measurement](https://aifitnessapi.com/bluetooth-fitness/rsc-measurement) `0x2A53`
- [RSC Feature](https://aifitnessapi.com/bluetooth-fitness#char-rsc-feature) `0x2A54`
- [CSC Measurement](https://aifitnessapi.com/bluetooth-fitness/csc-measurement) `0x2A5B`
- [CSC Feature](https://aifitnessapi.com/bluetooth-fitness#char-csc-feature) `0x2A5C`
- [Sensor Location](https://aifitnessapi.com/bluetooth-fitness#char-sensor-location) `0x2A5D`
- [Cycling Power Measurement](https://aifitnessapi.com/bluetooth-fitness/cycling-power-measurement) `0x2A63`
- [Cycling Power Vector](https://aifitnessapi.com/bluetooth-fitness/cycling-power-vector) `0x2A64`
- [Cycling Power Feature](https://aifitnessapi.com/bluetooth-fitness#char-cycling-power-feature) `0x2A65`
- [Aerobic Heart Rate Lower Limit](https://aifitnessapi.com/bluetooth-fitness#char-aerobic-heart-rate-lower-limit) `0x2A7E`
- [Aerobic Threshold](https://aifitnessapi.com/bluetooth-fitness#char-aerobic-threshold) `0x2A7F`
- [Age](https://aifitnessapi.com/bluetooth-fitness#char-age) `0x2A80`
- [Anaerobic Heart Rate Lower Limit](https://aifitnessapi.com/bluetooth-fitness#char-anaerobic-heart-rate-lower-limit) `0x2A81`
- [Anaerobic Heart Rate Upper Limit](https://aifitnessapi.com/bluetooth-fitness#char-anaerobic-heart-rate-upper-limit) `0x2A82`
- [Anaerobic Threshold](https://aifitnessapi.com/bluetooth-fitness#char-anaerobic-threshold) `0x2A83`
- [Aerobic Heart Rate Upper Limit](https://aifitnessapi.com/bluetooth-fitness#char-aerobic-heart-rate-upper-limit) `0x2A84`
- [Date of Birth](https://aifitnessapi.com/bluetooth-fitness/date-of-birth) `0x2A85`
- [Date of Threshold Assessment](https://aifitnessapi.com/bluetooth-fitness/date-of-threshold-assessment) `0x2A86`
- [Email Address](https://aifitnessapi.com/bluetooth-fitness#char-email-address) `0x2A87`
- [Fat Burn Heart Rate Lower Limit](https://aifitnessapi.com/bluetooth-fitness#char-fat-burn-heart-rate-lower-limit) `0x2A88`
- [Fat Burn Heart Rate Upper Limit](https://aifitnessapi.com/bluetooth-fitness#char-fat-burn-heart-rate-upper-limit) `0x2A89`
- [First Name](https://aifitnessapi.com/bluetooth-fitness#char-first-name) `0x2A8A`
- [Five Zone Heart Rate Limits](https://aifitnessapi.com/bluetooth-fitness/five-zone-heart-rate-limits) `0x2A8B`
- [Gender](https://aifitnessapi.com/bluetooth-fitness#char-gender) `0x2A8C`
- [Heart Rate Max](https://aifitnessapi.com/bluetooth-fitness#char-heart-rate-max) `0x2A8D`
- [Height](https://aifitnessapi.com/bluetooth-fitness#char-height) `0x2A8E`
- [Hip Circumference](https://aifitnessapi.com/bluetooth-fitness#char-hip-circumference) `0x2A8F`
- [Last Name](https://aifitnessapi.com/bluetooth-fitness#char-last-name) `0x2A90`
- [Maximum Recommended Heart Rate](https://aifitnessapi.com/bluetooth-fitness#char-maximum-recommended-heart-rate) `0x2A91`
- [Resting Heart Rate](https://aifitnessapi.com/bluetooth-fitness#char-resting-heart-rate) `0x2A92`
- [Sport Type for Aerobic and Anaerobic Thresholds](https://aifitnessapi.com/bluetooth-fitness#char-sport-type-for-aerobic-and-anaerobic-thresholds) `0x2A93`
- [Three Zone Heart Rate Limits](https://aifitnessapi.com/bluetooth-fitness/three-zone-heart-rate-limits) `0x2A94`
- [Two Zone Heart Rate Limits](https://aifitnessapi.com/bluetooth-fitness#char-two-zone-heart-rate-limits) `0x2A95`
- [VO2 Max](https://aifitnessapi.com/bluetooth-fitness#char-vo2-max) `0x2A96`
- [Waist Circumference](https://aifitnessapi.com/bluetooth-fitness#char-waist-circumference) `0x2A97`
- [Weight](https://aifitnessapi.com/bluetooth-fitness#char-weight) `0x2A98`
- [Body Composition Feature](https://aifitnessapi.com/bluetooth-fitness#char-body-composition-feature) `0x2A9B`
- [Body Composition Measurement](https://aifitnessapi.com/bluetooth-fitness/body-composition-measurement) `0x2A9C`
- [Weight Measurement](https://aifitnessapi.com/bluetooth-fitness/weight-measurement) `0x2A9D`
- [Weight Scale Feature](https://aifitnessapi.com/bluetooth-fitness#char-weight-scale-feature) `0x2A9E`
- [Language](https://aifitnessapi.com/bluetooth-fitness#char-language) `0x2AA2`
- [CGM Feature](https://aifitnessapi.com/bluetooth-fitness/cgm-feature) `0x2AA8`
- [Treadmill Data](https://aifitnessapi.com/bluetooth-fitness/treadmill-data) `0x2ACD`
- [Cross Trainer Data](https://aifitnessapi.com/bluetooth-fitness/cross-trainer-data) `0x2ACE`
- [Step Climber Data](https://aifitnessapi.com/bluetooth-fitness/step-climber-data) `0x2ACF`
- [Stair Climber Data](https://aifitnessapi.com/bluetooth-fitness/stair-climber-data) `0x2AD0`
- [Rower Data](https://aifitnessapi.com/bluetooth-fitness/rower-data) `0x2AD1`
- [Indoor Bike Data](https://aifitnessapi.com/bluetooth-fitness/indoor-bike-data) `0x2AD2`
- [Supported Speed Range](https://aifitnessapi.com/bluetooth-fitness/supported-speed-range) `0x2AD4`
- [Supported Inclination Range](https://aifitnessapi.com/bluetooth-fitness/supported-inclination-range) `0x2AD5`
- [Supported Resistance Level Range](https://aifitnessapi.com/bluetooth-fitness/supported-resistance-level-range) `0x2AD6`
- [Supported Heart Rate Range](https://aifitnessapi.com/bluetooth-fitness/supported-heart-rate-range) `0x2AD7`
- [Supported Power Range](https://aifitnessapi.com/bluetooth-fitness/supported-power-range) `0x2AD8`
- [Preferred Units](https://aifitnessapi.com/bluetooth-fitness#char-preferred-units) `0x2B46`
- [High Resolution Height](https://aifitnessapi.com/bluetooth-fitness#char-high-resolution-height) `0x2B47`
- [Middle Name](https://aifitnessapi.com/bluetooth-fitness#char-middle-name) `0x2B48`
- [Stride Length](https://aifitnessapi.com/bluetooth-fitness#char-stride-length) `0x2B49`
- [Handedness](https://aifitnessapi.com/bluetooth-fitness#char-handedness) `0x2B4A`
- [Device Wearing Position](https://aifitnessapi.com/bluetooth-fitness#char-device-wearing-position) `0x2B4B`
- [Four Zone Heart Rate Limits](https://aifitnessapi.com/bluetooth-fitness/four-zone-heart-rate-limits) `0x2B4C`
- [Activity Goal](https://aifitnessapi.com/bluetooth-fitness/activity-goal) `0x2B4E`
- [Sedentary Interval Notification](https://aifitnessapi.com/bluetooth-fitness#char-sedentary-interval-notification) `0x2B4F`
- [Caloric Intake](https://aifitnessapi.com/bluetooth-fitness#char-caloric-intake) `0x2B50`

### Decoded up to a field it cannot read (18)

- [Glucose Measurement](https://aifitnessapi.com/bluetooth-fitness/glucose-measurement) `0x2A18`: Glucose Concentration: medfloat16 is not decoded here: the SIG's YAML files do not define its encoding
- [Temperature Measurement](https://aifitnessapi.com/bluetooth-fitness/temperature-measurement) `0x2A1C`: Temperature Measurement Value (Celsius): medfloat32 is not decoded here: the SIG's YAML files do not define its encoding
- [Intermediate Temperature](https://aifitnessapi.com/bluetooth-fitness/intermediate-temperature) `0x2A1E`: Intermediate Temperature (Celsius): medfloat32 is not decoded here: the SIG's YAML files do not define its encoding
- [Glucose Measurement Context](https://aifitnessapi.com/bluetooth-fitness/glucose-measurement-context) `0x2A34`: Carbohydrate: medfloat16 is not decoded here: the SIG's YAML files do not define its encoding
- [Blood Pressure Measurement](https://aifitnessapi.com/bluetooth-fitness/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](https://aifitnessapi.com/bluetooth-fitness/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](https://aifitnessapi.com/bluetooth-fitness/record-access-control-point) `0x2A52`: Operand: no struct definition for Operand in the SIG's file
- [SC Control Point](https://aifitnessapi.com/bluetooth-fitness/sc-control-point) `0x2A55`: Parameter: no struct definition for Parameter in the SIG's file
- [Cycling Power Control Point](https://aifitnessapi.com/bluetooth-fitness/cycling-power-control-point) `0x2A66`: Parameter: no struct definition for Parameter in the SIG's file
- [CGM Measurement](https://aifitnessapi.com/bluetooth-fitness/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](https://aifitnessapi.com/bluetooth-fitness/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](https://aifitnessapi.com/bluetooth-fitness/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](https://aifitnessapi.com/bluetooth-fitness/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](https://aifitnessapi.com/bluetooth-fitness/cgm-specific-ops-control-point) `0x2AAC`: Operand: no struct definition for Operand in the SIG's file
- [Enhanced Blood Pressure Measurement](https://aifitnessapi.com/bluetooth-fitness/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](https://aifitnessapi.com/bluetooth-fitness/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](https://aifitnessapi.com/bluetooth-fitness/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](https://aifitnessapi.com/bluetooth-fitness/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](https://github.com/mdn/browser-compat-data/blob/main/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](https://aifitnessapi.com/tools/heart-rate-lab), the [FTMS lab](https://aifitnessapi.com/tools/ftms-lab) for treadmills, bikes and rowers, and the [cycling power and cadence lab](https://aifitnessapi.com/tools/cycling-power-lab). Every characteristic is documented in the [Bluetooth GATT reference](https://aifitnessapi.com/bluetooth-fitness); building against them is covered in [Web Bluetooth for fitness apps](https://aifitnessapi.com/devices/web-bluetooth-fitness) and [testing BLE fitness devices](https://aifitnessapi.com/devices/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](https://aifitnessapi.com/tools/ble-gatt-explorer/layouts.json) 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](https://aifitnessapi.com/tools).
