Letterboxd Films Scraper avatar

Letterboxd Films Scraper

Pricing

from $1.44 / 1,000 item extracteds

Go to Apify Store
Letterboxd Films Scraper

Letterboxd Films Scraper

Extract Letterboxd film ratings, runtime, cast, countries, language codes, studios and IMDb/TMDB IDs from supplied public film URLs.

Pricing

from $1.44 / 1,000 item extracteds

Rating

0.0

(0)

Developer

Automation Lab

Automation Lab

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

4 days ago

Last modified

Categories

Share

Extract current public film metadata and rating signals from supplied Letterboxd film URLs. Letterboxd Films Scraper turns each accepted URL into one typed dataset record with film identity, year, directors, runtime, cast, countries, language codes, production companies, IMDb/TMDB IDs, synopsis, poster, genres, aggregate ratings, and links back to the public film activity and reviews indexes.

The Actor is designed for repeatable catalog enrichment and rating snapshots. It does not collect review text, member diaries, profiles, or list membership.

What can you extract?

Each successful URL produces one record containing:

FieldMeaning
filmIdLetterboxd response identifier, with the slug as fallback
slug, title, yearFilm identity and release year
directorsCredited director names
runtimeMinutesRuntime in minutes derived from the page's ISO-8601 duration; null when absent or invalid
castCredited cast names in source order
countriesSource-provided countries of origin
languagesLanguage codes exactly as supplied by the source, not translated names
productionCompaniesCredited production company names
imdbId, tmdbIdIMDb title ID and TMDB movie ID (strings) from recognized links on the same film page; null when unavailable
descriptionPublic synopsis when available
posterUrlPublic poster image URL when available
genresGenres shown by Letterboxd
averageRatingCurrent aggregate rating when available
ratingCount, reviewCountCurrent public aggregate counts
canonicalUrlCanonical Letterboxd film URL
activityUrl, reviewsUrlPublic index links; their contents are not scraped
scrapedAtUTC extraction timestamp

Optional source fields can be null or empty when Letterboxd does not expose them.

Who is this Actor for?

  • Media catalog teams enriching film records with Letterboxd identity and metadata.
  • Data analysts taking comparable rating snapshots on a schedule.
  • Recommendation teams joining titles, genres, directors, and aggregate audience signals to internal datasets.
  • Developers who need typed JSON instead of maintaining a page parser.

Why use URL-based film extraction?

A supplied-URL workflow is predictable: you choose the exact films, preserve input order, and receive at most one record per unique canonical film URL. Duplicate URLs are removed before processing. Unlike broad review or member scrapers, this Actor remains limited to public film-level details and aggregate rating signals.

Join and filter your film catalog

Join records to your catalog using imdbId or the string tmdbId rather than title matching. Filter by runtimeMinutes, credited cast, countries, languages, or productionCompanies. Arrays preserve available source order, remove blanks and duplicates, and are empty when unavailable. Credits and language codes reflect Letterboxd's public structured metadata, not an independently verified complete filmography. All fields come from the same film-page request; no external database is fetched.

Getting started

  1. Open the Actor input page.
  2. Add one or more public URLs such as https://letterboxd.com/film/parasite-2019/.
  3. Set Maximum films if you want to process only the first part of the input.
  4. Click Start.
  5. Open the default dataset and export JSON, CSV, Excel, XML, or another Apify-supported format.

Input

ParameterTypeRequiredDescription
startUrlsarrayYesPublic https://letterboxd.com/film/<slug>/ URLs. Review, list, diary, member, and search URLs are rejected.
maxItemsintegerNoMaximum unique films to export, from 1 to 1,000. Default: 100.

Example input:

{
"startUrls": [
{ "url": "https://letterboxd.com/film/parasite-2019/" },
{ "url": "https://letterboxd.com/film/oppenheimer-2023/" }
],
"maxItems": 2
}

Output example

A current run returns records shaped like this:

{
"filmId": "hTha",
"slug": "parasite-2019",
"title": "Parasite",
"year": 2019,
"directors": ["Bong Joon Ho"],
"runtimeMinutes": 133,
"cast": ["Song Kang-ho", "Lee Sun-kyun"],
"countries": ["South Korea"],
"languages": ["en", "de", "ko"],
"productionCompanies": ["Barunson E&A"],
"imdbId": "tt6751668",
"tmdbId": "496243",
"description": "All unemployed, Ki-taek's family takes peculiar interest in the wealthy and glamorous Parks...",
"posterUrl": "https://a.ltrbxd.com/resized/film-poster/...jpg",
"genres": ["Thriller", "Comedy", "Drama"],
"averageRating": 4.52,
"ratingCount": 5783478,
"reviewCount": 775408,
"canonicalUrl": "https://letterboxd.com/film/parasite-2019/",
"activityUrl": "https://letterboxd.com/film/parasite-2019/activity/",
"reviewsUrl": "https://letterboxd.com/film/parasite-2019/reviews/",
"scrapedAt": "2026-08-29T14:36:11.256Z"
}

Ratings and counts change over time; the cast sample is shortened. The example demonstrates the schema, not permanently fixed values.

How much does it cost to extract Letterboxd films?

The Actor uses pay-per-event pricing: a $0.00005 Start event per run plus one Item extracted event for each film record saved. At the BRONZE tier an item costs $0.0024; the six plan tiers decrease from $0.00276 at FREE to $0.000672 at DIAMOND. Failed, rejected, and duplicate URLs do not create an item charge. If the run's charge cap cannot cover another item, processing stops without emitting that item.

At BRONZE, 1 saved film costs $0.00245, 10 films cost $0.02405, and 100 films cost $0.24005 including the start event. For efficiency, submit several film URLs in one run rather than starting one run per film.

Refresh film ratings on a schedule

Create an Apify Schedule with the same URL set to take recurring snapshots. Each run stores current values and scrapedAt; compare datasets in your own database, spreadsheet, or automation flow to identify changes. The Actor does not provide built-in history, alerts, or change detection.

Export and integrations

The default dataset works with Apify exports and integrations. Common workflows include:

  • export CSV or Excel for a one-time catalog review;
  • send dataset items to Google Sheets;
  • connect a webhook that loads completed records into a warehouse;
  • call the API from an enrichment pipeline;
  • schedule a stable URL batch and compare snapshots downstream.

Use the Apify API

Replace APIFY_TOKEN with your token.

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~letterboxd-film-details-scraper/runs?token=APIFY_TOKEN&waitForFinish=120" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://letterboxd.com/film/parasite-2019/"}],"maxItems":1}'

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/letterboxd-film-details-scraper').call({
startUrls: [{ url: 'https://letterboxd.com/film/parasite-2019/' }],
maxItems: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
client = ApifyClient(token="APIFY_TOKEN")
run = client.actor("automation-lab/letterboxd-film-details-scraper").call(run_input={
"startUrls": [{"url": "https://letterboxd.com/film/parasite-2019/"}],
"maxItems": 1,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

Use with MCP

Add the Apify MCP server to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/letterboxd-film-details-scraper"

For Claude Desktop, Cursor, or VS Code, add this MCP JSON block to the client's MCP configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/letterboxd-film-details-scraper"
}
}
}

Example prompts:

  • “Run Letterboxd Films Scraper for Parasite and Oppenheimer, then summarize their current ratings.”
  • “Extract these five Letterboxd film URLs and return a table with title, year, director, genres, and canonical URL.”
  • “Refresh my supplied film URLs and save the resulting dataset for downstream comparison.”

Reliability and failure behavior

The Actor uses the public server-rendered film page and parses structured movie data. It retries transient network errors, HTTP 429, and temporary 5xx responses up to two times with backoff. Invalid URLs, missing films, challenge pages, or pages without recognizable movie data fail clearly instead of silently returning an empty record.

No proxy, login, browser, or automatic residential fallback is used. A source-side layout or access-policy change can temporarily require an Actor update.

Diagnostics and privacy

Failed operations send sanitized diagnostic input, exceptions, and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL query strings are removed; reports are retained for 30 days. Normal transient retries are not reported as terminal failures.

Limits and responsible usage

Only public film-detail URLs are supported. Keep request volume reasonable and do not use the Actor to collect private information or circumvent access controls.

Data handling and support

This Actor uses no AI service. Film pages are fetched directly from Letterboxd; no paid proxy or external metadata API is required. Run input, datasets and logs remain in your Apify storage under your account's retention settings; delete runs and their storages through Apify when no longer needed. There is no cross-run cache. Diagnostic reports are automatically removed after 30 days. For a bug or how-to question, use the Actor's Issues tab and include a safe film URL and run link, not credentials.

This independent Automation Lab Actor is not affiliated with or endorsed by Letterboxd, IMDb or TMDB. Source names identify the catalog and link destinations only.

Legality

Scraping public web data can be lawful, but your purpose, jurisdiction, and downstream use matter. Follow Letterboxd's terms, applicable privacy and database laws, and source rate limits. Poster URLs and film metadata may be subject to third-party rights; verify that your storage, redistribution, and commercial use are authorized. This Actor does not provide legal advice.

Troubleshooting

Why was my URL rejected? Ensure it is an HTTPS Letterboxd film URL ending in /film/<slug>/. Review, member, diary, list, and search URLs are outside scope.

Why is a field null or an array empty? Letterboxd does not expose every metadata field for every title. Optional fields accurately reflect what was present during the run.

Why did the run fail after retries? Check the Actor log for an HTTP status or challenge message. Retry later if Letterboxd returned a temporary block or server error.

Data freshness

Every run fetches the current public film page. scrapedAt identifies when the snapshot was taken. The Actor does not cache records across runs and does not claim real-time updates between scheduled executions.

This Actor is intentionally standalone for Letterboxd film-level catalog records. Review-text, member diary, watchlist, and list-membership products are outside its scope; no unrelated third-party Actor is presented as an Automation Lab companion.

FAQ

Does it scrape Letterboxd reviews? No. It returns the public reviews index URL and aggregate review count when available, but never review text.

Does it support lists, profiles, diaries, or watchlists? No. Only supplied public film-detail URLs are accepted.

Can I process duplicates? Duplicate canonical URLs are processed once per run.

Can I monitor rating changes? Schedule repeated runs and compare the resulting datasets downstream. Change detection and alerts are not built in.

What happens when one URL is unavailable? The run fails with a clear error rather than charging for or emitting an invalid film record.