StreamAdsPro Logo
StreamAdsProSSAI Platform
SCTE-35

SCTE-35 ad insertion: from marker to advert.

SCTE-35 does not insert anything. It marks the opportunity — a timed message saying a break begins here and lasts this long. Everything between that message and an advert on screen is a separate system making four decisions in sequence, and each one is a place the break can go wrong.

The actual chain

The four decisions between cue and creative

It helps to stop thinking of SCTE-35 as ad insertion and start thinking of it as the first of four steps. Only one of them is the marker. The other three are yours to build or buy, and a break that fails almost always failed at a specific one of them.

  1. 1
    Signal

    The upstream feed emits a splice_info_section: a break starts at this timestamp, for this duration, of this type. This is the only part SCTE-35 does.

  2. 2
    Detect

    Something downstream has to actually see it. The cue arrives as a transport-stream section or as a playlist tag, and whatever reads it must understand the form your packager chose to emit.

  3. 3
    Decide

    What fills the break? A fixed sponsor reel, a house promo, or a call to an ad decision server that returns a creative for this viewer, this region, this moment.

The fourth step is splice: put the chosen content into the stream at the marked point and return cleanly when the break ends. On the server side that means the advert becomes ordinary video segments in the same encode as the programme. On the client side it means telling the player to cut away and come back. Those two produce very different viewer experiences, which is the subject of the SSAI versus CSAI comparison.

Diagnosis by symptom

Where each step actually fails

Symptom you seeThe step that failedWhat to check first
No break at all, everSignal or DetectPull the media playlist and look for CUE-OUT, DATERANGE and OATCLS. If none are present, nothing downstream can act.
Break fires, but seconds early or lateSignal — timingSegment duration and pre-roll. Rounding to the nearest segment boundary explains most sub-ten-second errors exactly.
Break fires on some breaks, not othersDetectCue form drift. A packager can emit DATERANGE for one break type and CUE-OUT for another; a reader configured for one sees half.
Break opens and never closesSignal — pairingA CUE-OUT with no matching CUE-IN. Your insertion system should treat break_duration as a hard timeout so this cannot strand viewers.
Right timing, wrong or blank creativeDecideThe ad decision call: timeout, empty response, no fill. A house-promo fallback turns this from dead air into unsold inventory.
Viewer sees a stall or black frame at the cutSpliceDiscontinuity handling and encode mismatch. If the advert is a different resolution or frame rate, the player has to re-initialise at the seam.
Works in your player, fails on a smart TVSpliceClient-side insertion depends on the playback surface. Server-side does not, which is the main reason channels move to it.
Honest limits

What the marker cannot tell you

🎞️
What to play

SCTE-35 carries no creative and no reference to one. The decision layer is entirely separate and entirely yours.

👤
Who is watching

A cue is a property of the stream, not of a viewer. Per-person targeting has to come from somewhere else — a session, a player, a consent signal.

💰
What the break is worth

The marker says an opportunity exists, not that anyone bought it. Yield lives in the decision layer and in your reporting, not in the signalling.

✅
Whether the advert played

Confirmation is a downstream concern. A cue firing correctly is not evidence that a viewer saw anything.

📐
Whether the encode will match

Nothing in the cue guarantees your advert is the same resolution, frame rate or audio layout as the programme. That mismatch is the usual cause of a visible seam.

🔁
Whether it is the same break twice

Duplicate cues from two hops are common. Deduplicating on event id is your job, and skipping it produces double insertions.

Why breaks drift

A worked example of the timing problem

This is the most reported symptom and it is almost always arithmetic rather than a fault. Suppose the cue asks for a splice at 14:32:10.000 and your packager produces six-second segments starting on the minute.

cue pts_time        -> 14:32:10.000   (the editorial moment)
segment boundaries  -> 14:32:06.000
                       14:32:12.000   <- the splice actually lands here
observed drift      -> +2.000 s

with 2 s segments   -> boundary at 14:32:10.000, drift 0.000 s
with 10 s segments  -> boundary at 14:32:20.000, drift +10.000 s
The cue is honoured; the boundary is not where the cue asked. Nothing here is broken — this is how segmented delivery works.

The drift is bounded by your segment duration and nothing else. That gives you a real lever: shorter segments buy precision at the cost of more requests, more playlist churn and more CDN overhead. If a two-second miss is acceptable for your channel — and for a sponsor overlay it almost always is — the cheapest fix is to stop chasing it.

Where precision genuinely matters, frame-accurate insertion is a different and considerably more expensive pipeline. It is worth being clear about which one your rights agreement actually requires before paying for the second.

Starting without SCTE-35 is a legitimate strategy

Most of the channels we work with in India do not have usable SCTE-35 at all. The upstream feed never carried it, or it did and three hops later it does not. Waiting until the signalling chain is fixed means waiting to monetise, and that wait has no revenue in it.

Schedule-driven insertion is the pragmatic starting point: a spot every ten minutes, a sponsor L-bar for a whole innings, a lower third every quarter. It needs no markers, no ad decision server and no cooperation from whoever runs the feed upstream. When the cues do become reliable, the same pipeline switches from clock to cue without re-plumbing anything — the decision and splice layers do not care where the trigger came from.

If you want to know what your stream actually carries today, send us one live URL. The checks we would run are listed on the SCTE-35 validator page, and the tags we look for are on the HLS manifest page.

Frequently asked questions

What is SCTE-35 ad insertion?+

It is ad insertion driven by markers already present in the stream rather than by a clock. The broadcast feed carries SCTE-35 messages that say a break starts here and lasts this long; an ad insertion system reads those messages, decides what to play, and splices it in at that exact point. The alternative — schedule-driven insertion — ignores the stream and inserts on a timer instead.

Does SCTE-35 insert the advert itself?+

No, and this is the most common misunderstanding. SCTE-35 carries no video, no audio and no creative. It is purely a timed signal that an opportunity exists. Something else — a server-side ad insertion pipeline, an ad decision server, a splicer — has to decide what fills the opportunity and actually put it there.

Can I do SCTE-35 ad insertion without an ad server?+

Yes. An ad decision server is only needed when the creative choice is dynamic — different viewers, different regions, real-time bidding. If you are running a fixed sponsor reel or a house promo, the cue tells you when and your own scheduler decides what. Many regional channels run exactly this way, and it removes an entire vendor from the chain.

Why does my ad start a few seconds late?+

Usually segment-boundary rounding. A splice point can fall anywhere, but an HLS segment is an indivisible unit, so most systems move the actual cut to the nearest segment boundary. With six-second segments your break can land up to six seconds away from where the cue said. Shorter segments reduce the error and increase request overhead; that trade-off is the whole tuning exercise.

What happens if the cue-in never arrives?+

The break stays open. A well-built insertion system treats break_duration from the cue-out as a hard timeout and returns to programme when it expires, precisely so a missing cue-in cannot strand viewers in an advertising state. If your system does not do that, a single dropped tag can take a channel off air for the length of a missing return.

Is SCTE-35 required for server-side ad insertion?+

No. Server-side insertion works from a schedule with no markers at all, which is how most channels we work with start. SCTE-35 becomes worth the complexity when breaks have to land on real editorial moments, or when a rights agreement obliges you to honour the upstream break exactly.

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