TECHNICAL

EPG and XMLTV Setup for FAST Channels: A Step-by-Step Guide

April 17, 2026 7 min read OTTEngine Team

A FAST channel without a valid EPG is invisible. Platforms like Pluto, Samsung TV Plus, LG Channels, and Roku's live tab pull program schedules from the XMLTV feed you provide. Get this wrong and your channel does not appear in the guide. Here is the practical setup.

What an EPG actually is

An Electronic Program Guide is a schedule of what is airing on your channel, when, with metadata like title, description, episode number, genre, rating, and length. Platforms use it to populate the channel guide UI and to power 'What's on next' surfaces.

XMLTV is the de facto format. It is an XML schema that lists <channel> and <programme> entries with start times in UTC and per-programme metadata.

Minimum required XMLTV fields

  • <channel id='your-channel-id'> with a <display-name> and an <icon src='...'> URL.
  • <programme channel='your-channel-id' start='20260418000000 +0000' stop='20260418003000 +0000'> for every airing.
  • Inside each <programme>: <title>, <desc>, <category>, <length units='minutes'>, optional <episode-num>, <rating>, <icon>.

All times must be UTC with explicit timezone offset. The most common mistake: posting times in local time without offset, which causes every airing to show at the wrong time in the guide.

A complete sample XMLTV feed

Here is a minimal but complete feed for one channel with three back-to-back programmes - a movie, a branded interstitial, and an episodic series. Note the contiguous start/stop times (no gaps), the explicit +0000 UTC offset on every timestamp, and the per-programme metadata:

<?xml version="1.0" encoding="UTF-8"?>
<tv generator-info-name="OTTEngine Scheduler" source-info-name="OTTEngine">
  <channel id="ottengine.action">
    <display-name>OTT Action</display-name>
    <icon src="https://cdn.ottengine.com/epg/ott-action.png" />
  </channel>

  <programme channel="ottengine.action" start="20260418000000 +0000" stop="20260418010000 +0000">
    <title lang="en">Midnight Pursuit</title>
    <desc lang="en">A detective races against the clock to stop a citywide heist.</desc>
    <category lang="en">Movie</category>
    <length units="minutes">60</length>
    <rating system="MPAA"><value>PG-13</value></rating>
    <icon src="https://cdn.ottengine.com/epg/midnight-pursuit.png" />
  </programme>

  <programme channel="ottengine.action" start="20260418010000 +0000" stop="20260418010030 +0000">
    <title lang="en">OTT Action Presents</title>
    <desc lang="en">A 30-second branded promo - what's coming up this week on OTT Action.</desc>
    <category lang="en">Interstitial</category>
    <length units="seconds">30</length>
  </programme>

  <programme channel="ottengine.action" start="20260418010030 +0000" stop="20260418020030 +0000">
    <title lang="en">Steel Horizon</title>
    <sub-title lang="en">Episode 4: The Long Drop</sub-title>
    <desc lang="en">The crew discovers the rig is hiding more than ore.</desc>
    <category lang="en">Series</category>
    <episode-num system="xmltv_ns">0 . 3 . 0/1</episode-num>
    <length units="minutes">60</length>
    <rating system="MPAA"><value>TV-14</value></rating>
  </programme>
</tv>

Paste this into our free XMLTV EPG Validator to watch it pass every check - then delete a timezone offset or a <title> and see the errors light up. Everything runs in your browser; nothing is uploaded.

Schedule depth and refresh cadence

Platforms expect 7–14 days of forward schedule at all times. Pluto and Samsung require 14 days; Roku and LG accept 7. Below 7 days the platform may stop ingesting your feed.

Refresh the feed at least every 6 hours, ideally hourly. If you change the schedule (a programming swap or a live cut-in), the next refresh must reflect it.

Handling gaps and filler

Every second of your 24-hour broadcast must be covered by a <programme> entry. Gaps (even one-minute ones) cause the platform to drop the channel from the guide. Use filler programmes - house promos, branded interstitials - to fill any space between scheduled content.

Filler programme entries should still have real titles and descriptions; 'Filler' or 'Promo' as a title looks unprofessional in the guide.

Stream alignment with EPG

Your live HLS or DASH manifest must align with the EPG schedule within a 5-second tolerance. If your EPG says 'Show A airs at 14:00 UTC' but the manifest is showing minute 23 of Show A at that timestamp, the channel guide is misleading and downstream recommendations break.

Use SCTE-35 markers in the stream at programme boundaries so platforms can verify alignment automatically.

Validation tools

Before delivering your XMLTV feed to a platform, validate it. We built a free, browser-based XMLTV EPG Validator that checks your feed for exactly the problems above - missing timezone offsets, schedule gaps, orphaned channel IDs, reversed times, and forward-depth shortfalls - without uploading anything. Platform-side validators (Samsung TV Plus's pre-ingest validator, Pluto's content portal) and the xmltv-validator npm package catch the same classes of error.

Set up automated validation in your scheduling pipeline so a broken feed is caught before it ships, not after the platform de-lists you.

Common rejection reasons

  1. Times in local timezone without offset.
  2. Gaps between programmes.
  3. Forward schedule depth below 7 days.
  4. Missing rating field on adult content.
  5. <programme> entries that do not match the live stream within tolerance.
  6. Inconsistent channel ID across feed and platform contract.

The bottom line

EPGs are mechanical but unforgiving - and they are the single most common reason FAST channels disappear from platform guides. OTTEngine auto-generates a compliant XMLTV feed from your scheduling pipeline, validates it on every refresh, and aligns SCTE-35 markers with programme boundaries. Book a demo to see your channel scheduled end to end.

Frequently Asked Questions

What is XMLTV?

An open XML schema for describing TV programme schedules. It is the de facto standard for delivering EPG data to FAST platforms.

How many days of forward schedule do I need?

Most platforms expect 7–14 days. Pluto and Samsung require 14; Roku and LG accept 7.

How often should I refresh my EPG feed?

At least every 6 hours, ideally hourly. Platforms cache aggressively but expect timely updates when your schedule changes.

Can I have gaps in my schedule?

No. Every second of your 24-hour broadcast must be covered by a programme entry. Use branded filler to fill gaps between scheduled content.

What is SCTE-35 and why does it matter for EPG?

SCTE-35 markers in your live stream signal programme boundaries and ad breaks. Platforms use them to verify your live stream aligns with the published EPG schedule.

✍️
OTTEngine Team
Streaming technology experts helping publishers launch on Roku, Fire TV, and Apple TV.

Ready to launch your streaming channel?

Book a 30-minute demo with our team - we will get your build started the same day.

Book a Demo

Related articles