Write ad-break markers into a playlist, read the cues that are actually there, and prove the signalling survives every hop between your encoder and the player.
SCTE-35 does not insert the ad. It signals the opportunity. A separate system — an SSAI server, AWS MediaTailor, Amagi — reads the marker and decides what to stitch in.
Cue works on that signal: writing it, reading it back, and checking it is still intact further down the chain.
Everything Cue does is one of these three.
| Mode | Job | Who needs it |
|---|---|---|
| Mark | Write breaks into a playlist from a JSON cue sheet | Content owners preparing VOD / FAST inventory |
| Detect | Read the cues actually present in any playlist or live URL | Anyone debugging a pipeline they did not build |
| Validate | Assert the signalling is correct, paired and decodable | Proving a break works before it goes live |
Marking a file is a solved problem. Finding out where a cue dies between the encoder and the player is not.
Vendors disagree about how to write the same cue. Cue reads all of these on the way in.
| Tag | Emitted by |
|---|---|
| #EXT-X-CUE-OUT / #EXT-X-CUE-IN | almost everything |
| #EXT-X-CUE-OUT-CONT | mid-break continuation |
| #EXT-X-DATERANGE + SCTE35-OUT | Apple HLS spec (RFC 8216) |
| #EXT-OATCLS-SCTE35 | AWS Elemental / MediaPackage |
| #EXT-X-SCTE35:CUE= | older Elemental |
| #EXT-X-SPLICEPOINT-SCTE35 | other packagers |
Check the cues at each stage of a pipeline you did not build.
The hop where the cue count drops is the hop that broke it.
Both the text form and the binary form, because different consumers need different things.
#EXT-X-CUE-OUT:30.000
#EXT-X-DATERANGE:ID="ad-break-1",PLANNED-DURATION=30.000,SCTE35-OUT=0xFC3025...
...break segments...
#EXT-X-CUE-IN#EXT-X-CUE-OUT tells a player a break is starting.
The SCTE35-OUT binary payload is what an SSAI server or MediaTailor actually parses.
Text-only signalling is the single most common reason a break “does not work” downstream.
| Capability | State |
|---|---|
| File / VOD marking | Working |
| Binary splice_insert encode + decode | Working |
| Detection across vendor tag forms, file or URL | Working |
| Validation + audit reporting | Working |
| time_signal + segmentation descriptors | Planned |
| Live manifest proxy (mark a running 24/7 stream) | Planned |
| MPEG-TS binary PID embedding | Planned |
The encoder is dependency-free — pure Python standard library, so it runs on a client’s laptop with nothing installed.
validate exits 0 on pass and 1 on fail, so it gates a CI pipeline.
An SCTE-35 cue is a promise about the future. It says: thirty seconds from now, this stream reaches a point where an advert may be inserted, and that opportunity lasts for a stated duration. It carries no video and no advert — only the timing, an event identifier, and enough structure for a machine downstream to act on it without guessing.
That indirection is the whole point, and also the whole problem. The system that knows when a break happens is usually the playout automation, sitting at the very start of the chain. The system that has to do something about it — an ad server, a stitcher, a packager — sits at the end. Between them are several hops, each of which is entitled to re-segment the stream and rewrite the playlist. A packager that does not recognise a tag will often drop it rather than pass it through, and it will do so silently, because from its point of view nothing went wrong.
So the failure mode is almost never a loud one. The stream plays perfectly, the ad break simply never fires, and the first person to notice is whoever reconciles the delivery report against the booking. By then the inventory is gone. Reading the playlist at each hop, rather than only at the player, is what turns that into a five-minute answer.
This page is the overview. Each of these answers one question properly, with the tags, the failure modes and the checks worth running on your own stream.
What the marker is, what it carries, and the six places it dies between your encoder and your player.
The four steps between a cue arriving and an advert on screen — and which one your break actually failed at.
EXT-X-CUE-OUT, EXT-X-DATERANGE and EXT-OATCLS-SCTE35 compared line by line, with a routine for reading a playlist.
Presence, pairing and payload: the three checks that prove signalling is well formed before a break goes live.
A broadcast standard with agreed meaning versus a container you define yourself, and why most chains carry both.
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.
Send us the hops and we will tell you which one drops the signal.