Skip to content

MSOOCast LLC is opening U.S. operations. We're scheduling launch consultations for FAST, OTT, and IPTV channels now. Book a consultation

Guide

SCTE-35, explained for the people who run channels

SCTE-35 is the standard way to mark ad breaks and program boundaries inside a video stream. This guide covers the parts that matter in practice, using a real, decodable cue as the example.

What SCTE-35 is

SCTE-35 is a standard from the Society of Cable Telecommunications Engineers (SCTE) for cue messages carried inside a video stream. A cue tells downstream systems that something is about to happen at a precise moment: an ad break starts, a program ends, or a blackout applies. The current edition is split into ANSI/SCTE 35-1 for splice and time-based signaling and SCTE 35-2 for event-based signaling. Cues are timed against the stream's 90 kHz presentation clock (PTS), so a splicer can act on the exact frame. That precision is what makes server-side ad insertion look like broadcast instead of a web player loading an ad.

Splice commands

Every cue carries exactly one command. Two of them do almost all of the work in ad insertion.

Splice commands
TypeNameUse
0x00splice_nullHeartbeat or carrier for descriptors with no splice action.
0x04splice_scheduleAnnounces splices by wall-clock time well in advance. Rare in streaming.
0x05splice_insertClassic out-of-network / return-to-network splice with an optional break duration.
0x06time_signalMarks a point in time; segmentation descriptors say what it means. The most common command in modern workflows.
0x07bandwidth_reservationReserves bandwidth in satellite multiplexes; no splice action.
0xFFprivate_commandVendor-defined payloads.

Segmentation types

A segmentation descriptor says what a time_signal means. These are the types you will meet most often in advertising workflows. Starts and ends are paired by segmentation_event_id.

Segmentation types
StartEndNameUse
0x100x11Program start / endProgram boundaries; used for program replacement and blackouts.
0x220x23Break start / endThe whole commercial break, which may contain several ads and placement opportunities.
0x300x31Provider advertisement start / endAn individual ad placed by the content provider (network).
0x320x33Distributor advertisement start / endAn individual ad placed by the distributor.
0x340x35Provider placement opportunity start / endTime the provider makes available for replacement. The usual trigger for SSAI.
0x360x37Distributor placement opportunity start / endTime reserved for the distributor, such as local avails on cable networks.
0x400x41Unscheduled event start / endBreaking news or other unplanned interruptions.
0x500x51Network start / endSwitching between networks on a shared channel.

How cues travel

A cue changes form several times between the automation system and the viewer's device.

How cues travel
StageDetail
Automation to encoderSCTE-104 messages from the playout or automation system ask the encoder to insert a cue at a given time.
MPEG transport streamSCTE-35 sections travel on their own PID, declared in the program map table with stream_type 0x86.
HLS playlistsEXT-X-DATERANGE tags carry the payload in SCTE35-OUT, SCTE35-IN, or SCTE35-CMD attributes (RFC 8216). Older workflows use EXT-X-CUE-OUT / EXT-X-CUE-IN or EXT-OATCLS-SCTE35.
DASH manifests and segmentsEventStream elements in the MPD, or emsg boxes in segments, using the urn:scte:scte35:2013:bin or urn:scte:scte35:2014:xml+bin schemes.

Anatomy of a cue

This is a complete, valid cue: a time_signal opening a two-minute provider placement opportunity. Paste the base64 into any SCTE-35 decoder to check it.

Base64
/DBIAAAAAAAAAP/wBQb+HU13AAAyAjBDVUVJSAAAjn/fAACky4APHHVybjptc29vY2FzdDpicmVhazpoYnItcTItMDM0AQGM0dtv
Decoded cue fields
FieldValueNote
table_id0xFCEvery SCTE-35 section starts here
splice_command_type0x06 time_signalTime-based signal; meaning comes from the descriptor
pts_time5462.400000 s491,616,000 ticks on the 90 kHz clock
segmentation_event_id0x4800008EPairs this start with its end cue
segmentation_type_id0x34Provider Placement Opportunity Start
segmentation_duration120.0 s10,800,000 ticks; the break to fill
segmentation_upidURI (0x0F)urn:msoocast:break:hbr-q2-03
delivery restrictionsweb allowed, no blackoutCleared for streaming in all regions
Stitched HLS playlist
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:910
#EXT-X-PROGRAM-DATE-TIME:2026-10-21T14:02:54.000Z
#EXTINF:6.000,
program/1080p/910.ts
#EXT-X-DATERANGE:ID="4800008e",START-DATE="2026-10-21T14:03:00.000Z",PLANNED-DURATION=120.000,SCTE35-OUT=0xFC304800000000000000FFF00506FE1D4D770000320230435545494800008E7FDF0000A4CB800F1C75726E3A6D736F6F636173743A627265616B3A6862722D71322D30333401018CD1DB6F
#EXT-X-DISCONTINUITY
#EXTINF:6.000,
ads/c7e2/1080p/000.ts
#EXTINF:6.000,
ads/c7e2/1080p/001.ts
# … 18 more ad segments: 4 ads × 30 s
#EXT-X-DISCONTINUITY
#EXTINF:6.000,
program/1080p/931.ts

From cue to stitched break

What Edge Splice does with each cue, in order.

  1. Detect

    Parse the cue from TS, HLS, or DASH and verify its CRC and structure.

  2. Validate

    Check pairing, duration, timing, and delivery restrictions against channel rules.

  3. Decide

    Request a pod for the exact duration from Moment Exchange or your ad server.

  4. Stitch

    Insert conditioned ad segments between discontinuities in each session's playlist.

  5. Report

    Fire impression beacons and write proof of play for the break.

Common cue problems, and how they are handled

Want your current cues checked? Send us a sample stream and we will return a cue report.

Common cue problems
ProblemEffectHandling
Missing return cueThe break never ends and the program does not come back.Edge Splice returns to the program after the signaled duration and logs the missing cue.
Duration does not match the breakAds overrun the program or leave a gap.Pods are built to the signaled duration; gaps are padded with promos or slate, and the mismatch is reported.
Splice point not on a segment boundaryA visible glitch or a frame of the original ad at the splice.Encoders should insert IDR frames and segment breaks at cue points. Edge Splice aligns to the nearest boundary and flags the source.
Duplicate cuesTwo breaks are inserted where one was intended.Cues are de-duplicated by segmentation_event_id within the break window.
PTS wrap or offsetBreaks land at the wrong time after long uptime.pts_adjustment is applied and the 33-bit PTS rollover, about every 26.5 hours, is handled.
Cues stripped upstreamNo breaks at all, and no error either.Monitoring alerts when a channel misses its expected break cadence.

Send us a sample stream

Questions