Skip to content

MoQT Error Codes

MoQT reports failure in several places, and each has its own numbering. A session ends with a termination code. A request fails with a code in the message that rejects it. A subscription finishes with a status. A data stream is reset with a reason. These are separate registries with overlapping numbers — 0x2 means one thing in a session close and another in a request rejection — so a code without its registry is ambiguous.

moqtap tracks all of them across drafts 07 through 20. The current draft, draft-20, assigns 61 code points across 4 registries: Session Termination, REQUEST_ERROR, PUBLISH_DONE and Stream Reset.

The registry set is not stable across the draft range. Drafts 07–14 gave each request message its own error registry; draft-15 merged them into a single REQUEST_ERROR registry. A blank cell means the draft has no such registry at all, which is a different statement from a registry with no entries.

Registry 2019181716151413121110987
Session Termination Error Codes 21 22 21 22 21 21 21 19 19 16 10 10 10 8
SUBSCRIBE_ERROR Codes · · · · · · 8 8 8 10 7 7 7 6
SUBSCRIBE_DONE · · · · · · · 8 8 7 7 7 7 7
ANNOUNCE_ERROR Codes · · · · · · 7 7 7 8 5 5 5 ·
FETCH_ERROR Codes · · · · · · 12 12 12 11 6 6 6 ·
SUBSCRIBE_ANNOUNCES_ERROR · · · · · · · · 8 9 5 5 5 ·
Stream Reset Error Codes 11 11 11 9 6 4 4 4 4 4 · · · ·
PUBLISH_ERROR Codes · · · · · · 5 5 5 · · · · ·
SUBSCRIBE_NAMESPACE_ERROR Codes · · · · · · 8 8 · · · · · ·
PUBLISH_DONE Codes 10 11 11 11 9 9 8 · · · · · · ·
REQUEST_ERROR Codes 19 20 19 17 13 13 · · · · · · · ·

Column headings are draft numbers, newest on the left. Each cell is the number of code points that draft's registry assigns, and links to it.

Draft Registries Code points Described Object Status
draft-20 4 61 57 3
draft-19 4 64 60 3
draft-18 4 62 58 3
draft-17 4 59 55 3
draft-16 4 49 49 3
draft-15 4 47 47 4
draft-14 8 73 73 4
draft-13 8 71 71 4
draft-12 8 71 71 4
draft-11 7 65 65 4
draft-10 6 40 40 5
draft-09 6 40 40 5
draft-08 6 40 40 5
draft-07 3 21 21 5

Object Status is a second family of code points, counted on its own and never added to the code point total. It is the status a single Object carries, not the outcome of a request.

Newest first. Each entry is the difference between that draft's registries and the one before it, computed by diffing the two extractions rather than read from a change log.

  • 3 removed: VERSION_NEGOTIATION_FAILED (0x15) in Session Termination, INVALID_JOINING_REQUEST_ID (0x32) in REQUEST_ERROR and SUBSCRIPTION_ENDED (0x3) in PUBLISH_DONE.
  • 3 code points added: TOO_MANY_REQUEST_UPDATES (0x1B) in Session Termination, CONFLICTING_FILTERS (0x35) in REQUEST_ERROR and INVALID_FILTER (0x36) in REQUEST_ERROR.
  • 1 removed: DUPLICATE_SUBSCRIPTION (0x19) in REQUEST_ERROR.
  • 3 code points added: UNSUPPORTED_EXTENSION (0x33) in REQUEST_ERROR, REDIRECT (0x34) in REQUEST_ERROR and EXPIRED_AUTH_TOKEN (0x7) in Stream Reset.
  • 1 renumbered: UNKNOWN_OBJECT_STATUS 0x4 → 0x6 in Stream Reset.
  • 3 renamed: 0x5 EXPIRED → TOO_FAR_BEHIND in PUBLISH_DONE, 0x6 TOO_FAR_BEHIND → EXPIRED in PUBLISH_DONE and 0x4 UNKNOWN_OBJECT_STATUS → GOING_AWAY in Stream Reset.
  • 1 removed: INVALID_REQUIRED_REQUEST_ID (0x7) in Session Termination.
  • 3 code points added: DUPLICATE_SUBSCRIPTION (0x19) in REQUEST_ERROR, UNKNOWN_OBJECT_STATUS (0x4) in Data Stream Reset and MALFORMED_TRACK (0x12) in Data Stream Reset.
  • 1 renumbered: MALFORMED_TRACK 0x7 → 0x12 in PUBLISH_DONE.
  • 1 removed: UNKNOWN_STATUS_IN_RANGE (0x33) in REQUEST_ERROR.
  • New registry: REQUEST_ERROR Codes.
  • Dropped registries: SUBSCRIBE_ERROR Codes, PUBLISH_ERROR Codes, FETCH_ERROR Codes, ANNOUNCE_ERROR Codes and SUBSCRIBE_NAMESPACE_ERROR Codes.
  • 14 code points added.
  • 40 removed.
  • New registry: SUBSCRIBE_NAMESPACE_ERROR.
  • Dropped registry: SUBSCRIBE_ANNOUNCES_ERROR.
  • 8 code points added.
  • 8 removed.
  • New registry: PUBLISH_ERROR.
  • 11 code points added.
  • 1 renamed: 0x7 INVALID_JOINING_SUBSCRIBE_ID → INVALID_JOINING_REQUEST_ID in FETCH_ERROR.
  • 5 removed: RETRY_TRACK_ALIAS (0x6) in SUBSCRIBE_ERROR, UNKNOWN_AUTH_TOKEN_ALIAS (0x11) in SUBSCRIBE_ERROR, UNKNOWN_AUTH_TOKEN_ALIAS (0x11) in FETCH_ERROR, UNKNOWN_AUTH_TOKEN_ALIAS (0x11) in ANNOUNCE_ERROR and UNKNOWN_AUTH_TOKEN_ALIAS (0x11) in SUBSCRIBE_ANNOUNCES_ERROR.
  • New registry: Closing Subgroup Streams.
  • 25 code points added.
  • 3 renamed: 0x4 DUPLICATE_TRACK_ALIAS → INVALID_REQUEST_ID in Termination, 0x5 PARAMETER_LENGTH_MISMATCH → DUPLICATE_TRACK_ALIAS in Termination and 0x6 TOO_MANY_SUBSCRIBES → KEY_VALUE_FORMATTING_ERROR in Termination.

No change. The registries are identical.

No change. The registries are identical.

Every code point on these pages is extracted from the published draft, not transcribed. The extraction lives at crates/moqtap-codec/tools/registries/draft-NN.json in the moqtap codec repository, is committed alongside the crate, and is what the crate's conformance tests compare against its own enums — in both directions, so a code the draft assigns and the codec refuses is as much a failure as the reverse.

Each extraction records source_sha256, the SHA-256 of the rendered draft as bytes on disk. The per-draft pages print that hash and confirm it against the frozen copy of the same document this site serves at /spec/. All 14 drafts currently agree.

Control message types by draft · The MoQT specification, section by section · How moqtap handles draft versions