# YouTube Scraper Pro (`logical_vivacity/youtube-scraper`) Actor

Extract YouTube data at scale — search results, channel videos & shorts, full transcripts, comments with nested replies, playlists, and trending feeds. No API key or quota limits. Bulk-parallel input accepts any mix of queries, channels, videos, and playlists in one run.

- **URL**: https://apify.com/logical\_vivacity/youtube-scraper.md
- **Developed by:** [Logical Vivacity](https://apify.com/logical_vivacity) (community)
- **Categories:** SEO tools, Videos, Social media
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 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.

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

## YouTube Scraper — Search, Channels, Videos, Transcripts, Comments & Playlists

Extract structured data from YouTube at scale, without an API key, without quota limits, and without the slow browser-based pricing of most competing scrapers. Pull search results, channel videos, single-video metadata, full transcripts, comments and replies, and playlists — all from one input.

Built for **content researchers, SEO teams, marketing agencies, AI/ML pipelines, journalists, and competitive-intelligence workflows** that need clean, structured YouTube data delivered fast.

### Why this YouTube scraper

- **No YouTube Data API key, no quota.** Skip the 10,000-units-per-day cap. Scrape as much as you need.
- **5–10× cheaper than browser-based competitors.** A lightweight fast path replaces full browser rendering for almost every job, so you pay for the data, not for ads, video players, or fonts.
- **One actor, every job.** Search, channel, video, comments, playlist, transcripts — same input, different mode. No need to pay for and chain three different scrapers.
- **Bulk-first.** Pass a list of any mix of targets and the actor figures out what each one is, runs them in parallel, and isolates errors per-target.
- **AI-pipeline-ready.** Full transcripts in plain text plus timed segments, rich field metadata, and a clean schema make this a drop-in source for LLM-based summarization, RAG, content-tagging, and trend-detection systems.

### What you can scrape

| Mode | Input | What you get |
|---|---|---|
| **YouTube search** | A query | Top videos for the query, with date / duration / sort / type filters |
| **YouTube channel** | A handle (`@name`) or channel URL | A tab of your choice: **Videos**, **Shorts**, **Live streams**, **Playlists**, or **About** (channel info) |
| **YouTube video** | A video URL or ID | Full video metadata, plus optional **subtitles & full transcript** in any available language |
| **YouTube comments** | A video URL or ID | Top-level comments, plus optional nested **replies** |
| **YouTube playlist** | A playlist URL or ID | Every video in the playlist, in order, with index, duration, and link |

If you don't pick a mode, it's inferred automatically from your input.

### Use cases

- **SEO and content research** — find the highest-ranking videos for a query under any time window (last hour / today / this week / this month / this year), sorted by views, date, or rating.
- **YouTube transcript extraction** — pull a clean, plain-text transcript out of any video that has captions (manual or auto-generated), in dozens of languages. Feed straight into LLM summarization, semantic search, or RAG.
- **Competitive intelligence** — track a competitor's channel: every new upload, every Short, every live replay, all subscriber/view stats from the About tab.
- **Comment sentiment & community research** — pull thousands of comments and replies on a viral video, with author, like count, and pinned/hearted-by-creator flags.
- **Playlist mining** — turn a curated playlist of 500 videos into a clean dataset for a course catalog, music library, or content recommender.
- **Influencer discovery** — search by view count + recency to surface fast-rising creators in any niche.
- **Dataset building for ML** — bulk-scrape thousands of videos and their transcripts to fine-tune or evaluate models.

### Bulk inputs (any mix of types)

Pass an array of targets and the actor processes them in parallel. The list can mix queries, channel handles, video URLs, and playlist links — each target is dispatched to the right mode automatically.

```json
{
  "targets": [
    "playwright tutorial",
    "@MrBeast",
    "https://www.youtube.com/watch?v=wGr5rz8WGCE",
    "PLBuVTgrx7DqQK9X4i7t6Itw9MJyfKRFi8"
  ],
  "concurrency": 5,
  "maxItems": 100
}
````

### Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `target` | string | — | A single query, handle/URL, video, or playlist. |
| `targets` | string\[] | — | Multiple targets in one run. Overrides `target` if set. |
| `mode` | string | inferred | `search`, `channel`, `video`, `comments`, or `playlist`. |
| `maxItems` | integer | `50` | Max records per target. Ignored for `video`. |
| `concurrency` | integer | `3` | Targets to process in parallel. |
| `language` | string | `en` | Two-letter language code. |
| `region` | string | `US` | Two-letter country code used to localize results. |
| `channelTab` | string | `videos` | When mode is `channel`: `videos`, `shorts`, `streams`, `playlists`, or `about`. |
| `uploadDate` | string | `any` | Search filter: `hour`, `today`, `week`, `month`, `year`. |
| `durationFilter` | string | `any` | Search filter: `short` (<4 min), `medium` (4–20 min), `long` (>20 min). |
| `sortBy` | string | `relevance` | Sort search results: `relevance`, `date`, `views`, `rating`. |
| `resultType` | string | `video` | Restrict search to: `video`, `channel`, `playlist`, `movie`. |
| `includeSubtitles` | boolean | `false` | For `video` mode, also fetch the subtitle track and a plain-text transcript. |
| `subtitleLanguage` | string | — | Preferred subtitle language code (e.g. `en`, `es`). |
| `includeReplies` | boolean | `false` | For `comments` mode, also pull replies under each top-level comment. |
| `maxRepliesPerComment` | integer | `10` | Cap on replies per comment. |
| `proxyConfiguration` | object | Apify Proxy on | Optional proxy settings. |

### Examples

#### Find the most-viewed videos on a topic this week

```json
{
  "target": "open source ai",
  "uploadDate": "week",
  "sortBy": "views",
  "maxItems": 100
}
```

#### Download a YouTube transcript

```json
{
  "target": "https://www.youtube.com/watch?v=wGr5rz8WGCE",
  "includeSubtitles": true,
  "subtitleLanguage": "en"
}
```

#### Scrape a creator's Shorts

```json
{ "target": "@MrBeast", "mode": "channel", "channelTab": "shorts", "maxItems": 200 }
```

#### Pull comments and replies on a video

```json
{
  "target": "wGr5rz8WGCE",
  "mode": "comments",
  "includeReplies": true,
  "maxRepliesPerComment": 25,
  "maxItems": 500
}
```

#### Bulk-scrape a list of channels

```json
{
  "targets": ["@MrBeast", "@MKBHD", "@LinusTechTips", "@veritasium"],
  "mode": "channel",
  "channelTab": "videos",
  "maxItems": 30,
  "concurrency": 4
}
```

### Output

Every record lands in the run's dataset, one row per item. Each record carries a `mode` field so mixed-mode runs stay easy to filter and route.

**Common fields on every video-like record**: `videoId`, `url`, `title`, `channel`, `channelId`, `channelUrl`, `viewCount`, `viewCountText`, `duration`, `lengthSeconds`, `publishedTimeText`, `thumbnail`.

**Computed fields** added automatically wherever the data exists — useful for ranking, dashboards, and analytics:

- `viewsPerDay` — average daily views since publish
- `daysSincePublished` — fractional days since publish
- `likeCountApprox` — like count parsed from short-form (`4.6k` → `4600`)
- `likeViewRatio` — engagement ratio
- `lengthSeconds` — duration normalized to whole seconds

**Mode-specific extras:**

- **`video`** — `description`, `keywords`, `publishDate`, `category`, `likesText`, `availableSubtitles`, plus `subtitleSegments` and `transcript` when subtitles are requested
- **`comments` / `replies`** — `commentId`, `author`, `authorChannelId`, `authorUrl`, `text`, `likeCount`, `isPinned`, `isHearted`, `replyCount`. Replies also carry `parentCommentId`
- **`playlist`** — `playlistId`, `playlistTitle`, `indexInPlaylist`
- **`channelAbout`** — `subscriberCountText`, `videoCountText`, `joinedDate`, `country`, `links`, `avatar`, `banner`, channel description and keywords
- **`shorts` / `live`** — same shape as videos, plus `isShort` / `isLive` flags

Three pre-built table views on the dataset: **Overview** (covers most modes), **Comments**, and **Transcripts**.

Records are written incrementally as each target finishes, so a long bulk run is observable from the first second — no waiting for a single dump at the end.

### Speed and cost

This scraper is built around a lightweight fast path: one HTTP request returns YouTube's own embedded data, and pagination uses the same continuation API the YouTube site uses internally. No browser, no rendered page, no ad downloads, no video player.

In practice that's roughly **5–10× faster and cheaper** than browser-based YouTube scrapers for the same data. Heavy continuation jobs — pulling 5,000 search results or 10,000 comments — feel light because every additional page is a single API call rather than a full page render.

### Compared to YouTube Data API

| | This actor | YouTube Data API v3 |
|---|---|---|
| API key required | No | Yes |
| Daily quota | None | 10,000 units (≈100 search calls) |
| Search filters | All standard filters | Yes |
| Full transcripts | Yes | No (third-party only) |
| Comment replies (nested) | Yes | Yes |
| Channel "About" details | Yes | Limited |
| Bulk parallel processing | Yes | DIY |
| Cost model | Pay per run | Free up to quota, then approval needed |

### FAQ

#### Does this scraper work without a YouTube Data API key?

Yes. There's no quota and no key to manage. You're scraping public pages directly.

#### Can I download YouTube subtitles or transcripts?

Yes — for any video that has captions (manually uploaded or auto-generated). Set `includeSubtitles: true` and optionally `subtitleLanguage` (e.g. `"en"`, `"es"`, `"hi"`). You get both timed segments and a single plain-text transcript field.

#### Can I scrape YouTube comments at scale?

Yes. Set `mode: "comments"` and a `maxItems` cap. Add `includeReplies: true` to also pull nested replies. Each comment includes the author handle, channel ID, like count, pinned status, and creator-hearted status.

#### Can I scrape an entire YouTube channel?

Yes. Pass the channel handle (`@name`) or URL and pick a tab via `channelTab`: `videos`, `shorts`, `streams` (live replays), `playlists`, or `about` for subscriber count, country, joined date, and external links.

#### Can I scrape YouTube Shorts?

Yes. Set `mode: "channel"` and `channelTab: "shorts"`. Search results that are Shorts are also returned with `isShort: true`.

#### How do I scrape multiple channels or videos in one run?

Use the `targets` array. You can mix queries, handles, video URLs, and playlist links in the same list. The `concurrency` field controls how many run in parallel.

#### Does it handle YouTube playlists?

Yes. Pass a playlist URL or ID with `mode: "playlist"`. Records are returned in playlist order with an `indexInPlaylist` field.

#### Will it bypass age-gated or private videos?

No. Private, members-only, and login-required content is not accessible. Age-gated content depends on the run's region and proxy setup.

#### What happens if a target fails?

A single record with an `error` field is pushed to the dataset for that target, and the rest of the run continues. Failures don't kill the job.

#### Is there a single-video / single-target pricing tier?

Yes — small inputs run on the fast path and are very cheap. Bulk runs scale linearly with `len(targets) × maxItems`. Use a small smoke-test input first to estimate cost.

#### Can I pass an Apify Proxy or my own proxy?

Yes. Configure it via `proxyConfiguration`. Apify Proxy is on by default.

### Notes

- View counts and like counts are returned both as the raw display string (e.g. `"199,700 views"`, `"4.6k"`) and as numbers wherever they parse cleanly.
- If a video has comments disabled, `comments` mode returns no records and logs a warning.
- Channel handles work with or without the leading `@`.
- A target that fails for any reason produces a single record with an `error` field rather than killing the rest of the run.

***

**Keywords:** YouTube scraper, YouTube data extractor, YouTube transcript downloader, YouTube comments scraper, YouTube channel scraper, YouTube search scraper, YouTube playlist scraper, YouTube data without API, YouTube subtitles extractor, YouTube Shorts scraper, scrape YouTube without API key, YouTube bulk scraper, YouTube API alternative, YouTube data for AI, YouTube transcript for LLM, YouTube content research tool.

# Actor input Schema

## `target` (type: `string`):

What to look up. A search query, channel handle/URL, video URL/ID, or playlist URL/ID.

## `targets` (type: `array`):

Run the scraper across many targets in one go. If set, `target` is ignored. Each entry can be a query, channel, video, or playlist.

## `mode` (type: `string`):

What to scrape. If left blank, the mode is inferred from the input (a video URL becomes `video`, a handle becomes `channel`, a `playlist?list=…` link becomes `playlist`, otherwise `search`).

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

Maximum records to collect for each target. Ignored for `video`.

## `concurrency` (type: `integer`):

How many targets to process at the same time when running in bulk.

## `language` (type: `string`):

Two-letter language code used to pick UI language (e.g. `en`, `de`, `es`).

## `region` (type: `string`):

Two-letter country code used to localize results (e.g. `US`, `GB`, `DE`).

## `channelTab` (type: `string`):

Which tab to scrape when mode is `channel`.

## `uploadDate` (type: `string`):

Restrict search results to a recency window.

## `durationFilter` (type: `string`):

Restrict search results to a duration range.

## `sortBy` (type: `string`):

How to order search results.

## `resultType` (type: `string`):

Which kind of result to keep when searching.

## `includeSubtitles` (type: `boolean`):

When scraping a single video, also fetch its subtitle track and produce a plain-text transcript.

## `subtitleLanguage` (type: `string`):

Preferred subtitle language code (e.g. `en`, `es`). Falls back to the first available track if the chosen one isn't there.

## `includeReplies` (type: `boolean`):

When scraping comments, also pull replies under each top-level comment. Slower and produces more records.

## `maxRepliesPerComment` (type: `integer`):

Cap on replies fetched per top-level comment.

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

Optional proxy settings used while scraping.

## Actor input object example

```json
{
  "target": "playwright tutorial",
  "maxItems": 50,
  "concurrency": 3,
  "language": "en",
  "region": "US",
  "channelTab": "videos",
  "uploadDate": "any",
  "durationFilter": "any",
  "sortBy": "relevance",
  "resultType": "video",
  "includeSubtitles": false,
  "subtitleLanguage": "en",
  "includeReplies": false,
  "maxRepliesPerComment": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All records produced by the run, in dataset row format.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("logical_vivacity/youtube-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("logical_vivacity/youtube-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 '{}' |
apify call logical_vivacity/youtube-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Scraper Pro",
        "description": "Extract YouTube data at scale — search results, channel videos & shorts, full transcripts, comments with nested replies, playlists, and trending feeds. No API key or quota limits. Bulk-parallel input accepts any mix of queries, channels, videos, and playlists in one run.",
        "version": "0.1",
        "x-build-id": "AjoQP0UeO366SmHBR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logical_vivacity~youtube-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logical_vivacity-youtube-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/logical_vivacity~youtube-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logical_vivacity-youtube-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/logical_vivacity~youtube-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logical_vivacity-youtube-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": {
                    "target": {
                        "title": "Target",
                        "type": "string",
                        "description": "What to look up. A search query, channel handle/URL, video URL/ID, or playlist URL/ID."
                    },
                    "targets": {
                        "title": "Bulk targets",
                        "type": "array",
                        "description": "Run the scraper across many targets in one go. If set, `target` is ignored. Each entry can be a query, channel, video, or playlist.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "channel",
                            "video",
                            "comments",
                            "playlist"
                        ],
                        "type": "string",
                        "description": "What to scrape. If left blank, the mode is inferred from the input (a video URL becomes `video`, a handle becomes `channel`, a `playlist?list=…` link becomes `playlist`, otherwise `search`)."
                    },
                    "maxItems": {
                        "title": "Max items per target",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum records to collect for each target. Ignored for `video`.",
                        "default": 50
                    },
                    "concurrency": {
                        "title": "Parallel targets",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many targets to process at the same time when running in bulk.",
                        "default": 3
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Two-letter language code used to pick UI language (e.g. `en`, `de`, `es`).",
                        "default": "en"
                    },
                    "region": {
                        "title": "Region",
                        "type": "string",
                        "description": "Two-letter country code used to localize results (e.g. `US`, `GB`, `DE`).",
                        "default": "US"
                    },
                    "channelTab": {
                        "title": "Channel tab",
                        "enum": [
                            "videos",
                            "shorts",
                            "streams",
                            "playlists",
                            "about"
                        ],
                        "type": "string",
                        "description": "Which tab to scrape when mode is `channel`.",
                        "default": "videos"
                    },
                    "uploadDate": {
                        "title": "Upload date filter",
                        "enum": [
                            "any",
                            "hour",
                            "today",
                            "week",
                            "month",
                            "year"
                        ],
                        "type": "string",
                        "description": "Restrict search results to a recency window.",
                        "default": "any"
                    },
                    "durationFilter": {
                        "title": "Duration filter",
                        "enum": [
                            "any",
                            "short",
                            "medium",
                            "long"
                        ],
                        "type": "string",
                        "description": "Restrict search results to a duration range.",
                        "default": "any"
                    },
                    "sortBy": {
                        "title": "Sort search results by",
                        "enum": [
                            "relevance",
                            "date",
                            "views",
                            "rating"
                        ],
                        "type": "string",
                        "description": "How to order search results.",
                        "default": "relevance"
                    },
                    "resultType": {
                        "title": "Search result type",
                        "enum": [
                            "video",
                            "channel",
                            "playlist",
                            "movie"
                        ],
                        "type": "string",
                        "description": "Which kind of result to keep when searching.",
                        "default": "video"
                    },
                    "includeSubtitles": {
                        "title": "Include subtitles / transcript",
                        "type": "boolean",
                        "description": "When scraping a single video, also fetch its subtitle track and produce a plain-text transcript.",
                        "default": false
                    },
                    "subtitleLanguage": {
                        "title": "Subtitle language",
                        "type": "string",
                        "description": "Preferred subtitle language code (e.g. `en`, `es`). Falls back to the first available track if the chosen one isn't there."
                    },
                    "includeReplies": {
                        "title": "Include comment replies",
                        "type": "boolean",
                        "description": "When scraping comments, also pull replies under each top-level comment. Slower and produces more records.",
                        "default": false
                    },
                    "maxRepliesPerComment": {
                        "title": "Max replies per comment",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Cap on replies fetched per top-level comment.",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional proxy settings used while scraping.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
