# Letterboxd Scraper (`anyxsolutions/letterboxd-scraper`) Actor

Scrape Letterboxd films from film pages, lists, member films and watchlists, or a director's or actor's filmography: ratings, review and fan counts, cast, crew, genres, themes, runtime, studios, TMDB and IMDb IDs, plus popular reviews on request. No login, no API key.

- **URL**: https://apify.com/anyxsolutions/letterboxd-scraper.md
- **Developed by:** [Anyx Solutions](https://apify.com/anyxsolutions) (community)
- **Categories:** Social media, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![banner](https://anyx.solutions/banners/letterboxd-scraper.png)

## Letterboxd Scraper

**Films from Letterboxd — average rating, ratings and fan counts, cast, crew, genres, themes and popular reviews — from film pages, lists, member pages and filmographies, as clean JSON.**

Letterboxd is where millions of film fans log, rate and review what they watch, which makes it one
of the best public signals of how audiences feel about a film. This Actor reads Letterboxd film
pages and returns one record per film: title, year, directors, top-billed cast with characters,
crew by department, genres and themes, runtime, countries, languages and studios, the Letterboxd
average rating with ratings, reviews and fan counts, the poster, and the film's TMDB and IMDb IDs.
Paste a film, a list, a member's films or watchlist, or a director's, actor's or studio's page;
switch on reviews to add each film's most popular reviews with their full text. No login and no
API key. Built for film marketers and distributors, streaming and catalogue teams, entertainment
analysts and data journalists, and anyone building on film data.

### ⚡ Quick start

```json
{
  "startUrls": [{ "url": "https://letterboxd.com/dave/list/imdb-top-250/" }],
  "maxItems": 5
}
```

Or a few films, with their popular reviews:

```json
{
  "startUrls": [
    { "url": "https://letterboxd.com/film/parasite-2019/" },
    { "url": "https://letterboxd.com/film/the-godfather/" }
  ],
  "includeReviews": true,
  "maxReviews": 5
}
```

### 🧩 Input

| Field                | Type    | Required | Default                      | Description                                                                                                                                                                                                                                                     |
| -------------------- | ------- | -------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | array   | yes      | —                            | Letterboxd pages: a film (`/film/parasite-2019/`), a list (`/dave/list/imdb-top-250/`), a member's films or watchlist (`/dave/films/`, `/dave/watchlist/`), or a person's or studio's page (`/director/bong-joon-ho/`, `/actor/song-kang-ho/`, `/studio/a24/`). |
| `includeReviews`     | boolean | no       | `false`                      | Add each film's most popular reviews. Each review costs one extra page, so runs take longer.                                                                                                                                                                    |
| `maxReviews`         | integer | no       | `12`                         | Popular reviews per film when `includeReviews` is on, from 1 to 12 (Letterboxd shows up to 12 per film).                                                                                                                                                        |
| `maxItems`           | integer | no       | —                            | Maximum number of films per start URL. The input form starts at 5; leave it empty to get every film on a list or member page.                                                                                                                                   |
| `proxyConfiguration` | object  | no       | `{ "useApifyProxy": false }` | Proxy settings. Letterboxd's public pages work without a proxy.                                                                                                                                                                                                 |

**Which pages work.** Film pages, lists, member film grids and filmographies are read page by page
until `maxItems` is reached. Sorted or filtered views (`/by/rating/`, `/genre/horror/`, `/decade/…`)
and the "Popular" browse pages are not supported: open the list or member page itself instead.

### 📤 Output

Each film is one dataset row. Films from a list keep the list's order, and ranked lists add the
film's number as `listRank`. `reviews` is `null` unless `includeReviews` is on.

#### Fields

| Field               | Type   | Description                                                                                                                                                              |
| ------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `slug`              | string | The film's Letterboxd slug, e.g. `parasite-2019`.                                                                                                                        |
| `url`               | string | The film page on Letterboxd.                                                                                                                                             |
| `filmId`            | number | Letterboxd's numeric film ID.                                                                                                                                            |
| `shortUrl`          | string | The film's `boxd.it` short link.                                                                                                                                         |
| `title`             | string | Title as Letterboxd shows it.                                                                                                                                            |
| `originalTitle`     | string | Title in the original language, when it differs.                                                                                                                         |
| `year`              | number | Release year.                                                                                                                                                            |
| `releaseDate`       | string | First release date (often the festival premiere), `YYYY-MM-DD`.                                                                                                          |
| `directors`         | array  | Director names.                                                                                                                                                          |
| `cast`              | array  | The first 20 billed cast members: `name`, `character` and `url`.                                                                                                         |
| `castCount`         | number | How many cast members Letterboxd lists in total.                                                                                                                         |
| `crew`              | array  | Crew by department: `role` (e.g. `Writers`, `Cinematography`) and `names`.                                                                                               |
| `genres`            | array  | Genres.                                                                                                                                                                  |
| `themes`            | array  | Letterboxd's themes for the film, e.g. "Twisted dark psychological thriller".                                                                                            |
| `runtimeMinutes`    | number | Running time in minutes.                                                                                                                                                 |
| `countries`         | array  | Countries of production.                                                                                                                                                 |
| `primaryLanguage`   | string | The film's main language.                                                                                                                                                |
| `languages`         | array  | Spoken languages.                                                                                                                                                        |
| `studios`           | array  | Production studios.                                                                                                                                                      |
| `alternativeTitles` | array  | Other titles the film is known by, in other countries and languages.                                                                                                     |
| `tagline`           | string | The film's tagline.                                                                                                                                                      |
| `synopsis`          | string | Plot summary.                                                                                                                                                            |
| `averageRating`     | number | Letterboxd's weighted average rating, 0.5 to 5.                                                                                                                          |
| `ratingsCount`      | number | Number of ratings.                                                                                                                                                       |
| `reviewsCount`      | number | Number of reviews.                                                                                                                                                       |
| `fansCount`         | number | Members who have the film among their four favourites. Letterboxd rounds large numbers (198K → `198000`).                                                                |
| `posterUrl`         | string | Poster image.                                                                                                                                                            |
| `tmdbId`            | number | The film's ID on The Movie Database.                                                                                                                                     |
| `imdbId`            | string | The film's IMDb ID, e.g. `tt6751668`.                                                                                                                                    |
| `listRank`          | number | The film's number on the ranked list it came from; `null` otherwise.                                                                                                     |
| `sourceUrl`         | string | The page the film was found on (the film page itself for a pasted film).                                                                                                 |
| `reviews`           | array  | Popular reviews: `reviewId`, `url`, `reviewerName`, `reviewerUsername`, `rating`, `likedFilm`, `containsSpoilers`, `text`, `publishedAt`, `likesCount`, `commentsCount`. |

<details><summary>Example output</summary>

```json
{
  "slug": "parasite-2019",
  "url": "https://letterboxd.com/film/parasite-2019/",
  "filmId": 426406,
  "shortUrl": "https://boxd.it/hTha",
  "title": "Parasite",
  "originalTitle": "기생충",
  "year": 2019,
  "releaseDate": "2019-05-21",
  "directors": ["Bong Joon Ho"],
  "cast": [
    {
      "name": "Song Kang-ho",
      "character": "Kim Ki-taek",
      "url": "https://letterboxd.com/actor/song-kang-ho/"
    },
    {
      "name": "Lee Sun-kyun",
      "character": "Park Dong-ik",
      "url": "https://letterboxd.com/actor/lee-sun-kyun/"
    },
    {
      "name": "Cho Yeo-jeong",
      "character": "Yeon-kyo",
      "url": "https://letterboxd.com/actor/cho-yeo-jeong/"
    }
  ],
  "castCount": 54,
  "crew": [
    {
      "role": "Director",
      "names": ["Bong Joon Ho"]
    },
    {
      "role": "Producers",
      "names": [
        "Jang Young-hwan",
        "Kwak Sin-ae",
        "Moon Yang-kwon",
        "Lee Joo-hyun",
        "Bong Joon Ho"
      ]
    },
    {
      "role": "Writers",
      "names": ["Kim Dae-hwan", "Han Jin-won", "Bong Joon Ho"]
    }
  ],
  "genres": ["Thriller", "Comedy", "Drama"],
  "themes": [
    "Intense violence and sexual transgression",
    "Humanity and the world around us",
    "Moving relationship stories",
    "Twisted dark psychological thriller"
  ],
  "runtimeMinutes": 133,
  "countries": ["South Korea"],
  "primaryLanguage": "Korean",
  "languages": ["English", "German", "Korean"],
  "studios": ["Barunson E&A"],
  "alternativeTitles": [
    "ชนชั้นปรสิต",
    "パラサイト 半地下の家族：2019",
    "Parazitlər",
    "Gisaengchung"
  ],
  "tagline": "Act like you own the place.",
  "synopsis": "All unemployed, Ki-taek's family takes peculiar interest in the wealthy and glamorous Parks for their livelihood until they get entangled in an unexpected incident.",
  "averageRating": 4.52,
  "ratingsCount": 5928019,
  "reviewsCount": 797728,
  "fansCount": 198000,
  "posterUrl": "https://a.ltrbxd.com/resized/film-poster/4/2/6/4/0/6/426406-parasite-0-600-0-900-crop.jpg?v=8f5653f710",
  "tmdbId": 496243,
  "imdbId": "tt6751668",
  "listRank": 35,
  "sourceUrl": "https://letterboxd.com/dave/list/imdb-top-250/",
  "reviews": [
    {
      "reviewId": "72286970",
      "url": "https://letterboxd.com/philbertdy/film/parasite-2019/",
      "reviewerName": "Philbert Dy",
      "reviewerUsername": "philbertdy",
      "rating": 5,
      "likedFilm": true,
      "containsSpoilers": true,
      "text": "Update: Now in video form\n\nThere is a house on a hill, and there are people in it. And they're nice, but not really. There is a garden, and there they get a lot of sunlight. And it is nice, and they get to sleep there sometimes.\n\nThere is a house underground, and there are people in it. And they're the first to tell you that they're not very nice: they're con-men, grifters, forgers and imposters. They sit among stink bugs, and they've been there for so long that maybe they've convinced themselves that they just belong there.",
      "publishedAt": "2019-08-17",
      "likesCount": 44659,
      "commentsCount": 248
    }
  ]
}
```

</details>

### 💡 Use cases

- **Film marketing and distribution** — track how a release is rated and talked about, and compare it with comparable titles.
- **Catalogue and acquisition research** — rank a list or a filmography by audience rating and fan count before licensing.
- **Recommendation and data products** — join Letterboxd ratings, themes and genres to your catalogue through the TMDB and IMDb IDs.
- **Audience sentiment** — read the most popular reviews for a film, with spoiler flags and likes.

### ❓ FAQ

- **Do I need a Letterboxd account?** No. The Actor reads the same public pages anyone can open.
- **Do I need a proxy?** No. It runs without one by default.
- **How many reviews can I get per film?** Up to 12: the most popular reviews Letterboxd shows on the film page, each with its full text and publish date.
- **Why is `fansCount` a round number?** Letterboxd shows fan counts rounded (for example "198K fans"); the Actor returns that number in full.
- **Can I scrape the "Popular" or genre browse pages?** No. Those pages load their films separately and are not supported; use a list, a member's films or a filmography instead.
- **How do I follow a list over time?** Schedule the Actor on the list and compare runs: `listRank`, `averageRating` and `ratingsCount` change as members rate.

### 🔗 More scrapers by Anyx

- [Steam Scraper](https://apify.com/anyxsolutions/steam-scraper)
- [App Store Scraper](https://apify.com/anyxsolutions/app-store-scraper)
- [Trustpilot Scraper](https://apify.com/anyxsolutions/trustpilot-scraper)
- [Reddit Scraper](https://apify.com/anyxsolutions/reddit-scraper)

### 🤝 Anyx Solutions

We build custom scrapers and data-extraction pipelines.

- Email: tantosthor@gmail.com

### 🖼 Image credit

Image credit: [letterboxd.com](https://letterboxd.com/)

# Actor input Schema

## `startUrls` (type: `array`):

Letterboxd pages to scrape, such as a film (https://letterboxd.com/film/parasite-2019/), a list (https://letterboxd.com/dave/list/imdb-top-250/), a member's films or watchlist (https://letterboxd.com/dave/films/), or a person's or studio's page (https://letterboxd.com/director/bong-joon-ho/).

## `includeReviews` (type: `boolean`):

Add each film's most popular reviews, for example to read audience sentiment. Each review costs one extra page, so runs take longer.

## `maxReviews` (type: `integer`):

How many popular reviews to add per film when reviews are on, for example 5. Letterboxd shows up to 12 per film.

## `maxItems` (type: `integer`):

Maximum number of films to return per start URL. Leave empty to get every film on a list or member page.

## `proxyConfiguration` (type: `object`):

Proxy settings. Letterboxd's public pages work without a proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://letterboxd.com/dave/list/imdb-top-250/"
    }
  ],
  "includeReviews": false,
  "maxReviews": 12,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://letterboxd.com/dave/list/imdb-top-250/"
        }
    ],
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("anyxsolutions/letterboxd-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://letterboxd.com/dave/list/imdb-top-250/" }],
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("anyxsolutions/letterboxd-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://letterboxd.com/dave/list/imdb-top-250/"
    }
  ],
  "maxItems": 5
}' |
apify call anyxsolutions/letterboxd-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,anyxsolutions/letterboxd-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/I59srnRswlgxSztfJ/builds/hEPqRBqGVabTLgHOI/openapi.json
