Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/nordicsemi/bluetooth-numbers-database/llms.txt

Use this file to discover all available pages before exploring further.

GATT Descriptors sit one level below characteristics in the attribute hierarchy. Where a characteristic holds a data value, a descriptor provides metadata about that value: a human-readable description string, the valid numeric range, notification enable/disable configuration, and more. Every descriptor has a UUID in the SIG-reserved range 0x2900–0x2911 and is exposed as an attribute on the peripheral’s GATT server alongside its parent characteristic. The most universally important descriptor is the Client Characteristic Configuration Descriptor (CCCD, UUID 2902) — it is the mechanism by which a BLE central device subscribes to asynchronous notifications and indications from a peripheral. The Bluetooth Numbers Database includes all 18 SIG-defined descriptor entries sourced directly from the GATT Specification Supplement.

Data Structure

Each entry in descriptor_uuids.json conforms to the following schema:
uuid
string
required
4-character hexadecimal string identifying the descriptor (e.g., "2902"). All SIG-assigned descriptors occupy the 29002911 range.
name
string
required
Human-readable descriptor name as defined in the GATT Specification Supplement (e.g., "Client Characteristic Configuration").
identifier
string
required
Uniform Type Identifier in reverse-dot notation providing a globally scoped label (e.g., org.bluetooth.descriptor.gatt.client_characteristic_configuration).
source
string
required
All current descriptor entries are "gss" (GATT Specification Supplement). This field is included for schema consistency with the service and characteristic UUID files.

Complete Descriptor Listing

The following is the full contents of descriptor_uuids.json — all 18 SIG-defined GATT descriptors:
[
  {
    "name": "Characteristic Extended Properties",
    "identifier": "org.bluetooth.descriptor.gatt.characteristic_extended_properties",
    "uuid": "2900",
    "source": "gss"
  },
  {
    "name": "Characteristic User Descriptor",
    "identifier": "org.bluetooth.descriptor.gatt.characteristic_user_description",
    "uuid": "2901",
    "source": "gss"
  },
  {
    "name": "Client Characteristic Configuration",
    "identifier": "org.bluetooth.descriptor.gatt.client_characteristic_configuration",
    "uuid": "2902",
    "source": "gss"
  },
  {
    "name": "Server Characteristic Configuration",
    "identifier": "org.bluetooth.descriptor.gatt.server_characteristic_configuration",
    "uuid": "2903",
    "source": "gss"
  },
  {
    "name": "Characteristic Presentation Format",
    "identifier": "org.bluetooth.descriptor.gatt.characteristic_presentation_format",
    "uuid": "2904",
    "source": "gss"
  },
  {
    "name": "Characteristic Aggregate Format",
    "identifier": "org.bluetooth.descriptor.gatt.characteristic_aggregate_format",
    "uuid": "2905",
    "source": "gss"
  },
  {
    "name": "Valid Range",
    "identifier": "org.bluetooth.descriptor.valid_range",
    "uuid": "2906",
    "source": "gss"
  },
  {
    "name": "External Report Reference",
    "identifier": "org.bluetooth.descriptor.external_report_reference",
    "uuid": "2907",
    "source": "gss"
  },
  {
    "name": "Report Reference",
    "identifier": "org.bluetooth.descriptor.report_reference",
    "uuid": "2908",
    "source": "gss"
  },
  {
    "name": "Number of Digitals",
    "identifier": "org.bluetooth.descriptor.number_of_digitals",
    "uuid": "2909",
    "source": "gss"
  },
  {
    "name": "Value Trigger Setting",
    "identifier": "org.bluetooth.descriptor.value_trigger_setting",
    "uuid": "290A",
    "source": "gss"
  },
  {
    "name": "Environmental Sensing Configuration",
    "identifier": "org.bluetooth.descriptor.environmental_sensing_configuration",
    "uuid": "290B",
    "source": "gss"
  },
  {
    "name": "Environmental Sensing Measurement",
    "identifier": "org.bluetooth.descriptor.environmental_sensing_measurement",
    "uuid": "290C",
    "source": "gss"
  },
  {
    "name": "Environmental Sensing Trigger Setting",
    "identifier": "org.bluetooth.descriptor.environmental_sensing_trigger_setting",
    "uuid": "290D",
    "source": "gss"
  },
  {
    "name": "Time Trigger Setting",
    "identifier": "org.bluetooth.descriptor.time_trigger_setting",
    "uuid": "290E",
    "source": "gss"
  },
  {
    "name": "Complete BR-EDR Transport Block Data",
    "identifier": "org.bluetooth.descriptor.complete_bredr_transport_block_data",
    "uuid": "290F",
    "source": "gss"
  },
  {
    "name": "Observation Schedule",
    "identifier": "org.bluetooth.descriptor.observation_schedule",
    "uuid": "2910",
    "source": "gss"
  },
  {
    "name": "Valid Range and Accuracy",
    "identifier": "org.bluetooth.descriptor.valid_range_accuracy",
    "uuid": "2911",
    "source": "gss"
  }
]

The CCCD (0x2902)

The Client Characteristic Configuration Descriptor (UUID 2902) is by far the most commonly encountered descriptor in Bluetooth Low Energy development. It is a 2-byte, client-writable attribute that controls how the server delivers asynchronous updates to a connected central:
BitNameEffect
0Notifications EnabledServer sends ATT_HANDLE_VALUE_NTF without acknowledgement. Client does not confirm receipt.
1Indications EnabledServer sends ATT_HANDLE_VALUE_IND with acknowledgement. Client must confirm via ATT_HANDLE_VALUE_CFM.
A characteristic must have the NOTIFY property set for notifications to work, or the INDICATE property set for indications to work. Writing 0x0001 to the CCCD enables notifications; writing 0x0002 enables indications; writing 0x0000 disables both. The CCCD value is per-connection and per-bonded-client, meaning each connected device has its own independent CCCD state.

Lookup Example

import descriptors from './v1/descriptor_uuids.json';

// Find the Client Characteristic Configuration Descriptor
const cccd = descriptors.find(d => d.uuid === '2902');
console.log(cccd.name);
// "Client Characteristic Configuration"

console.log(cccd.identifier);
// "org.bluetooth.descriptor.gatt.client_characteristic_configuration"

// Find the Characteristic User Description descriptor
const userDesc = descriptors.find(d => d.uuid === '2901');
console.log(userDesc.name);
// "Characteristic User Descriptor"

// Resolve any descriptor UUID to a name
function getDescriptorName(uuid) {
  const entry = descriptors.find(d => d.uuid === uuid.toUpperCase());
  return entry ? entry.name : `Unknown Descriptor (${uuid})`;
}

console.log(getDescriptorName('2904'));
// "Characteristic Presentation Format"
Most real-world Bluetooth applications interact with only 2–3 descriptors in practice. The CCCD (2902) is used in almost every notification-based profile. The Characteristic User Description (2901) is occasionally present to supply a display label. All other descriptors are rarely encountered outside of specialized profiles such as Environmental Sensing or Automation IO.

Build docs developers (and LLMs) love