# YouTube Channel Email Scraper: Business Emails, Phones, Socials (`apivault_labs/youtube-channel-business-email-scraper`) Actor

Extract public business emails + full channel intelligence from any YouTube channel. No login, no API key. Get email, subscribers, views, country, niche, language, social links, verification, activity & a 0-100 outreach score. Pay-per-result.

- **URL**: https://apify.com/apivault\_labs/youtube-channel-business-email-scraper.md
- **Developed by:** [Apivault Labs](https://apify.com/apivault_labs) (community)
- **Categories:** Social media, Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $13.50 / 1,000 channel records

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 Email Scraper 📧 — Business Emails, Phones & Socials

**Turn any list of YouTube channels into an outreach-ready contact database.**
Paste channel URLs, `@handles`, or channel IDs — or just describe a niche — and get back **verified public business emails**, **phone numbers**, **social profiles**, and a **full intelligence profile** for every channel.

No Google login. No API key. No CAPTCHA. Pay only for the channels you actually get back.

---

### 🚀 Why creators, agencies & sales teams use it

- **Find the inbox that converts.** Most tools stop at the YouTube page. This Actor keeps looking — across the channel's website, link-in-bio pages, socials, and an extended business directory — so you get an email for far more channels, including the big ones.
- **Reach a real person, not a void.** Optional filtering keeps only named business emails (drops `info@`, `support@`, …) so your cold outreach lands with a human.
- **Prioritize instantly.** Every channel gets a **0–100 outreach score** plus rich stats, so you know who's worth contacting first.
- **Build lists from scratch.** No channel list? Search by keyword/niche and the Actor discovers matching channels for you.
- **Plug straight into your workflow.** Clean, flat fields export perfectly to CSV, Google Sheets, HubSpot, Pipedrive, Salesforce, or any CRM.

---

### ✨ What you get for every channel

#### 📇 Contact data
| Field | Description |
|-------|-------------|
| `primaryEmail` | The best business email for the channel |
| `emails[]` / `allEmails` | Every unique email found, de-duplicated |
| `businessEmail` | Named/business inbox when available |
| `phones[]` / `phonesText` | Public phone numbers |
| `socialLinks{}` | Instagram, Twitter/X, TikTok, Facebook, Discord, Twitch, LinkedIn, Patreon |
| `externalLinks[]` | Every link the creator added, **with its label** |
| `emailSourceSummary` | Where each email was found (YouTube page, website/socials, directory) |

#### 📊 Channel stats
| Field | Description |
|-------|-------------|
| `channelName`, `handle`, `channelId`, `channelUrl` | Identity |
| `subscribers` | **Precise** subscriber count (exact number, not YouTube's rounded "1.2M") |
| `subscribersRounded` | The rounded figure YouTube shows publicly |
| `videoCount`, `totalViews` | Volume |
| `country`, `language` | Localization |
| `joinedDate`, `channelAgeYears` | Tenure |
| `isVerified`, `isFamilySafe` | Trust flags |

#### 🧠 Intelligence (nobody else returns all of this)
| Field | Description |
|-------|-------------|
| `niche` | Auto-detected category (gaming, tech, beauty, finance, …) |
| `avgViewsPerDay`, `avgViewsPerVideo`, `subsPerVideo` | Performance ratios |
| `recentVideos[]`, `avgRecentViews` | Latest activity |
| `engagementRate` | Views-to-subscribers signal |
| `lastUpload`, `isActive` | Freshness |
| `hasMembership`, `hasMerch` | Monetization signals |
| `outreachScore` | Composite 0–100 lead-quality score |

---

### 🎯 Perfect for

- **Influencer & creator outreach** — build ranked, niche-specific contact lists
- **Brand sponsorships** — find creators with a reachable business inbox
- **Agency lead generation** — enrich thousands of channels at scale
- **Talent & casting research** — surface active, growing creators
- **CRM enrichment** — merge emails, phones, socials and stats into existing records
- **Market & competitor research** — map who's who in any YouTube niche

---

### 📥 Input

You can provide a channel list, keyword searches, or both.

| Field | Type | Description |
|-------|------|-------------|
| `channels` | array | Channel URLs, `@handles`, bare handles, channel IDs — even a video/Shorts/`youtu.be` URL (auto-resolved to its channel). Up to 5,000 per run. |
| `searchQueries` | array | Niche keywords (e.g. `home barista`, `indie game dev`) — the Actor finds matching channels automatically. |
| `maxChannelsPerQuery` | integer | How many channels to pull per search query (default 10). |
| `onlyWithEmail` | boolean | Keep only channels where an email was found. |
| `onlyBusinessEmail` | boolean | Drop generic inboxes (`info@`, `support@`, …); keep named/business emails only. |
| `emailDomains` | array | Keep only emails on these domains (e.g. `@gmail.com`), or your own corporate list. |
| `minSubscribers` | integer | Skip channels below this subscriber count. |
| `enrichFromLinks` | boolean | Also check the channel's website & social links for an email (default on). |
| `useDeepLookup` | boolean | Extra lookup that finds a business email for larger channels when it isn't public elsewhere (default on). |
| `preciseSubscribers` | boolean | Return an exact subscriber count instead of YouTube's rounded number (default on). |
| `extractRecentVideos` | boolean | Compute activity metrics from the latest videos (default on). |
| `maxConcurrency` | integer | Channels fetched in parallel (default 20). |
| `timeout` | integer | Per-channel timeout in seconds (default 25). |

#### Example input

```json
{
  "channels": [
    "@MrBeast",
    "https://youtube.com/@mkbhd",
    "UCX6OQ3DkcsbYNE6H8uQQuVA"
  ],
  "searchQueries": ["home barista", "productivity coach"],
  "maxChannelsPerQuery": 15,
  "onlyWithEmail": true,
  "onlyBusinessEmail": false,
  "minSubscribers": 10000
}
````

***

### 📤 Example output

```json
{
  "channelName": "NetworkChuck",
  "handle": "@NetworkChuck",
  "channelId": "UC9x0AN7BWHpCDHSm9NiJFJQ",
  "channelUrl": "https://www.youtube.com/@NetworkChuck",
  "subscribers": 77470,
  "subscribersRounded": 77400,
  "videoCount": 47,
  "totalViews": 11590930,
  "country": "United States",
  "language": "en",
  "niche": "tech",
  "isVerified": false,
  "isFamilySafe": true,
  "primaryEmail": "chuck@networkchuck.com",
  "emails": ["chuck@networkchuck.com", "sponsor@networkchuck.com"],
  "allEmails": "chuck@networkchuck.com, sponsor@networkchuck.com",
  "businessEmail": "chuck@networkchuck.com",
  "emailSourceSummary": "youtube, website, directory",
  "phones": [],
  "socialLinks": {
    "twitter": "https://twitter.com/networkchuck",
    "instagram": "https://instagram.com/networkchuck",
    "twitch": "https://twitch.tv/networkchuck"
  },
  "externalLinks": [
    { "label": "Website", "url": "https://networkchuck.com" }
  ],
  "avgViewsPerVideo": 246615,
  "engagementRate": 3.1,
  "hasMembership": true,
  "hasMerch": true,
  "outreachScore": 62,
  "hasEmail": true
}
```

***

### 📈 Result views

The dataset ships with ready-made table views in the Apify UI:

- **Overview** — channel, handle, business email, all emails, phones, subscribers, country, niche, outreach score.
- **Emails by source** — see at a glance where each email came from.

Export any view to **CSV, Excel, JSON, or Google Sheets** in one click, or pull it via the Apify API.

***

### 💡 Tips for the best results

- **Leave `useDeepLookup` on** for the highest email hit-rate — it's what finds business inboxes for large channels.
- **Turn on `onlyBusinessEmail`** when you want a clean, human-addressable outreach list (note: some channels only publish a generic inbox, so they'll be filtered out).
- **Use `searchQueries`** to build a fresh list for any niche without hunting for channels manually.
- **Sort by `outreachScore`** to work your best leads first.
- **Set `minSubscribers`** to focus on channels above a size threshold.

***

### ❓ FAQ

**Do I need a Google login or API key?**
No. The Actor uses only public, logged-out data and requires zero setup.

**How accurate is the subscriber count?**
You get the exact, up-to-the-moment number — not YouTube's rounded "1.2M". The rounded figure is also included for reference.

**Will it find an email for every channel?**
No tool can. Many channels simply don't publish one anywhere. This Actor maximizes coverage by checking multiple public sources, so you'll get emails for far more channels than a page-only scraper.

**What if a channel has no email?**
By default it's still returned with all its stats and socials. Turn on `onlyWithEmail` to keep only channels that have an email.

**Does it collect private data?**
No. Only publicly accessible information is returned.

**How fast is it?**
Roughly 5 channels/second on default settings — about 1,000 channels in a few minutes.

**How am I billed?**
Pay-per-result: you're charged only for channels actually delivered to your dataset. Failed, missing, or filtered-out channels are never charged.

***

### ⚖️ Fair use & compliance

This Actor collects only publicly accessible data that YouTube serves to logged-out visitors. Use it responsibly: comply with YouTube's Terms of Service and applicable privacy and anti-spam laws (GDPR, CAN-SPAM, etc.), and never use the data for spam or harassment. You are responsible for how you use the results.

***

#### Keywords

`youtube-email-scraper` `youtube-scraper` `creator-emails` `influencer-outreach`
`influencer-marketing` `lead-generation` `b2b-prospecting` `email-finder`
`youtube-channel-scraper` `contact-scraper` `sponsorship-outreach` `crm-enrichment`
`social-media-scraper` `creator-database` `outreach-automation`

# Actor input Schema

## `channels` (type: `array`):

Channels to scrape. Accepts channel URLs (https://youtube.com/@MrBeast), @handles (@MrBeast), bare handles (MrBeast), channel IDs (UCX6OQ3DkcsbYNE6H8uQQuVA), or even a video/Shorts/youtu.be URL (we resolve it to its channel automatically). Leave empty if you only use 'Search queries'. Max 5000 per run.

## `searchQueries` (type: `array`):

Don't have a channel list? Type niche keywords (e.g. 'fitness coach', 'home barista', 'indie game dev') and the actor finds matching channels on YouTube, then scrapes their emails. Great for building an outreach list from scratch.

## `maxChannelsPerQuery` (type: `integer`):

How many channels to pull per search query.

## `onlyWithEmail` (type: `boolean`):

Skip channels where no public email was found. Great for building a clean outreach list — and you don't pay for empty results if combined with pay-per-result.

## `onlyBusinessEmail` (type: `boolean`):

Filter out generic role inboxes (info@, support@, contact@, hello@, sales@ …) and keep only named/business addresses, which convert better in cold outreach.

## `emailDomains` (type: `array`):

Optional. Keep only emails on these domains, e.g. \['@gmail.com'] for personal creator inboxes, or your own list of corporate domains. Leave empty to keep all. Accepts '@gmail.com' or 'gmail.com'.

## `minSubscribers` (type: `integer`):

Only keep channels with at least this many subscribers. 0 = no filter.

## `enrichFromLinks` (type: `boolean`):

If no email found on the YouTube page itself, visit the channel's linked website, Linktree, and other external links to extract email from there. Significantly increases email discovery rate for smaller channels.

## `useDeepLookup` (type: `boolean`):

Extra lookup step that finds a business email for larger channels when it isn't on the YouTube page or website. Works out of the box — no setup needed. On by default for maximum email discovery. Turn OFF for cheaper, faster runs.

## `deepLookupEndpoint` (type: `string`):

Advanced/optional. Leave empty — deep lookup already works with the built-in configuration. Only for users running their own endpoint.

## `deepLookupApiKey` (type: `string`):

Advanced/optional. Leave empty to use the built-in configuration.

## `preciseSubscribers` (type: `boolean`):

YouTube only shows a rounded subscriber count (e.g. 21.1M). Turn this on to also get a precise live subscriber estimate (down to the single digit) in the 'subscribersExact' field. Adds one fast lookup per channel. On by default.

## `extractRecentVideos` (type: `boolean`):

Also parse the latest videos on the channel page to compute average recent views, engagement rate and last-upload recency. Slightly more parsing, no extra requests.

## `maxConcurrency` (type: `integer`):

How many channels to fetch in parallel. 40 is a good balance for most runs; raise it for very large lists.

## `timeout` (type: `integer`):

HTTP timeout for each channel fetch.

## Actor input object example

```json
{
  "channels": [
    "@MrBeast",
    "@mkbhd",
    "@NetworkChuck"
  ],
  "searchQueries": [],
  "maxChannelsPerQuery": 10,
  "onlyWithEmail": false,
  "onlyBusinessEmail": false,
  "emailDomains": [],
  "minSubscribers": 0,
  "enrichFromLinks": true,
  "useDeepLookup": true,
  "preciseSubscribers": true,
  "extractRecentVideos": true,
  "maxConcurrency": 40,
  "timeout": 25
}
```

# 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 = {
    "channels": [
        "@MrBeast",
        "@mkbhd",
        "@NetworkChuck"
    ],
    "searchQueries": [],
    "emailDomains": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("apivault_labs/youtube-channel-business-email-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 = {
    "channels": [
        "@MrBeast",
        "@mkbhd",
        "@NetworkChuck",
    ],
    "searchQueries": [],
    "emailDomains": [],
}

# Run the Actor and wait for it to finish
run = client.actor("apivault_labs/youtube-channel-business-email-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 '{
  "channels": [
    "@MrBeast",
    "@mkbhd",
    "@NetworkChuck"
  ],
  "searchQueries": [],
  "emailDomains": []
}' |
apify call apivault_labs/youtube-channel-business-email-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Channel Email Scraper: Business Emails, Phones, Socials",
        "description": "Extract public business emails + full channel intelligence from any YouTube channel. No login, no API key. Get email, subscribers, views, country, niche, language, social links, verification, activity & a 0-100 outreach score. Pay-per-result.",
        "version": "1.17",
        "x-build-id": "ugMQGfmRYTYI145uf"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/apivault_labs~youtube-channel-business-email-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-apivault_labs-youtube-channel-business-email-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/apivault_labs~youtube-channel-business-email-scraper/runs": {
            "post": {
                "operationId": "runs-sync-apivault_labs-youtube-channel-business-email-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/apivault_labs~youtube-channel-business-email-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-apivault_labs-youtube-channel-business-email-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": {
                    "channels": {
                        "title": "YouTube channels or video URLs",
                        "maxItems": 5000,
                        "type": "array",
                        "description": "Channels to scrape. Accepts channel URLs (https://youtube.com/@MrBeast), @handles (@MrBeast), bare handles (MrBeast), channel IDs (UCX6OQ3DkcsbYNE6H8uQQuVA), or even a video/Shorts/youtu.be URL (we resolve it to its channel automatically). Leave empty if you only use 'Search queries'. Max 5000 per run.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "Search queries (find channels by niche)",
                        "type": "array",
                        "description": "Don't have a channel list? Type niche keywords (e.g. 'fitness coach', 'home barista', 'indie game dev') and the actor finds matching channels on YouTube, then scrapes their emails. Great for building an outreach list from scratch.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxChannelsPerQuery": {
                        "title": "Max channels per search query",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "How many channels to pull per search query.",
                        "default": 10
                    },
                    "onlyWithEmail": {
                        "title": "Only output channels with an email",
                        "type": "boolean",
                        "description": "Skip channels where no public email was found. Great for building a clean outreach list — and you don't pay for empty results if combined with pay-per-result.",
                        "default": false
                    },
                    "onlyBusinessEmail": {
                        "title": "Only keep named/business emails (drop info@, support@ …)",
                        "type": "boolean",
                        "description": "Filter out generic role inboxes (info@, support@, contact@, hello@, sales@ …) and keep only named/business addresses, which convert better in cold outreach.",
                        "default": false
                    },
                    "emailDomains": {
                        "title": "Keep only these email domains",
                        "type": "array",
                        "description": "Optional. Keep only emails on these domains, e.g. ['@gmail.com'] for personal creator inboxes, or your own list of corporate domains. Leave empty to keep all. Accepts '@gmail.com' or 'gmail.com'.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minSubscribers": {
                        "title": "Minimum subscribers",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only keep channels with at least this many subscribers. 0 = no filter.",
                        "default": 0
                    },
                    "enrichFromLinks": {
                        "title": "Find email from channel's website & social links",
                        "type": "boolean",
                        "description": "If no email found on the YouTube page itself, visit the channel's linked website, Linktree, and other external links to extract email from there. Significantly increases email discovery rate for smaller channels.",
                        "default": true
                    },
                    "useDeepLookup": {
                        "title": "Deep email lookup",
                        "type": "boolean",
                        "description": "Extra lookup step that finds a business email for larger channels when it isn't on the YouTube page or website. Works out of the box — no setup needed. On by default for maximum email discovery. Turn OFF for cheaper, faster runs.",
                        "default": true
                    },
                    "deepLookupEndpoint": {
                        "title": "Deep lookup endpoint (advanced)",
                        "type": "string",
                        "description": "Advanced/optional. Leave empty — deep lookup already works with the built-in configuration. Only for users running their own endpoint."
                    },
                    "deepLookupApiKey": {
                        "title": "Deep lookup key (advanced)",
                        "type": "string",
                        "description": "Advanced/optional. Leave empty to use the built-in configuration."
                    },
                    "preciseSubscribers": {
                        "title": "Precise subscriber count",
                        "type": "boolean",
                        "description": "YouTube only shows a rounded subscriber count (e.g. 21.1M). Turn this on to also get a precise live subscriber estimate (down to the single digit) in the 'subscribersExact' field. Adds one fast lookup per channel. On by default.",
                        "default": true
                    },
                    "extractRecentVideos": {
                        "title": "Extract recent videos & activity",
                        "type": "boolean",
                        "description": "Also parse the latest videos on the channel page to compute average recent views, engagement rate and last-upload recency. Slightly more parsing, no extra requests.",
                        "default": true
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "How many channels to fetch in parallel. 40 is a good balance for most runs; raise it for very large lists.",
                        "default": 40
                    },
                    "timeout": {
                        "title": "Timeout per channel (seconds)",
                        "minimum": 10,
                        "maximum": 120,
                        "type": "integer",
                        "description": "HTTP timeout for each channel fetch.",
                        "default": 25
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
