The questions come from real launches and are grouped by topic. If your question isn't here, open a ticket.
General
Why is SSAI better than client-side insertion (CSAI)?
Ads are part of the stream, so ad blockers don't see them (on the web they cut about 30% of CSAI ads). There's no stream break between content and ads, quality and loudness are the same, and you don't have to maintain an SDK for every platform. Comparison — How SSAI.TV works.
Do we need to change the player?
No. The integration happens at the stream delivery level: the player receives ordinary HLS/DASH. It only needs to handle #EXT-X-DISCONTINUITY correctly at ad boundaries. Overlays and client-side tracking need a small amount of work — Overlays (SSAI Overlay), Client Side Tracking.
Which ad server is supported? Do we need our own ad platform?
Your own platform isn't required: the solution includes an ad server/DSP where your team creates campaigns (dates, impressions or budget, targeting, frequency) and uploads videos — SSAI.TV does the rest. If you already have an ad server, we connect any that returns VAST 3+ and allows server-to-server requests, including Google Ad Manager / GAM 360 — Technical requirements for ad servers, Setting up Google Ad Manager for SSAI.TV. Several ad servers can be chained in a waterfall. How to set up campaigns — Ad server campaigns for SSAI.
Is MPEG-DASH supported?
Yes. The main scenario is HLS; DASH is connected per separate recommendations (the ad break is delivered as a separate Period). HLS and DASH often coexist: DASH/Widevine — Smart TVs, Android, web; HLS/FairPlay — Apple devices. You can start with the protocol that dominates your audience and add the other later — until then those viewers see the original stream without insertions.
What are the HLS requirements?
- Audio and video in the same segment (muxed). Separate audio tracks in the master playlist (demuxed renditions) aren't supported for SSAI — the player can't take audio for the ad. The way out: a single track or CMAF muxed.
RESOLUTIONin the master playlist inWIDTHxHEIGHTformat (e.g.1920x1080), both values even.- SCTE-35 markers in every sub-manifest — Marker requirements in HLS.
Does stitching affect quality and latency?
No. The client still receives playlist segments gradually — some segments simply point to ads. Content and ads are served from the same OTT cache servers. Live latency is determined by the protocol (HLS/DASH) and the platform's CDN: different viewers of one channel naturally have different latency.
What about DRM?
SSAI works with the manifest and doesn't touch the content, so DRM on the content doesn't interfere. Ad segments are served unencrypted; the player must switch correctly between encrypted and unencrypted segments. If you use secure links or tokens in segment URLs, pass them in the request to SSAI so the links in the playlist keep working.
Does it work with VOD and catch-up?
Yes. In VOD, breaks are placed from the CMS media plan, by ad rules (VMAP) or at content joints — pre-rolls, mid-rolls, post-rolls. For catch-up (archive, pause, start over), ads are inserted the same way as in live if the recording keeps SCTE-35 markers (TS format, not MP4) and the recording's playlist request goes through SSAI. An archive stored in MP4 has no markers — a pre-roll at start suits it.
How do ads work in FAST channels?
FAST is a monetization model; technically it's an ordinary live channel. If the playout builds the channel from a VOD library, the playout places the markers: usually a pre-roll at the start of an episode and mid-rolls every 15 minutes. The Adaptek playout delivers ready HLS with markers — Adaptek playout — API and HLS delivery.
SCTE-35 markers
What are CUE-OUT and CUE-IN?
CUE-OUT — leaving the programme for the ad (break start, contains the duration). CUE-IN — returning to the programme. In an SCTE-35 splice_insert marker this is the out_of_network_flag: true — start, false — return.
What should the channel do?
- Send SCTE-35 markers on a separate PID in the transport stream, with the exact break duration.
- Place the marker on a keyframe (IDR) at a content joint, not "by timer" in the middle of a scene.
- Have "advertising" bumpers and place markers inside them — then segmentation error falls on the bumper.
Parameters — SCTE-35 markers on the channel, launch order — Channel launch — checklist.
Where do markers come from and why might they be missing in HLS?
A marker travels the chain: channel playout (SCTE-104 in SDI) → encoder (SCTE-35 on a separate PID) → distributor or teleport → OTT transcoder and packager → HLS/DASH → SSAI. Any link can drop it. If the stream doesn't even have the marker PID, an intermediate link stripped it — request the "version with markers". If the PID is there but the playlist has no markers, HLS marking (SCTE-35 passthrough / manifest decoration) isn't enabled in the OTT packager.
The channel has several marker PIDs. Which one to use?
The rights holder may split markers: some for linear ads, others for dynamic ones. SSAI uses only the agreed PID of dynamic breaks; other breaks must not be replaced. The OTT should keep only that PID in the stream for SSAI. It's better to filter markers once, upstream in the chain, than in a non-standard way at every OTT.
Is a marker without duration a problem?
Yes. The duration in CUE-OUT defines how many ads to pick: by the time the closing marker arrives, the break is over. If the channel can't send a duration, you can agree on a fixed break length — SSAI will substitute it. In the OTT packager, choose to end such breaks "by the closing marker", not "by duration".
Do tone signals or QR-code markers work?
Only as an intermediate step. SSAI works with SCTE-35 in the playlist: tone signals (DTMF), QR codes in the frame and the like must first be converted into SCTE-35 by the playout or a partner — before packaging, because the packager cuts segments at the marker when it meets SCTE-35. Recognizing video at every OTT is unreliable.
How do we check that markers are present?
- In the transport stream:
ffprobe <url>— the stream list should includeData: scte_35. RTMP has no separate PMT table; markers go on a separate data track. - In the playlist:
#EXT-X-CUE-OUT,#EXT-X-DATERANGE,#EXT-OATCLS-SCTE35tags and so on — Marker formats in HLS. - In the SSAI.TV account, each source shows the caught markers and a status: no markers for over 4 hours or insertions impossible — red; markers lack tags but insertions are possible — yellow.
Markers may be rare on a channel — for testing, ask the channel for a marker schedule several days ahead.
Can ads be inserted without markers?
In live — only forcibly on a schedule (for example, to test players), and the content is cut regardless of the plot. For VOD — pre-rolls and mid-rolls by duration or at content joints. SSAI doesn't insert ads "by the broadcast grid" or cue sheet — only by markers.
OTT integration
What's needed from the OTT platform?
HLS (or DASH) with markers, reachable by SSAI.TV servers, and the SSAI playlist link for viewers instead of the original one. The viewer's IP, User-Agent and unique device ID are passed along with the playlist request — without them geo, frequency and reach don't work. Step by step — Integration spec for OTT platforms.
What does the stream link with ads look like?
https://<host>/out/<key>/master.m3u8?uid={user_ID}&cdn={your_CDN} — uid is mandatory, without it no ads are selected; cdn is substituted into content links. For catch-up — .../vod/<key>/master.m3u8?src={recording_url}. The host can be your own domain (CNAME) with SSAI.TV behind it.
Why cache ads on our CDN?
Under real load, ad segments must be served from the operator's CDN, just like content: https://<your-cdn>/creatives/* → https://cdn.ssai.tv/creatives/*, cached for up to 7 days. If creatives are fetched for each viewer separately, freezes before ads are possible. Playlists aren't cached — they're personal. Details — CDN — requirements for SSAI.
Which domains should we whitelist?
The second-level domain *.ssai.tv — specific subdomains may change. Your manager will provide the IP addresses of the servers that fetch your origin.
What happens if SSAI.TV is unavailable?
The OTT switches the viewer to the original stream without ads — at session start, if no playlist was received from SSAI. Switching a viewer mid-session isn't a good idea: the playlists have different segment numbering, and the player may freeze.
We redirect the playlist through our CDN. What should we watch for?
- SSAI's requests for the original playlist must not be redirected back to SSAI, otherwise an infinite loop appears. Use a separate domain for the origin or a request parameter.
- Don't hardcode a single SSAI domain or a single CDN node — they can change.
- Pass the headers: IP (
X-Forwarded-For/X-Real-IP), User-Agent and device ID. - The simplest scheme: the player gets the SSAI link directly and pulls segments from your CDN.
Ads and filling the break
What if there aren't enough ads for the whole break?
The remainder is filled with a filler agreed with the channel. If ads are below the fillfloor threshold (50% of the break duration by default, configurable per channel), there's no insertion — the original programme runs. Long breaks (3 minutes and more) need several campaigns or placeholders, otherwise the break will rarely reach the threshold.
What should the filler be like?
Plotless and no shorter than 60 s — it's cut to the break remainder at an arbitrary point. A plot-driven video as a filler annoys viewers. An alternative is a set of promos of 1, 2, 3, 5, 10, 15, 20, 30 s. Evergreen promos are set up in the system and go only at the end of the break; time-limited ones the channel sets up as ordinary campaigns.
How do we mark promos and public service ads?
Add the promo_ prefix to the creative name. Such videos don't get the "advertising" caption, aren't billed and are counted separately from commercial ones.
Who overlays the channel logo and the "advertising" caption?
SSAI.TV, automatically: on ads — the logo and "advertising", on promos and fillers — only the logo. If the channel delivers promos with the logo already on, we turn overlaying off for them. The channel provides its rules (graphics, loudness normalization) and the materials for them.
Why doesn't a break contain two videos from one campaign?
That's how DSPs work: only one winner per campaign gets into an ad break, to leave room for other advertisers. Several creatives in one profile (line item) will never end up in the same break. The same creative can win twice if it's in two different campaigns.
When will a new creative go on air?
After the ad server's first response with a new creative, SSAI.TV downloads, transcodes and checks it — that break runs without it. Subsequent responses are already inserted. How long this takes depends on the frequency of real breaks and viewer requests.
The ad is louder than the content. What should we do?
Creative loudness is normalized automatically per EBU R 128. If a particular video stands out, tell us its name: the creative will be re-transcoded, and the new version will appear in the next breaks. Requirements — Ad creative requirements.
Can we target a specific programme or genre?
Yes, if the OTT passes the programme ID, genre or title in every request. SSAI.TV sets the channel genre itself. Adult/children's audience, paid/free subscriber and personalization consent signals work the same way: for example, age-restricted videos are shown only to devices with confirmed age. A programme ≠ a channel: programmes air at unpredictable times, so a signal in the request is what's needed.
Why doesn't a tester see ads on a production channel?
Targeting and frequency work in production: the tester may have used up the impression limit or not be in the target group. The "counter" can only be reset with another device. On test channels creatives are served unconditionally. Also, the channel must be turned on before the break starts: a viewer who joined mid-break sees the programme without insertion.
Statistics and tracking
What metrics does the account have?
Inventory (person-breaks and their duration), impressions (count and seconds), fill rate, reach. Definitions, reports, CSV and API — Statistics and reporting.
Why don't the data match the TV broadcast?
HLS has a latency of up to several minutes, and the viewer can pause or rewind. Each viewer's impression time is different, so a "broadcast second" makes no sense for OTT — reporting is aggregated by hour.
How do we connect a third-party measurement vendor?
Add the vendor's tracking pixel to the VAST (in the ad server campaign) — SSAI.TV fires all impression trackers from the VAST server-side, passing the viewer's IP, User-Agent and ID via macros. The tracker domain must be whitelisted in advance. VPAID and client-side measurement scripts don't work in CTV. If the vendor needs calls from the device itself — Client Side Tracking.
Can we sell through Google programmatic?
Yes, with the PAL SDK in the app: PAL creates a session that SSAI.TV passes into the request to Google — Google PAL SDK for SSAI. Google doesn't accept server-side calls without client-side validation. Access to AdX without your own contract with Google — through an MCM partnership: GAM 360 · MCM with Adaptek.
Interactivity
Is interactive advertising (SIMID) supported?
Yes, in a hybrid scheme: the server stitches the video, and the app draws the interactive layer over the stream. SSAI.TV passes the app each ad's metadata: ID, start and duration within the break, tracking URLs, a link to the interactive file. For devices without SIMID support, the creative has a QR code or an end card. Details — Interactive creatives (SIMID).
Can we show overlays?
Yes. The client draws the overlay on a signal from SSAI.TV, so it doesn't overlap ad breaks — Overlays (SSAI Overlay).