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

Extract films, reviews, and watch history from Letterboxd. Get titles, directors, cast, genres, ratings, and full user reviews. Search by keyword or paste film, member, or list URLs. Films and reviews returned as separate rows.

- **URL**: https://apify.com/solidcode/letterboxd-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Automation, Developer tools, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 films

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Letterboxd Scraper

Pull films and their user reviews from Letterboxd at scale — title, director, full cast, genres, runtime, country, average rating, ratings count, plus every review with its star rating, full text, spoiler flag, and date. Films and reviews come back as separate, joinable rows. Built for film researchers, data scientists, and recommendation-engine builders who need structured Letterboxd data without collecting it title by title.

### Why This Scraper?

- **16 film fields per title** — director, full cast list, genres, runtime in minutes, synopsis, tagline, country of origin, original language, poster URL, plus Letterboxd's 0–5 average rating, ratings count, and review count.
- **Films and reviews as separate, joinable rows** — every output row carries a `recordType` of `film` or `review`, and each review references its parent film by `filmSlug` and `filmTitle` so you can join the two sides cleanly.
- **Star ratings and spoiler flags on every review** — capture the reviewer's username and display name, the half-star rating (0–5), the full review text, the spoiler flag, and the publish date for sentiment and audience analysis.
- **Auto-detects film, member, and list URLs** — paste a film page, a member profile, or a curated list and the scraper figures out what to pull. No mode toggle, no separate inputs.
- **Member watch histories and curated lists** — point it at any member's films or a published list to harvest hundreds of titles in one run, far beyond what keyword search returns.
- **Per-film review cap you control** — set `maxReviewsPerFilm` to keep runs lean (default 20, most-popular-first) or set it to 0 to pull every review on a title.
- **Unrated reviews stay honest** — a review with no star comes back as `rating: null`, never a misleading zero, so your rating distributions aren't skewed.
- **Reviews don't count against your film cap** — `maxResults` limits films only, so a 50-film run with reviews on still returns all 50 films plus their reviews.

### Use Cases

**Film Research & Recommendation**
- Build a structured catalogue of films with director, cast, genre, and runtime
- Train and evaluate recommendation engines on real audience ratings
- Compare average ratings and ratings counts across genres or directors
- Assemble a director or franchise filmography from a curated list

**Sentiment & Review Analysis**
- Mine review text for sentiment, themes, and recurring praise or complaints
- Measure how spoiler-flagged reviews differ from spoiler-free ones
- Track a film's star-rating distribution from the most popular reviews
- Compare critical reception between two films side by side

**Market & Audience Research**
- Gauge audience reception for a release using ratings count and review volume
- Profile a member's taste from their watch history and personal ratings
- Benchmark a genre's typical rating and review engagement
- Identify under-reviewed titles with high ratings for content gaps

**Journalism & Content**
- Source quotes and reactions for a film feature or retrospective
- Compile "most-loved" lists ranked by Letterboxd average rating
- Fact-check release year, runtime, and country for an article
- Build year-end roundups from a list of nominees or festival selections

### Getting Started

#### Search by Keyword

The simplest run — search a film title and pull metadata plus reviews:

```json
{
    "searchTerms": ["parasite"],
    "maxResults": 10
}
````

#### Specific Films by URL

Paste Letterboxd film pages to pull exactly the titles you want:

```json
{
    "startUrls": [
        "https://letterboxd.com/film/parasite-2019/",
        "https://letterboxd.com/film/portrait-of-a-lady-on-fire/"
    ],
    "maxReviewsPerFilm": 50
}
```

#### Member Watch History or a Curated List

Harvest every film in a member's history or a published list, with reviews off for a faster, cheaper run:

```json
{
    "startUrls": [
        "https://letterboxd.com/dave/films/",
        "https://letterboxd.com/crew/list/official-top-250-narrative-feature-films/"
    ],
    "includeReviews": false,
    "maxResults": 250
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | `[]` | Letterboxd URLs — film pages (`/film/parasite-2019/`), member profiles (`/username/`), or curated lists (`/username/list/my-favourites/`). The scraper auto-detects which kind each URL is. |
| `searchTerms` | string\[] | `["parasite"]` | Film titles or keywords to search on Letterboxd. Each term returns the matching films. Ignored when you supply URLs above. |

#### Output Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includeReviews` | boolean | `true` | Collect user reviews for each film as their own rows (reviewer, star rating, full text, spoiler flag, date). Turn off for a faster, cheaper run that returns only film metadata. |
| `maxReviewsPerFilm` | integer | `20` | Cap on reviews captured per film, most popular first. Set to `0` to collect every available review for each film. Ignored when `includeReviews` is off. |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `50` | Cap on the total number of films collected across all URLs and search terms. Set to `0` for no cap. Reviews collected for these films do not count against this limit. |

### Output

Every row carries a `recordType` field — `film` or `review` — so the two sides are easy to split and rejoin downstream. Each review references its parent film by `filmSlug` and `filmTitle`.

#### Film (`recordType: "film"`)

```json
{
    "recordType": "film",
    "filmSlug": "parasite-2019",
    "title": "Parasite",
    "year": 2019,
    "director": "Bong Joon-ho",
    "cast": ["Song Kang-ho", "Lee Sun-kyun", "Cho Yeo-jeong", "Choi Woo-shik"],
    "genres": ["Comedy", "Thriller", "Drama"],
    "runtime": 133,
    "averageRating": 4.56,
    "ratingsCount": 1284503,
    "reviewCount": 312045,
    "language": "Korean",
    "country": "South Korea",
    "tagline": "Act like you own the place.",
    "description": "All unemployed, Ki-taek's family takes peculiar interest in the wealthy and glamorous Parks...",
    "posterUrl": "https://a.ltrbxd.com/resized/film-poster/parasite.jpg",
    "filmUrl": "https://letterboxd.com/film/parasite-2019/",
    "scrapedAt": "2026-06-28T14:30:00Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `"film"` |
| `filmSlug` | string | Letterboxd URL slug, e.g. `parasite-2019` |
| `title` | string | Film title |
| `year` | number | Release year |
| `director` | string | Director(s), comma-separated |
| `cast` | string\[] | Full cast list |
| `genres` | string\[] | Genre tags |
| `runtime` | number | Runtime in minutes |
| `averageRating` | number | Letterboxd average rating (0–5) |
| `ratingsCount` | number | Number of ratings |
| `reviewCount` | number | Number of reviews on Letterboxd |
| `language` | string | Original language |
| `country` | string | Country of origin |
| `tagline` | string | Film tagline |
| `description` | string | Synopsis text |
| `posterUrl` | string | Poster image URL |
| `filmUrl` | string | Letterboxd film page URL |
| `scrapedAt` | string | ISO timestamp of data extraction |

#### Review (`recordType: "review"`)

Emitted when `includeReviews` is on, up to `maxReviewsPerFilm` per film.

```json
{
    "recordType": "review",
    "filmTitle": "Parasite",
    "filmYear": 2019,
    "filmSlug": "parasite-2019",
    "filmUrl": "https://letterboxd.com/film/parasite-2019/",
    "reviewer": "Karsten",
    "username": "karsten",
    "rating": 4.5,
    "reviewText": "A perfect mesh of genre and class commentary that escalates with surgical precision...",
    "isSpoiler": false,
    "reviewUrl": "https://letterboxd.com/karsten/film/parasite-2019/",
    "reviewDate": "2026-02-11"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `"review"` |
| `filmTitle` | string | Parent film's title |
| `filmYear` | number | Parent film's release year |
| `filmSlug` | string | Parent film's slug — join key back to the film row |
| `filmUrl` | string | Parent film's Letterboxd URL |
| `reviewer` | string | Reviewer's display name |
| `username` | string | Reviewer's Letterboxd username |
| `rating` | number | Star rating, 0–5 in half steps (`null` when the reviewer left no star) |
| `reviewText` | string | Full review text |
| `isSpoiler` | boolean | Whether the review is flagged as containing spoilers |
| `reviewUrl` | string | Direct link to the review |
| `reviewDate` | string | Review publish date |

### Tips for Best Results

- **Use member or list URLs for large sets.** Keyword search returns roughly 20 films per term — Letterboxd's search caps at one page. To pull hundreds of titles, point the scraper at a member's films or a curated list instead.
- **Start small to test.** Set `maxResults` to 10 on a first run to confirm the fields match your needs, then scale up.
- **Turn reviews off when you only need metadata.** `includeReviews: false` skips all review fetching for a much faster, cheaper run when you just want film catalogue data.
- **Cap reviews on blockbusters.** Setting `maxReviewsPerFilm: 0` collects as many reviews as possible, but hugely popular titles (hundreds of thousands of reviews) stop after a generous limit to keep runs efficient — so `0` returns a large sample, not literally every review, on the biggest films. Keep a sensible cap (20–100) unless you want the largest sample available.
- **Mix URLs and search terms in one run.** Combine specific film URLs, a member profile, and a few search terms in a single invocation — they're all collected together and de-duplicated by film.
- **Join films to reviews on `filmSlug`.** Both record types carry `filmSlug`, so you can rebuild the one-film-to-many-reviews relationship in any spreadsheet or database.
- **Sort and rank by `averageRating` and `ratingsCount`.** Pair a high average rating with a high ratings count to surface broadly loved films rather than niche titles with a handful of votes.

### Pricing

**From $3.00 per 1,000 films** — reviews are billed separately at the lower rate of $0.50 per 1,000 reviews. This is a pay-per-result model: you're charged per film plus per review collected, with no compute or time-based charges.

| Volume | No discount | Bronze | Silver | Gold |
|--------|-------------|--------|--------|------|
| 1,000 films | $3.60 | $3.40 | $3.20 | $3.00 |
| 1,000 reviews | $0.60 | $0.56 | $0.53 | $0.50 |

Apify's loyalty tiers (Bronze, Silver, Gold) apply automatically in the Console — the more you run, the less you pay. Here's what realistic mixes cost at the Gold tier:

| Example run | Films | Reviews | Gold total |
|-------------|-------|---------|-----------|
| 50 films, 20 reviews each | 50 | 1,000 | $0.65 |
| 10 films, reviews off | 10 | 0 | $0.03 |
| 100 films, 50 reviews each | 100 | 5,000 | $2.80 |

No compute or time-based charges — you pay per film and per review, plus a small fixed per-run start fee. Platform fees depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate film research, audience analysis, content creation, and recommendation work. Users are responsible for complying with applicable laws and Letterboxd's Terms of Service. Reviews and member profiles may contain personal data — handle it responsibly, respect reviewers' rights, and do not use extracted data for spam, harassment, or any illegal purpose.

# Actor input Schema

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

Paste one or more Letterboxd URLs. Accepts film pages (e.g. https://letterboxd.com/film/parasite-2019/), member profiles (e.g. https://letterboxd.com/username/), and curated list pages (e.g. https://letterboxd.com/username/list/my-favourites/). Leave blank to use the search box below.

## `searchTerms` (type: `array`):

Film titles or keywords to search for on Letterboxd (e.g. 'parasite', 'stanley kubrick', 'neon noir'). Each term is searched and the matching films are collected. Ignored for rows where you supply URLs above. Each search term returns up to about 20 films (Letterboxd shows one page of search results) — to pull larger sets, paste member or list URLs into Letterboxd URLs above instead.

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

Collect user reviews for each film, returned as their own rows (reviewer, star rating, full text, spoiler flag, date). Each review is billed as a separate result. Turn off for a faster, cheaper run that returns only film metadata.

## `maxReviewsPerFilm` (type: `integer`):

Cap on the number of reviews captured per film (most popular first). Default is 20. Set to 0 to collect as many reviews as possible per film. Very popular films can have hundreds of thousands of reviews; for those, collection stops after a generous limit to keep runs efficient — set a specific number to control exactly how many you get. Each review is returned as its own result. Ignored when 'Include Reviews' is off.

## `maxResults` (type: `integer`):

Cap on the total number of films collected across all URLs and search terms. Default 50 — increase for bigger runs, or set to 0 for no cap (collects every film found). Reviews collected for these films do not count against this cap.

## Actor input object example

```json
{
  "startUrls": [],
  "searchTerms": [
    "parasite"
  ],
  "includeReviews": true,
  "maxReviewsPerFilm": 20,
  "maxResults": 50
}
```

# Actor output Schema

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

Every record from the run in one place — films and reviews — distinguished by `recordType`.

## `films` (type: `string`):

Films only, with title, year, director, cast, genres, runtime, average rating, language, country, and poster.

## `reviews` (type: `string`):

User reviews only, each linked to its film. Present only when 'Include Reviews' is enabled.

# 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": [],
    "searchTerms": [
        "parasite"
    ],
    "includeReviews": true,
    "maxReviewsPerFilm": 20,
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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": [],
    "searchTerms": ["parasite"],
    "includeReviews": True,
    "maxReviewsPerFilm": 20,
    "maxResults": 50,
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [],
  "searchTerms": [
    "parasite"
  ],
  "includeReviews": true,
  "maxReviewsPerFilm": 20,
  "maxResults": 50
}' |
apify call solidcode/letterboxd-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/letterboxd-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Letterboxd Scraper",
        "description": "Extract films, reviews, and watch history from Letterboxd. Get titles, directors, cast, genres, ratings, and full user reviews. Search by keyword or paste film, member, or list URLs. Films and reviews returned as separate rows.",
        "version": "1.0",
        "x-build-id": "Bj4rk581oCQMoiWF4"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~letterboxd-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-letterboxd-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solidcode~letterboxd-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-letterboxd-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solidcode~letterboxd-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-letterboxd-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "Letterboxd URLs",
                        "type": "array",
                        "description": "Paste one or more Letterboxd URLs. Accepts film pages (e.g. https://letterboxd.com/film/parasite-2019/), member profiles (e.g. https://letterboxd.com/username/), and curated list pages (e.g. https://letterboxd.com/username/list/my-favourites/). Leave blank to use the search box below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchTerms": {
                        "title": "Search Terms",
                        "type": "array",
                        "description": "Film titles or keywords to search for on Letterboxd (e.g. 'parasite', 'stanley kubrick', 'neon noir'). Each term is searched and the matching films are collected. Ignored for rows where you supply URLs above. Each search term returns up to about 20 films (Letterboxd shows one page of search results) — to pull larger sets, paste member or list URLs into Letterboxd URLs above instead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeReviews": {
                        "title": "Include Reviews",
                        "type": "boolean",
                        "description": "Collect user reviews for each film, returned as their own rows (reviewer, star rating, full text, spoiler flag, date). Each review is billed as a separate result. Turn off for a faster, cheaper run that returns only film metadata.",
                        "default": true
                    },
                    "maxReviewsPerFilm": {
                        "title": "Max Reviews Per Film",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap on the number of reviews captured per film (most popular first). Default is 20. Set to 0 to collect as many reviews as possible per film. Very popular films can have hundreds of thousands of reviews; for those, collection stops after a generous limit to keep runs efficient — set a specific number to control exactly how many you get. Each review is returned as its own result. Ignored when 'Include Reviews' is off.",
                        "default": 20
                    },
                    "maxResults": {
                        "title": "Max Films",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap on the total number of films collected across all URLs and search terms. Default 50 — increase for bigger runs, or set to 0 for no cap (collects every film found). Reviews collected for these films do not count against this cap.",
                        "default": 50
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
