StreamAdsPro Logo
StreamAdsProSSAI Platform
Reference

SCTE-35 in an HLS manifest: the tags, line by line.

By the time a cue reaches a player it is no longer a binary section in a transport stream — it is a handful of text tags in a media playlist. There are three common forms, they are not interchangeable, and knowing which one you have is usually the difference between a five-minute fix and a week of guessing.

Master versus media

First: you are probably reading the wrong file

The single most common wasted hour in SCTE-35 debugging is spent searching a master playlist for cues. The master lists variants — resolutions, bandwidths, codecs — and has no timeline at all. Markers live on a timeline, so they live in the media playlists the master points at, one per variant.

# master.m3u8  -  NO CUES LIVE HERE
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2400000,RESOLUTION=1280x720
720p/index.m3u8          <- open this one
#EXT-X-STREAM-INF:BANDWIDTH=980000,RESOLUTION=854x480
480p/index.m3u8
Synthetic. The master has no cues and never will; open one of the variant URLs it lists.

A second consequence follows from this and catches people out: cues have to be present in every variant, because a viewer whose bandwidth drops mid-break switches playlist and needs the markers to exist on the other side. A packager that marks only the top rendition produces breaks that work until the network hiccups.

The common convention

Form one — EXT-X-CUE-OUT and EXT-X-CUE-IN

Not part of the HLS specification, and nonetheless the form you are most likely to meet. The value on the CUE-OUT is the break duration in seconds; the CUE-IN closes it and carries nothing.

#EXTINF:6.000,
segment_140.ts
#EXT-X-CUE-OUT:30.000
#EXTINF:6.000,
segment_141.ts
#EXTINF:6.000,
segment_142.ts
#EXTINF:6.000,
segment_143.ts
#EXTINF:6.000,
segment_144.ts
#EXTINF:6.000,
segment_145.ts
#EXT-X-CUE-IN
#EXTINF:6.000,
segment_146.ts
Synthetic media playlist excerpt. The break opens, five six-second segments elapse, the break closes.

Its virtue is that almost everything understands it. Its cost is that the original binary message is gone: you know a thirty-second break started, but not its event id, not its segmentation type, not whether you were permitted to replace it. For a channel inserting its own sponsor content that is usually enough. For one honouring an upstream rights agreement, it is not.

The standardised tag

Form two — EXT-X-DATERANGE

Defined in the HLS specification, and the only form that carries the raw SCTE-35 payload alongside a real wall-clock anchor. Where CUE-OUT summarises, DATERANGE preserves.

#EXT-X-DATERANGE:ID="break-7",
  START-DATE="2026-09-07T14:32:10.000Z",
  PLANNED-DURATION=30.0,
  SCTE35-OUT=0xFC302F...

#EXT-X-DATERANGE:ID="break-7",
  START-DATE="2026-09-07T14:32:40.000Z",
  SCTE35-IN=0xFC302F...
Synthetic. START-DATE is ISO 8601 UTC; SCTE35-OUT carries the hex splice_info_section, truncated here.
AttributeWhat it carriesWhy you care
IDA unique identifier for this rangeThe out and the in share it. Duplicate ids across hops are how double insertions happen.
START-DATEISO 8601 wall-clock startAnchors the break to real time rather than to a media offset, which matters for scheduling and reconciliation.
DURATIONActual elapsed duration, once knownWritten after the fact. Absent on a live break that has not closed yet.
PLANNED-DURATIONExpected duration at the time of signallingWhat you sell against, and the value to compare with the decoded break_duration.
SCTE35-OUT / SCTE35-INThe raw splice_info_section, hex encodedThe full original message. Decode it and you recover everything the CUE-OUT form threw away.
The vendor hybrid

Form three — EXT-OATCLS-SCTE35

A pragmatic middle ground that several commercial packagers emit: the base64 payload on its own line, immediately before the CUE-OUT it describes. You get player-friendly tags and the decodable original in the same playlist.

#EXT-OATCLS-SCTE35:/DA0AAAAAAAAA...
#EXT-X-CUE-OUT:30.000
#EXTINF:6.000,
segment_141.ts
Synthetic. The base64 line belongs to the CUE-OUT directly beneath it.

If your chain emits this, prefer it as your source of truth over the CUE-OUT value beside it. When the two disagree — and they do — the payload is the message the encoder actually sent and the tag is a summary something downstream wrote.

A practical routine

Reading a manifest, in order

When a break has misfired and you have a playlist in front of you, this order finds the answer fastest, because each step is cheaper than the one after it.

StepLook forWhat a negative answer means
1Are you in a media playlist, not the master?Nothing else on this list is meaningful until you are.
2Any of CUE-OUT, DATERANGE or OATCLS present?The cue did not survive the chain. The problem is upstream of your player, not in it.
3Does every out have an in?An open break. Check whether your insertion layer enforces a duration timeout.
4Do the EXTINF durations between them sum to the declared break?A drift you can now quantify instead of guess at.
5Is the same cue present in every variant?Breaks that work until a viewer changes rendition mid-break.
6Does the payload decode, and does it agree with the tags?Two systems in your chain are reading different values from the same cue.

Those six questions are what our own validator automates — the validator page shows the report it produces. If you would rather not run anything, send one playlist URL and we will answer all six for you, or read SCTE-35 ad insertion for what happens after the tags are correct.

Frequently asked questions

Where does SCTE-35 appear in an HLS manifest?+

In the media playlist, never in the master. The master playlist lists variants and bandwidths; it carries no timeline and therefore no cues. If you are looking for markers in the file that contains EXT-X-STREAM-INF, you are reading the wrong file. Open one of the variant playlists it points at.

What is EXT-X-CUE-OUT?+

It is the widely deployed convention for marking the start of an ad break in an HLS media playlist, carrying the break duration in seconds as its value. It is not part of the core HLS specification — it is a de facto standard that almost every packager and player understands, which is precisely why it is the most common form you will encounter.

What is the difference between EXT-X-CUE-OUT and EXT-X-DATERANGE?+

EXT-X-DATERANGE is the standardised tag defined in the HLS specification, and it can carry the raw SCTE-35 payload in its SCTE35-OUT and SCTE35-IN attributes alongside a wall-clock start date and a duration. EXT-X-CUE-OUT is the older convention: simpler, more widely supported by players, but it carries only the duration and loses the binary message. Many packagers emit both, which is the safest thing they can do.

What is EXT-OATCLS-SCTE35?+

A vendor-originated tag that carries the base64-encoded splice_info_section on the line immediately before the CUE-OUT it belongs to. It originated with one packager family and spread because it preserves the full binary message in a chain that otherwise only carries a duration. If you see it, you can decode the payload even when the surrounding tags have thrown detail away.

Do I need EXT-X-DISCONTINUITY around an ad break?+

Only if the media on either side of the splice genuinely differs — a different encode, a reset timeline, a different codec configuration. Server-side insertion that re-encodes the advert to match the programme does not need one and is better without it, because every discontinuity is a point at which a player may re-initialise its decoder and stall.

Why can my player see the segments but not the cue?+

Because playing video and reading markers are different capabilities. Most players ignore unknown tags by design — that is what makes HLS extensible. A player that plays your stream perfectly may have no cue handling at all, or may implement DATERANGE and not CUE-OUT. The tag can be present and correct and still have no effect.

Free, no account

Send us your HLS stream URL. We will show you where the SCTE-35 cue is lost.

You get a plain report: which cues are present, whether every break opens and closes, whether the durations agree, and the first hop where the signal disappears. One URL, one working day, and no obligation to buy anything.

Neeraj Mishra, founder of StreamAdsPro
Neeraj Mishra Founder

Video-technology engineer in Thane, India. Send me one live stream URL and I will run a free test on your own feed. You get my reply within one working day (IST), from the person who builds it, not a sales queue.

Bring us your stream.

Send us one live URL and what you want on it. We will put a demo on your own feed before you commit to anything.

© 2026 StreamAdsPro · Made in India 🇮🇳 · DPIIT-recognised · Udyam registered
streamadspro@gmail.comContact us
WhatsApp