Letterboxd Scraper icon

Letterboxd Scraper

Scrape Letterboxd films and reviews by search phrase, popular or genre lists, or film URL. Extract ratings, directors, runtimes, review text and star…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Letterboxd Scraper at a glance

Letterboxd Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes title, change type (incremental mode), release year, directors and genre, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Web data
Pricing
$2.00 per 1,000 results (Free plan), from $1.20 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
21 options

Scrape Letterboxd films and reviews by search phrase, popular or genre lists, or film URL. Extract ratings, directors, runtimes, review text and star ratings. Includes incremental monitoring, resume support and MCP connectors.

What Letterboxd Scraper can do

  • Two ways in. Search by film title phrase, or paste ANY Letterboxd link shape: film pages, member lists, diaries, profiles, browse lists.
  • Member lists with their films. Paste a list link and get one list row (title, owner, film count, description) with every film nested in order: rank, title, year and the owner's rating.
  • Diaries and profiles. A diary link yields one row per entry (film, watched date, star rating, rewatch flag, review link); a profile link yields the member's stats and favourite films.
  • Real film metadata. Every row carries title, release year, directors, genre, average rating, ratings count, runtime, and tagline, plus optional reader reviews (author, star rating, date, text, likes, spoiler flag).
  • Reviews-only output: turn on Output reviews only and the dataset becomes one row per reader review (film, author, rating, date, text, likes, spoiler flag), billed as ordinary result rows with no enrichment charge. Enrichment is set up automatically - review fetching turns on and the film detail page is never read, so the mode works even when detail pages are refused.
  • Output caps and views. Caps work in both modes, with separate dataset views per kind: Films, Lists, List films, Diary, Profiles, Reviews, Changes and Film reviews.

Choose what to collect

These inputs let you configure Letterboxd Scraper - Films, Ratings & Reviews. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestringSearch mode looks up films matching the phrases in Search phrases. URL mode reads the pasted Letterboxd URLs (or the Browse path fallback). Film, user and list modes read the links in Start URLs like URL mode; popular mode walks the film browse page chosen in Film sort.

Choices: search, url, film, popular, user, list

queriesarrayOne or more film title phrases to search on Letterboxd. Matching films are returned with full metadata.
startUrlsarrayLetterboxd URLs of any shape: a film page (/film//), a boxd.it short link, a browse path (/films/popular/), a member's list (//list//, a pasted /page/2/ starts at that page), their lists index (//lists/), their diary (//films/diary/) or their profile (//). Direct film slugs also work. Watchlist pages (//watchlist/) are not scraped: the site renders that grid client-side, and the run logs a loud warning for each such URL. The pre-filled examples are one link per shape; left untouched (or empty), URL mode walks Browse path instead.
browsePathstringUsed when Start URLs is empty or still holds the pre-filled example list (URL, film, user and list modes), and in popular mode when Film sort is empty. Site path to browse, e.g. /films/popular/ or /films/genre/sci-fi/by/rating/.
filmSortstringBrowse page used in popular mode, or in URL mode when Start URLs is empty and Browse path is left at its default. A Browse path you set yourself is never overridden. Leave empty to use Browse path.

Choices: popular/this/week, popular/this/month, popular/this/year, popular, by/rating, by/release

maxItemsintegerMaximum films to return across the whole run. 0 is not valid; the cap is always finite.
maxPagesintegerMaximum Letterboxd browse/search pages to read per source. Leave empty (0) to walk every result page; max items is the primary output cap.
Show 14 more inputs
More input fields
InputWhat it controls
fetchReviewsbooleanFetch each film's reader reviews (star rating, date, text, likes, spoiler flag) and attach them to the record as a nested list, also exposed one-per-row in the Reviews output tab. Works in search and URL mode. Billed on the Reviews enrichment (detail-enrichment) event: one unit per 10 delivered reviews, plus the per-film detail unit when the film page is read. Cap and off-switch via Max reviews per film.
reviewsOnlybooleanReturn one row per review instead of film rows (search mode walks the phrases, URL mode reads the given links). Sets enrichment up automatically: review fetching turns on and the film detail page is never read - the film name comes from the reviews feed itself - so this mode works even when detail pages are refused. Each review row is billed only as a normal dataset record: no detail or review surcharges apply.
fetchDetailsbooleanSearch mode only. ON (default): each matched film's detail page is read for the full record (directors, genre, tagline, description, precise rating) - charged the detail-enrichment event per film. OFF: film rows come from the search results alone (title, year, runtime, average rating, poster) with no detail-enrichment charge. URL mode always reads the film page you paste, so the detail charge is inherent there.
maxReviewsPerFilmintegerOnly used when Fetch reader reviews is on. Maximum reviews to collect per film.
fetchFullTextbooleanOnly used when Fetch reader reviews is on. Expands reviews the site shows truncated by reading the full text of each one (one extra request per truncated review, no extra charge).
resumeFromRunIdstringPaste a previous run ID (or dataset ID) from this actor to continue a large job pull without returning or charging for films already collected there (matched by slug). Use this after an interrupted run. For recurring daily monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching films as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED films. Turn on "Emit unchanged" or "Emit expired" only when you also want those films returned (and billed). State is kept separately for each search/URL and mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode/queries/URLs/browse path: different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return films that have not changed since the last run, marked UNCHANGED. This returns (and bills) extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return films that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max items capped it or when Resume was used. This returns (and bills) extra synthetic rows, so leave it off unless you need expiry tracking.
ignoreFieldsForChangesarrayWith Incremental mode on, dataset fields listed here never count as a change (they stay in the output, they just don't flip a row to UPDATED). Already ignored by default (at any depth): rating counts and averages, review likes, film, watch, fan, list and like counts, poster URLs, cast, language, country, synopsis, year, director, genres, runtime, studios, type, film URL and year, reviewer, username, review text, spoiler flag, review URL, search phrase, list position, member rating, and list title, owner and URL. List extra fields here.
mcpConnectorsarrayOptionally send the scraped films into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify > Settings > API & Integrations, then select it here. Notion gets a page-per-film export; other connectors receive a best-effort write or digest. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL or id of the Notion page under which film pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on how many films are written to each selected connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

titleTitle (text)
changeTypeChange type (incremental mode) (text)
releaseYearRelease year (number)
directorsDirectors (array)
genreGenre (array)
averageRatingAverage rating (number)
ratingsCountRatings count (number)
runtimeMinutesRuntime (min) (number)
taglineTagline (text)
urlFilm URL (link)
scrapedAtScraped at (date)
changedFieldsChanged fields (incremental mode) (array)
Show 62 more fields
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
typeType (text)
castCast (array)
languageLanguage (text)
countryCountry (text)
synopsisSynopsis (text)
posterUrlPoster URL (link)
filmUrlFilm URL (link)
filmYearFilm year (number)
yearYear (number)
directorDirector (array)
genresGenres (array)
runtimeRuntime (text)
studiosStudios (array)
querySearch phrase (text)
kindKind (text)
ownerOwner (text)
filmCountFilms (site total) (number)
rankedRanked (boolean)
descriptionDescription (text)
filmCount_pushedFilms included (number)
films.rankRank (number)
films.slugFilm slug (text)
films.nameFilm (with year) (text)
films.releaseYearReleased (number)
films.ownerRatingOwner rating (number)
films.positionPosition (number)
films.userRatingOwner rating (number)
films.listTitleList title (text)
films.listOwnerList owner (text)
films.listUrlList URL (link)
userMember (text)
watchedDateWatched (date)
filmNameFilm (with year) (text)
filmTitleFilm (text)
ratingRating (number)
rewatchRewatch (boolean)
hasReviewHas review (boolean)
reviewUrlReview URL (link)
displayNameDisplay name (text)
bioBio (text)
statsStats (object)
favoritesFavorite films (array)
filmSlugFilm slug (text)
authorAuthor (text)
reviewDateReview date (date)
textReview text (text)
likesLikes (number)
containsSpoilersSpoilers (boolean)
reviewerReviewer (text)
usernameUsername (text)
reviewTextReview text (text)
isSpoilerSpoiler (boolean)
reviews.reviewerReviewer (text)
reviews.usernameUsername (text)
reviews.ratingRating (number)
reviews.reviewDateReview date (date)
reviews.reviewTextReview (text)
reviews.likesLikes (number)
reviews.isSpoilerSpoiler (boolean)
reviews.reviewUrlReview URL (link)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "url": "https://letterboxd.com/film/sample-film-title/",
  "slug": "sample-film-title",
  "title": "Sample Film Title",
  "image": "https://a.ltrbxd.com/resized/sample-poster.jpg",
  "description": "A one-paragraph synopsis of the film.",
  "genre": [
    "Drama",
    "Mystery"
  ],
  "directors": [
    "Sample Director"
  ],
  "averageRating": 3.8,
  "averageRatingPrecise": 3.76,
  "ratingsCount": 125000,
  "datePublished": "2023-05-01",
  "releaseYear": 2023,
  "runtimeMinutes": 118,
  "tagline": "A story worth telling.",
  "reviews": [
    {
      "filmSlug": "sample-film-title",
      "author": "sample_reviewer",
      "rating": 3.5,
      "reviewDate": "2026-01-03",
      "text": "A short, generic reaction to the film.",
      "likes": 2,
      "containsSpoilers": false
    }
  ],
  "scrapedAt": "2026-01-01T00:00:00Z"
}

Ways to use this data

  • Film bloggers and critics: pull ratings, taglines, and directors to enrich reviews and roundup posts.
  • Data journalists and researchers: build historical rating datasets across genres, decades, or directors.
  • Watch-list and recommendation tools: track new releases and rating changes with Incremental mode.
  • Audience and sentiment teams: read reader review text and star ratings for a title or a set of titles.
  • Catalogers and archivists: collect structured metadata for a curated list of titles from pasted URLs.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Letterboxd Scraper return?

The documented output for Letterboxd Scraper includes title, change type (incremental mode), release year, directors, genre, average rating, ratings count and runtime (min). Availability of each field depends on the source page and the selected mode.

How much does Letterboxd Scraper cost?

It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

What is the difference between Resume and Incremental mode?

Resume (resumeFromRunId) continues one specific interrupted run from a pasted run or dataset ID. Incremental mode is for a schedule, for example daily or weekly: the actor remembers the previous run of the same search or URLs by itself and returns only new, updated, and reappeared films. Use one or the other; a state key that already has saved incremental state cannot also be combined with Resume.

Can I get only new or changed films on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated, and reappeared films by default, and unchanged ones are not billed unless you turn that on too.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear, or Airtable.

Ready to collect with Letterboxd Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.