Youtube Channel Scraper avatar

Youtube Channel Scraper

Pricing

from $14.00 / 1,000 api requests

Go to Apify Store
Youtube Channel Scraper

Youtube Channel Scraper

Discover channels by niche keywords, category, and region. Get contact information (emails, social media), engagement metrics, and partnership potential scores. Perfect for brands seeking influencer collaborations.

Pricing

from $14.00 / 1,000 api requests

Rating

0.0

(0)

Developer

Andrey Afanasenko

Andrey Afanasenko

Maintained by Community

Actor stats

1

Bookmarked

42

Total users

6

Monthly active users

7 days ago

Last modified

Share

YouTube Channel Author Finder

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 $0.014 per API request with a single primary event.

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 is the most expensive (~$0.50 per fully analyzed channel ≈ 25 events) but produces the richest record. search and playlist cost ~$0.02 per video unless includeStatistics: true.

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,
"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",
"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%",
"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.

🛠 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 filtersminSubscribers, maxSubscribers, minAverageViews, minAverageLikes, minAverageComments, minAverageEngagementRate. Set every filter to 0 on the first run, then tighten.
  • Step 5 · Budgetbudget (USD cap; the actor stops at the limit). Start with $2–$5.

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,
"budget": 2
}

Playlist mode

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

💰 Pricing

Pay-per-event with a single primary event. One billable unit covers every API operation the actor performs (search, video details, channel stats, comments, contact-data lookup):

EventTriggerFreeBronzeSilverGoldPlatinumDiamond
api-requestOne API request to the upstream YouTube data service. All operations cost the same.$0.020$0.018$0.016$0.014$0.014$0.014

Cost math:

  • channel mode ≈ ~25 api-request events per fully analyzed channel ≈ $0.50/channel on Free, $0.35/channel on Diamond. So 10 channels → ~$5 (Free) / ~$3.50 (Diamond).
  • search mode ≈ 1 api-request per result without includeStatistics, ~2 with it. 50 results, stats on → ~$2 (Free).
  • playlist mode ≈ same as search.

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

🆓 Free vs paid

CapabilityFree planPaid plan
All 3 modes (channel / search / playlist)
Contact data (emails / socials / partnership score)
Comment-reply enrichment (includeCommentReplies)
Cost per api-request event$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 pricing on the same api-request event.

🧪 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}

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 About page and an external lookup; some private channels have nothing public to find.
  • 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.