SCTE-35 is the standard way to mark ad breaks inside a live video stream. A small message travels with the video and says, in effect, “a break starts now and lasts two minutes”. FAST platforms such as The Roku Channel, Samsung TV Plus and Pluto TV read those markers and put their own ads into the gap. A channel without them usually has no breaks for the platform to sell.
The marker doesn’t pick the ads or insert them. It only says where the break is and how long it lasts. The platform’s ad system does the rest.

What an SCTE-35 marker says
The standard is ANSI/SCTE 35, the Digital Program Insertion Cueing Message, published by SCTE. Its latest edition is numbered SCTE 35-1, next to a newer Part 2. It defines the messages and how they ride along with the video. It says nothing about which ads to play.
Most ad breaks use one of two commands:
| splice_insert | time_signal | |
|---|---|---|
| Command type | 5 | 6 |
| What it says | Leave the program now, or at this frame, for this long | Something happens at this frame. A descriptor says what |
| What carries the meaning | Its own fields: out of network, duration, auto return | A segmentation descriptor, such as Provider Placement Opportunity Start |
| Where you see it | Simple ad breaks, and many FAST channels | Richer schedules: program starts, chapters, blackouts |
A splice_insert for an ad break carries a few fields that matter:
- out_of_network_indicator: 1 means leave the program for a break, 0 means come back.
- splice_event_id: a number for this break, so its start and end can be matched.
- splice_immediate_flag or pts_time: start the break now, or at an exact frame on the stream’s own clock.
- break_duration: how long the break lasts, in ticks of a 90,000-per-second clock. Thirty seconds is 2,700,000 ticks.
- auto_return: 1 means the program comes back by itself when the time is up, with no second message.
A real SCTE-35 cue, decoded
Unified Streaming runs a public demo stream with SCTE-35 breaks in it. On November 4, 2026 its playlist marked a 38.4 second break about every two minutes. Here is one of those cues, and what its bytes mean.

That’s the simplest form a break can take, and a common one. Google’s Live Stream API uses the same flags in its own example: out of network, immediate, with a duration and auto return.
How the marker travels
In an MPEG-TS stream, the format broadcasters send, SCTE-35 has its own track. It sits on a separate PID with stream type 0x86, and the program is tagged with the registration code CUEI so receivers know to look for it.
When the stream is turned into HLS for apps and players, the packager writes the cue into the playlist. RFC 8216 defines an EXT-X-DATERANGE tag with SCTE35-OUT and SCTE35-IN attributes for this. In practice the older EXT-X-CUE-OUT and EXT-X-CUE-IN tags are still the ones you see most. AWS calls them “the most common” type of ad marker. The demo above writes both.

The service in the middle is usually called SSAI, server-side ad insertion. It reads each cue, asks an ad server what to play, and stitches the ads into the stream for each viewer. AWS Elemental MediaTailor, Google Ad Manager’s Dynamic Ad Insertion and the distribution partners behind most FAST channels, such as Amagi and Wurl, all work this way.
Why FAST channels need SCTE-35
FAST stands for free ad-supported streaming TV: linear channels in apps like The Roku Channel, Samsung TV Plus, Tubi and Pluto TV. Viewers don’t pay, so the ads are the business, and the platform needs to know where it can put them.

Channels that come from cable often have breaks that don’t fit. Cable breaks are long and placed for cable advertisers. NDTV put it plainly when it started reshaping its breaks for FAST with Amagi:
What Roku asks for
Most FAST platforms keep their delivery specs private and share them with partners. Roku publishes its live linear ingest spec, so it’s the clearest public example of what a FAST channel must deliver. Version 3.4, updated October 26, 2026, asks for:
| Requirement | Roku’s spec |
|---|---|
| Ad markers | SCTE-35 in the stream. splice_insert preferred, with a start, a duration and out of network set to true |
| Other markers | time_signal with a segmentation descriptor, type 0x22, 0x30, 0x32, 0x34 or 0x36 |
| Ad load | 8 minutes an hour in 2 minute pods. Kids channels: 6 minutes in 90 second pods |
| Video | MPEG-TS, H.264 at 1080p preferred, constant bitrate, at least 12 Mbps for HD |
| Delivery | AWS MediaConnect, Zixi, SRT, RTP with FEC, or RTMP push |
| Program guide | 8 days, in blocks of at least 15 minutes |
| Who delivers | One of Roku’s Linear Certified Partners, such as Amagi, Wurl or Frequency |
The last row matters most. You don’t send a channel to Roku yourself. A certified partner takes your stream, checks the markers, builds the guide and delivers it.
Where markers get lost
A cue only works if it survives every step between your playout and the ad system. These are the usual places it disappears.

FFmpeg is the most common trap. It can read SCTE-35 from a stream, but it doesn’t write it back into MPEG-TS, so a copy or a transcode drops it. On the FFmpeg mailing list, LTN Global engineer Devin Heitmueller answered the question this way:
Timing is the other one. Some ad systems want the cue several seconds before the break, and in all quality versions of the stream. Equativ’s spec, for example, asks for at least five seconds of warning.
SCTE-35 and YouTube
YouTube doesn’t use SCTE-35 for live ads. It has its own system. A cuepoint API starts an ad break, 30 seconds long unless you set a length. Automatic midrolls are placed by YouTube or run on a schedule, every 6 to 30 minutes. So a 24/7 channel on YouTube needs cuepoints or midroll settings, not markers in the stream.
SCTE-35 with Upstream
Upstream runs your channel from the cloud, 24/7 or on a schedule, from the videos you upload. You place ad breaks as markers in the playlist: at a set time inside a video, on a repeating timer, or after a set number of videos. Each break can be 5 to 300 seconds long, and can play a sting or slate video too.
On YouTube, those markers start a YouTube ad break through YouTube’s own API, and you can turn on automatic midrolls next to them. For broadcasters, our team sets up an MPEG-TS output over SRT as a managed setup on cloud playout. It carries the SCTE-35 track, EIT now and next, and SDT service names. The markers then go out as an immediate splice_insert with a break duration and auto return, the form Roku’s public spec lists as its preferred marker.
Upstream isn’t an ad server or an SSAI service, and it doesn’t deliver to Roku itself. It gives your certified partner a channel with the breaks already marked. Start free with 24 streaming hours a month to build the playlist, then talk to our team about the managed setup.
SCTE-35: FAQ
What does SCTE stand for?
The Society of Cable Telecommunications Engineers, the standards body that publishes SCTE-35. The full name of the standard is the Digital Program Insertion Cueing Message.
What is the difference between SCTE-35 and SCTE-104?
SCTE-104 is how broadcast automation tells an encoder about a break, over SDI or the network. The encoder turns it into SCTE-35, which travels inside the stream to the next system.
Does SCTE-35 insert the ads?
No. It only marks where a break starts and how long it lasts. An ad server picks the ads, and an SSAI service stitches them into the stream.
Can FFmpeg add SCTE-35 markers?
Not to an MPEG-TS output. FFmpeg can read SCTE-35, but it doesn’t write it, and a copy drops it. Broadcast tools such as TSDuck, packagers and playout systems add the markers instead.
Do I need SCTE-35 for a YouTube channel?
No. YouTube places live ads with its own cuepoint API and automatic midrolls. SCTE-35 matters when you deliver to FAST platforms and other broadcast systems.
Sources
- SCTE: ANSI/SCTE 35-1, Digital Program Insertion Cueing Message
- Carriage: RFC 8216 (section 4.3.2.7.1), AWS MediaTailor HLS ad markers, Google Cloud Live Stream ad break markers and Google Ad Manager live ad break encoding
- Platforms: Roku live linear ingest specification (version 3.4), Equativ SSAI live ad markers, YouTube’s cuepoint API and live midrolls
- FFmpeg: the MPEG-TS demuxer and the ffmpeg-user thread
- Figures: Samsung TV Plus, Tubi, The Roku Channel and Amagi
- The decoded cue: Unified Streaming’s public SCTE-35 demo, fetched November 4, 2026



