A country's schedule
A whole country's day across its channels in one answer, 50 channels a page.
What it is for
Ask for a country and a day and get the programmes on its channels, 50 channels at a time, in the same shape as a channel's day. Follow meta.next_cursor for the next 50 until it is null.
It saves one call per channel when you need a whole market, such as for an EPG import, a night-by-night "what is on" page, or counting what a country broadcast.
A full EPG import
Load a country's day into your own guide in a few calls.
Tonight's highlights
Pick the new and live programmes across every channel.
Market research
Count genres, repeats and slots across a country.
Try it
Calls the real API with your key and shows the answer below. Your key stays in this browser and fills in on every docs page.
A country's schedule
Needs Live or CompleteNo key yet? Get a free key. It fills in here by itself once made.
Code
Built from the form above, with your key in place. The language you pick is remembered.
curl "https://api.tvschedule.org/v1/countries/US/schedule/yesterday" \ -H "X-API-Key: <your key>"
Parameters
| Name | In | Type | Example | What it does |
|---|---|---|---|---|
ccrequired | path | string | GB | The country as a two-letter code, such as GB. |
daterequired | path | string | today | The day: YYYY-MM-DD, yesterday, today or tomorrow, within your plan's window. YYYY-MM-DDyesterdaytodaytomorrow |
cursor | query | string | The next_cursor from the page before, to read the next page. | |
tz | query | string | Europe/London | Cut the day at this time zone's midnight. Times stay UTC. |
Returns
A list under data, with meta.count beside it and meta.next_cursor for the next page.
| Field | Type | Example | What it holds |
|---|---|---|---|
id | string | ls_b31kam9z | Its id, stable and used by every other endpoint |
channel | string | ch_012re0ya | The channel id it airs on, so you can group by channel. |
start | datetime | 2026-10-28T00:00:00Z | When it starts, UTC. |
stop | datetime | 2026-10-28T02:00:00Z | When it ends, UTC. |
title | string | Scary Movie | The programme title |
sub_title | string or null | null | Sub title |
description | string | The spoof that started it all. ... | Description |
category | array | ["movie","comedy"] | The programme's categories |
episode_num | string | original-air-date:20000707000000... | Episode num |
lang | string or null | null | Lang |
rating | string or null | null | Rating |
flags | object | {"new":false,"live":false} | new, live and repeat, each true or false. |
episode | string or null | null | The show and episode where matched: show_id, season, number |
film | string or null | null | Film |
Example answer
A real answer from our data, cut to three rows, so you can see the shape before you run anything.
{
"data": [
{
"id": "ls_b31kam9z",
"channel": "ch_012re0ya",
"start": "2026-10-28T00:00:00Z",
"stop": "2026-10-28T02:00:00Z",
"title": "Scary Movie",
"sub_title": null,
"description": "The spoof that started it all. Scream with the Wayans brothers, Carmen Electra, Shannon Elizabeth, and Anna Faris as they bumble and shriek their way to horror-movie hilarity in Scary Movie.",
"category": [
"movie",
"comedy"
],
"episode_num": "original-air-date:20000707000000 +0000",
"lang": null,
"rating": null,
"flags": {
"new": false,
"live": false
},
"episode": null,
"film": null
},
{
"id": "ls_pkm4sehb",
"channel": "ch_012re0ya",
"start": "2026-10-28T02:00:00Z",
"stop": "2026-10-28T03:45:00Z",
"title": "Scary Movie 2",
"sub_title": null,
"description": "Four teens are tricked by their professor into visiting a haunted house for a school project.",
"category": [
"movie",
"comedy"
],
"episode_num": "original-air-date:20010704000000 +0000",
"lang": null,
"rating": null,
"flags": {
"new": false,
"live": false
},
"episode": null,
"film": {
"year": 2001,
"imdb": "tt0257106"
}
},
{
"id": "ls_76527nmd",
"channel": "ch_012re0ya",
"start": "2026-10-28T03:45:00Z",
"stop": "2026-10-28T05:30:00Z",
"title": "Scary Movie 3",
"sub_title": null,
"description": "David Zucker (AIRPLANE!) directs SCARY MOVIE 3, which piles on hysterical yet gratuitous cameos from thrillers, blockbusters, and pop culture in general, getting its best goosing yet.",
"category": [
"movie",
"comedy"
],
"episode_num": "original-air-date:20031024000000 +0000",
"lang": null,
"rating": null,
"flags": {
"new": false,
"live": false
},
"episode": null,
"film": {
"year": 2003,
"imdb": "tt0306047"
}
}
],
"meta": {
"count": 1219,
"channels": 50,
"date": "2026-10-28",
"next_cursor": "bzUwLjVkOTMxMmJk"
}
}Errors
| Status | Code | When | What to do |
|---|---|---|---|
| 401 | unauthorized | No key was sent, or it is not an active TV Schedule key. | Send it as Authorization: Bearer <key> or X-API-Key. Your keys are in your account. |
| 403 | upgrade_required | The free key does not read whole countries, or the day is outside your plan's window. | The message names the plan that does. Upgrade on the same key at /pricing. |
| 400 | bad_request | A value is the wrong shape: a date that is not YYYY-MM-DD, a two-character search, a key sent in the address. | Fix the value the message names and send it again. |
| 422 | unknown_parameter | A query parameter this endpoint does not take. | The message lists the ones it does take. |
| 429 | rate_limited | Faster than your plan's pace per minute. | Wait for Retry-After seconds. The X-RateLimit headers show where you are. |
| 429 | quota_exceeded | Your plan's allowance for the day or month is used. | It resets at the time in the message, or upgrade for a bigger allowance. |
| 500 | server_error | Something went wrong on our side, or the data was out of reach for a moment. | Try again in a minute. It has been logged, and /status shows the state of the service. |