GATT Descriptor
Metadata attached to a characteristic, such as the Client Characteristic Configuration Descriptor (CCCD).
What Is a GATT Descriptor?
A ATT">gatt-descriptor/" class="glossary-term-link" data-term="GATT Descriptor" data-definition="Metadata attached to a BLE characteristic." data-category="GATT & ATT">GATT Descriptor is a small attribute attached to a characteristic that provides supplementary metadata about the characteristic's value. While the characteristic declaration defines access properties and the value holds application data, descriptors supply context -- enabling notifications, describing presentation format, or providing a human-readable label.
Common Descriptor Types
| UUID | Name | Purpose |
|---|---|---|
| 0x2902 | CCCD | Enables/disables notifications and indications |
| 0x2901 | Characteristic User Description | Human-readable string label |
| 0x2904 | Characteristic Presentation Format | Data format, exponent, unit, namespace |
| 0x2906 | Valid Range | Min/max values the characteristic accepts |
| 0x2900 | Characteristic Extended Properties | Additional property flags (reliable write, writable auxiliaries) |
The CCCD in Detail
The Client Characteristic Configuration Descriptor (0x2902) is by far the most important and most commonly used descriptor. It is a 2-byte value where bit 0 enables notifications and bit 1 enables indications. The CCCD is unique in that each bonded client gets its own copy of the value -- the server must store per-client CCCD state so that reconnecting devices resume their subscription preferences without re-subscribing. This per-client persistence is a frequent source of firmware bugs, especially when bonding storage is limited.
Characteristic Presentation Format
The Presentation Format descriptor (0x2904) is a structured 7-byte value that encodes the data type (uint8, float32, UTF-8, etc.), an exponent for scaling, the unit (using Bluetooth SIG assigned numbers), and a namespace/description pair. This descriptor is particularly useful when a service exposes multiple instances of the same characteristic type, such as multiple temperature sensors on a single device.
Placement in the Attribute Database
Descriptors follow their parent characteristic's value attribute in the ATT database and precede the next characteristic declaration or service boundary. During service discovery, the GATT client issues a Discover All Characteristic Descriptors request to enumerate them within the handle range. Minimizing descriptor count reduces discovery time, which is especially important on power-constrained peripherals that want to keep connection events short.
Best Practices
Always include a CCCD on any characteristic that supports Notify or Indicate -- many mobile BLE stacks will refuse to subscribe without one. Use the User Description descriptor sparingly; it increases the attribute database size and is rarely displayed by production apps. If interoperability with third-party clients matters, include the Presentation Format descriptor so that generic BLE explorer tools can render values correctly.
Related Terms
Related Content
Understanding BLE Architecture: Protocol Stack Overview
Getting StartedBLE GATT Server Implementation Guide
DevelopmentWeb Bluetooth API: BLE from the Browser
Development…The GATT hierarchy — server → service → characteristic → descriptor — mirrors the native BLE stack exactly. MTU negotiation is…
Python BLE with Bleak: Cross-Platform BLE Scripting
Development…with full service/ characteristic / descriptor hierarchy. Reading, Writing, and Notifications…
GATT UUID & Descriptors (0x2902) Explained — BLE
Protocols & Profiles…Heart Rate Measurement (0x2A37) │ ├── Value (Notify) │ └── Descriptor: CCCD (0x2902) └── Characteristic: Body Sensor Location…
Frequently Asked Questions
Our glossary covers 90+ BLE technical terms organized by category. Each term includes a definition, related terms, and links to relevant chips and guides.