# Letterboxd API

> Letterboxd returns film details, ratings, reviews, and popularity-ranked films as a workflow and API.

Letterboxd (LB) Get film returns film details, ratings, watch services, and popular reviews from a title or film link. List popular films returns popularity-ranked films for a period, optionally filtered by genre and decade.

- Page: https://fous.com/workflows/letterboxd
- Handle: `@letterboxd`
- Category: [Entertainment](https://fous.com/workflows/category/entertainment)
- Source website: https://letterboxd.com
- Last verified: Sep 29, 2026
- Fous is not affiliated with Letterboxd.

## Methods

### Get film

Operation `get_film`, version 1. 1 credit per call.

Get a Letterboxd film by title or film link, with its ratings, cast, watch services and popular reviews. Fans may be shown as an abbreviated count; watch services depend on location.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `year` | integer | no | `1982` | Release year to distinguish films with the same title, for example 2023. |
| `title` | string | yes | `"Past Lives"` | Film name or Letterboxd film link, for example Past Lives or https://letterboxd.com/film/past-lives/. |
| `max_reviews` | integer | no | `20` | Maximum popular reviews to return, for example 10. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "title"
  ],
  "properties": {
    "year": {
      "type": "integer",
      "description": "Release year to distinguish films with the same title, for example 2023.",
      "examples": [
        1982
      ]
    },
    "title": {
      "type": "string",
      "description": "Film name or Letterboxd film link, for example Past Lives or https://letterboxd.com/film/past-lives/.",
      "examples": [
        "Past Lives",
        "https://letterboxd.com/film/arrival-2016/",
        "The Thing"
      ]
    },
    "max_reviews": {
      "type": "integer",
      "default": 10,
      "maximum": 20,
      "minimum": 0,
      "description": "Maximum popular reviews to return, for example 10.",
      "x-fous-developer": true,
      "examples": [
        20,
        2,
        3
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "title": "Past Lives"
    },
    {
      "title": "Past Lives",
      "max_reviews": 20
    },
    {
      "title": "https://letterboxd.com/film/arrival-2016/",
      "max_reviews": 2
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `cast` | array |  |  |
| `fans` | any | `"69K"` |  |
| `year` | any | `2023` |  |
| `likes` | any | `902078` |  |
| `lists` | any | `478320` |  |
| `title` | any | `"Past Lives"` |  |
| `genres` | array |  |  |
| `themes` | array |  |  |
| `runtime` | any | `"106 mins"` |  |
| `tagline` | any | `"Why are they here?"` |  |
| `watched` | any | `2218498` |  |
| `synopsis` | any | `"After decades apart, childhood friends Nora and Hae Sung are reunited in New York for one fateful weekend as they confr` |  |
| `directors` | array |  |  |
| `poster_link` | any | `"https://a.ltrbxd.com/resized/film-poster/5/9/1/0/5/3/591053-past-lives-0-600-0-900-crop.jpg?v=c600b7854e"` |  |
| `average_rating` | any | `4.16` |  |
| `where_to_watch` | array |  |  |
| `letterboxd_link` | any | `"https://letterboxd.com/film/past-lives/"` |  |
| `popular_reviews` | array |  |  |
| `popular_reviews[].text` | any | `"found a version without subtitles, to get the full arthur experience"` |  |
| `popular_reviews[].likes` | any | `86334` |  |
| `popular_reviews[].rating` | any | `4` |  |
| `popular_reviews[].reviewer` | string | `"Jay"` |  |
| `number_of_ratings` | any | `1876882` |  |
| `rating_distribution` | array |  |  |
| `rating_distribution[].count` | any | `3534` |  |
| `rating_distribution[].stars` | number | `0.5` |  |

**Example input**

```json
{
  "title": "Past Lives"
}
```

**Example output**

```json
{
  "cast": [
    "Greta Lee",
    "Teo Yoo",
    "John Magaro"
  ],
  "fans": "69K",
  "year": 2023,
  "likes": null,
  "lists": null,
  "title": "Past Lives",
  "genres": [
    "Drama",
    "Romance"
  ],
  "themes": [
    "Moving relationship stories",
    "Heartfelt and sentimental family stories",
    "Powerful stories of heartbreak and suffering"
  ],
  "runtime": "106 mins",
  "tagline": null,
  "watched": null,
  "synopsis": "After decades apart, childhood friends Nora and Hae Sung are reunited in New York for one fateful weekend as they confront notions of destiny, love, and the choices that make a life.",
  "directors": [
    "Celine Song"
  ],
  "poster_link": "https://a.ltrbxd.com/resized/film-poster/5/9/1/0/5/3/591053-past-lives-0-600-0-900-crop.jpg?v=c600b7854e",
  "average_rating": 4.16,
  "where_to_watch": [
    "Apple TV Store",
    "Google Play Movies",
    "Amazon Video"
  ],
  "letterboxd_link": "https://letterboxd.com/film/past-lives/",
  "popular_reviews": [
    {
      "text": "found a version without subtitles, to get the full arthur experience",
      "likes": 86334,
      "rating": 4,
      "reviewer": "Jay"
    },
    {
      "text": "telling your long lost friend and potential lover to watch eternal sunshine is an act of emotional violence",
      "likes": 57773,
      "rating": 4,
      "reviewer": "Bobby Wagner"
    },
    {
      "text": "Shoutout to the husband for being shockingly chill about this whole situation",
      "likes": 54798,
      "rating": 4,
      "reviewer": "Patrick Willems"
    }
  ],
  "number_of_ratings": 1876882,
  "rating_distribution": [
    {
      "count": 3534,
      "stars": 0.5
    },
    {
      "count": 8168,
      "stars": 1
    },
    {
      "count": 6272,
      "stars": 1.5
    }
  ]
}
```

### List popular films

Operation `list_popular_films`, version 1. 1 credit per call.

List Letterboxd films in popularity order for a week, month, year or all time, optionally filtered by genre and decade. Ratings and posters may be unavailable for some films.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `genre` | string | no | `"horror"` | Film genre, for example horror; use all for any genre. |
| `decade` | string | no | `"1990s"` | Release decade, for example 1990s; use all for any decade. |
| `period` | string | no | `"this_week"` | Popularity period, for example this_month. |
| `max_results` | integer | no | `36` | Maximum number of films to return, for example 36. |

**Input schema**

```json
{
  "type": "object",
  "properties": {
    "genre": {
      "type": "string",
      "default": "all",
      "description": "Film genre, for example horror; use all for any genre.",
      "examples": [
        "horror"
      ]
    },
    "decade": {
      "type": "string",
      "default": "all",
      "description": "Release decade, for example 1990s; use all for any decade.",
      "examples": [
        "1990s",
        "1870s"
      ]
    },
    "period": {
      "enum": [
        "this_week",
        "this_month",
        "this_year",
        "all_time"
      ],
      "type": "string",
      "default": "this_week",
      "description": "Popularity period, for example this_month.",
      "examples": [
        "this_week",
        "this_month",
        "this_year"
      ]
    },
    "max_results": {
      "type": "integer",
      "default": 36,
      "maximum": 100,
      "minimum": 1,
      "description": "Maximum number of films to return, for example 36.",
      "x-fous-developer": true,
      "examples": [
        36,
        100,
        12
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "genre": "horror",
      "decade": "1990s",
      "period": "this_week",
      "max_results": 36
    },
    {
      "period": "this_month",
      "max_results": 100
    },
    {
      "genre": "horror",
      "decade": "1870s",
      "period": "this_year",
      "max_results": 12
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `films` | array |  |  |
| `films[].rank` | integer | `1` | Rank in popularity for the selected filters. |
| `films[].year` | integer or null | `2014` |  |
| `films[].title` | string | `"Interstellar"` |  |
| `films[].poster_link` | string or null | `"https://a.ltrbxd.com/resized/film-poster/1/1/7/6/2/1/117621-interstellar-0-70-0-105-crop.jpg?v=7ad89e6666"` |  |
| `films[].average_rating` | number or null | `4.46` | Average rating out of 5. |
| `films[].letterboxd_link` | string | `"https://letterboxd.com/film/interstellar/"` |  |

**Example input**

```json
{
  "genre": "horror",
  "decade": "1870s",
  "period": "this_year",
  "max_results": 12
}
```

**Example output**

```json
{
  "films": []
}
```

## Quick start

Call the API with a Fous API key (`FOUS_API_KEY`). To create one, turn on Developer mode in Fous Studio, then open Keys & connections → API keys (https://app.fous.com/keys).

```bash
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
: "${FOUS_API_KEY:?Set FOUS_API_KEY before running this example}"

curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 120 \
  -H "Authorization: Bearer $FOUS_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "api": "@letterboxd",
  "visibility": "public",
  "operation": "get_film",
  "version": 1,
  "input": {
    "title": "Past Lives"
  },
  "response": {
    "format": "json"
  }
}'
```

```python
# Save as fous.py and run with python3 fous.py. No packages needed.
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
import json
import os
import urllib.error
import urllib.request

api_key = os.environ.get("FOUS_API_KEY")
if not api_key:
    raise RuntimeError("Set FOUS_API_KEY before running this example")

body = json.loads("{\n  \"api\": \"@letterboxd\",\n  \"visibility\": \"public\",\n  \"operation\": \"get_film\",\n  \"version\": 1,\n  \"input\": {\n    \"title\": \"Past Lives\"\n  },\n  \"response\": {\n    \"format\": \"json\"\n  }\n}")
request = urllib.request.Request(
    "https://api.fous.com/v1/query",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=120) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8', errors='replace')}") from error
if result.get("success") is False:
    raise RuntimeError(result.get("error", {}).get("message", "Request failed"))
print(json.dumps(result["data"]["output"], indent=2))
```

```typescript
// Save as fous.mts and run with npx tsx fous.mts.
// First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
const apiKey = process.env.FOUS_API_KEY;
if (!apiKey) throw new Error("Set FOUS_API_KEY before running this example");

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(120_000),
  body: JSON.stringify({
  "api": "@letterboxd",
  "visibility": "public",
  "operation": "get_film",
  "version": 1,
  "input": {
    "title": "Past Lives"
  },
  "response": {
    "format": "json"
  }
}),
});
type ApiResult = { success: boolean; data?: { output: unknown }; error?: { message: string } };
const result: ApiResult = await response.json();
if (!response.ok || result.success === false) {
  throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
if (!result.data) throw new Error("Missing API response data");
console.log(result.data.output);
```

Or describe the data in plain language: send `{"api":"@letterboxd","prompt":"Describe the data you need, with every detail"}` to the same URL. Fous fills in the input, runs the method that fits and returns only the fields you asked for; `data.route.calls[].request` is the exact call it made. Routing is free; the run costs the same.

## Use cases

- Compare film ratings and review activity
- Find popular films by genre and decade
- Check where a film is available to watch
- Explore cast, themes, and directors for a film

## FAQ

### Is Fous affiliated with Letterboxd?

No. Fous is not affiliated with Letterboxd. This workflow reads the public letterboxd.com website and returns its data.

### How much does it cost?

Each run costs 1 credit. With pay-as-you-go, a credit costs 1¢; monthly plans cost less per credit.

### Do I need a Letterboxd account?

No. You only need a Fous account.

### How current is the data?

Fous gets the data from letterboxd.com when you run it; repeating the same request within a day may return the saved result. Fous checks this workflow automatically; it last passed a check on Sep 29, 2026.

### Where can I watch a particular film?

Get film returns watch services for a film found by title or film link; services depend on location.

### Which films are popular this month?

List popular films returns films in popularity order for a selected period, including this month.

### What are a film’s ratings and popular reviews?

Get film returns a film’s ratings and popular reviews when given its title or film link.

## Related

- [TMDB API](https://fous.com/workflows/tmdb.md): TMDB returns movie and TV details, cast, trailers, releases, viewing services, scheduled upcoming movies, and up to 20 homepage trending titles; future episode details depend on published schedules.
- [Netflix API](https://fous.com/workflows/netflix.md): Netflix offers weekly global and country Top 10 rankings, all-time popularity rankings based on titles’ first 91 days, and title details with country availability that may lag.
- [IMDb API](https://fous.com/workflows/imdb.md): IMDb returns movie, TV, person, episode, chart and Parents Guide details, including available weekly rank changes; missing details are null, and unaired or unrated episodes lack ratings.
- [Rotten Tomatoes API](https://fous.com/workflows/rotten-tomatoes.md): Rotten Tomatoes returns movie and TV details, scores, newest reviews, and listings for theaters, coming soon, or at home; series rating counts may be unavailable.
- [Box Office Mojo API](https://fous.com/workflows/box-office-mojo.md): Box Office Mojo reports weekend rankings, movie details, daily grosses, and annual leaders; weekend and daily results default to the latest reported period, with some international figures unavailable.
- [Fandango API](https://fous.com/workflows/fandango.md): Fandango provides nearby U.S. movie showtimes, formats, local times and ticket links; theater listings for selected dates when available; and movies now playing or coming soon with details when listed.
- [FlixPatrol API](https://fous.com/workflows/flixpatrol.md): FlixPatrol provides daily streaming rankings by service and country, plus current country rankings for titles; older dates and some daily-change or Top 10 duration figures are unavailable.
- [The Numbers API](https://fous.com/workflows/the-numbers.md): Movie box office, home video sales, budgets, and release details.
- [All Entertainment workflows](https://fous.com/workflows/category/entertainment)
