72.1M 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 Asia/Seoul time, what is on now and next, and the same data in your app with one call.
All times Asia/Seoul. The same day from the API: GET /v1/channels/ch_ddy8d4x2/schedule?date=2026-10-13&tz=Asia/Seoul
| Time | Programme | Episode | Category | Length |
|---|---|---|---|---|
| 23:59 | [AFTER 8NEWS] 인신매매 브로커[AFTER 8NEWS] 인신매매 브로커 | 7m | ||
| 00:07 | [AFTER 8NEWS] 미국 중간선거[AFTER 8NEWS] 미국 중간선거 | 7m | ||
| 00:13 | [AFTER 8NEWS][AFTER 8NEWS] | 6m | ||
| 00:19 | [AFTER 8NEWS] 용혜인[AFTER 8NEWS] 용혜인 | 1m | ||
| 00:20 | 나이트 라인명확하게, 깊이 있게, 치우침 없이SBS의 심야 종합뉴스 프로그램 '나이트라인'입니다. | 30m | ||
| 00:50 | 뉴스브리핑(재)"깊이있는 뉴스, SBS 뉴스브리핑이 함께합니다"명확하게, 깊이 있게, 치우침 없이 | 1h 30m | ||
| 02:15 | 뉴스브리핑(재)"깊이있는 뉴스, SBS 뉴스브리핑이 함께합니다"명확하게, 깊이 있게, 치우침 없이 | 1h 16m | ||
| 03:31 | SBS 뉴스토리새로운 정통 시사보도 프로그램이다.SBS뉴스토리는 뉴스의 속 얘기를 스토리텔링 방식으로 전하는 | 34m | ||
| 04:05 | SBS 뉴스토리 580회새로운 정통 시사보도 프로그램이다.SBS뉴스토리는 뉴스의 속 얘기를 스토리텔링 방식으로 전하는 | 25m | ||
| 04:30 | 디지털 뉴스 클립디지털 뉴스 클립 | 5m | ||
| 04:35 | 디지털 뉴스 클립디지털 뉴스 클립 | 5m | ||
| 04:40 | 뉴스브리핑(재)"깊이있는 뉴스, SBS 뉴스브리핑이 함께합니다"명확하게, 깊이 있게, 치우침 없이 | 1h 16m | ||
| 05:56 | 뉴스브리핑(재)"깊이있는 뉴스, SBS 뉴스브리핑이 함께합니다"명확하게, 깊이 있게, 치우침 없이 | 3m | ||
| 06:00 | 모닝와이드 (1부)명확하게, 깊이 있게, 치우침 없이"매일 아침을 열겠습니다. SBS 모닝와이드" | 25m | ||
| 06:25 | 모닝와이드 (2부) On now명확하게, 깊이 있게, 치우침 없이"매일 아침을 열겠습니다. SBS 모닝와이드" | 1h 15m | ||
| 07:40 | 모닝와이드 (3부)실생활에 필요한 알찬 정보를 품격있게 소개하는국내외 곳곳에서 일어나는 흥미로운 화제와 사회적 이슈를 발굴하고흥미로운 화제와 알찬 정보가 있는 곳. 모... | 1h |
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_ddy8d4x2/schedule?date=2026-10-13&tz=Asia/Seoul" # what is on now, and next curl -H "Authorization: Bearer $TVG_KEY" \ "https://api.tvguideapi.com/v1/channels/ch_ddy8d4x2/now" # any past day (Archive plan) curl -H "Authorization: Bearer $TVG_KEY" \ "https://api.tvguideapi.com/v1/channels/ch_ddy8d4x2/history?from=2026-10-05T00:00:00Z&to=2026-10-06T00:00:00Z"
$ch = curl_init("https://api.tvguideapi.com/v1/channels/ch_ddy8d4x2/schedule?date=2026-10-13&tz=Asia/Seoul"); 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_ddy8d4x2/schedule?date=2026-10-13&tz=Asia/Seoul", { 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_ddy8d4x2/schedule", params={"date": "2026-10-13", "tz": "Asia/Seoul"}, headers={"Authorization": f"Bearer {os.environ['TVG_KEY']}"}, ) for slot in r.json()["data"]: print(slot["start"], slot["title"])
// GET /v1/channels/ch_ddy8d4x2/schedule?date=2026-10-13, the first programme { "data": [ { "id": "ls_tt1fj6q5", "channel": "ch_ddy8d4x2", "start": "2026-10-12T14:59:52Z", "stop": "2026-10-12T15:07:13Z", "title": "[AFTER 8NEWS] 인신매매 브로커", "sub_title": null, "description": "[AFTER 8NEWS] 인신매매 브로커", "category": [], "flags": { "new": false, "live": false } } ], "meta": { "count": 16, "date": "2026-10-13", "tz": "Asia/Seoul" } }
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 155 countries.