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.
| Type | Name | Use |
|---|---|---|
| 0x00 | splice_null | Heartbeat or carrier for descriptors with no splice action. |
| 0x04 | splice_schedule | Announces splices by wall-clock time well in advance. Rare in streaming. |
| 0x05 | splice_insert | Classic out-of-network / return-to-network splice with an optional break duration. |
| 0x06 | time_signal | Marks a point in time; segmentation descriptors say what it means. The most common command in modern workflows. |
| 0x07 | bandwidth_reservation | Reserves bandwidth in satellite multiplexes; no splice action. |
| 0xFF | private_command | Vendor-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.
| Start | End | Name | Use |
|---|---|---|---|
| 0x10 | 0x11 | Program start / end | Program boundaries; used for program replacement and blackouts. |
| 0x22 | 0x23 | Break start / end | The whole commercial break, which may contain several ads and placement opportunities. |
| 0x30 | 0x31 | Provider advertisement start / end | An individual ad placed by the content provider (network). |
| 0x32 | 0x33 | Distributor advertisement start / end | An individual ad placed by the distributor. |
| 0x34 | 0x35 | Provider placement opportunity start / end | Time the provider makes available for replacement. The usual trigger for SSAI. |
| 0x36 | 0x37 | Distributor placement opportunity start / end | Time reserved for the distributor, such as local avails on cable networks. |
| 0x40 | 0x41 | Unscheduled event start / end | Breaking news or other unplanned interruptions. |
| 0x50 | 0x51 | Network start / end | Switching between networks on a shared channel. |
How cues travel
A cue changes form several times between the automation system and the viewer's device.
| Stage | Detail |
|---|---|
| Automation to encoder | SCTE-104 messages from the playout or automation system ask the encoder to insert a cue at a given time. |
| MPEG transport stream | SCTE-35 sections travel on their own PID, declared in the program map table with stream_type 0x86. |
| HLS playlists | EXT-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 segments | EventStream 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.
/DBIAAAAAAAAAP/wBQb+HU13AAAyAjBDVUVJSAAAjn/fAACky4APHHVybjptc29vY2FzdDpicmVhazpoYnItcTItMDM0AQGM0dtv| Field | Value | Note |
|---|---|---|
| table_id | 0xFC | Every SCTE-35 section starts here |
| splice_command_type | 0x06 time_signal | Time-based signal; meaning comes from the descriptor |
| pts_time | 5462.400000 s | 491,616,000 ticks on the 90 kHz clock |
| segmentation_event_id | 0x4800008E | Pairs this start with its end cue |
| segmentation_type_id | 0x34 | Provider Placement Opportunity Start |
| segmentation_duration | 120.0 s | 10,800,000 ticks; the break to fill |
| segmentation_upid | URI (0x0F) | urn:msoocast:break:hbr-q2-03 |
| delivery restrictions | web allowed, no blackout | Cleared for streaming in all regions |
#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.tsFrom cue to stitched break
What Edge Splice does with each cue, in order.
Detect
Parse the cue from TS, HLS, or DASH and verify its CRC and structure.
Validate
Check pairing, duration, timing, and delivery restrictions against channel rules.
Decide
Request a pod for the exact duration from Moment Exchange or your ad server.
Stitch
Insert conditioned ad segments between discontinuities in each session's playlist.
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.
| Problem | Effect | Handling |
|---|---|---|
| Missing return cue | The 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 break | Ads 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 boundary | A 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 cues | Two breaks are inserted where one was intended. | Cues are de-duplicated by segmentation_event_id within the break window. |
| PTS wrap or offset | Breaks 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 upstream | No breaks at all, and no error either. | Monitoring alerts when a channel misses its expected break cadence. |