Skip to main content
GET

Authorizations

client_id
string
query
default:YOUR_CLIENT_ID
required

Preferred form: your client_id as a URL query parameter on every request. Self-describing in logs and curl commands. See Headers and required parameters.

Authorization
string
header
default:YOUR_ACCESS_TOKEN
required

A user access_token, sent as Authorization: Bearer .... Required for endpoints that read or modify the user's library, scrobble session, ratings, settings, or playbacks. Every flow returns the same kind of token. See Set up authentication.

Headers

User-Agent
string
required

Descriptive identifier for your app, ideally name/version. Examples: PlexMediaServer/1.43.1.10540, kodi-simkl/0.9.2, MyApp/2.4.1 (https://myapp.com).

Path Parameters

type
enum<string>
required

One of shows, movies, anime, or all. Pass all to skip filtering on type even when the runtime accepts the segment-less form, so for spec strictness this is true. To call without it in practice, just drop the segment from the URL.

Available options:
movies,
shows,
anime,
all
Example:

"all"

status
enum<string>
required

One of watching, plantowatch, hold, completed, dropped, or all. Movies accept only plantowatch, completed, dropped, and all; TV and anime accept all six. Pass all to skip filtering on status — /sync/all-items/{type}/all returns every status for that type. User watchlist status. Movies skip watching and hold — see /conventions/list-statuses.

Available options:
watching,
plantowatch,
hold,
completed,
dropped,
all
Example:

"all"

Query Parameters

allow_rewatch
enum<string>
default:no

Opt into rewatch tracking. When yes, POST /sync/history records an additional rewatch session instead of being a no-op for already-watched items, and GET /sync/all-items returns one extra entry per saved rewatch session alongside the item's normal entry. Available to Simkl PRO and VIP users — non-PRO callers see no effect even with the flag set.

⚠️ Do not enable this flag until you've read the Rewatches guide end-to-end and implemented the precautions. Used carelessly (on retries, on every scrobble event, on importer re-runs, without pinning rewatch_id after the first write), it will pollute the user's history stats and rewatches panel with phantom sessions. The flag should be gated behind explicit user intent — a dedicated "Rewatch" button — never on background or automated flows. Also expose a per-user Track rewatches toggle in your app's settings (default off) — not every user wants the rewatch-session complexity.

Limits: up to 50 rewatches per item (movie, show, or anime), and any two watch events on the same item (movie or episode) must be at least 2 days apart — a new rewatch within 48 hours of the previous watch of that same item collapses into the same session (it's a rewatch, not a rewind 😄). Full walkthrough — session lifecycle (active / completed / closed with bidirectional transitions), episode-level tracking, reading sessions back from GET /sync/all-items, and ready-made code for simkl.com-style UI patterns — in the Rewatches guide.

Available options:
yes,
no
date_from
string<date-time>

ISO-8601 timestamp. Returns only items changed strictly after this time — one stamped exactly at this value is not returned. Pass the top-level all from the /sync/activities response you saved as your snapshot, exactly as returned.

extended
enum<string>

Controls response richness. Omit for the default (summary fields only — status, counters, last_watched / next_to_watch markers, no episode arrays).

  • simkl_ids_only — smallest payload: just ids.simkl per item. Ideal for the deletion-reconciliation diff in continuous sync.
  • ids_only — same, plus external IDs (imdb, tmdb, tvdb, mal, …).
  • full — required to get the per-episode seasons[].episodes[] arrays; without it, episode_watched_at and include_all_episodes do nothing. Necessary but not always sufficient: on its own it loads episodes for watching / hold / plantowatch items only — completed and dropped additionally need include_all_episodes. The only extra metadata field it adds is runtime.
  • full_anime_seasons — like full, plus TVDB season/episode mapping on anime (mapped_tvdb_seasons at the show level, a tvdb block per episode).

This endpoint does not return overview, fanart, genres, or ratings at any extended value — it returns watch state plus a compact item stub (title, poster, year, ids, and runtime on full). For catalog metadata, call the detail endpoints (/movies/{id}, /tv/{id}, /anime/{id}).

Large payload on full / full_anime_seasons — pair with date_from for continuous sync. The one expected full-library use is a one-time episode baseline on first sync (see the Sync guide → Phase 1).

Available options:
full,
full_anime_seasons,
simkl_ids_only,
ids_only
next_watch_info
enum<string>

When yes, attaches a next_to_watch_info object to each watched item, indicating the next episode to watch.

Available options:
yes
episode_tvdb_id
enum<string>

When yes, includes TVDB IDs on each episode in episode-bearing responses.

Available options:
yes
episode_runtime
enum<string>

When yes, adds runtime (whole minutes, or null when unknown) to each episode row. Like the other episode modifiers it needs extended=full, since episode rows are not loaded without it.

Available options:
yes
language
enum<string>

en forces English titles. It's the only accepted value — any other value is ignored and titles fall back to the user's profile language.

Available options:
en
anime_type
enum<string>

When movies, restricts the anime results to anime-movie subtype only.

Available options:
movies
episode_watched_at
string

yes adds per-episode watched_at timestamps to every loaded episode. Requires extended=full (or extended=full_anime_seasons) — it's a modifier on already-loaded episodes, so on its own it does nothing. To also cover completed / dropped items, combine with include_all_episodes (which itself also requires extended=full). Pair with date_from for continuous sync — significantly larger response.

Allowed value: "yes"
include_all_episodes
enum<string>
default:no

Three-value flag that controls per-episode loading on canonical entries. Requires extended=full — it has no effect on its own.

  • no (default) — Episode lists are loaded only for items in watching, plantowatch, and hold statuses. Items in completed and dropped skip episode loading entirely (you get only watched_episodes_count).
  • yes — Load episode lists for every status. For completed entries with no per-episode data recorded, synthesizes virtual episode rows stamped with the item's last-watched time (the same timestamp is shared across all synthesized rows). Complete coverage, approximate dates.
  • original — Load episode lists for every status, but skip virtual-episode synthesis. Completed entries get only their real recorded rows with real dates — which can be fewer than watched_episodes_count for an item the user marked complete in a single action. Treat the count as authoritative for how many episodes are watched, and the rows for which ones and when.

Independent of allow_rewatch=yes — combine the two when you need both canonical episode lists AND rewatch session episode lists in one response. Pair with date_from for continuous sync since the response can be much larger when episodes load for completed-bucket items.

Available options:
yes,
original,
no
memos
string

yes includes the user's per-item memo object (text capped at 140 chars, plus is_private) in addition to all other data. Field name is singular memo; empty memos render as {}.

Allowed value: "yes"
client_id
string
required

Your client_id from your Simkl developer settings. Required on every request.

app-name
string
required

Short, lowercase identifier for your app (e.g. plex-scrobbler, kodi-bridge). Helps Simkl identify which apps are using the API.

app-version
string
required

Your app's current version (e.g. 1.0, 2.4.1). Helps Simkl debug issues you report.

Response

Top-level dict keyed by shows, movies, and anime. Keys are present only when there's at least one item in that bucket — filtered calls (/movies/completed) return just that key; an empty library returns {}.

The per-item shape is AllItemsEntry — its fields are gated on the query parameters (extended, memos, next_watch_info, episode_watched_at, episode_tvdb_id, allow_rewatch, etc.). See the schema and the examples below for what each modifier adds.

To show only what the user still has to watch, filter watching entries on next_to_watch rather than on the episode counts — Hide shows the user is caught up on explains why the arithmetic version keeps showing shows the user has finished.

Top-level dict keyed by shows, movies, and anime. Each key is an array of AllItemsEntry objects. Keys are present only when there's at least one item in that bucket — an empty library returns {}; a library with only movies returns { movies: [...] } with no shows or anime keys.

shows
object[]
movies
object[]
anime
object[]