# YouTube Channel Contacts & Social Links Scraper (`coregent/youtube-channel-contacts-scraper`) Actor

Find YouTube creators fast: get channel stats plus public contact signals—websites and social links (X, Instagram, LinkedIn, TikTok, etc.). Perfect for influencer outreach, lead lists, partnerships, and market research.

- **URL**: https://apify.com/coregent/youtube-channel-contacts-scraper.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (community)
- **Categories:** Automation, Developer tools, SEO tools
- **Features:** Limited permissions
- **Stats:** 159 total users, 8 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $5.00 / 1,000 channel results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## YouTube Channel Contacts & Social Links Scraper

**Advanced YouTube channel scraper** that extracts contact information and social media links from channel About pages. Get **41 enriched fields** including external links (websites, social profiles), email addresses (with optional MX validation), a 0–100 contactability score, CRM qualification tier, discovery lineage, and all standard channel metadata. Uses a **hybrid architecture**: YouTube Data API v3 for reliable metadata + a browserless TikHub path for fast contact extraction. **No residential proxy required**.

![YouTube Channel Contacts Scraper](https://raw.githubusercontent.com/coregentdevspace/youtube-channel-contacts-scraper-assets/main/thumbnail-apify-youtube-channel-contacts-scraper.jpeg)

***

### ⚡ Need a real-time API?

This Actor also powers the **[YouTube Scraper API](https://rapidapi.com/coregentdevspace/api/youtube-scraper14)** on RapidAPI. `POST /youtube/channel-contacts` returns creator channels with public business contacts as JSON in a single HTTP request, with a free Basic plan and no Apify account needed.

Use the API for on-demand lookups inside your app. Use this Actor for bulk runs, schedules, datasets and integrations.

### Key Features

- **Hybrid API + Scraping**: YouTube Data API v3 for reliable standard fields, Puppeteer only for contacts
- **Contact Extraction**: Extracts email addresses from channel About pages with confidence scoring
- **Social Links**: Captures and categorizes all external links (Instagram, X, LinkedIn, Facebook, TikTok, etc.)
- **Enhanced Discovery**: Extracts channels from BOTH channel results AND video results (5-20+ per search)
- **No Proxy Required**: Works reliably without residential proxy
- **41 Enriched Fields**: Complete channel profile — 15 standard + 19 contact + 4 status/discovery-lineage + 1 contactability score + 2 CRM qualification
- **Email Validation** (optional): MX-record check with disposable & role-address detection
- **Linked-Website Scanning**: in full-contacts mode, also scans the channel's linked website(s) for emails — **decodes Cloudflare-obfuscated addresses** and, when the linked page has none, **follows a contact/about page** to find the business email
- **Video-Description Scanning**: when the About page and linked sites yield no email, scans the channel's recent video descriptions — where many creators put their business contact — recovering emails other scrapers miss
- **Smart Deduplication**: Automatically filters duplicate channels by ChannelId
- **Link Categorization**: Automatically detects and categorizes social platforms and link aggregators
- **Extract Contacts toggle**: full contacts (emails + social links + website scan), or metadata-only for fast, cheap discovery
- **Automatic Fallback**: Full Puppeteer scraping activates if API is unavailable

> **Best for**: Influencer outreach, partnership campaigns, creator collaborations, B2B marketing, PR activities, and any use case requiring direct contact with YouTube creators

> **Public data only — no CAPTCHA bypass.** This scraper extracts **publicly accessible** emails and contact links (from the channel's About page and description). It does **not** log into Google or solve CAPTCHAs to reveal YouTube's gated "business email" — when a channel has one, we flag `BusinessInquiryAvailable: true` so you know it exists, but we don't extract it. This keeps the actor ToS-safe and reliable.

***

### At a Glance

| Feature | Value |
|---------|-------|
| **Architecture** | Hybrid: YouTube Data API v3 + Puppeteer |
| **Speed** | ~2-4s per channel (with contacts), <1s (API only) |
| **Standard Field Reliability** | ≈99% (API-sourced) |
| **Discovery** | 5-20+ channels per search |
| **Throughput** | 15-30 channels/minute |
| **Fields** | 41 total (15 standard + 19 contact + 4 status/lineage + 1 contactability score + 2 CRM qualification) |
| **Contact Success Rate** | 40-60% have external links, 10-20% have emails |
| **Email Detection** | Balanced sensitivity with confidence scoring (tuned internally) |
| **Proxy Required** | No |
| **Concurrency** | 20 parallel requests (configurable 1-50) |
| **Deduplication** | Automatic by ChannelId |

***

### How It Works

#### Hybrid Architecture

This scraper uses a two-phase approach for each channel:

1. **Phase 1 - YouTube Data API v3**: Fetches standard channel metadata (subscribers, views, country, join date, description, keywords, etc.) in a single API call. This is fast (~100ms) and reliable -- no DOM parsing failures.

2. **Phase 2 - Puppeteer (About page only)**: When contact extraction is enabled, navigates to the channel's About page to extract external links, emails, and the verification badge. These fields are not available through the API.

3. **Fallback**: If the API is unavailable (quota exhausted, network error), the full Puppeteer scraping pipeline activates automatically -- no data loss.

***

### Why This Scraper?

| Feature | This Scraper (Hybrid) | Traditional Scrapers |
|---------|----------------------|---------------------|
| **Standard field reliability** | ≈99% (API) | 80-95% (DOM parsing) |
| **Contact information** | Emails & social links | Not available |
| **Fields per channel** | 41 enriched fields | 10-15 basic fields |
| **SubscriberCount/Country/JoinedDate** | Always populated (API) | Often null |
| **Discovery per search** | 5-20+ channels | 1-2 channels |
| **Email extraction** | 3 detection modes | None |
| **Link categorization** | Auto-categorized | None |
| **Time per channel** | ~2-4s (with contacts) | ~5-8s |
| **Outreach ready** | Export to CRM | Manual enrichment |
| **Proxy required** | No | Often yes |

***

### Input Parameters

#### Core Discovery

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| **searchQueries** | Array | `[]` | Keywords or topics — runs a YouTube channel search (relevance-ranked, not an exact lookup) |
| **startUrls** | Array | `[]` | **Channels** — one per line: channel handle (`@name`), channel ID (`UC…`), channel URL, or video URL. Exact lookup |
| **maxResultsPerQuery** | Integer | `10` | Max channels per search (1-50) |
| **maxTotalChannels** | Integer | *(none)* | Hard cap on total channels returned across the whole run (cost control). Empty = no cap |
| **onlyWithContact** | Boolean | `false` | Keep only channels that have an email or a social/website link |
| **minSubscribers** | Integer | *(none)* | Keep only channels with at least this many subscribers |
| **maxSubscribers** | Integer | *(none)* | Keep only channels with at most this many subscribers |
| **regionCode** | String | `"US"` | ISO country code (US, GB, CA, AU, etc.) |
| **language** | String | `"en"` | Language code (en, es, de, fr, etc.) |
| **dateFrom** | String | `""` | Filter by channel join date (Joined After, YYYY-MM-DD) |
| **dateTo** | String | `""` | Filter by channel join date (Joined Before, YYYY-MM-DD) |

#### Contact Extraction

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| **extractContacts** | Boolean | `true` | ON = full contacts (emails + social links + linked-website scan); OFF = metadata only (fastest, no contacts) |
| **validateEmails** | Boolean | `false` | Validate emails via MX check; flag disposable/role addresses (adds `EmailValidationStatus`) |

> Extraction depth, email-detection sensitivity, and concurrency are handled internally — when **Extract Contacts** is on, the actor always extracts emails + social links, scans linked websites, and (only when no email is found yet) scans recent video descriptions for more emails.

#### CRM & Integrations

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| **minQualificationScore** | Integer (0–100) | `60` | A channel is flagged `IsQualified = true` when its `ContactabilityScore` ≥ this value. Every channel also gets a `QualificationTier`. Annotation only — no channels are dropped. |
| **webhookUrl** | String | `null` | Optional http/https endpoint. Each delivered channel is POSTed as JSON in real time (one request per channel) — for Zapier, Make, n8n, or a CRM. Best-effort delivery. |
| **webhookAuthHeader** | String (secret) | `null` | Optional value sent as the `Authorization` header on each webhook POST (e.g. `Bearer <token>`). Used only when a Webhook URL is set. |

#### Performance Tips

- Turn **Extract Contacts** off (`extractContacts: false`) for the fastest, cheapest runs (no contact extraction)

***

### Output Schema

#### Standard Channel Fields (15 fields, from API)

| # | Field | Type | Description |
|---|-------|------|-------------|
| 1 | **ChannelId** | String | Unique YouTube channel ID |
| 2 | **ChannelName** | String | Display name of the channel |
| 3 | **ChannelHandle** | String | The @handle (e.g., `@nateherk`) |
| 4 | **ChannelURL** | String | Full canonical channel link |
| 5 | **ThumbnailURL** | String | Channel profile image URL |
| 6 | **Description** | String | Channel description text |
| 7 | **Country** | String / null | Channel's listed country (from API) |
| 8 | **JoinedDate** | String / null | Channel creation date (YYYY-MM-DD, from API) |
| 9 | **SubscriberCount** | Integer / null | Total subscribers (exact number from API) |
| 10 | **VideoCount** | Integer / null | Total videos uploaded (from API) |
| 11 | **TotalViews** | Integer / null | Lifetime view count (from API) |
| 12 | **Keywords** | Array | Channel keywords from branding settings |
| 13 | **IsVerified** | Boolean | Verification badge (from page scraping) |
| 14 | **ChannelType** | String / null | Category: Music, Entertainment, Gaming, etc. (from API topic data) |
| 15 | **ScrapedAt** | String | ISO 8601 timestamp of extraction |

#### Contact Fields (19 fields, from About page scraping)

| # | Field | Type | Description |
|---|-------|------|-------------|
| 16 | **ExternalLinks** | Array | All external links with labels, URLs, and types |
| 17 | **WebsiteUrl** | String / null | Primary website URL |
| 18 | **InstagramUrl** | String / null | Instagram profile URL |
| 19 | **XUrl** | String / null | X (Twitter) profile URL |
| 20 | **LinkedInUrl** | String / null | LinkedIn profile URL |
| 21 | **FacebookUrl** | String / null | Facebook page URL |
| 22 | **TikTokUrl** | String / null | TikTok profile URL |
| 23 | **DiscordUrl** | String / null | Discord server invite URL |
| 24 | **TelegramUrl** | String / null | Telegram channel URL |
| 25 | **PrimaryAggregatorUrl** | String / null | Link aggregator (Linktree, Beacons, etc.) |
| 26 | **OtherLinks** | Array | Additional uncategorized links |
| 27 | **Emails** | Array | All extracted email addresses |
| 28 | **PrimaryEmail** | String / null | Highest confidence email |
| 29 | **EmailConfidence** | Number / null | Confidence score (0-100) |
| 30 | **EmailSources** | Array | Where emails were found |
| 31 | **HasLinks** | Boolean | Whether channel has external links |
| 32 | **HasEmail** | Boolean | Whether email was found |
| 33 | **BusinessInquiryAvailable** | Boolean | Whether a hidden business email exists (behind CAPTCHA) |
| 34 | **EmailValidationStatus** | String / null | Email validation result when `validateEmails` is on: `mx_valid`, `role_valid`, `no_mx`, `disposable`, or `unknown` (null when disabled) |

#### Status & Discovery Fields (4 fields)

| # | Field | Type | Description |
|---|-------|------|-------------|
| 35 | **Status** | String | `success`, or `no_contact` when the channel has no email/links |
| 36 | **SourceType** | String / null | How the channel was discovered: `search`, `video`, or `channel` |
| 37 | **SourceQuery** | String / null | The search keyword or input URL the channel came from |
| 38 | **SearchRank** | Integer / null | Position within the search results (null for Channels entries) |
| 39 | **ContactabilityScore** | Integer (0–100) | Outreach-readiness score bundling email presence + confidence, MX/disposable validation, alternative contact routes (website, socials, aggregator), and credibility (business-inquiry, verification). Higher = easier to reach. |
| 40 | **QualificationTier** | String | CRM tier from the score: `Hot` (≥80), `Warm` (≥60), `Cold` (≥40), `Unqualified` (<40). |
| 41 | **IsQualified** | Boolean | `true` when ContactabilityScore ≥ your **Qualification Threshold** input (default 60). |

> **Note on ContactabilityScore**: A single 0–100 signal to sort and qualify leads. A deliverable direct email dominates the score (up to 60 pts), with the rest from contact-route richness (up to 28) and credibility (up to 12). Channels with only social links (no direct email) typically land in the 20–50 range. When `validateEmails` is off, the email is scored as "unknown" (not penalized as undeliverable).

> **Note on qualification & webhooks (CRM-ready)**: Every channel is tiered (`QualificationTier`) and flagged (`IsQualified`) against your **Qualification Threshold** input — no channels are dropped, they're just annotated so you can sort/segment in your CRM. Set an optional **Webhook URL** to stream each delivered channel to Zapier, Make, n8n, or your own endpoint as a real-time JSON POST (one request per channel); add a **Webhook Authorization Header** to secure it. Webhook delivery is best-effort — a failed POST is logged and never stops the run.

> **Note on BusinessInquiryAvailable**: Some YouTube channels have a "View email address" button that requires solving a reCAPTCHA. This scraper does not attempt to bypass the CAPTCHA. Instead, it flags `BusinessInquiryAvailable = true` so you know the channel has a business email available, even though it cannot be extracted automatically.

***

### Output Example

#### Table View - Results Overview

![YouTube Channel Contacts Scraper - Results Table View](https://raw.githubusercontent.com/coregentdevspace/youtube-channel-contacts-scraper-assets/main/youtube-channel-contacts-scraper-output-results-table-view.png)

#### Table View - All Fields

![YouTube Channel Contacts Scraper - All Fields Table View](https://raw.githubusercontent.com/coregentdevspace/youtube-channel-contacts-scraper-assets/main/youtube-channel-contacts-scraper-output-all-fields-table-view.png)

#### JSON View

```json
{
  "ChannelId": "UC2ojq-nuP8ceeHqiroeKhBA",
  "ChannelName": "Nate Herk | AI Automation",
  "ChannelHandle": "@nateherk",
  "ChannelURL": "https://www.youtube.com/@nateherk",
  "ThumbnailURL": "https://yt3.ggpht.com/rjiskq1h4EjTgsqvP_BOsnpwCdHUHKvSo00RmUraoWqDuHQN6RAUMdo1ircHs0ZcKQrrWNvukEs=s800-c-k-c0x00ffffff-no-rj",
  "Description": "Hi 👋 I'm Nate Herk. I'm passionate about helping businesses unlock the power of AI Automations to save time, cut costs, and stay competitive. \n\nI believe that businesses that don't adopt AI will struggle to keep up, and I'm here to make sure you're ahead of the curve. Whether you're new to AI or looking to refine your workflows, I'm here to guide you through it all.\n\nLet's build a more efficient future together! Book a call on my website!\n",
  "Country": null,
  "JoinedDate": "2013-11-17",
  "SubscriberCount": 530000,
  "VideoCount": 328,
  "TotalViews": 22862386,
  "Keywords": [],
  "IsVerified": false,
  "ChannelType": "Technology",
  "ScrapedAt": "2026-02-19T00:39:00.713Z",
  "ExternalLinks": [
    {
      "label": "skool.com/ai-automation-society-plus/about",
      "url": "https://www.skool.com/ai-automation-society-plus/about",
      "type": "website"
    },
    {
      "label": "https://www.skool.com/ai-automation-s...",
      "url": "https://www.skool.com/ai-automation-society/about",
      "type": "website"
    },
    {
      "label": "https://uppitai.com/",
      "url": "https://uppitai.com/",
      "type": "website"
    },
    {
      "label": "https://n8n.partnerlinks.io/22crlu8afq5r",
      "url": "https://n8n.partnerlinks.io/22crlu8afq5r",
      "type": "website"
    },
    {
      "label": "http://hostinger.com/nateherk",
      "url": "http://hostinger.com/nateherk",
      "type": "website"
    },
    {
      "label": "nateherk.com",
      "url": "https://nateherk.com/",
      "type": "website"
    }
  ],
  "WebsiteUrl": "https://www.skool.com/ai-automation-society-plus/about",
  "InstagramUrl": null,
  "XUrl": null,
  "LinkedInUrl": null,
  "FacebookUrl": null,
  "TikTokUrl": null,
  "DiscordUrl": null,
  "TelegramUrl": null,
  "PrimaryAggregatorUrl": null,
  "OtherLinks": [],
  "Emails": [
    "sponsorships@nateherk.com"
  ],
  "PrimaryEmail": "sponsorships@nateherk.com",
  "EmailConfidence": 100,
  "EmailSources": [
    "about-page-button"
  ],
  "HasLinks": true,
  "HasEmail": true,
  "BusinessInquiryAvailable": true,
  "EmailValidationStatus": null,
  "Status": "success",
  "SourceType": "search",
  "SourceQuery": "AI automation tools",
  "SearchRank": 3,
  "ContactabilityScore": 65,
  "QualificationTier": "Warm",
  "IsQualified": true
}
```

***

### Quick Start

#### Example 1: Keywords Search with Full Contact Extraction

```json
{
  "searchQueries": ["AI automation tools"],
  "maxResultsPerQuery": 20,
  "regionCode": "US",
  "language": "en",
  "extractContacts": true,
  "validateEmails": true
}
```

#### Example 2: Specific Channels with Email Validation

Provide channels by handle, ID, channel URL, or video URL — one per line. Each is an exact lookup.

```json
{
  "startUrls": [
    "@mkbhd",
    "UCX6OQ3DkcsbYNE6H8uQQuVA",
    "https://www.youtube.com/@LinusTechTips",
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "extractContacts": true,
  "validateEmails": true
}
```

#### Example 3: Fast Mode - Metadata Only (No Contact Extraction)

```json
{
  "searchQueries": ["tech reviews"],
  "maxResultsPerQuery": 50,
  "extractContacts": false
}
```

> **How to read the source fields:** results record where they came from. Channels you request in the **Channels** field return `SourceType: "channel"` (or `"video"` when you pass a video URL) with `SearchRank: null`. Channels discovered via **Search Keywords** return `SourceType: "search"`, the keyword in `SourceQuery`, and a `SearchRank` (1, 2, 3…) for their position in YouTube's results.

***

### Performance & Reliability

#### Throughput

| Channels | With Contacts (hybrid) | API Only (no contacts) |
|----------|----------------------|----------------------|
| 10 channels | ~20-40 seconds | ~10-15 seconds |
| 50 channels | ~2-3 minutes | ~1-2 minutes |
| 100 channels | ~4-5 minutes | ~2-3 minutes |
| 500 channels | ~15-25 minutes | ~8-12 minutes |

#### Architecture

- **YouTube Data API v3**: Fast, reliable metadata (subscribers, views, country, date)
- **Puppeteer**: Targeted About page scraping for contacts only
- **Automatic fallback**: Full scraping pipeline if API unavailable
- **Enhanced discovery**: Channel filter + dual extraction from search results
- **Smart deduplication**: ChannelId-based duplicate prevention
- **Error handling**: Automatic retries with exponential backoff
- **Anti-detection**: Realistic browser fingerprinting and human-like behavior

***

### Use Cases

#### Influencer Outreach

Find creators in your niche with their contact information. Export to CRM for automated outreach campaigns. Filter by subscriber count and engagement metrics.

#### PR & Media Relations

Build media lists with journalist YouTube channels. Extract business emails for press releases. Identify channels covering your industry.

#### B2B Partnerships

Discover business channels with LinkedIn profiles. Find decision makers through channel descriptions. Connect via multiple social platforms.

#### Competitive Analysis

Map competitor social media presence. Discover partnership networks. Analyze market communication channels.

#### Content Marketing

Identify collaboration opportunities. Find guest posting channels. Build relationships with content creators.

***

### Best Practices

1. **Start small**: Test with `maxResultsPerQuery: 10` to verify results
2. **Use keywords effectively**: Broad keywords discover more channels through dual extraction
3. **Qualify leads fast**: Sort by `ContactabilityScore` or filter on `IsQualified` / `QualificationTier` to prioritize reachable channels
4. **Respect privacy**: Only use publicly available contact information ethically
5. **Filter results**: Use `HasEmail` and `HasLinks` to find contactable channels
6. **Verify contacts**: Higher `EmailConfidence` scores are more reliable
7. **Export strategically**: Use CSV for CRM import, JSON for programmatic access
8. **Fast mode**: Turn off `extractContacts` for fastest extraction when you don't need contacts

***

### Changelog

#### 2026-07-20 — Scoring, CRM & fairer billing (v1.0)

A major update driven by a marketplace assessment — adding lead scoring, CRM integration, email validation, and fairer pricing. **Output grew to 41 fields** (15 standard + 19 contact + 4 status/lineage + 1 contactability score + 2 CRM qualification).

**Scoring & CRM (new)**

- **Contactability score (0–100)** — one outreach-readiness number per channel (`ContactabilityScore`), bundling email presence + confidence, MX/disposable validation, contact-route richness, and credibility. No competitor offers this.
- **Lead qualification** — every channel gets a `QualificationTier` (Hot / Warm / Cold / Unqualified) and an `IsQualified` flag against your `minQualificationScore` threshold (default 60). Annotation only — nothing is dropped.
- **Per-record webhooks** — stream each delivered channel as a real-time JSON POST to Zapier, Make, n8n, or your CRM (`webhookUrl` + optional secret `webhookAuthHeader`). Best-effort; a failed POST is logged and never stops the run.

**Contact enrichment & validation**

- **Email validation** — optional MX check + disposable/role detection → `EmailValidationStatus` (`mx_valid`, `role_valid`, `no_mx`, `disposable`, `unknown`).
- **Linked-website email scan** — fetches the channel's linked site(s) and scans for additional emails beyond the About page. Now also **decodes Cloudflare-obfuscated emails** (`data-cfemail`) and, when the linked page has none, **follows a same-origin contact/about page** (capped) — recovering business emails that a plain scan misses.
- **Video-description email scan** — when the About page and linked sites yield no email, scans the channel's recent video descriptions (public data) — the source that lets some competitors surface emails others miss. Runs only when no email is found yet (1 free YouTube API quota unit); results pass the junk-domain blocklist. **Precision guards:** an email must recur across **≥2 descriptions** (drops one-off guest/sponsor/scam addresses), and a **brand-matching domain** is preferred as the primary contact.
- **Subscriber filters** — `minSubscribers` / `maxSubscribers`.
- **Status & discovery lineage** — `Status`, `SourceType`, `SourceQuery`, `SearchRank` show where each channel came from.

**Discovery, billing & UX**

- **Fairer billing** — discovery is now free; the `search-query` charge was removed, so you pay only per channel returned. Filtered-out / not-found / errored channels are never charged.
- **Result controls** — `onlyWithContact` (only keep reachable channels) and `maxTotalChannels` (hard run cap).
- **Simplified input** — universal options internalized (email-detection sensitivity, link depth, concurrency); use-case options kept as toggles/filters.

**Positioning**

- Evaluated premium gated-email (CAPTCHA) retrieval and **deliberately declined it** — we keep *"public data, no CAPTCHA bypass"* as a ToS-safe stance. `BusinessInquiryAvailable` still flags when a channel has a gated business email, without revealing it.

#### v1.0 — Initial release (Feb 2026) + performance tuning (Apr 2026)

- **Hybrid architecture** — YouTube Data API v3 for metadata + a browserless/Puppeteer path for contacts, with automatic fallback when the API is unavailable.
- **Contact extraction** — public emails with confidence scoring from the About page.
- **Social links** — all external links categorized by platform (Instagram, X, LinkedIn, TikTok, Discord, Telegram, …).
- **Link-aggregator detection** — Linktree, Beacons, and similar hubs.
- **Business-inquiry flag** — detects when a gated business email exists (without bypassing the CAPTCHA).
- **Performance tuning** — browserless pipeline with high concurrency (~100+ channels/min) and no residential proxy required.

***

### Pricing

This actor uses **pay-per-event** pricing. You are charged **only per channel returned** (`channel-result`) — no search fee and no setup fee. Keyword searches and channel lookups cost nothing extra; you pay only for the channels you actually get.

- **Fair billing**: you are **not** charged for channels that are filtered out, not found, or fail — only for a channel that is successfully returned to your dataset.
- **Pay only for contactable channels**: turn on **Only Channels With Contact** (`onlyWithContact`) to drop contactless channels before they're saved or billed.
- **Cost control**: use `maxTotalChannels` to hard-cap the number of channels a run can return.
- **Email validation** (optional): when `validateEmails` is enabled, each validated email adds a small `email-validated` charge.

> The exact per-event prices are shown on this actor's Apify pricing tab (set on the platform, not in the code).

***

### FAQ

**Do you extract the hidden "business email" behind YouTube's CAPTCHA?**
No. We flag `BusinessInquiryAvailable: true` when one exists, but we never bypass CAPTCHAs or log into Google. We extract emails that are publicly visible in the About page / description.

**Do I pay for channels with no email?**
Only if you ask for them. By default you get (and pay for) every discovered channel, since the full profile has value. Turn on `onlyWithContact` to pay only for channels that have an email or link.

**Do I need a proxy?**
No. The actor works without any residential proxy.

**How is this different from an email-only scraper?**
You get the whole creator profile — subscribers, country, join date, categorized social links, and email **with a confidence score** — discoverable from a keyword, channel, video, or playlist URL. It's built for CRM-ready outreach, not just a raw email dump.

**How fast is it?**
The default browserless pipeline processes ~100+ channels/minute. Discovery and enrichment run without launching a browser.

***

> ⭐ **Found this useful?** A rating on the Apify Store really helps — and if something's missing, open an issue with your use case and we'll take a look.

***

### Compliance

- Intended for **legitimate channel discovery, influencer research, and business intelligence**
- Collects only **public** YouTube channel data
- Uses YouTube Data API v3 within Google's usage policies
- Does **not** attempt to bypass CAPTCHAs or access gated content
- Users responsible for compliance with applicable laws in their jurisdiction

***

### Support

- **Issues**: Report via GitHub or Apify support
- **Feature requests**: Open an issue with your use case
- **Documentation**: See `/docs` folder for detailed PRD and guides

***

**Built for production-ready channel discovery and outreach**

# Actor input Schema

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

Keywords or topics to discover YouTube channels via YouTube's search. Each keyword returns the channels YouTube ranks as most relevant for that term — this is a keyword search, not an exact lookup. To scrape a specific channel directly, use the Direct URLs section with its channel URL instead.

## `maxResultsPerQuery` (type: `integer`):

Maximum number of channels to discover per search keyword. Each search will return up to this many unique channels.

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

Scrape specific channels — one entry per line. Accepts a channel handle (@name), a channel ID (UC…), a channel URL, or a video URL (the video's channel is scraped). Each entry is an exact lookup, unlike Search Keywords which returns relevance-ranked matches. Playlist and search URLs are also accepted.

## `maxTotalChannels` (type: `integer`):

Hard cap on the total number of channels returned across the whole run (all searches and URLs combined). Leave empty for no cap. Useful for controlling cost.

## `regionCode` (type: `string`):

Country for localization (ISO 3166-1 alpha-2).

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

Preferred language (IETF BCP-47).

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

Only keep channels with at least this many subscribers. Leave empty for no minimum.

## `maxSubscribers` (type: `integer`):

Only keep channels with at most this many subscribers. Leave empty for no maximum.

## `dateFrom` (type: `string`):

Filter channels that joined YouTube after this date (optional). Leave empty to include all channels regardless of join date.

## `dateTo` (type: `string`):

Filter channels that joined YouTube before this date (optional). Leave empty to include all channels regardless of join date.

## `extractContacts` (type: `boolean`):

ON: extract emails + social links from the About page AND scan the channel's linked website(s) for more emails. OFF: metadata only — fastest and cheapest, no contact extraction.

## `validateEmails` (type: `boolean`):

Verify each extracted email's domain has mail servers (MX records) and flag disposable/role addresses. Adds an EmailValidationStatus field. 💲 Extra charge: when ON, bills one `email-validated` event per email validated — the only option in this section with an additional charge. Applies whenever contacts are extracted.

## `onlyWithContact` (type: `boolean`):

ON: keep only channels that have a public email OR a social/website link (a way to reach them). OFF: keep all discovered channels. Filtered-out channels are not saved or charged.

## `minQualificationScore` (type: `integer`):

A channel is flagged IsQualified = true when its ContactabilityScore is at least this value. The score (0–100) bundles email presence + confidence, MX validation, contact-route richness, and credibility. Every channel also gets a QualificationTier (Hot ≥80, Warm ≥60, Cold ≥40, Unqualified <40). This only annotates results — it does not drop channels.

## `webhookUrl` (type: `string`):

Optional. If set, each delivered channel is POSTed (as JSON) to this URL in real time — one request per channel — ideal for Zapier, Make, n8n, or a CRM endpoint. Must be http/https. Delivery is best-effort: failed POSTs are logged and never stop the run.

## `webhookAuthHeader` (type: `string`):

Optional. Value sent as the `Authorization` header on each webhook POST (e.g. `Bearer <token>`) to secure your endpoint. Only used when a Webhook URL is set.

## Actor input object example

```json
{
  "searchQueries": [
    "n8n"
  ],
  "maxResultsPerQuery": 5,
  "startUrls": [],
  "regionCode": "US",
  "language": "en",
  "dateFrom": "",
  "dateTo": "",
  "extractContacts": true,
  "validateEmails": false,
  "onlyWithContact": false,
  "minQualificationScore": 60
}
```

# Actor output Schema

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

Dataset containing extracted YouTube channel data with 41 fields: 15 standard channel metadata fields (from YouTube Data API v3), 19 contact fields (from About page scraping) including external links, social media URLs, email addresses, and optional email validation status, 4 status/discovery-lineage fields (Status, SourceType, SourceQuery, SearchRank), a ContactabilityScore (0–100 outreach-readiness score bundling email confidence, validation, and contact-route richness), plus CRM qualification fields (QualificationTier: Hot/Warm/Cold/Unqualified, and IsQualified).

# 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 = {
    "searchQueries": [
        "n8n"
    ],
    "maxResultsPerQuery": 5,
    "startUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/youtube-channel-contacts-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 = {
    "searchQueries": ["n8n"],
    "maxResultsPerQuery": 5,
    "startUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("coregent/youtube-channel-contacts-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "n8n"
  ],
  "maxResultsPerQuery": 5,
  "startUrls": []
}' |
apify call coregent/youtube-channel-contacts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,coregent/youtube-channel-contacts-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sOipP4qbTR90mBaW7/builds/W2S3jYkclrauofj2A/openapi.json
