Skip to main content
GET /redirect is a passive helper that 301-redirects to a Simkl URL given any combination of identifiers. It’s designed for two distinct situations — pick the one that matches your job.

Two use cases

1. Link to Simkl without an API call

You have an external ID or a title and you just want to send the user to the matching Simkl page (or trailer / share / mark-watched action). No client_id, no JSON parsing.

2. Cheapest external ID → Simkl ID

You have an IMDB / TMDB / TVDB / MAL ID and need the Simkl ID so you can call /movies/:id, /tv/:id, or /anime/:id. /redirect is the lowest-overhead way to get there — read one header, no JSON parsing.
Always returns 301 Moved Permanently with a Location header and Cache-Control: no-store. The type=show value matches both tv and anime. Like every Simkl endpoint, requests must include the required URL parameters (client_id, app-name, app-version) and a User-Agent header. No Authorization token is needed except for to=watched, which signs the user in if they aren’t already.
Do not follow the 301. This applies to HTTP clients, scrapers, server-side fetchers, automated tools, AI agents, and LLM-driven workflows alike — the information you need is in the Location response header, never in the destination body. The destination is one of:
  • A human-facing simkl.com page (HTML),
  • A YouTube trailer page,
  • A twitter.com/intent/tweet URL,
  • A /oauth/authorize URL (for to=watched flows when the user isn’t signed in).
None of those contain API data. Fetching them wastes bandwidth, can break (CORS / auth / rate limits on the destination host), and gives you nothing useful. The Simkl URL you want — and the simkl_id you can parse out of its path — is in the redirect target string, available without ever following the redirect.Configure your HTTP client to stop at the 301 and read the header:This is the canonical way to use /redirect — not a perf optimisation. Following the redirect defeats the endpoint’s purpose.What to do after reading the Location header — pick one:
  • You only need the Simkl ID. Parse it out of the URL path and stop here. Don’t call anything else. Example: Location: https://simkl.com/tv/17465/game-of-thronessimkl_id = 17465. You’re done.
  • You also need the full record (title, overview, poster, fanart, ratings, trailers, etc.). Use the parsed Simkl ID to call the matching detail endpoint, which is Cloudflare-cached by Simkl ID — popular titles come straight from edge cache and are near-free:
Two HTTP requests max (one to /redirect for the ID, one to the cached detail endpoint for the data). Never follow the 301 from /redirect itself.
You’re rendering a clickable link in a newsletter, a browser-extension menu, a “Share” button, or any external surface, and you’d rather not call the JSON API yourself. Hand /redirect whatever identifier you have on hand and it sends the user to the right place.

Action modes (to=)

Recipes

Building the Simkl URL yourself

If you already have the Simkl ID and slug (returned in ids.simkl_id and ids.slug on every standard media object), you don’t need /redirect at all — assemble the URL directly: The slug is technically optional, but always include it when you have it. If you skip it, Simkl runs an extra title lookup and 301-redirects to the slugged URL anyway — wasted server time on Simkl’s side and an extra round-trip on yours. The slug is returned in ids.slug on every standard media object — store it alongside the Simkl ID and reuse.

Use case 2 — Resolve an external ID to a Simkl ID

You have an external ID (IMDB, TMDB, TVDB, MAL, AniDB, AniList, Kitsu, etc.) and you need the Simkl ID so you can fetch the full record from /movies/{id}, /tv/{id}, or /anime/{id}. This is the recommended path/redirect returns a tiny redirect with the Simkl ID baked into the URL, and the detail endpoints are aggressively cached on Cloudflare by Simkl ID.

How /redirect resolves an ID

The response is a 301 with a Location header pointing at the canonical Simkl URL, e.g. https://simkl.com/tv/17465/game-of-thrones. Parse out 17465 and pass it to /tv/17465 to get the full record from Cloudflare cache.
  • Tiny payload — just HTTP headers, no JSON to parse.
  • Cached path — the follow-up detail call (/movies/{id}, /tv/{id}, /anime/{id}) hits Cloudflare’s edge cache, so it stays cheap for repeat lookups of the same title.
  • Same required params as every Simkl endpoint — see Headers and required parameters.

How to extract the Simkl ID from the redirect

The Location header looks like one of:
The numeric segment immediately after /movies/, /tv/, or /anime/ is the Simkl ID. Then call the summary endpoint of your choice with that ID.

Recipes

Cache the resolved Simkl ID. External IDs map to Simkl IDs once and rarely change. Store the mapping locally so the next request goes straight to /movies/{id} / /tv/{id} / /anime/{id} without a round-trip through /redirect.

What you can pass

/redirect accepts a wide set of identifiers — pass any combination, the more the better:

External IDs

Any of the supported ID keyssimkl, imdb, tmdb (pair with type=movie or type=tv — TMDB has no anime type), tvdb, mal, anidb, crunchyroll, etc. Most stand alone.

Title + year

title=...&year=...&type=.... Title-based fallback for when you have nothing else.

Episode targeting

season (defaults to 1) and episode. Setting either one excludes movies from the search.

Tweet text

ep_title is used when to=twitter to include the episode title in the tweet body.

Endpoint reference

GET /redirect

Full parameter list, response codes, and an interactive playground.

Standard media objects

Where the ids.simkl_id and ids.slug fields come from.

Detail endpoints

Once you have the Simkl ID, fetch the full record from /movies/{id}, /tv/{id}, or /anime/{id} (Cloudflare-cached by ID).

OAuth flow

to=watched first redirects through /oauth/authorize for unauthenticated users.