73.8M listings
Every country's schedule under one key, one shape and one set of ids.
GET /v1/now
What every channel in a country is showing this minute, with the next programme after it.
MIT, no lock-in
Every lab tool reads only the public API with your own key, so it runs on the free key.
Working normally
Checked every minute from outside our own servers.
The full schedule in America/Toronto time, what is on now and next, and the same data in your app with one call.
All times America/Toronto. The same day from the API: GET /v1/channels/ch_b6d14r17/schedule?date=2026-10-13&tz=America/Toronto
| Time | Programme | Episode | Category | Length |
|---|---|---|---|---|
| 23:18 | Silent WitnessNikki suspects David Cannon to be more involved in Sally's disappearance. | Moment of Surrender, Part 2 | 59m | |
| 00:17 | Silent WitnessA series of tragic events are linked to the hacking of a hospital database. | Duty of Candour, Part 1 | 55m | |
| 01:12 | Silent WitnessThe team wonder if the cyber hack is the only danger. | Duty of Candour, Part 2 | 59m | |
| 02:11 | Silent WitnessA US Diplomat is shot dead in London forcing our team to work closely with the Embassy. | A Special Relationship, Part 1 | 58m | |
| 03:10 | Silent WitnessThe team uncover a secret held by those at the very top of the US government. | A Special Relationship, Part 2 | 59m | |
| 04:08 | Silent Witness On nowA road traffic accident points to the sociopathic behaviour of a care home resident. | One Day, Part 1 | 58m | |
| 05:07 | Silent WitnessThe team are determined to uncover the truth about unexplained care home deaths. | One Day, Part 2 | 59m | |
| 06:06 | Silent WitnessNikki is awaiting a call from Matt who is back in the States. | Family, Part 1 | 58m |
Copy, add your key, run. The free key reads yesterday and today on every channel, 500 calls a day.
curl -H "Authorization: Bearer $TVG_KEY" \ "https://api.tvguideapi.com/v1/channels/ch_b6d14r17/schedule?date=2026-10-13&tz=America/Toronto" # what is on now, and next curl -H "Authorization: Bearer $TVG_KEY" \ "https://api.tvguideapi.com/v1/channels/ch_b6d14r17/now" # any past day (Archive plan) curl -H "Authorization: Bearer $TVG_KEY" \ "https://api.tvguideapi.com/v1/channels/ch_b6d14r17/history?from=2026-10-06T00:00:00Z&to=2026-10-07T00:00:00Z"
$ch = curl_init("https://api.tvguideapi.com/v1/channels/ch_b6d14r17/schedule?date=2026-10-13&tz=America/Toronto"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("TVG_KEY")], ]); foreach (json_decode(curl_exec($ch), true)["data"] as $slot) { echo $slot["start"], " ", $slot["title"], "\n"; }
const r = await fetch("https://api.tvguideapi.com/v1/channels/ch_b6d14r17/schedule?date=2026-10-13&tz=America/Toronto", { headers: { Authorization: `Bearer ${process.env.TVG_KEY}` }, }); const { data } = await r.json(); data.forEach(s => console.log(s.start, s.title, s.flags.live ? "LIVE" : ""));
import os, requests r = requests.get( "https://api.tvguideapi.com/v1/channels/ch_b6d14r17/schedule", params={"date": "2026-10-13", "tz": "America/Toronto"}, headers={"Authorization": f"Bearer {os.environ['TVG_KEY']}"}, ) for slot in r.json()["data"]: print(slot["start"], slot["title"])
// GET /v1/channels/ch_b6d14r17/schedule?date=2026-10-13, the first programme { "data": [ { "id": "ls_qf1gec2f", "channel": "ch_b6d14r17", "start": "2026-10-13T03:18:38Z", "stop": "2026-10-13T04:17:47Z", "title": "Silent Witness", "sub_title": "Moment of Surrender, Part 2", "description": "Nikki suspects David Cannon to be more involved in Sally's disappearance.", "category": [], "flags": { "new": false, "live": false } } ], "meta": { "count": 8, "date": "2026-10-13", "tz": "America/Toronto" } }
8 calls cover a channel from its details to its past. Each one opens in the documentation with Try it.
A free key in a minute, with Google. No card. Yesterday and today on every channel in 150 countries.