EPG Feed Guide
For partners and platforms that receive our programme data
Read-only

EPG Feed Guide

This page explains how to fetch our electronic programme guide (EPG) and how to read the data. The feed is available as XMLTV, JSON and iCalendar and always contains the latest approved schedule.

01Overview

XMLTV

For EPG systems

The common exchange format for set-top boxes, middleware and IPTV platforms. Validates against the official xmltv.dtd.

JSON

For websites & apps

The same programme data with a few extras: channel languages, contact, DVB content code.

ICS

For calendars

Subscribe in Outlook, Google Calendar or Apple Calendar to see the schedule as events.

You will normally receive a personal link containing an access token. The token identifies you; please keep it confidential. If it is ever compromised, we can revoke it and send you a new one.

FormatShort linkLong form (works on every server)
XMLTV<token>.xml?t=<token>&f=xml
JSON<token>.json?t=<token>&f=json
ICS<token>.ics?t=<token>&f=ics

Both forms return exactly the same data. Use whichever form you were given.

Public feedsIf the channel has made its EPG public, the feed is also available without a token at epg.xml, epg.json and epg.ics.

03Choosing the time range

Without parameters you receive the default range set by the channel (for example yesterday plus the next 7 days). Add a query string to request a specific period:

ParameterExampleReturns
date?date=2026-10-20One day, 00:00 to 24:00 local time.
from, to?from=2026-10-20&to=2026-10-26Several days, both days included. Maximum 31 days.
past, future?past=0&future=14Days back (0–31) and days ahead (1–31), counted from today.

Dates are always written YYYY-MM-DD. Parameters can be added to both link forms:

<token>.xml?date=2026-10-20
?t=<token>&f=json&from=2026-10-20&to=2026-10-26
Programmes crossing midnightA range includes every programme that overlaps it. A film from 23:15 to 01:00 therefore appears in the results for both days.

04XMLTV

One <channel> followed by the programmes in chronological order. Standard XMLTV according to the official xmltv.dtd, in DTD element order. Elements without a value are omitted (no empty tags), so receivers such as TVHeadend, Jellyfin, Plex or Enigma2 read the feed without workarounds. Only <title> and the ciegolink ID are always present.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tv SYSTEM "xmltv.dtd">
<tv generator-info-name="CiegoLink EPG Planer" generator-info-url="https://ciegolink.com" source-info-name="Example TV" source-info-url="https://example.tv">
  <channel id="example.tv">
    <display-name lang="de">Example TV</display-name>
    <icon src="https://…/uploads/logo-1a2b3c4d.png"/>
    <url>https://example.tv</url>
  </channel>
  <programme start="20261020201500 +0200" stop="20261020214500 +0200" channel="example.tv">
    <title lang="de">Tatort</title>
    <sub-title lang="de">Der Fall Müller</sub-title>
    <desc lang="de">Kommissarin Weber ermittelt …</desc>
    <category lang="en">Movie / Drama</category>   <!-- 1st: DVB genre -->
    <category lang="de">Krimi</category> <!-- 2nd: channel category -->
    <length units="minutes">90</length>
    <icon src="https://…/uploads/20261018-154401-704fcde2.jpg"/>
    <episode-num system="xmltv_ns">11.4.</episode-num>
    <episode-num system="onscreen">S12E05</episode-num>
    <episode-num system="ciegolink">t044473196da4-202610202015</episode-num>
  </programme>
</tv>

05JSON

The same data as XMLTV plus channel languages and contact details. Every field is always present: empty texts are "", missing numbers are null.

{
  "generator": "CiegoLink EPG Planer",
  "generated": "2026-10-18T18:40:00+02:00",
  "timezone": "Europe/Zurich",
  "from": "2026-10-20T00:00:00+02:00",
  "to": "2026-10-21T00:00:00+02:00",
  "channel": {
    "id": "example.tv",
    "name": "Example TV",
    "language": "de-CH",
    "languages": ["de-CH", "fr-CH"],
    "logo": "https://…/uploads/logo-1a2b3c4d.png",
    "url": "https://example.tv",
    "contact": { "phone": "+41 44 123 45 67", "email": "epg@example.tv" }
  },
  "programmes": [
    {
      "id": "t044473196da4-202610202015",
      "show_id": "s29aaffabc8b7",
      "start": "2026-10-20T20:15:00+02:00",
      "stop": "2026-10-20T21:45:00+02:00",
      "duration": 90,
      "title": "Tatort",
      "subtitle": "Der Fall Müller",
      "description": "Kommissarin Weber ermittelt …",
      "season": 12,
      "episode": 5,
      "episode_label": "S12E05",
      "genre": "film",
      "genre_name": "Movie / Drama",
      "dvb_content": "0x1",
      "category": "Krimi",
      "image": "https://…/uploads/20261018-154401-704fcde2.jpg",
      "explicit": false
    }
  ]
}

06iCalendar (ICS)

Paste the .ics link into your calendar app as a subscription (not an import), so it updates automatically.

Unlike XMLTV and JSON, empty fields are left out in ICS because some calendar apps do not handle empty properties well.

07Field reference

JSONXMLTVContent
idepisode-num system="ciegolink"Unique ID of the broadcast. See Programme IDs.
show_id–ID of the show (series). The same for all broadcasts of a show.
start, stopstart, stopStart and end in local time with UTC offset (not Unix timestamps).
XMLTV: 20261020201500 +0200 · JSON: ISO 8601 2026-10-20T20:15:00+02:00
durationlengthDuration in minutes.
titletitleName of the show.
subtitlesub-titleSecond title line, typically the episode title. Not closed captions.
descriptiondescSynopsis. Plain text and may contain line breaks.
season, episodeepisode-numSeason and episode number, starting at 1. null if not set.
episode_labelepisode-num system="onscreen"Display form, e.g. S12E05, S12 or E05.
genre–Genre key, e.g. film (see table below).
genre_name1st categoryOfficial English DVB genre name.
dvb_content–DVB content nibble level 1, e.g. 0x1.
category2nd categoryThe channel's own category, free text.
explicitrating system="explicit"Explicit content, adults only. JSON true / false, XMLTV only present (yes) when true. Set per show.
imageicon srcProgramme image. Uploaded images are always 1920×1080 JPEG.

Genres (DVB)

The genre follows the content descriptor of ETSI EN 300 468 (content_nibble_level_1), so it can be mapped directly into DVB EIT.

genredvb_contentgenre_name
film0x1Movie / Drama
news0x2News / Current affairs
show0x3Show / Game show
sports0x4Sports
kids0x5Children's / Youth programmes
music0x6Music / Ballet / Dance
arts0x7Arts / Culture
social0x8Social / Political issues / Economics
education0x9Education / Science / Factual topics
leisure0xALeisure hobbies
special0xBSpecial characteristics

Season & episode

xmltv_ns counts from zero and has the form season.episode.part; unknown parts stay empty.

Season / episodexmltv_nsonscreen
12 / 511.4.S12E05
12 / –11..S12
– / 5.4.E05
– / –both omitted

Programme IDs

Each broadcast has an ID of the form <series-id>-<YYYYMMDDhhmm>. The time part is the broadcast's originally planned slot.

RecommendationTreat every response as the complete truth for its time range: replace all programmes you hold for that range instead of merging by ID. Deleted programmes simply no longer appear.

08HTTP, caching & errors

StatusMeaningBody
200OKThe feed in the requested format.
400Invalid parameter, e.g. wrong date format, range over 31 days or unknown formatJSON: {"error": "…"}
403Token missing, wrong or revokedPlain text: Zugriff verweigert (access denied)
404Short link not available on this server – use the long formServer page

09Integration checklist

  1. Store your link with the token securely, e.g. as a secret in your configuration rather than in public code.
  2. Map our channel ID (<channel id="…">) to your channel. It only changes after prior notice.
  3. Fetch the default range every 15–60 minutes, or request specific days with ?date= or ?from=…&to=….
  4. Replace all programmes of the fetched range with the response.
  5. Use the first <category>, or dvb_content in JSON, for genre mapping to DVB EIT.
  6. Show sub-title and the onscreen episode number where your EPG has room for them.
Questions or problems?Contact the channel. The current contact details are in the JSON feed under channel.contact.
EPG Planer · Feed Guide · Formats: XMLTV (xmltv.dtd), JSON, iCalendar (RFC 5545) · Genres: ETSI EN 300 468