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

The most comprehensive YouTube channel scraper on Apify. One run pulls videos, shorts, livestreams, playlists, community posts, and store products into one unified tidy-long dataset. Tab-aware gating skips empty endpoints. Built for influencer agencies, M\&A diligence, and brand safety.

- **URL**: https://apify.com/sian.agency/youtube-channel-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 $1.50 / 1,000 channel video rows

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 Channel 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-YouTube Auto-Complete](https://img.shields.io/badge/Store-YouTube%20Auto--Complete-FF0000)](https://apify.com/sian.agency/youtube-auto-complete-and-query-suggestion?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) [![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)

**The most comprehensive YouTube channel scraper on Apify.** One run pulls videos, shorts, livestreams, playlists, community posts, store products, and channel metadata into a single tidy-long dataset. Tab-aware gating skips empty endpoints — you are never charged for tabs that don't exist on a channel.

---

### Why this actor

Most YouTube-channel scrapers on Apify return videos only. To build a real creator profile you have to chain three or four actors together — and your data team still has to glue the results into one table.

This actor delivers **eight YouTube channel surfaces in one run, one bill, one dataset**:

| | This actor | Top incumbent (videos-only scrapers) |
|---|---|---|
| Channel metadata (About) | ✅ | partial / not surfaced |
| Long-form videos | ✅ | ✅ |
| Shorts | ✅ | ❌ |
| Livestreams (past + upcoming) | ✅ | ❌ |
| Playlists | ✅ | ❌ |
| Community posts | ✅ | ❌ |
| Store / merch products | ✅ | ❌ |
| Within-channel search | ✅ | ❌ |
| Unified tidy-long row schema | ✅ | flat blob — flatten yourself |
| Tab-aware gating (no charge for empty tabs) | ✅ | 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 |
|---|---|---|
| `about` | Channel metadata snapshot (subs, joined, country, links, tabs) | `channel-about-row` |
| `video` | Long-form video from the Videos tab (or Home or Search) | `channel-video-row` |
| `short` | Short-form Shorts-tab video | `channel-short-row` |
| `livestream` | Past, upcoming, or in-progress livestream | `channel-livestream-row` |
| `playlist` | Channel playlist with `playlistId` + video count | `channel-playlist-row` |
| `communityPost` | Community Posts tab entry | `channel-community-post-row` |
| `storeProduct` | Channel Store merch product | `channel-store-product-row` |
| `video` (from Search) | Within-channel search result | `channel-search-row` |
| `error` | Status row (`status: invalid_channel | not_in_tabs | endpoint_unavailable | error`) — never charged | — |

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

---

### Input

The actor accepts a single channel or a batch of channels. Each entry can be:

- **Canonical channel ID** — `UCBJycsmduvYEL83R_U4JriQ` (fastest, skips lookup).
- **Handle** — `@mkbhd` or bare `mkbhd`.
- **Full URL** — `https://www.youtube.com/@mkbhd`, `/channel/UC...`, `/c/CustomName`.

```json
{
  "channel": "@mkbhd",
  "includeEndpoints": ["about", "videos", "shorts", "community"],
  "maxPagesPerEndpoint": 1
}
````

```json
{
  "channels": "@mkbhd\nUCX6OQ3DkcsbYNE6H8uQQuVA\n@veritasium",
  "includeEndpoints": ["about", "videos"],
  "maxPagesPerEndpoint": 2
}
```

#### Input fields

| Field | Type | Default | Description |
|---|---|---|---|
| `channel` | string | — | One channel (ID, handle, or URL). One of `channel` or `channels` is required. |
| `channels` | string | — | Batch — comma/newline-separated list. Max 50 per run. Overrides `channel`. |
| `includeEndpoints` | array | All 8 (excluding search) | Pick which tabs to scrape. Defaults to: `about, home, videos, shorts, liveStreams, playlists, community, store`. Search runs only when `searchQuery` is provided. |
| `searchQuery` | string | — | Optional. When included with `search` in `includeEndpoints`, runs an in-channel search. |
| `maxPagesPerEndpoint` | integer | 1 | Max paginated pages per endpoint (videos, shorts, community, search). Range 1–10. |
| `lang` | string | — | Optional language code (`en`, `es`, `ja`, `pt`). |

***

### Use cases

1. **Influencer Marketing Agency — Match Clients to Creators.** Pull 50 creator channels in one batch. Each comes back with full tabs metadata + videos + shorts + community posts + verified links → complete creator profile to match against client briefs.

2. **M\&A Diligence on a Creator Acquisition.** Map every surface the target creator publishes on (videos, shorts, livestreams, playlists, community posts, store products) into a single tidy-long dataset to baseline pre-acquisition footprint and audit revenue lines.

3. **Brand Safety Audit — Every Content Type Covered.** Filter `rowType: short` and `rowType: communityPost` to surface short-form + community content that pure video-only scrapers miss.

4. **Talent Agency Intel Pack — One-Pager Briefs.** A 360-snapshot on prospective signings — subscribers, joined date, country, links, recent video performance, shorts activity, store products — in one run, one CSV.

5. **AI / ML Training Datasets.** Multi-modal creator data (videos + shorts + playlists + community) in a tidy-long schema purpose-built for downstream pipelines.

***

### How tab-aware gating works

Every run begins by fetching `/channel/about` — the "anchor" row. About returns a `tabs` array (`['Home','Videos','Shorts','Live','Playlists','Posts','Store','Search']`) that tells us exactly which tabs the channel has.

If you request `liveStreams` and the channel has no Live tab, the actor:

1. **Skips the upstream call entirely** (saves your quota).
2. **Does not charge you** for the endpoint.
3. Pushes one status row (`status: not_in_tabs`) so you have an auditable trail.

This means a small podcast channel with no Store + no Live + no Community gets billed only for what exists. No incumbent scraper does this — they call all endpoints blindly.

***

### 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 |
| `channel-about-row` | $0.025 | Channel metadata snapshot (the anchor row) |
| `channel-video-row` ⭐ | $0.003 | Per long-form video from the Videos tab |
| `channel-short-row` | $0.003 | Per Short from the Shorts tab |
| `channel-livestream-row` | $0.004 | Per livestream from the Live tab |
| `channel-playlist-row` | $0.004 | Per playlist from the Playlists tab |
| `channel-community-post-row` | $0.005 | Per community post from the Posts tab |
| `channel-store-product-row` | $0.005 | Per channel-store merch product |
| `channel-search-row` | $0.004 | Per in-channel search result (only when `searchQuery` is set) |

⭐ = primary / headline event (highest typical volume per run).

**Estimated bundle cost (MrBeast, 1 page each endpoint, BRONZE tier):**
$0.005 (start) + $0.025 (about) + 30 × $0.003 (videos) + 30 × $0.003 (shorts) + 8 × $0.005 (community) + 23 × $0.004 (playlists) = **~$0.30 / channel**.

Skip endpoints you don't need with `includeEndpoints: ["about", "videos"]` → drops to ~$0.12 / channel.

***

### Output schema (unified rows)

Every row carries:

- Tracing fields: `_sourceChannelInput`, `_sourceChannelId`, `_sourceEndpoint`, `_fetchedAt`, `_page`
- Discriminator: `rowType` (one of `about | video | short | livestream | playlist | communityPost | storeProduct | error`)
- Status: `status` (`success` / `invalid_channel` / `not_in_tabs` / `endpoint_unavailable` / `error`)

Plus per-`rowType` fields:

**`about`** — `channelId`, `channelTitle`, `channelHandle`, `channelDescription`, `channelCountry`, `channelAvatarUrl`, `channelBannerUrl`, `subscriberCount`, `videosCount`, `viewCount`, `joinedDate`, `channelKeywords`, `channelLinks`, `channelTabs`, `availableCountries`, `isFamilySafe`, `hasEmail`.

**`video` / `short` / `livestream`** — `videoId`, `videoPageUrl`, `videoTitle`, `videoDescription` (not on `short`), `lengthText`, `publishedTimeText`, `publishedAt`, `viewCount`, `viewCountText`, `thumbnailUrl`, `channelTitle`.

**`playlist`** — `playlistId`, `playlistPageUrl`, `videoTitle` (playlist title), `playlistVideoCount`, `thumbnailUrl`.

**`communityPost`** — `postId`, `postContentText`, `publishedTimeText`, `postVoteCountText`, `postReplyCount`.

**`storeProduct`** — `productId`, `productTitle`, `productPriceText`, `productImageUrl`.

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 want only videos, not the full bundle. Can I do that?**
Yes — set `includeEndpoints: ["about", "videos"]`. You'll get the channel snapshot + the video rows and pay only for those events.

**Q: Why include `about` by default?**
The about row gives you the `channelTabs` array — used by the actor's gating to skip empty tabs. It's also the canonical anchor row for downstream JOINs.

**Q: What if I pass a channel that doesn't exist?**
The actor pushes one row with `status: invalid_channel` and `errorMessage` explaining why. No charge for that row.

**Q: What if a channel has no Live tab?**
The actor pushes one `status: not_in_tabs` row for that endpoint. No upstream call, no charge.

**Q: How do I get views/likes/comments for an individual video?**
That's a different actor — try a dedicated video-detail scraper. This bundle is breadth-first, not depth-first per video.

**Q: Is there a search-within-channel feature?**
Yes — add `search` to `includeEndpoints` and set `searchQuery`. Each match becomes a `rowType: video` row tagged `_sourceEndpoint: search`.

**Q: Does it work for branded / corporate channels (Apple, Nike, BBC)?**
Yes — tested. Brand channels typically lack Posts and Store; the gating handles that cleanly.

***

### ⚠️ 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 channel 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

## `channel` (type: `string`):

One channel to scrape. Accepts ANY of:

- Channel ID (`UCBJycsmduvYEL83R_U4JriQ` — fastest, skips resolution).
- Handle (`@mkbhd` or `mkbhd`).
- Full URL (`https://www.youtube.com/@mkbhd`, `/channel/UC...`, `/c/CustomName`).

Use `channels` below for batch scans. One of `channel` or `channels` is required.

## `channels` (type: `string`):

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

Example (one per line):

```
@mkbhd
UCX6OQ3DkcsbYNE6H8uQQuVA
https://www.youtube.com/@veritasium
```

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

Pick which channel tabs to scrape. **Defaults to all 9** — leave empty to fetch the full bundle. Endpoints not on the channel's tabs (per the about-row `tabs` field) are silently skipped — you are NEVER charged for empty endpoint pulls. The about endpoint always runs (the snapshot is the bundle's anchor row).

## `maxPagesPerEndpoint` (type: `integer`):

Max paginated pages to fetch per endpoint that supports pagination (videos, shorts, community, search). Each page returns ~30 rows (videos), ~48 (shorts), ~8 (community posts). Set to `1` for cheap sampling of recent content, `2-3` for a deeper crawl, `10` for full historical (capped). The about/playlists/liveStreams/store endpoints are single-page.

## `searchQuery` (type: `string`):

Optional. Only used when `search` is included in `includeEndpoints`. Searches within each channel for videos matching this query — useful for finding 'iPhone reviews from this channel'. Each match becomes a `channel-search-row` in the output dataset. Leave empty to skip the search endpoint even if it's in `includeEndpoints`.

## `lang` (type: `string`):

Optional language code (e.g. `en`, `es`, `ja`, `pt`) to localize result language. Forwards as the `lang` param to YouTube's response shaping.

## Actor input object example

```json
{
  "channel": "@mkbhd",
  "channels": "@mkbhd\nUCX6OQ3DkcsbYNE6H8uQQuVA\n@veritasium",
  "includeEndpoints": [
    "about",
    "home",
    "videos",
    "shorts",
    "liveStreams",
    "playlists",
    "community",
    "store"
  ],
  "maxPagesPerEndpoint": 1,
  "searchQuery": "iphone review",
  "lang": "en"
}
```

# Actor output Schema

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

Tidy-long rows. Filter by `rowType` (`about`, `video`, `short`, `livestream`, `playlist`, `communityPost`, `storeProduct`, `error`) and `_sourceEndpoint` to slice the bundle. Every row tagged with `_sourceChannelInput`, `_sourceChannelId`, and `_fetchedAt`.

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

HTML report with run status, success/error counts, per-endpoint and per-channel 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-channel-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-channel-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-channel-360-intelligence --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

````json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Channel 360 Intelligence — Bundle Scraper",
        "description": "The most comprehensive YouTube channel scraper on Apify. One run pulls videos, shorts, livestreams, playlists, community posts, and store products into one unified tidy-long dataset. Tab-aware gating skips empty endpoints. Built for influencer agencies, M&A diligence, and brand safety.",
        "version": "1.0",
        "x-build-id": "o2KASJdemZbbuy9rr"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~youtube-channel-360-intelligence/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-youtube-channel-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-channel-360-intelligence/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-youtube-channel-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-channel-360-intelligence/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-youtube-channel-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": {
                    "channel": {
                        "title": "📺 Channel (single)",
                        "type": "string",
                        "description": "One channel to scrape. Accepts ANY of:\n- Channel ID (`UCBJycsmduvYEL83R_U4JriQ` — fastest, skips resolution).\n- Handle (`@mkbhd` or `mkbhd`).\n- Full URL (`https://www.youtube.com/@mkbhd`, `/channel/UC...`, `/c/CustomName`).\n\nUse `channels` below for batch scans. One of `channel` or `channels` is required."
                    },
                    "channels": {
                        "title": "📺 Channels (batch — comma or newline separated)",
                        "type": "string",
                        "description": "Optional — for batch scans. Comma-separated OR newline-separated list of channel IDs, handles, or URLs (same formats as `channel`). Each channel runs the full bundle independently and tags every row with its source channel. Max 50 channels per run. Overrides `channel` when set.\n\nExample (one per line):\n```\n@mkbhd\nUCX6OQ3DkcsbYNE6H8uQQuVA\nhttps://www.youtube.com/@veritasium\n```"
                    },
                    "includeEndpoints": {
                        "title": "🎯 Endpoints to fetch",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Pick which channel tabs to scrape. **Defaults to all 9** — leave empty to fetch the full bundle. Endpoints not on the channel's tabs (per the about-row `tabs` field) are silently skipped — you are NEVER charged for empty endpoint pulls. The about endpoint always runs (the snapshot is the bundle's anchor row).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "about",
                                "home",
                                "videos",
                                "shorts",
                                "liveStreams",
                                "playlists",
                                "community",
                                "store",
                                "search"
                            ]
                        },
                        "default": [
                            "about",
                            "home",
                            "videos",
                            "shorts",
                            "liveStreams",
                            "playlists",
                            "community",
                            "store"
                        ]
                    },
                    "maxPagesPerEndpoint": {
                        "title": "📄 Max pages per endpoint",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Max paginated pages to fetch per endpoint that supports pagination (videos, shorts, community, search). Each page returns ~30 rows (videos), ~48 (shorts), ~8 (community posts). Set to `1` for cheap sampling of recent content, `2-3` for a deeper crawl, `10` for full historical (capped). The about/playlists/liveStreams/store endpoints are single-page.",
                        "default": 1
                    },
                    "searchQuery": {
                        "title": "🔍 Search query (optional)",
                        "type": "string",
                        "description": "Optional. Only used when `search` is included in `includeEndpoints`. Searches within each channel for videos matching this query — useful for finding 'iPhone reviews from this channel'. Each match becomes a `channel-search-row` in the output dataset. Leave empty to skip the search endpoint even if it's in `includeEndpoints`."
                    },
                    "lang": {
                        "title": "🗣 Language (optional)",
                        "type": "string",
                        "description": "Optional language code (e.g. `en`, `es`, `ja`, `pt`) to localize result language. Forwards as the `lang` param to YouTube's response shaping."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
````
