La spécification du CBOR[3] est disponible dans la RFC 8949[2].
Les types sont regroupés en 8 types majeurs dont le numéro est codé sur 3 bits :
Les 5 bits restant[4] du premier octet sont utilisés pour indiquer soit la valeur (si elle est comprise entre 0 et 23) ou le nombre d'octets qui suivent :
- de 0 à 23, il s'agit de la représentation de la valeur ou de la longueur pour les chaînes et les tableaux simples ou associatifs,
- de 24 à 27, il s'agit du nombre d'octets qui suivent (24 = 1 octet, 25 = 2 octets, 26 = 4 octets, 27 = 8 octets) contenant la valeur ou la taille,
- de 28 à 30, valeurs réservées pour un usage futur,
- selon le type majeur, la valeur 31 peut être réservée pour indiquer le début ou la fin d'une structure de taille indéterminée à l'avance.
Les types composés (tableaux simples, tableaux associatifs, chaînes de caractères ou d'octets) peuvent être encodés en spécifiant le nombre d'éléments avant le contenu, ou bien en mode non déterminé à l'avance en utilisant une valeur spéciale indiquant la fin.
Le type majeur étiquette permet d'étendre le format en indiquant quelle est l'interprétation à donner à l'item qui suit.
Par exemple, le tag 0 précède une chaîne de caractères représentant une date et une heure au format standard.
Il existe des tags pour les UUID, les données au format Base64, les fractions, les expressions régulières, l'absence de valeur, etc.
L'assignation des numéros fait l'objet d'un enregistrement de l'IANA[5].