NOTICE
Consumer Technology Association (CTA)™ Standards, Bulletins and other technical publications are designed to serve the public interest through eliminating misunderstandings between manufacturers and purchasers, facilitating interchangeability and improvement of products, and assisting the reader in selecting and obtaining with minimum delay the proper product for the reader’s particular need. Existence of such Standards, Bulletins and other technical publications shall not in any respect preclude any member or nonmember of the Consumer Technology Association from manufacturing or selling products not conforming to such Standards, Bulletins or other technical publications, nor shall the existence of such Standards, Bulletins and other technical publications preclude their voluntary use by those other than Consumer Technology Association members, whether the standard is to be used either domestically or internationally.
Standards and Publications are adopted by CTA in accordance with American National Standards Institute (ANSI) patent policy. By such action, neither CTA nor ANSI assumes any liability to any patent owner, nor does either organization assume any obligation whatever to parties adopting the Standard or Publication. CTA and ANSI take no position with respect to the validity of any Essential Patent Claim relating to this standard. Neither CTA nor ANSI is responsible for identifying patents for which a license may be required in order to comply with any CTA or ANS standard.
This document does not purport to address all safety problems associated with its use or all applicable regulatory requirements. It is the responsibility of the user of this document to establish appropriate safety and health practices and to determine the applicability of regulatory limitations before its use. This document is copyrighted by the Consumer Technology Association (CTA)™ and may not be reproduced, in whole or part, without written permission. Federal copyright law prohibits unauthorized reproduction of this document by any means. Organizations may obtain permission to reproduce a limited number of copies by entering into a license agreement. Requests to reproduce text, data, charts, figures or other material should be made to the Consumer Technology Association (CTA)®. (This document was produced by CTA WAVE.)
Published by ©CONSUMER TECHNOLOGY ASSOCIATION 2026 Technology & Standards Department www.cta.tech
All rights reserved
This document outlines a simple means by which every media player can communicate data with each media object request and have it received and processed consistently by every CDN.
This is an approved and published CTA WAVE standard document. All CTA standards are available at CTA.tech/Standards.
Media player clients can convey information to Content Delivery Networks (CDN) with each object request. This information can be useful in log analysis, QoS monitoring and delivery optimization. Session identification allows thousands of individual server log lines to be interpreted as a single user session, leading to a clearer picture of end-user quality of service. Bitrate, buffer and segment signaling allow CDNs to fine-tune and optimize their midgress traffic by intelligently reacting to the time constraints implicit in each request. Prefetch hints allow CDNs to have content ready at the edge ahead of the client request, improving delivery performance. Buffer starvation flags allow performance problems across a multi-CDN delivery surface to be identified in real-time. In combination, this transferred data should improve the quality-of-service offered by CDNs which in turn will improve the quality-of-experience enjoyed by consumers.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC2119 [1].
This document outlines a simple means by which every media player can communicate data with each media object request and have it received and processed consistently by every CDN.
The media client data can be sent by one of three means:
A HTTP request can carry a Common Media Client Data (CMCD) header or a CMCD query arg, but it MUST NOT carry both. The preferred mode of transmission for HTTP requests is to use custom headers.
Note: usage of a custom header from a web browser user-agent will trigger a preflight OPTIONS request before each unique media object request. This will lead to an increased request rate against the server. As a result, for CMCD transmissions from web browser user-agents that require CORS-preflighting per URL, the preferred mode of use is query arguments.
Four headers are defined to transmit the data. The payload key/value pairs are sharded over these headers based upon their expected level of entropy, in order to assist with HPACK/QPACK [2] header compression. The headers begin with the prefix "CMCD-" and have the following case-insensitive names:
CMCD-Request
CMCD-Object
CMCD-Status
CMCD-Session
The query argument is case-sensitive and capitalization MUST be used
CMCD=<URL_encoded_concatenation_of_key_value_pairs><reserved_character>
The reserved character is defined by RFC3986 [3]. This reserved character is optional at the end of the URL.
If the request already bears a query string, then an ampersand Unicode 0x26 character should precede the CMCD field.
{ <key>:<value>, … }
The JSON object must follow the formatting requirements defined by RFC8259 [4]. Key names and values are defined in Table 1.
The data payload for Header and Query Argument transmission consists of a series of key/value pairs constructed according to the following rules:
The reserved keys and their definitions are defined in Table 1 below:
|
Description |
Key Name |
Header Name |
Type & Unit |
Value definition |
|
br |
CMCD-Object |
Integer kbps |
The encoded bitrate of the audio or video object being requested. This may not be known precisely by the player, however it MAY be estimated based upon playlist/manifest declarations. If the playlist declares both peak and average bitrate values, the peak value should be transmitted. |
|
|
bl |
CMCD-Request |
Integer milliseconds |
The buffer length associated with the media object being requested. This value MUST be rounded to the nearest 100 ms. This key SHOULD only be sent with an object type of ‘a’,‘v’ or ‘av’. |
|
|
bs |
CMCD-Status |
Boolean |
Key is included without a value if the buffer was starved at some point between the prior request and this object request, resulting in the player being in a rebuffering state and the video or audio playback being stalled. This key MUST NOT be sent if the buffer was not starved since the prior request. If the object type ‘ot’ key is sent along with this key, then the ‘bs’ key refers to the buffer associated with the particular object type. If no object type is communicated, then the buffer state applies to the current session. |
|
|
cid |
CMCD-Session |
String |
A unique string identifying the current content. Maximum length is 64 characters. This value is consistent across multiple different sessions and devices and is defined and updated at the discretion of the service provider. |
|
|
d |
CMCD-Object |
Integer milliseconds |
The playback duration in milliseconds of the object being requested. If a partial segment is being requested, then this value MUST indicate the playback duration of that part and not that of its parent segment. This value can be an approximation of the estimated duration if the explicit value is not known. |
|
|
dl |
CMCD-Request |
Integer milliseconds |
Deadline from the request time until the first sample of this Segment/Object needs to be available in order to not create a buffer underrun or any other playback problems. This value MUST be rounded to the nearest 100ms. For a playback rate of 1, this may be equivalent to the player’s remaining buffer length. |
|
|
mtp |
CMCD-Request |
Integer kilobits per second (kbps) |
The throughput between client and server, as measured by the client and MUST be rounded to the nearest 100 kbps. This value, however derived, SHOULD be the value that the client is using to make its next Adaptive Bitrate switching decision. If the client is connected to multiple servers concurrently, it must take care to report only the throughput measured against the receiving server. If the client has multiple concurrent connections to the server, then the intent is that this value communicates the aggregate throughput the client sees across all those connections. |
|
|
nor |
CMCD-Request |
String |
Relative path of the next object to be requested. This can be used to trigger pre-fetching by the CDN.This MUST be a path relative to the current request. This string MUST be URLEncoded [5]. The client SHOULD NOT depend upon any pre-fetch action being taken - it is merely a request for such a pre-fetch to take place. |
|
|
nrr |
CMCD-Request |
String of the form "<range-start>-<range-end>" |
If the next request will be a partial object request, then this string denotes the byte range to be requested. If the ‘nor’ field is not set, then the object is assumed to match the object currently being requested. The client SHOULD NOT depend upon any pre-fetch action being taken - it is merely a request for such a pre-fetch to take place. Formatting is similar to the HTTP Range header, except that the unit MUST be ‘byte’, the ‘Range:’ prefix is NOT required and specifying multiple ranges is NOT allowed. Valid combinations are: "<range-start>-" "<range-start>-<range-end>" "-<suffix-length>" |
|
|
ot |
CMCD-Object |
Token - one of [m, a,v,av,i,c,tt,k,o] |
The media type of the current object being requested: m = text file, such as a manifest or playlist a = audio only v = video only av = muxed audio and video i = init segment c = caption or subtitle tt = ISOBMFF timed text track k = cryptographic key, license or certificate. o = other If the object type being requested is unknown, then this key MUST NOT be used. |
|
|
pr |
CMCD-Session |
Decimal |
1 if real-time, 2 if double speed, 0 if not playing. SHOULD only be sent if not equal to 1. |
|
|
rtp |
CMCD-Status |
Integer kilobits per second (kbps) |
The requested maximum throughput that the client considers sufficient for delivery of the asset. Values MUST be rounded to the nearest 100kbps. For example, a client would indicate that the current segment, encoded at 2Mbps, is to be delivered at no more than 10Mbps, by using rtp=10000. Note: This can benefit clients by preventing buffer saturation through over-delivery and can also deliver a community benefit through fair-share delivery. The concept is that each client receives the throughput necessary for great performance, but no more. The CDN may not support the rtp feature. |
|
|
sf |
CMCD-Session |
Token - one of [d,h,s,o] |
The streaming format which defines the current request d = MPEG DASH h = HTTP Live Streaming (HLS) s = Smooth Streaming o = other If the streaming format being requested is unknown, then this key MUST NOT be used. |
|
|
sid |
CMCD-Session |
String |
A GUID identifying the current playback session. A playback session typically ties together segments belonging to a single media asset. Maximum length is 64 characters. It is RECOMMENDED to conform to the UUID specification [7]. |
|
|
st |
CMCD-Session |
Token - one of [v,l] |
v = all segments are available e.g. VOD l = segments become available over time e.g. LIVE |
|
|
su |
CMCD-Request |
Boolean |
Key is included without a value if the object is needed urgently due to startup, seeking or recovery after a buffer-empty event. The media SHOULD not be rendering when this request is made. This key MUST not be sent if it is FALSE. |
|
|
tb |
CMCD-Object |
Integer Kbps |
The highest bitrate rendition in the manifest or playlist that the client is allowed to play, given current codec, licensing and sizing constraints. |
|
|
v |
CMCD-Session |
Integer |
The version of this specification used for interpreting the defined key names and values. If this key is omitted, the client and server MUST interpret the values as being defined by version 1. Client SHOULD omit this field if the version is 1. |
Table 1: Reserved Key and Value definitions
It is RECOMMENDED that a player supply sid on all media object requests in a session, including playlists/manifests, init files, captioning files and DRM key requests. Other keys should be applied where they have contextual meaning. For example, a ‘br’ (bitrate) key on a manifest request is inappropriate and could be omitted.
Note: any caching proxy should be aware that the CMCD payload will be constantly changing and therefore has the potential to pollute cache keys. Implementers may wish to exclude CMCD query arguments from any cache key.
Note: origin servers are advised to not include the CMCD-Request, CMCD-Object, CMCD-Status, CMCD-Session headers in the Vary header [9].
The data transmitted as defined by this specification is passed between a client device and a Content Delivery Network (CDN), as described in Section 2, Data Transmission Modes. Data is exchanged over HTTP/HTTPS during the regular process of a media client requesting content. The HTTP Request Headers and Query Arguments utilized for data transmission are mature and established technologies for data transmission over the web. Transport Layer Security (TLS) can provide confidentiality and integrity for data during transmission.
A malicious client may inject false data. This tactic may be part of replay, message insertion, or modification attacks. If the server-client communication is delivered over HTTP, then man-in-the-middle attacks are feasible. Use of HTTPS for communications mitigates these attacks. All server responses are optional, which aids in server-based protection strategies. The server is not required to take any action upon receiving CMCD data.
Some limited denial-of-service amplification opportunity exists for malicious clients utilizing the next-object-request key. Requiring the next object to be a relative path to the current request, along with the prefetch operation being optional for the server, helps mitigate this amplification.
Privacy concerns resulting from successful eavesdropping and man-in-the-middle attacks in this threat environment indicate the need to strictly limit device-identifiable data. Therefore, fingerprinting opportunities have been minimized; see sections 3.1 and 3.2. Identification confidentiality of content, as described above, is dependent upon protocol-layer protections since the playback client must by definition request playback of specific content pieces to operate.
Defense against malicious content injected via man-in-the-middle, message insertion, or message modification attacks is likewise dependent upon protocol-layer protections. HTTPS is strongly recommended over HTTP, when applicable, for all CMCD data transmissions over the web.
As discussed above, the specification does not expose any security issues that are not already exposed to a client making media object requests or to an edge server which answers all incoming requests. A number of steps have been taken to mitigate specific security and privacy concerns:
- The ‘nor’ key value must be a relative path to the current request. This makes it harder to inject false requests to arbitrary objects.
- Only one object can be requested by the ‘nor’ key value - this lowers amplification opportunity.
- All requests to the server are optionally executed by the server, meaning that a server can ignore them for security concerns (such as a rate-based threshold being exceeded) and still be compliant with the specification.
- Session ID is a GUID which is highly unlikely to repeat for a particular user.
- Measured throughput, requested maximum throughput, deadline and buffer length are bucketed to reduce fingerprinting surface.
- Key-value pairs should be sequenced in alphabetical order to reduce fingerprinting surface.
- Personally Identifiable Information fields, such as IP address, cookie information and location data, are intentionally not carried by the specification.
CMCD-Object:br=3200,d=4004,ot=v,tb=6000
CMCD-Status:bs,rtp=15000
CMCD-Session:sid="6e2fb550-c457-11e9-bb97-0800200c9a66"
CMCD-Session:sid="6e2fb550-c457-11e9-bb97-0800200c9a66"
CMCD-Request:su
CMCD-Session:com.example-myNumericKey=500,com.example-myStringKey="myStringValue"
CMCD-Request:nor="..%2F300kbps%2Fsegment35.m4v"
CMCD-Request:nrr="12323-48763"
CMCD-Request:nor="..%2F300kbps%2Ftrack.m4v",nrr="12323-48763"
CMCD-Object:br=3200,d=4004,ot=v,tb=6000
CMCD-Status:bs,rtp=12000
CMCD-Session:cid="faec5fc2-ac30-11ea-bb37-0242ac130002",pr=1.08,sf=d,sid="6e2fb550-c457-11e9-bb97-0800200c9a66",st=v