YouTube Channel Email Scraper — Find YouTube Creators avatar

YouTube Channel Email Scraper — Find YouTube Creators

Pricing

from $14.00 / 1,000 api requests

Go to Apify Store
YouTube Channel Email Scraper — Find YouTube Creators

YouTube Channel Email Scraper — Find YouTube Creators

YouTube channel scraper: find creators worth partnering with. Search channels by niche keyword, category or region, then get emails (optionally from video descriptions and linked sites), contacts, social links, subscriber and view counts, upload activity, partnership score. CSV or JSON channel data.

Pricing

from $14.00 / 1,000 api requests

Rating

0.0

(0)

Developer

Andrey Afanasenko

Andrey Afanasenko

Maintained by Community

Actor stats

1

Bookmarked

81

Total users

4

Monthly active users

9 days ago

Last modified

Security

Limited permissions

Share

Apify Actor

Find YouTube creators for partnerships — discover channels by niche, fetch contact emails and social handles, score partnership potential, and export everything as CSV / Excel / JSON in one run. From 13 November 2026 you pay per result — from $0.007 per channel saved, and channels your filters drop are free (until then, $0.014–$0.020 per request for YouTube data).

YouTube's official Data API requires OAuth, has strict daily quotas, and doesn't expose contact emails or partnership scoring at all. This actor reads the same channels any browser visitor sees, finds public contact data, and produces a partnership score (0–100) so outreach teams can move from list-building to first email in one run.

🎯 What it does

The actor finds YouTube channel authors and their videos, scores them for partnerships, and pulls public contact data so outreach teams can move from list-building to first email in one run. Three operation modes share the same output dataset and pricing:

ModeInputOutputUse when
channelchannelSearchQuery (niche keywords) or channelHandles: ["@fireship", ...]channelSummary rows — one per channel, with aggregates + contact data + partnership scoreYou're looking for partnership / outreach leads. The default mode.
searchsearchQuery (keywords) or videoLinks: [...]video rows — one per matched video, with stats and channel metadataYou want to find videos by topic, not full channels.
playlistplaylistId or playlistChannelHandle (uses uploads playlist) + optional playlistDateRangevideo rows — one per playlist itemYou want to scan a curated list of videos or all uploads from one creator.

channel mode produces the richest record. From 13 November 2026 it costs $0.01 per channel saved on the free plan ($0.007 on Gold and up), plus $0.02 when the channel comes with a contact email; search and playlist cost $0.002 per video saved. Until then every request for YouTube data is charged (about $0.16 per channel on average in October 2026). See § Pricing.

Output is a single Apify dataset where the recordType column distinguishes layouts. Numeric stats may come back as raw numbers, formatted display strings ("1.2M"), or the sentinel "N/A" when YouTube hides the count.

📦 Output sample

A real channelSummary row from a channel-mode run (truncated to ~30 keys for readability — every column is documented in the .actor/dataset_schema.json):

{
"recordType": "channelSummary",
"mode": "channel",
"status": "analyzed",
"channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
"channelHandle": "@GoogleDevelopers",
"channelTitle": "Google for Developers",
"channelUrl": "https://www.youtube.com/@GoogleDevelopers",
"subscriberCount": "2,560,000",
"averageViews": "18,433",
"averageLikes": "942",
"averageComments": 84,
"averageEngagementRate": "5.12%",
"partnershipPotential": 85,
"lastUploadAt": "2025-11-14T17:00:12.000Z",
"daysSinceLastUpload": 2,
"uploadsLast30Days": 9,
"uploadsPerMonth": 8.6,
"sponsoredVideos": 0,
"analyzedVideos": 20,
"requestedMaxVideos": 20,
"engagement": {
"videosWithMetrics": 20,
"totalViews": 368652,
"totalLikes": 18848,
"totalComments": 1682
},
"contactEmail": "devrel@google.com",
"contactEmails": "devrel@google.com, partnerships@google.com",
"contactSocials": [
{"platform": "Twitter/X", "handle": "@googledevs"}
],
"contactSocialsTwitter": [{"platform": "twitter/x", "handle": "@googledevs", "url": "https://twitter.com/googledevs"}],
"bestContactMethod": "email",
"emailSource": "channel",
"hasHiddenBusinessEmail": null,
"channelCountry": "US",
"discovery": {"source": "search", "searchQuery": "coding tutorials", "matchedTags": ["programming"]},
"thumbnailPreview": "https://yt3.googleusercontent.com/ytc/AIdro_xyz=s176",
"scrapedAt": "2025-11-16T17:15:00.000Z"
}

A video row from a search-mode run:

{
"recordType": "video",
"mode": "search",
"videoId": "3rrpfW0bEdc",
"title": "Apify Tutorial For Beginners",
"channelTitle": "Speak About Digital",
"channelUrl": "https://www.youtube.com/@speakaboutdigital",
"videoUrl": "https://www.youtube.com/watch?v=3rrpfW0bEdc",
"views": "12,403",
"likeCount": 320,
"commentCount": 18,
"engagementRate": "2.73%",
"hasPaidPromotion": false,
"publishedAt": "2025-02-01T00:00:00.000Z",
"thumbnailUrl": "https://i.ytimg.com/vi/3rrpfW0bEdc/hq720.jpg",
"scrapedAt": "2025-11-15T14:00:00Z"
}

⚡ Quick start

  1. Pick a mode in the Apify Console UI: channel (default), search, or playlist.
  2. Paste a minimal input. Cheapest first try — search mode, one result, $1 budget:
{
"mode": "search",
"searchQuery": "javascript tutorial",
"maxResults": 1,
"includeStatistics": true,
"budget": 1
}
  1. Click Start → watch the Log tab for budget tracking.
  2. Open the Output tab when the run completes → preview as a table, switch to JSON view, or download CSV / Excel / JSON.
  3. Iterate: raise maxResults / maxChannelsToAnalyze and budget together when the shape looks right.

🎯 Example tasks

Ready-to-run examples — each opens a pre-configured task you can run in one click (no setup):

🛠 Input

The Input tab is split into 5 sections. Highlights:

  • Step 1 · Mode — the only always-required field. The other steps adapt to the mode.
  • Step 2 · Mode-specific — the field that defines what to scrape (searchQuery, playlistId, channelSearchQuery, etc.). Every required-per-mode field is labeled in its description.
  • Step 3 · Channel discovery (channel mode only) — channelTags, channelSearchStrategy: "channel" | "video" | "hybrid", videoCategoryId, regionCode.
  • Step 4 · Quality filters — minSubscribers, maxSubscribers, minAverageViews, minAverageLikes, minAverageComments, minAverageEngagementRate. Set every filter to 0 on the first run, then tighten.
  • Step 5 · Budget — budget (USD cap; the actor stops at the limit). Start with $2–$5.

Optional extras, all off by default — a saved task without them runs exactly as before:

  • Video filters (in the Video search section) — publishedAfter / publishedBefore (a date like 2026-09-01 or a period like "30 days"), videoDuration (short under 4 min · medium 4–20 min · long over 20 min), videoCaption (closedCaption · none), onlyPaidPromotion (only videos the creator marked as containing a paid promotion). YouTube search applies them itself. They work in search mode and in channel mode when discovery searches videos (channelSearchStrategy video or hybrid) — there onlyPaidPromotion: true finds creators who already take sponsorships. playlist mode ignores them (use playlistDateRange).
  • Look harder for an email (deepEmailSearch, channel mode, needs includeContactData) — for a channel whose contact details show no email, also reads its own video descriptions, then the website or link-in-bio page it links to (up to 3 page loads), and if there is still none, checks whether YouTube keeps a business email behind the channel's "View email address" button (hasHiddenBusinessEmail — the address itself is never revealed). emailSource says where each email came from. In our test on 20 channels it raised the channels with an email from 4 to 7, and flagged a hidden business email on 9 of the 13 that still had none.
  • Skip channels already delivered to you (skipDelivered, channel mode) — "off" · "7" · "30" · "90" · "180" · "365" · "forever", or any number of days from the API. Leaves out channels this Actor already delivered to your Apify account across all your runs; skipped channels are not fetched or charged, and the run takes the next channels the search finds. Channels you name in channelHandles are never skipped. The history is a key-value store named yt-delivered-… in your Storage (delete it to start over); every channel-mode run records what it delivered, so the history is there the day you switch the option on. Runs that overlap in time may still share a channel.

Channel mode

{
"mode": "channel",
"channelSearchQuery": "coding tutorials",
"videoCategoryId": 27,
"regionCode": "US",
"channelSearchStrategy": "hybrid",
"channelTags": ["programming", "web development"],
"includeContactData": true,
"maxChannelsToAnalyze": 10,
"maxVideos": 25,
"minSubscribers": 10000,
"maxSubscribers": 1000000,
"minAverageViews": 5000,
"minAverageEngagementRate": 3,
"budget": 5
}

Search mode

{
"mode": "search",
"searchQuery": "ai news 2025",
"maxResults": 50,
"orderBy": "viewCount",
"includeStatistics": true,
"includeCommentReplies": false,
"includeCaptions": false,
"captionLanguage": "en",
"budget": 2
}

Playlist mode

{
"mode": "playlist",
"playlistChannelHandle": "fireship",
"playlistDateRange": {"startDate": "2025-01-01", "endDate": "2025-02-01"},
"maxResults": 50,
"includeStatistics": true,
"includeCaptions": false,
"captionLanguage": "en",
"budget": 2
}

💰 Pricing

Pay-per-event. The price model changes on 13 November 2026: from that day you pay per result, not per request.

From 13 November 2026 — per result

EventTriggerFreeBronzeSilverGoldPlatinumDiamond
channel-scraped (Channel analyzed)One channel saved to your dataset with its subscribers, average views, likes and comments, engagement rate, upload activity, contact links and partnership score$0.010$0.009$0.008$0.007$0.007$0.007
email-found (Contact email found)A saved channel came with a contact email — once per channel, on top of the channel. Channels without an email are not charged for it$0.020$0.018$0.016$0.014$0.014$0.014
video-scraped (Video saved)One video saved in the search or playlist mode, with the details you asked for$0.002$0.0018$0.0016$0.0015$0.0015$0.0015
  • Requests are no longer charged. Channels your filters drop, channels skipped as already delivered, and extra lookups (includeStatistics, includeCaptions, deepEmailSearch, comment replies) cost nothing by themselves — you pay only for the rows saved.
  • channel mode: 10 channels on Free, 4 of them with an email → 10 × $0.01 + 4 × $0.02 = $0.18. On Diamond: 10 × $0.007 + 4 × $0.014 = $0.126.
  • search / playlist mode: 50 videos on Free → 50 × $0.002 = $0.10, with or without statistics and captions.

Until 12 November 2026 — per request

EventTriggerFreeBronzeSilverGoldPlatinumDiamond
api-requestOne request for YouTube data. All operations cost the same.$0.020$0.018$0.016$0.014$0.014$0.014
  • channel mode — the number of requests depends on maxVideos and the extras; in October 2026 a channel saved cost about $0.16 on average.
  • search mode ≈ 1 api-request per result without includeStatistics, ~2 with it. 50 results, stats on → ~$2 (Free).
  • playlist mode ≈ same as search.
  • Enabling includeCaptions (search/playlist only) adds ~1 api-request event per video. Off by default.

Set budget to the USD ceiling you'd accept; the actor stops cleanly when reached, under either model.

🆓 Free vs paid

CapabilityFree planPaid plan
All 3 modes (channel / search / playlist)✅✅
Contact data (emails / socials / partnership score)✅✅
Comment-reply enrichment (includeCommentReplies)✅✅
Transcript/caption fetching (includeCaptions, search & playlist)✅✅
Price per channel saved (from 13 November 2026)$0.010$0.007–$0.009 (tier-dependent)
Price per api-request event (until 12 November 2026)$0.020$0.014–$0.018 (tier-dependent)

Pricing tier is the only gate — every feature works on every plan. Higher tiers unlock cheaper unit prices on the same events.

🧪 Filter recipes

SaaS / B2B partnership leads

{"mode":"channel","channelSearchQuery":"saas startup founders","maxChannelsToAnalyze":15,"maxVideos":20,"minSubscribers":5000,"budget":4}

Micro-influencers in beauty (2k–150k subs)

{"mode":"channel","channelSearchQuery":"beauty makeup tutorial","videoCategoryId":"26","maxChannelsToAnalyze":25,"maxVideos":20,"minSubscribers":2000,"maxSubscribers":150000,"budget":6}

Top videos for a topic, sorted by views

{"mode":"search","searchQuery":"crypto trading education","maxResults":50,"orderBy":"viewCount","includeStatistics":true,"budget":2}

Creators who already take sponsorships — only ones you have not received yet

{"mode":"channel","channelSearchQuery":"home workout","channelSearchStrategy":"video","onlyPaidPromotion":true,"publishedAfter":"90 days","maxChannelsToAnalyze":15,"maxVideos":15,"deepEmailSearch":true,"skipDelivered":"forever","budget":5}

Recent uploads from one creator

{"mode":"playlist","playlistChannelHandle":"fireship","playlistDateRange":{"startDate":"2025-01-01","endDate":"2025-02-01"},"maxResults":50,"includeStatistics":true,"budget":1}

🔁 Resume / checkpoint

The actor checkpoints after every batch, so resurrected runs continue from where they left off without re-spending budget on already-processed items. Per-mode state lives in the run's storage/ directory and is loaded automatically when you re-run with the same input. There's nothing to configure — just hit Start again after a budget pause or transient error.

📡 Live status & storage records

Beyond the default dataset, the actor writes auxiliary records into the run's key-value store. Read any of them via the Apify API or Actor.getValue(...) from your own code:

RecordPurposeFormat
RUN_SUMMARYEnd-of-run snapshot (mode, totals, spend, stop reason)JSON
processed_video_idsPer-mode checkpoint: video IDs already fetchedJSON array
channel_progressChannel-mode resume token: which channels remainJSON object
playlist_statePlaylist-mode pagination stateJSON object
INPUTRaw input the actor receivedJSON

API access pattern: https://api.apify.com/v2/key-value-stores/<storeId>/records/<recordKey>.

🤖 Programmatic / API use

Start a run via REST and read the dataset:

TOKEN=YOUR_APIFY_TOKEN
RUN=$(curl -s -X POST "https://api.apify.com/v2/acts/afanasenko~youtube-channel-scraper/runs?token=$TOKEN" \
-H 'Content-Type: application/json' \
-d '{"mode":"search","searchQuery":"javascript tutorial","maxResults":5,"includeStatistics":true,"budget":1}' \
| jq -r '.data.id')
# Poll until finished
until S=$(curl -s "https://api.apify.com/v2/actor-runs/$RUN?token=$TOKEN" | jq -r '.data.status'); \
[ "$S" = "SUCCEEDED" ] || [ "$S" = "FAILED" ]; do sleep 5; done
# Read dataset rows
DS=$(curl -s "https://api.apify.com/v2/actor-runs/$RUN?token=$TOKEN" | jq -r '.data.defaultDatasetId')
curl -s "https://api.apify.com/v2/datasets/$DS/items?clean=1&token=$TOKEN" | jq '.[0]'

MCP / agent use: the actor is exposed as a tool via the Apify MCP server (mcp.apify.com). Agents call it by name and receive every input/output column description, so prompts like "find me 10 fitness creators with at least 50k subscribers and an email I can write to" route to channel mode automatically. The dataset schema is read by the agent before it interprets the result, so post-run analysis works without manual mapping.

🏆 Partnership Score & Engagement

  • Engagement rate is derived from likes + comments vs. views (where available) across analyzed videos.
  • Partnership score (0–100) blends size (subscribers), engagement, and contact availability. Email / social presence boosts the score; very large channels with low engagement score lower than mid-size channels with strong engagement.
  • Contact data includes primary email, socials (per platform), and best contact method (email > website > social > YouTube).
  • Tuning: raise maxVideos to 20–30 for tighter averages; use minAverageEngagementRate (e.g. 3 = 3 %) and a subscriber band (minSubscribers / maxSubscribers) to filter the score's inputs.
  • Reading the score: 80–100 = priority outreach (high engagement + contactable), 50–79 = qualified, < 50 = thin signal (often missing engagement or contact data).

❓ FAQ

  • How do I get emails? Keep includeContactData=true (default). Contact data comes from the channel's description and its About page — the email, links, socials and country the channel shows any visitor — and costs no extra request; some channels have nothing public to find. Turn on deepEmailSearch to also look in the channel's video descriptions and on the website it links to; hasHiddenBusinessEmail: true means the creator set a business email that YouTube shows only to signed-in viewers on the channel page.
  • Can I get only channels I have not received before? Yes — set skipDelivered (for example "forever"). Skipped channels are not fetched or charged.
  • What do uploadsPerMonth and sponsoredVideos mean? Both come from data the run already reads, at no extra cost: lastUploadAt, daysSinceLastUpload, uploadsLast30Days and uploadsPerMonth from the channel's latest uploads (up to 50), and sponsoredVideos — how many of the analyzed videos YouTube marks as containing a paid promotion.
  • Why zero results? Filters too tight. Set every min* and max* to 0, broaden channelSearchQuery, remove channelTags, and re-run.
  • How do I target micro-influencers? Set maxSubscribers to your ceiling (e.g. 150 000) and minSubscribers to your floor (e.g. 2 000). Keep maxVideos 15–25 for representative averages.
  • Why does views come back as "N/A"? YouTube sometimes hides view counts on freshly uploaded or low-traffic videos. The actor preserves whatever YouTube reports rather than fabricating a 0.
  • channel vs. playlist? Use channel to discover and analyze channels for partnerships. Use playlist (with playlistChannelHandle) to scan one specific creator's full uploads list.
  • How do I resume after a budget stop or migration? Just re-run with the same input. Checkpoints skip already-processed items and continue from the last token.
  • Why am I seeing Ignored attempt to charge… in the log? Informational. The actor uses pay-per-event-compatible charging; the message appears when PPE isn't active (e.g. local runs).

See the full set of afanasenko's Apify actors: apify.com/afanasenko.

🛟 Support & feedback

  • Bugs / questions — open an issue on the actor's Apify Store page.
  • Run not exiting — check the Log for budget exhaustion (the actor stops cleanly at the cap) and the RUN_SUMMARY record for the stop reason.
  • Discord / community — share your mode, input JSON, and the last 20 log lines for fast triage.

⚖️ Disclaimer

This actor scrapes only publicly visible YouTube data (channel pages, video pages, public playlists). It does not access private content, watch history, or anything behind a YouTube login. Use the output ethically and in compliance with YouTube's Terms of Service, your local regulations, and applicable privacy law (GDPR, CCPA, etc.) when storing or contacting the people whose details you've collected. Do not use scraped emails for unsolicited bulk outreach.