tvschedule.org
API Docs / Listings

A country's schedule

Live and CompleteMCP: country_schedule

A whole country's day across its channels in one answer, 50 channels a page.

ReturnsProgrammes across channels
Up to50 channels a page
FreshUp to 10 minutes old
PlanLive and Complete
GEThttps://api.tvschedule.org/v1/countries/{cc}/schedule/{date}

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 Complete

No key yet? Get a free key. It fills in here by itself once made.

https://api.tvschedule.org/v1/countries/US/schedule/yesterday
Uses 1 call from your plan.
Calling

        

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

NameInTypeExampleWhat it does
ccrequiredpathstringGBThe country as a two-letter code, such as GB.
daterequiredpathstringtodayThe day: YYYY-MM-DD, yesterday, today or tomorrow, within your plan's window.
YYYY-MM-DDyesterdaytodaytomorrow
cursorquerystringThe next_cursor from the page before, to read the next page.
tzquerystringEurope/LondonCut 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.

FieldTypeExampleWhat it holds
idstringls_b31kam9zIts id, stable and used by every other endpoint
channelstringch_012re0yaThe channel id it airs on, so you can group by channel.
startdatetime2026-10-28T00:00:00ZWhen it starts, UTC.
stopdatetime2026-10-28T02:00:00ZWhen it ends, UTC.
titlestringScary MovieThe programme title
sub_titlestring or nullnullSub title
descriptionstringThe spoof that started it all. ...Description
categoryarray["movie","comedy"]The programme's categories
episode_numstringoriginal-air-date:20000707000000...Episode num
langstring or nullnullLang
ratingstring or nullnullRating
flagsobject{"new":false,"live":false}new, live and repeat, each true or false.
episodestring or nullnullThe show and episode where matched: show_id, season, number
filmstring or nullnullFilm

Example answer

A real answer from our data, cut to three rows, so you can see the shape before you run anything.

200 OKhttps://api.tvschedule.org/v1/countries/US/schedule/yesterday
{
    "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

StatusCodeWhenWhat to do
401unauthorizedNo 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.
403upgrade_requiredThe 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.
400bad_requestA 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.
422unknown_parameterA query parameter this endpoint does not take.The message lists the ones it does take.
429rate_limitedFaster than your plan's pace per minute.Wait for Retry-After seconds. The X-RateLimit headers show where you are.
429quota_exceededYour plan's allowance for the day or month is used.It resets at the time in the message, or upgrade for a bigger allowance.
500server_errorSomething 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.

Next calls