SSAI Integration: Server-Side Ad Insertion
LtvAdx SSAI stitches ads directly into your HLS or DASH stream before the player receives the manifest. No client-side SDK required — ads are indistinguishable from content segments, eliminating ad blockers and reducing buffering.
SSAI vs client-side VAST
| Feature | SSAI (this guide) | Client-side VAST |
|---|---|---|
| Ad blocker bypass | ✅ Yes — ads stitched into stream | ❌ No — tag fetched by client |
| Buffering at break | ✅ Seamless — no buffer event | ⚠️ Possible — player fetches tag |
| Tracking accuracy | ✅ Server-confirmed delivery | ✅ Client fires beacons |
| Companion ads | ⚠️ Limited | ✅ Full companion support |
| Interactive ads (SIMID) | ❌ Not supported | ✅ Full SIMID support |
| Setup complexity | ⚠️ Moderate (session per viewer) | ✅ Simple URL in player |
How SSAI works in LtvAdx
- Session creation — Your origin server (or the CTV app at stream start) calls the LtvAdx SSAI session endpoint with the publisher manifest URL, channel ID, and HouseholdID. LtvAdx returns a stitched manifest URL unique to this viewer session.
- Player setup — The CTV player loads the stitched manifest URL instead of the origin manifest.
- Break detection — When LtvAdx encounters a SCTE-35 cue point in the origin manifest, it runs the waterfall auction and splices the winning creative segments into the manifest stream.
- Tracking — LtvAdx fires all VAST quartile beacons server-side as segments are delivered. No client-side beacon calls required.
SCTE-35 cue requirement
Your origin HLS/DASH stream must include SCTE-35 ad cue markers (#EXT-X-CUE-OUT / #EXT-X-CUE-IN in HLS) for LtvAdx to detect break boundaries. Optionally, configure break offsets by time in the dashboard as a fallback.
Step 1 — Enable SSAI on your channel
In the dashboard, go to Publisher Portal → Channels & Apps → [your channel] → Ad Config. Toggle SSAI Enabled on. Save and publish your configuration.
Step 2 — Create an SSAI session
Call the session creation endpoint at the start of each viewer session. This is typically done server-side (to protect your manifest URL) or from the CTV app at stream initialisation:
# Create SSAI session
GET https://ads.ltvadx.com/ssai/session/create
?publisherManifestUrl=https%3A%2F%2Fstream.yourdomain.com%2Flive.m3u8
&channelId=chan_fast_news_01
&householdId=hh_a1b2c3
&platform=ROKU
&ifa=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# 200 Response
{
"sessionId": "sess_xyz789abc",
"stitchedManifestUrl": "https://ads.ltvadx.com/ssai/hls/sess_xyz789abc/manifest.m3u8",
"expiresAt": "2026-06-03T21:00:00Z"
}Session TTL
SSAI sessions expire after 6 hours of inactivity or when the stream ends. Create a new session on each playback start — do not cache and reuse sessions across viewers or sessions, as this breaks per-viewer frequency capping and targeting.
Step 3 — Point the player at the stitched manifest
Return the stitchedManifestUrl to the CTV player. The player loads it exactly like a normal HLS/DASH manifest. The URL is opaque to the player — it does not need to know it is stitched:
# Stitched HLS manifest (player loads this URL) https://ads.ltvadx.com/ssai/hls/sess_xyz789abc/manifest.m3u8 # Manifest content — ads appear as additional segments: #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 # Content segment #EXTINF:8.008, https://origin.yourdomain.com/seg001.ts # SCTE-35 break detected — ad pod starts #EXT-X-DISCONTINUITY #EXT-X-DATERANGE:ID="ltv-1",CLASS="com.ltvadx.ad",START-DATE="2026-06-03T20:30:05Z",DURATION=30 #EXTINF:15.0, https://cdn.ltvadx.com/ads/creative_abc_p1.ts ← stitched ad segment 1 #EXTINF:15.0, https://cdn.ltvadx.com/ads/creative_abc_p2.ts ← stitched ad segment 2 # Ad pod ends — content resumes #EXT-X-DISCONTINUITY #EXTINF:8.008, https://origin.yourdomain.com/seg002.ts
Step 4 — DASH integration
For DASH streams, LtvAdx stitches via the same session model but returns an MPD manifest URL:
# DASH session creation
GET https://ads.ltvadx.com/ssai/session/create
?publisherManifestUrl=https%3A%2F%2Fstream.yourdomain.com%2Flive.mpd
&channelId=chan_fast_news_01
&householdId=hh_a1b2c3
&manifestType=DASH
# Response
{
"sessionId": "sess_dash_abc",
"stitchedManifestUrl": "https://ads.ltvadx.com/ssai/dash/sess_dash_abc/manifest.mpd"
}Tracking events
LtvAdx fires server-side beacons as ad segments are delivered. The following events are tracked automatically:
| Event | Trigger |
|---|---|
| impression | Session manifest fetched (ad pod entered) |
| start | First ad segment delivered |
| firstQuartile (Q1) | 25% of ad duration delivered |
| midpoint (Q2) | 50% of ad duration delivered |
| thirdQuartile (Q3) | 75% of ad duration delivered |
| complete | 100% of ad duration delivered |
| skip | Player skipped via EXT-X-DISCONTINUITY before complete |
For click tracking in SSAI, include an overlay or companion creative via client-side VAST (use the companionAds field in the stitched VAST). Overlay clicks fire through the standard VAST click redirect URL.
Redundancy and fallback
If the LtvAdx SSAI service is unavailable or the session creation call times out, your app should fall back to the origin manifest URL directly (no ads stitched). Configure a 2-second timeout on the session creation call. If no stitchedManifestUrl is returned, use the origin URL and log the failure.
Multi-CDN creative delivery
LtvAdx transcodes and stages winning creatives to a CDN edge cache before stitching. Creative segments are available at the nearest PoP within 200ms of the auction. If your stream region has specific CDN requirements, contact our solutions team for CDN peering configuration.