# YouTube Video 360 Intelligence — Bundle Scraper (`sian.agency/youtube-video-360-intelligence`) Actor

The most complete YouTube video snapshot on Apify. Metadata, transcript, related videos, and subtitle languages in one parallel run. Built for AI training, journalism, video SEO, and content intelligence. For comments, pair with our dedicated comments actor.

- **URL**: https://apify.com/sian.agency/youtube-video-360-intelligence.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Videos, Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.25 / 1,000 video info snapshots

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

## YouTube Video 360 Intelligence — Bundle Scraper 🎬

[![Store-SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store-Cheapest YouTube Comments](https://img.shields.io/badge/Store-Cheapest%20YouTube%20Comments-FF0000)](https://apify.com/sian.agency/cheapest-youtube-comments-scraper?fpr=sian) [![Store-YouTube AI Comments + Questions](https://img.shields.io/badge/Store-YouTube%20AI%20Comments%20%2B%20Questions-FF0000)](https://apify.com/sian.agency/youtube-ai-comments-scraper-and-questions-extractor?fpr=sian) [![Store-YouTube Shorts AI Transcript](https://img.shields.io/badge/Store-YouTube%20Shorts%20AI%20Transcript-FF0000)](https://apify.com/sian.agency/youtube-shorts-ai-transcript-and-metadata-extractor?fpr=sian)

**The most complete YouTube video snapshot on Apify.** One run pulls metadata, transcript, related videos, and subtitle languages into a single tidy-long dataset — in parallel. Built for AI training, journalism, video SEO, and content intelligence.

> 💬 **Need comments?** This actor deliberately excludes comments to keep the bundle focused and predictable. Pair with our [Cheapest YouTube Comments Scraper](https://apify.com/sian.agency/cheapest-youtube-comments-scraper?fpr=sian) or [AI Comments + Questions Extractor](https://apify.com/sian.agency/youtube-ai-comments-scraper-and-questions-extractor?fpr=sian).

---

### Why this actor

Most YouTube-video scrapers on Apify ship one endpoint. To build a real per-video pack you have to chain three or four actors together — and your data team still has to JOIN the results.

This actor delivers **four YouTube video endpoints in one parallel run, one bill, one dataset**:

| | This actor | Top per-endpoint commodity scrapers |
|---|---|---|
| Video metadata (title, views, likes, description, tags) | ✅ | ✅ (single-endpoint) |
| Full transcript with timestamped chunks | ✅ | ✅ (separate transcript-only actor) |
| Related / recommended videos graph | ✅ | partial / not surfaced |
| Subtitle languages (native + 100+ auto-translation) | ✅ | rarely exposed |
| Parallel execution (one wall-clock latency) | ✅ | sequential |
| Unified tidy-long row schema with `rowType` | ✅ | flat blob — flatten yourself |
| Opt-out per endpoint (transparent pricing) | ✅ | n/a |

Drop the result into Pandas, DuckDB, or BigQuery and filter by `rowType` to slice the bundle.

---

### What you get back

A single dataset where every row carries a `rowType` discriminator:

| `rowType` | What it is | Charged event |
|---|---|---|
| `video_info` | Full per-video metadata snapshot — title, channel, views, likes, description, tags, length, publishedAt, category, available countries | `video-info-result` |
| `transcript` | One consolidated transcript row per video. Full `transcriptText` + structured chunks (with `startMs` / `endMs` / `text`) in `extra.chunks` | `video-transcript-result` |
| `related_video` | One row per related/recommended video (videoId, channelTitle, views, publishedAt) | `video-related-row` |
| `subtitle_language` | One row per native subtitle language available; first row carries the full 100+ auto-translation language list in `extra.translationLanguages` | `video-subtitle-language-row` |
| `error` | Status row (`status: invalid_video | endpoint_unavailable | error`) — never charged | — |

Every row also carries `_sourceVideoInput`, `_sourceVideoId`, `_sourceEndpoint`, `_fetchedAt`, and `_page` so you can group, dedupe, and trace lineage in your downstream pipeline.

---

### Input

The actor accepts a single video or a batch of videos. Each entry can be:

- **Video ID** — `dQw4w9WgXcQ` (11 chars, fastest).
- **Watch URL** — `https://www.youtube.com/watch?v=dQw4w9WgXcQ`.
- **Short URL** — `https://youtu.be/dQw4w9WgXcQ`.
- **Shorts URL** — `https://www.youtube.com/shorts/...`.
- **Embed URL** — `https://www.youtube.com/embed/...`.
- **Live URL** — `https://www.youtube.com/live/...`.

```json
{
  "videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "includeEndpoints": ["info", "transcript", "related", "subtitles"],
  "maxRelatedPages": 1
}
````

```json
{
  "videoUrls": "dQw4w9WgXcQ\naircAruvnKk\nkJQP7kiw5Fk",
  "includeEndpoints": ["info", "transcript"],
  "maxRelatedPages": 1
}
```

#### Input fields

| Field | Type | Default | Description |
|---|---|---|---|
| `videoUrl` | string | — | One video (ID or URL). One of `videoUrl` or `videoUrls` is required. |
| `videoUrls` | string | — | Batch — comma/newline-separated list. Max 50 per run. Overrides `videoUrl`. |
| `includeEndpoints` | array | All 4 | Pick which endpoints to scrape. Defaults to: `info`, `transcript`, `related`, `subtitles`. `info` is always required (anchor row). |
| `maxRelatedPages` | integer | 1 | Max pages of related videos to fetch (each ~20 rows). Range 1–10. |
| `transcriptLang` | string | — | Optional. Preferred transcript language code (`en`, `es`, `ja`, `pt`). |

***

### How endpoint-level gating works

Every video is scraped in parallel across all 4 endpoints (`Promise.allSettled`) for **one wall-clock latency, not four**. If an endpoint can't return data for a specific video — e.g. transcript on a silent music video, or subtitles on a livestream that YouTube is still processing — the actor:

1. **Detects the body-level error** (yt-api wraps endpoint errors at the body level, not HTTP).
2. **Does not charge you** for that endpoint.
3. **Pushes one status row** (`status: endpoint_unavailable`, with the upstream message) so you have an auditable trail.

The same logic catches invalid videos (404s) and aborts downstream calls for that single video, saving your quota.

***

### Pricing

**Pay-per-event.** Bronze tier rates shown — higher tiers auto-ladder via the Apify tier system (FREE is intentionally higher to prevent abuse — see Apify pricing docs).

| Event | BRONZE | What it covers |
|---|---|---|
| `apify-actor-start` (once) | $0.005 | Actor lifecycle |
| `video-info-result` ⭐ | $0.015 | Per video — full metadata snapshot (the anchor row) |
| `video-transcript-result` | $0.012 | Per video — one consolidated transcript row with timestamped chunks |
| `video-related-row` | $0.003 | Per related-video row |
| `video-subtitle-language-row` | $0.001 | Per native subtitle language row |

⭐ = primary / headline event (snapshot anchor; exactly 1 per successful video).

**Estimated full-bundle cost (Rick Astley, 1 related page, BRONZE tier):**
$0.005 (start) + $0.015 (info) + $0.012 (transcript) + 18 × $0.003 (related) + 6 × $0.001 (subtitle langs) = **~$0.092 / video**.

**Cheap-snapshot cost (`includeEndpoints: ["info"]` only):**
$0.005 (start) + $0.015 (info) = **~$0.020 / video** for the metadata snapshot alone.

Skip endpoints you don't need — never pay for data you didn't request.

***

### Use cases

1. **Content-Intelligence Platforms — Per-Video Data Packs.** Platforms aggregating creator and brand video performance need a complete per-video snapshot: metadata, transcript, related-video graph, subtitle coverage. One actor run replaces four separate scraping pipelines.

2. **AI / ML Training Datasets — Multi-Modal Video Data.** Teams training video understanding, summarization, or recommendation models need text + relational + metadata signals together. The tidy-long `rowType` schema (`video_info`, `transcript`, `related_video`, `subtitle_language`) is purpose-built for Pandas, DuckDB, and BigQuery pipelines.

3. **Journalism + OSINT — Full Provenance Pack.** A research desk vetting a viral video needs metadata (publishedAt, channel, views), full transcript, the recommended/related sphere, and language reach (subtitle coverage). All in one run, one bill — no juggling four scrapers under deadline pressure.

4. **Video SEO + Competitor Research.** Marketing teams competing on YouTube need to scrape competitors' top videos as full snapshots — descriptions, tags, related-video graph (their content network), and subtitle coverage (their international reach). One snapshot per competitor video, batched across your watchlist.

5. **Content-Localisation Teams — Subtitle-Language Audits.** L10n teams need to know which videos already have native subtitles versus YouTube auto-translation only. The subtitle-languages endpoint returns native language coverage; combine with metadata and transcript to baseline a creator's localisation maturity.

***

### Output schema (unified rows)

Every row carries:

- **Tracing fields**: `_sourceVideoInput`, `_sourceVideoId`, `_sourceEndpoint`, `_fetchedAt`, `_page`
- **Discriminator**: `rowType` (one of `video_info | transcript | related_video | subtitle_language | error`)
- **Status**: `status` (`success` / `invalid_video` / `endpoint_unavailable` / `error`)

Plus per-`rowType` fields:

**`video_info`** — `videoId`, `videoPageUrl`, `videoTitle`, `videoDescription`, `lengthText`, `lengthSeconds`, `publishedAt`, `viewCount`, `likeCount`, `category`, `videoKeywords`, `thumbnailUrl`, `isLiveContent`, `isShortsEligible`, `isFamilySafe`, `isPrivate`, `isUnlisted`, `hasCaption`, `defaultVideoLanguage`, `defaultVideoLanguageCode`, `availableCountries`, `channelId`, `channelTitle`.

**`transcript`** — `transcriptText` (full joined text), `transcriptLanguageCode`, `transcriptLanguageTitle`, `transcriptChunkCount`. Structured chunks (with `startMs`, `endMs`, `text` per chunk) live in `extra.chunks`.

**`related_video`** — `relatedVideoId`, `relatedVideoPageUrl`, `channelId`, `channelTitle`, `channelHandle`, `publishedAt`, `publishedTimeText`, `viewCount`, `viewCountText`, `lengthText`, `thumbnailUrl`. The related video's own title sits in `extra.relatedVideoTitle`.

**`subtitle_language`** — `subtitleLanguageCode`, `subtitleLanguageName`, `subtitleUrl` (direct srv1 download URL; expires in a few hours), `subtitleIsTranslatable`. The first row carries the full 100+ auto-translation language list in `extra.translationLanguages`.

Any endpoint-specific upstream field that doesn't fit the unified schema is captured in `extra` (object) so you never lose data.

***

### FAQ

**Q: I only need the transcript. Can I opt out of the rest?**
Yes — set `includeEndpoints: ["info", "transcript"]`. You'll get the metadata anchor + transcript only, and pay only for those events. `info` is required because it's the bundle's anchor row and source of the row's video title.

**Q: Why is `info` always required?**
The info row anchors every downstream row (transcript, related, subtitle) with the video's title and channel. It also lets the actor short-circuit on invalid videos — if `info` returns "Video unavailable", no other endpoint is called and you don't get charged for them.

**Q: What if a video has no transcript?**
Some music videos and silent clips have no transcript. The actor pushes one `status: endpoint_unavailable` row for transcript with the upstream message. No charge.

**Q: What if I pass an invalid video ID or a deleted video?**
The actor pushes one `status: invalid_video` row with the upstream message. No upstream calls for transcript/related/subtitles, no charges.

**Q: Why are comments excluded?**
We ship two dedicated comments actors with simpler input modes and lower per-row pricing:

- [Cheapest YouTube Comments Scraper](https://apify.com/sian.agency/cheapest-youtube-comments-scraper?fpr=sian) for raw comment harvesting.
- [YouTube AI Comments + Questions Extractor](https://apify.com/sian.agency/youtube-ai-comments-scraper-and-questions-extractor?fpr=sian) for AI-extracted Q\&A.

Bundling comments into here would commoditize them and make this actor's pricing harder to read. The bundle stays focused on the 4 non-comment endpoints.

**Q: Do you handle Shorts URLs (`youtube.com/shorts/...`)?**
Yes — the URL extractor recognises `/shorts/` paths and pulls the 11-char video ID. The info endpoint returns the same row shape, with `isShortsEligible` flagged when YouTube classifies it as a Short.

**Q: How fast is it for a batch?**
Parallel execution within each video + 3-video concurrent batching across the run. Our local smoke test: 3 videos × 4 endpoints = **103 rows in 2.1 seconds**.

**Q: Are the subtitle URLs downloadable?**
Yes — `subtitleUrl` is YouTube's direct srv1 timed-text URL. Note that these URLs expire after a few hours; download promptly or re-scrape.

**Q: Can I get more than 20 related videos?**
Yes — set `maxRelatedPages` up to 10. Each page returns ~20 related videos (sequential pagination via continuation tokens).

***

### ⚠️ Trademark Disclaimer

YouTube® is a trademark of Google LLC. This actor is an independent data-discovery tool. It is not affiliated with, endorsed by, sponsored by, or supported by Google LLC or YouTube. All trademarks, registered trademarks, and brand names are the property of their respective owners.

***

### Legal & data privacy

This actor scrapes publicly accessible YouTube video data. Users are responsible for ensuring compliance with YouTube's Terms of Service and applicable data-protection laws (GDPR, CCPA, etc.) when using the data downstream. Don't scrape PII or use scraped data to harass / discriminate. See [Apify's blog on legal scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### Support

- Email: apify@sian-agency.online
- Issues: use the Apify Console Issues tab for this actor
- More actors: [apify.com/sian.agency](https://apify.com/sian.agency?fpr=sian)

***

# Actor input Schema

## `videoUrl` (type: `string`):

One YouTube video to scrape. Accepts ANY of:

- Video ID (`dQw4w9WgXcQ` — 11 chars, fastest).
- Full watch URL (`https://www.youtube.com/watch?v=dQw4w9WgXcQ`).
- Short URL (`https://youtu.be/dQw4w9WgXcQ`).
- Shorts URL (`https://www.youtube.com/shorts/...`).
- Embed URL (`https://www.youtube.com/embed/...`).
- Live URL (`https://www.youtube.com/live/...`).

Use `videoUrls` below for batch scans. One of `videoUrl` or `videoUrls` is required.

## `videoUrls` (type: `string`):

Optional — for batch scans. Comma-separated OR newline-separated list of video URLs or IDs (same formats as `videoUrl`). Each video runs the full bundle independently and tags every row with its source video. Max 50 videos per run. Overrides `videoUrl` when set.

Example (one per line):

```
dQw4w9WgXcQ
https://youtu.be/aircAruvnKk
https://www.youtube.com/watch?v=kJQP7kiw5Fk
```

## `includeEndpoints` (type: `array`):

Pick which endpoints to scrape per video. **Defaults to all 4** — leave empty to fetch the full bundle. Endpoints that return errors for a given video (e.g. transcript on a silent music video, subtitles on a livestream) are silently skipped — you are NEVER charged for unavailable endpoint pulls. The `info` endpoint is always required (the bundle's anchor row).

- `info` — full video metadata (title, channel, views, likes, description, tags, length, publishedAt, category, etc.)
- `transcript` — full long-form video transcript with timestamped chunks (one consolidated row per video)
- `related` — related/recommended videos graph (~20 per page)
- `subtitles` — native subtitle languages available (and the 100+ auto-translation languages)

## `maxRelatedPages` (type: `integer`):

Max pages of related videos to fetch (each page returns ~20 related videos). Set to `1` for a quick snapshot, `2-3` for a deeper related-video graph, `10` for full historical (capped). Only applies when `related` is in `includeEndpoints`.

## `transcriptLang` (type: `string`):

Optional. Preferred transcript language code (e.g. `en`, `es`, `pt`, `ja`). If the video has multiple transcript languages, the requested one is selected. Defaults to the video's auto-selected language (usually English-auto if available).

## Actor input object example

```json
{
  "videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "videoUrls": "dQw4w9WgXcQ\naircAruvnKk\nhttps://www.youtube.com/watch?v=kJQP7kiw5Fk",
  "includeEndpoints": [
    "info",
    "transcript",
    "related",
    "subtitles"
  ],
  "maxRelatedPages": 1,
  "transcriptLang": "en"
}
```

# Actor output Schema

## `output` (type: `string`):

Tidy-long rows. Filter by `rowType` (`video_info`, `transcript`, `related_video`, `subtitle_language`, `error`) and `_sourceEndpoint` to slice the bundle. Every row tagged with `_sourceVideoInput`, `_sourceVideoId`, and `_fetchedAt`.

## `report` (type: `string`):

HTML report with run status, success/error counts, per-endpoint and per-video breakdowns, pages fetched, duration, and inputs — written even on fatal crash.

# 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("sian.agency/youtube-video-360-intelligence").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("sian.agency/youtube-video-360-intelligence").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 sian.agency/youtube-video-360-intelligence --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

````json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Video 360 Intelligence — Bundle Scraper",
        "description": "The most complete YouTube video snapshot on Apify. Metadata, transcript, related videos, and subtitle languages in one parallel run. Built for AI training, journalism, video SEO, and content intelligence. For comments, pair with our dedicated comments actor.",
        "version": "1.0",
        "x-build-id": "xQpp7FSp8if4TfaSt"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~youtube-video-360-intelligence/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-youtube-video-360-intelligence",
                "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/sian.agency~youtube-video-360-intelligence/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-youtube-video-360-intelligence",
                "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/sian.agency~youtube-video-360-intelligence/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-youtube-video-360-intelligence",
                "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": {
                    "videoUrl": {
                        "title": "🎬 Video (single)",
                        "type": "string",
                        "description": "One YouTube video to scrape. Accepts ANY of:\n- Video ID (`dQw4w9WgXcQ` — 11 chars, fastest).\n- Full watch URL (`https://www.youtube.com/watch?v=dQw4w9WgXcQ`).\n- Short URL (`https://youtu.be/dQw4w9WgXcQ`).\n- Shorts URL (`https://www.youtube.com/shorts/...`).\n- Embed URL (`https://www.youtube.com/embed/...`).\n- Live URL (`https://www.youtube.com/live/...`).\n\nUse `videoUrls` below for batch scans. One of `videoUrl` or `videoUrls` is required."
                    },
                    "videoUrls": {
                        "title": "🎬 Videos (batch — comma or newline separated)",
                        "type": "string",
                        "description": "Optional — for batch scans. Comma-separated OR newline-separated list of video URLs or IDs (same formats as `videoUrl`). Each video runs the full bundle independently and tags every row with its source video. Max 50 videos per run. Overrides `videoUrl` when set.\n\nExample (one per line):\n```\ndQw4w9WgXcQ\nhttps://youtu.be/aircAruvnKk\nhttps://www.youtube.com/watch?v=kJQP7kiw5Fk\n```"
                    },
                    "includeEndpoints": {
                        "title": "🎯 Endpoints to fetch",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Pick which endpoints to scrape per video. **Defaults to all 4** — leave empty to fetch the full bundle. Endpoints that return errors for a given video (e.g. transcript on a silent music video, subtitles on a livestream) are silently skipped — you are NEVER charged for unavailable endpoint pulls. The `info` endpoint is always required (the bundle's anchor row).\n\n- `info` — full video metadata (title, channel, views, likes, description, tags, length, publishedAt, category, etc.)\n- `transcript` — full long-form video transcript with timestamped chunks (one consolidated row per video)\n- `related` — related/recommended videos graph (~20 per page)\n- `subtitles` — native subtitle languages available (and the 100+ auto-translation languages)",
                        "items": {
                            "type": "string",
                            "enum": [
                                "info",
                                "transcript",
                                "related",
                                "subtitles"
                            ]
                        },
                        "default": [
                            "info",
                            "transcript",
                            "related",
                            "subtitles"
                        ]
                    },
                    "maxRelatedPages": {
                        "title": "📄 Max related pages",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Max pages of related videos to fetch (each page returns ~20 related videos). Set to `1` for a quick snapshot, `2-3` for a deeper related-video graph, `10` for full historical (capped). Only applies when `related` is in `includeEndpoints`.",
                        "default": 1
                    },
                    "transcriptLang": {
                        "title": "🗣 Transcript language (optional)",
                        "type": "string",
                        "description": "Optional. Preferred transcript language code (e.g. `en`, `es`, `pt`, `ja`). If the video has multiple transcript languages, the requested one is selected. Defaults to the video's auto-selected language (usually English-auto if available)."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
````
