MoQT Control Message Types
Every MoQT control message begins with a type code, and the set of codes has moved more than any other part of the protocol. Messages have been added, merged, renumbered and retired across the draft range, so a type code on its own does not identify a message — you need the draft too.
moqtap covers drafts 07 through 20. The current draft, draft-20, defines 19 control message types and reserves 6 more code points for types that earlier drafts used.
These pages carry the type codes. For the field layout of a particular message, follow its section link into the draft text; for how the control stream works, see control messages.
Message types per draft
Section titled “Message types per draft”| Draft | Assigned | Reserved | Rows | Test vectors |
|---|---|---|---|---|
| draft-20 | 19 | 6 | 25 | 228 |
| draft-19 | 18 | 6 | 24 | 178 |
| draft-18 | 19 | 5 | 24 | 163 |
| draft-17 | 18 | 5 | 23 | 139 |
| draft-16 | 24 | 3 | 27 | 138 |
| draft-15 | 23 | 3 | 26 | 129 |
| draft-14 | 30 | 3 | 33 | 168 |
| draft-13 | 30 | 3 | 33 | 159 |
| draft-12 | 29 | 3 | 32 | 131 |
| draft-11 | 26 | 3 | 29 | 108 |
| draft-10 | 26 | 0 | 26 | 108 |
| draft-09 | 26 | 0 | 26 | 108 |
| draft-08 | 26 | 0 | 26 | 105 |
| draft-07 | 25 | 0 | 25 | 96 |
A reserved row is a code point the draft explicitly refuses to reuse, usually because an earlier draft assigned it to something else. The test-vector column counts the encode/decode vectors moqtap publishes for that draft.
What changed, draft by draft
Section titled “What changed, draft by draft”Newest first, computed by diffing each draft's Control Messages table against the previous one.
draft-19 → draft-20
Section titled “draft-19 → draft-20”- Added: PUBLISH_STATE_NOTIFY (0x22).
draft-18 → draft-19
Section titled “draft-18 → draft-19”- Renamed or retired: 0x1E PUBLISH_OK → RESERVED and 0xF PUBLISH_BLOCKED → PUBLISH_SKIPPED.
draft-17 → draft-18
Section titled “draft-17 → draft-18”- Added: SUBSCRIBE_TRACKS (0x51).
- Renumbered: SUBSCRIBE_NAMESPACE 0x11 → 0x50.
draft-16 → draft-17
Section titled “draft-16 → draft-17”- Added: SETUP (0x2F00) and PUBLISH_BLOCKED (0xF).
- Renamed or retired: 0x20 CLIENT_SETUP → RESERVED and 0x21 SERVER_SETUP → RESERVED.
- Removed: MAX_REQUEST_ID (0x15), REQUESTS_BLOCKED (0x1A), UNSUBSCRIBE (0xA), FETCH_CANCEL (0x17), PUBLISH_NAMESPACE_DONE (0x9) and PUBLISH_NAMESPACE_CANCEL (0xC).
draft-15 → draft-16
Section titled “draft-15 → draft-16”- Added: NAMESPACE (0x8) and NAMESPACE_DONE (0xE).
- Renamed or retired: 0x2 SUBSCRIBE_UPDATE → REQUEST_UPDATE.
- Removed: UNSUBSCRIBE_NAMESPACE (0x14).
draft-14 → draft-15
Section titled “draft-14 → draft-15”- Renamed or retired: 0x7 PUBLISH_NAMESPACE_OK → REQUEST_OK and 0x5 SUBSCRIBE_ERROR → REQUEST_ERROR.
- Removed: PUBLISH_ERROR (0x1F), FETCH_ERROR (0x19), TRACK_STATUS_OK (0xE), TRACK_STATUS_ERROR (0xF), PUBLISH_NAMESPACE_ERROR (0x8), SUBSCRIBE_NAMESPACE_OK (0x12) and SUBSCRIBE_NAMESPACE_ERROR (0x13).
draft-13 → draft-14
Section titled “draft-13 → draft-14”- Renamed or retired: 0xB SUBSCRIBE_DONE → PUBLISH_DONE, 0x6 ANNOUNCE → PUBLISH_NAMESPACE, 0x7 ANNOUNCE_OK → PUBLISH_NAMESPACE_OK, 0x8 ANNOUNCE_ERROR → PUBLISH_NAMESPACE_ERROR, 0x9 UNANNOUNCE → PUBLISH_NAMESPACE_DONE and 0xC ANNOUNCE_CANCEL → PUBLISH_NAMESPACE_CANCEL.
draft-12 → draft-13
Section titled “draft-12 → draft-13”- Added: TRACK_STATUS_ERROR (0xF).
- Renamed or retired: 0xD TRACK_STATUS_REQUEST → TRACK_STATUS, 0xE TRACK_STATUS → TRACK_STATUS_OK, 0x11 SUBSCRIBE_ANNOUNCES → SUBSCRIBE_NAMESPACE, 0x12 SUBSCRIBE_ANNOUNCES_OK → SUBSCRIBE_NAMESPACE_OK, 0x13 SUBSCRIBE_ANNOUNCES_ERROR → SUBSCRIBE_NAMESPACE_ERROR and 0x14 UNSUBSCRIBE_ANNOUNCES → UNSUBSCRIBE_NAMESPACE.
draft-11 → draft-12
Section titled “draft-11 → draft-12”- Added: PUBLISH (0x1D), PUBLISH_OK (0x1E) and PUBLISH_ERROR (0x1F).
draft-10 → draft-11
Section titled “draft-10 → draft-11”- Added: RESERVED (0x01).
- Renumbered: CLIENT_SETUP 0x40 → 0x20 and SERVER_SETUP 0x41 → 0x21.
- Renamed or retired: 0x40 CLIENT_SETUP → RESERVED, 0x41 SERVER_SETUP → RESERVED, 0x15 MAX_SUBSCRIBE_ID → MAX_REQUEST_ID and 0x1A SUBSCRIBES_BLOCKED → REQUESTS_BLOCKED.
draft-09 → draft-10
Section titled “draft-09 → draft-10”No control message type was added, removed, renumbered or renamed.
draft-08 → draft-09
Section titled “draft-08 → draft-09”No control message type was added, removed, renumbered or renamed.
draft-07 → draft-08
Section titled “draft-07 → draft-08”- Added: SUBSCRIBES_BLOCKED (0x1A).
Where these numbers come from
Section titled “Where these numbers come from”
Each draft's rows are parsed from the Control Messages table in the frozen xml2rfc rendering this
site keeps at site/spec-sources/draft-NN.html. Those files hash to the same source_sha256 the moqtap codec's committed registry extraction records, so the
message types and the error codes on this site come from provably the same documents.
Every draft is then cross-checked against the moqtap test-vector corpus — test-vectors/transport/draftNN/codec/messages/*.json — which all three moqtap implementations validate
against. The corpus never contributes a row; where the two sources disagree, the per-draft page
says so rather than reconciling them silently.
Every draft
Section titled “Every draft”- draft-20 — 25 types
- draft-19 — 24 types
- draft-18 — 24 types
- draft-17 — 23 types
- draft-16 — 27 types
- draft-15 — 26 types
- draft-14 — 33 types
- draft-13 — 33 types
- draft-12 — 32 types
- draft-11 — 29 types
- draft-10 — 26 types
- draft-09 — 26 types
- draft-08 — 26 types
- draft-07 — 25 types
Error codes by draft · The MoQT specification, section by section · How control messages work