Video — entry 033 of 37
TVMaze
TVmaze is a free, keyless JSON API for TV show/episode metadata and broadcast schedules, popular for hobby projects thanks to its zero-friction access. It also offers an optional authenticated Premium tier with extra personal-list features for paying TVmaze website members.
TVmaze is a free, keyless JSON API for TV show and episode metadata, cast, and broadcast schedules. A live GET against api.tvmaze.com needs no key, header, or signup for any of its documented endpoints, and every response observed this run carried an unconditional access-control-allow-origin: * header regardless of whether the request itself sent an Origin header.
GreatAPIs Score
Auth quickstart
- No API key required. Live GETs against /shows/{id}, /search/shows, and /schedule this run all returned data with no headers or query params beyond the documented path/query values. TVmaze's own docs (tvmaze.com/api) state calls are rate limited to "at least 20 calls every 10 seconds" per IP and that exceeding it "might" return an HTTP 429 -- not measured this run: five rapid sequential GETs to /shows/1..5 all returned 200 with no rate-limit header of any kind, so the limit (if enforced) sits above that burst size.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Look up a show by ID
GEThttps://api.tvmaze.com/shows/1
{"id":1,"url":"https://www.tvmaze.com/shows/1/under-the-dome","name":"Under the Dome","type":"Scripted","language":"English","genres":["Drama","Science-Fiction","Thriller"],"status":"Ended","runtime":60,"averageRuntime":60,"premiered":"2013-06-24","ended":"2015-09-10","officialSite":"http://www.cbs.com/shows/under-the-dome/","schedule":{"time":"22:00","days":["Thursday"]},"rating":{"average":6.6},"weight":98,"network":{"id":2,"name":"CBS","country":{"name":"United States","code":"US","timezone":"America/New_York"},"officialSite":"https://www.cbs.com/"},"webChannel":null,"dvdCountry":null,"externals":{"tvrage":25988,"thetvdb":264492,"imdb":"tt1553656"},"image":{"medium":"https://static.tvmaze.com/uploads/images/medium_portrait/610/1525272.jpg","original":"https://static.tvmaze.com/uploads/images/original_untouched/610/1525272.jpg"},"summary":"<p><b>Under the Dome</b> is the story of a small town that is suddenly and inexplicably sealed off from the rest of the world by an enormous transparent dome. The town's inhabitants must deal with surviving the post-apocalyptic conditions while searching for answers about the dome, where it came from and if and when it will go away.</p>","updated":1769177765,"_links":{"self":{"href":"https://api.tvmaze.com/shows/1"},"previousepisode":{"href":"https://api.tvmaze.com/episodes/185054","name":"The Enemy Within"}}}Try it
Developer reference
https://api.tvmaze.com/20 requests per 10 seconds per IP
- GET/shows/{id}
- GET/search/shows?q={query}
- GET/schedule
Gotchas & limits
- access-control-allow-origin: * is sent on every response this run, with or without an Origin request header -- unlike several other keyless APIs in this catalogue, TVmaze's CORS header is unconditional (confirmed live on both the /shows/1 success and the /shows/999999999 404 above).
- A live OPTIONS preflight to /shows/1 (with Origin + Access-Control-Request-Method headers set) returned HTTP 405 with only `allow: GET, HEAD` and no CORS headers at all -- TVmaze never answers a real CORS preflight. In practice this doesn't block browser calls because a plain GET with no custom headers is a CORS "simple request" and never triggers a preflight in the first place, but any GET that needs a preflight (e.g. a custom header) will fail here.
- Plain `http://` is not blocked or redirected: a live `GET http://api.tvmaze.com/shows/1` returned the same HTTP 200 body as the https:// version, so both schemes currently work -- but the docs and every code sample on tvmaze.com/api use https://, so treat http:// as unsupported and don't rely on it staying open.
- A nonexistent-but-well-formed numeric ID and a non-numeric path segment are both HTTP 404, but the body differs: `GET /shows/999999999` (a live probe this run) returns the plain `{"name":"Not Found","message":"","code":0,"status":404}`, while `GET /shows/abc` returns a richer body with a nested `previous` object naming the failed route -- `{"name":"Not Found","message":"Page not found.","code":0,"status":404,"previous":{"name":"Invalid Route","message":"Unable to resolve the request \"shows/abc\".","code":0}}`. Branch on `status`/`code` in the body, not on the message shape.
- TVmaze's own docs (tvmaze.com/api, not measured live -- this sandbox never triggered the limit) warn that "Leaving more than 1 connection to our servers idle may result in your IP getting blocked," and recommend reusing connections or HTTP/2 multiplexing instead of opening one per request.