YouTube Research Scraper - Videos, Channels & Search
Pricing
from $1.50 / 1,000 base video rows
YouTube Research Scraper - Videos, Channels & Search
Collect YouTube video and channel research data for content analysis, competitor monitoring, and lead research. Export structured metadata for automation workflows.
Pricing
from $1.50 / 1,000 base video rows
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
13
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
YouTube Research & Transcript Scraper
Search YouTube, export channel video lists, enrich selected videos, and collect transcripts without setting up the YouTube Data API.
This Apify Actor is built for YouTube research workflows. Start with broad discovery, shortlist the videos that matter, then run metadata enrichment or transcript extraction only on that smaller set — that keeps runs faster even though every dataset row uses the same result price.
Pay per event — Actor start + each result; platform usage is included (you do not pay separate Apify compute on top of the event prices).
Need a dedicated scraper for one website?
This Actor is the general tool for protected public pages. If you already have one specific site and a field list, a dedicated scraper is faster and more stable: listing + detail, your export format, delivered to your Apify account or as a standalone runnable client.
I confirm the tier before you pay. The clock starts after that confirmation.
Start here: Submit a custom scraper request
| Starter $50 | Dedicated $100 | Hard target $200–999 | |
|---|---|---|---|
| Site | 1 simple anti-bot public site | 1 medium anti-bot public site | Cloudflare / aggressive anti-bot / custom parser |
| Scope | Full listing + detail fields | Listing + detail + pagination, your field list | Agreed fields, repeatable runs |
| Delivery | CSV/JSON · Apify Actor or standalone runnable client (script/CLI) | Same, plus a sample run and short instructions | Feasibility first, then build |
| Time | 24 hours after we confirm the URL is in scope | 48 hours after confirmation | Quoted after feasibility |
| Fixes | 30 days for small public-layout changes | 30 days | Scoped in the quote |
Hard-target sites are not a 100% uptime promise. You get a dedicated parser that can be re-run on the agreed fields. If the URL is not feasible, you get a refund or pay an assessment fee only — you will know before the build starts.
Not in Starter/Dedicated: login-walled data, native APK / Windows installer / full web apps, or two-year maintenance. Those are a separate quote.
Best for
- YouTube keyword research and topic mapping
- competitor and creator channel monitoring
- content audits for brands, agencies, and media teams
- transcript collection for LLM, RAG, summarization, and qualitative research pipelines
- building structured YouTube datasets from search results, channel pages, and known video URLs
How it works
The Actor accepts three input types. You can use one, two, or all three in the same run.
| Input | Use it when | Result source |
|---|---|---|
searchQueries | You want to discover videos by topic or keyword | YouTube search results |
channelUrls | You want recent videos from one or more channels | Channel /videos pages with browse continuation, plus RSS fallback when needed |
videoUrls | You already know the exact videos to process | Direct video metadata paths with fallback metadata extraction |
includeTrending | You want popular videos for a market (gl) | Topic hubs (gaming, sports, news, podcasts, live, learning, fashion) — classic /feed/trending was removed by YouTube |
Rows are deduplicated by videoId, so the same video is only pushed once even if it appears in multiple inputs.
At least one of searchQueries, channelUrls, videoUrls, or includeTrending must be set. Empty input is rejected so the Actor does not create a misleading dataset row or charge for a helper item.
Comments (full coverage)
Set includeComments: true on a shortlist (videoUrls recommended). The worker paginates InnerTube /next for top-level comments and reply threads (modern commentEntityPayload text). Use maxComments: 0 / maxRepliesPerComment: 0 for exhaustive crawls within safety caps (20k tops / 2k replies per thread). includeRelated attaches watch-page related videos on each row.
More Actors like this
Looking for another social / video scraper, or a specialized Actor outside YouTube? Use a dedicated Actor when one exists — structured fields, better coverage, usually lower cost.
Similar social & content Actors
Prefer another specialized scraper?
Jobs & Freelance
- LinkedIn Jobs Scraper
- Indeed Jobs Scraper
- Upwork Jobs Scraper
- Glassdoor Scraper
- Fiverr Gigs Scraper
- Bayt Jobs Scraper
E-commerce
- Walmart Product Scraper
- Amazon Search Scraper
- Shopee Search Scraper
- Etsy Scraper
- SHEIN Product Scraper
- Temu Product Scraper
- Target Product Scraper
- Allegro Scraper
Real Estate
- Zillow & Zumper Scraper
- Realtor.com Scraper
- Apartments.com Rental Scraper
- Rightmove Scraper
- Idealista Scraper
- realestate.com.au Scraper
Travel & Stays
Ads Intelligence
Local & Maps
General Tools
→ See the full catalog in Related Actors below, or browse apify.com/lentic_clockss.
How to use (no code required)
- Click "Try for Free" at the top of this page
- Add at least one input:
searchQueries,channelUrls,videoUrls, and/or turn onincludeTrending - Keep
scrapeDetails/includeTranscript/includeCommentsoff for faster discovery; turn them on only for a shortlist - Click Start — rows appear in the Dataset tab
- Download as JSON, CSV, or Excel, or call the Standby API for small interactive requests
Tip: discover broadly first, then enrich or pull transcripts only for the videos you actually need — that keeps runtime down. Every dataset row is billed at the same result price.
Recommended workflow
1. Discover videos first
Use searchQueries or channelUrls first. Keep scrapeDetails and includeTranscript off while you are still exploring.
{"searchQueries": ["ai workflow automation", "youtube competitor analysis"],"maxResults": 50}
This gives you a clean shortlist with titles, URLs, channels, thumbnails, rough publish text, durations, view counts when available, and descriptions when present in the search result.
2. Review and shortlist
Filter the dataset outside the Actor. Pick only the videos you actually need for deeper work.
Useful shortlist signals:
- topic relevance from
titleanddescription - creator or company from
channelName - popularity from
viewCount - freshness from
publishedTextorpublishedAt - video length from
durationordurationSeconds
3. Enrich selected videos
Use videoUrls with scrapeDetails when you need stronger metadata for specific videos.
{"videoUrls": ["https://www.youtube.com/watch?v=XVv6mJpFOb0","https://youtu.be/dQw4w9WgXcQ"],"scrapeDetails": true}
scrapeDetails may improve or fill:
publishedAtcategorydescriptionviewCount
It is best used after shortlisting because it performs extra requests per video.
4. Collect transcripts only when needed
Use includeTranscript for videos where you actually need text, timestamps, or LLM-ready content.
{"videoUrls": ["https://www.youtube.com/watch?v=XVv6mJpFOb0"],"scrapeDetails": true,"includeTranscript": true,"transcriptLanguage": "en"}
When a transcript is available, the row includes timestamped transcript segments and a combined plain-text transcript. If YouTube does not provide captions for the video, or the captions cannot be fetched, the Actor still returns the video row without transcript fields.
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
searchQueries | array of strings | ["ai workflow automation"] | YouTube search keywords. Each query runs separately and can return up to maxResults videos. Best for discovery and SEO or market research. |
channelUrls | array of strings | empty | YouTube channel inputs. Supports @handle, UC channel IDs, and common youtube.com channel, c, and user URLs. Returns recent public videos; RSS fallback is used when the channel page does not expose rows. |
videoUrls | array of strings | empty | Exact YouTube videos to process. Supports 11-character video IDs and common watch, shorts, embed, live, and youtu.be URL formats. Best for enrichment and transcripts. |
maxResults | integer | 1 | Maximum videos per search query or channel. It does not multiply direct videoUrls; each provided video URL is processed once. |
scrapeDetails | boolean | false | Fetches richer metadata for each row. Use on shortlists or smaller runs. |
includeTranscript | boolean | false | Attempts transcript extraction for each video. Use on targeted runs because this is the heaviest mode. |
includeEngagement | boolean | true | Backfill like/subscriber/comment counts from /next. |
includeStructure | boolean | true | Backfill chapters/heatmap/topics/hashtags/rich description. |
includePlaybackMeta | boolean | true | Backfill formats/storyboards/playbackTracking/playerConfig from /player. |
includeCardsEndscreen | boolean | true | Backfill in-video cards and end-screen recommendations. |
includeUpdatedMetadata | boolean | false | Lightweight like/view deltas via updated_metadata. |
includeHomeFeed | boolean | false | Include FEwhat_to_watch home feed items. |
includeGuide | boolean | false | Include guide navigation items. |
transcriptLanguage | string | en | Preferred transcript language code, such as en, es, fr, de, ja, or pt. If that language is unavailable, the Actor can fall back to the first available caption track. |
includeComments | boolean | false | Full comment pagination (+ nested replies). Prefer with videoUrls. |
maxComments | integer | 0 | Max top-level comments; 0 = all (cap 20000). |
includeCommentReplies | boolean | true | Expand reply threads with full pagination. |
maxRepliesPerComment | integer | 0 | Max replies per thread; 0 = all (cap 2000). |
commentSort | string | top | top or newest. |
includeRelated | boolean | false | Attach related/recommended videos per watch page. |
maxRelated | integer | 20 | Cap related videos per source video. |
includeTrending | boolean | false | Discover popular videos via topic hubs for gl. |
trendingMaxResults | integer | 50 | Cap for topic-hub discovery. |
gl / hl | string | US / en | Market / UI language for search, comments, and topic hubs. |
Input examples
Search by keyword
{"searchQueries": ["supply chain automation"],"maxResults": 25}
Export latest channel videos
{"channelUrls": ["https://www.youtube.com/@freecodecamp"],"maxResults": 100}
Process known videos
{"videoUrls": ["https://www.youtube.com/watch?v=XVv6mJpFOb0","https://youtu.be/PXMJ6FS7llk"],"scrapeDetails": true}
Transcript run for a shortlist
{"videoUrls": ["https://www.youtube.com/watch?v=XVv6mJpFOb0"],"includeTranscript": true,"transcriptLanguage": "en"}
Mixed discovery run
{"searchQueries": ["ai sales outreach"],"channelUrls": ["https://www.youtube.com/@HubSpot"],"maxResults": 30}
Output fields
Each dataset item is one YouTube video row. The Actor does not write helper rows for empty input.
Core fields
| Field | Type | Description |
|---|---|---|
recordVersion | string | Output contract version, currently 1.0. |
enrichmentLevel | string | base, detail, or transcript. Shows how far the row was enriched. |
videoId | string | YouTube video ID. |
title | string | Video title. |
url | string | Canonical YouTube watch URL. |
channelName | string | Channel or author name when available. |
channelId | string | YouTube channel ID when available. |
channelUrl | string | Channel URL when available. |
viewCount | integer | View count when available. May be 0 when the source does not expose it. |
duration | string | Human-readable duration from listing pages when available. |
durationSeconds | integer | Duration in seconds when available. |
publishedText | string | Relative publish text from listing pages, such as 2 weeks ago, when available. |
publishedAt | string | Publish date when available. Detail mode can improve this field. |
description | string | Search snippet, RSS description, or fuller video description depending on source and enrichment. |
thumbnailUrl | string | Video thumbnail URL. |
category | string | Video category when detail metadata is available. |
isLive | boolean | Whether the source marks the video as live content. |
source | string | Source path used for the row: search, channel, or detail. |
scrapedAt | string | ISO timestamp when the row was created. |
Engagement & enrichment fields
These fields are backfilled from the InnerTube /next and /player responses — the data is already returned in the same requests, so they cost no extra calls. Toggle groups via the includeEngagement / includeStructure / includePlaybackMeta / includeCardsEndscreen input flags (all default true).
| Field | Type | Description |
|---|---|---|
likeCount | integer | Video like count from the engagement panel. |
likeStatus | string | Like button state (LIKE/INDIFFERENT) when present. |
viewCountExact | integer | Exact view count from the viewCount factoid (more precise than the rounded label). |
commentCountExact | integer | Exact comment count from commentsHeaderRenderer when exposed. |
subscriberCount | integer | Channel subscriber count parsed to integer. |
subscriberCountText | string | Raw subscriber label, e.g. 4.54M subscribers. |
chapters | array | Video chapters: [{title, startMs, thumbnailUrl}]. |
heatmap | array | Retention heatmap markers: [{startMs, durationMs, intensity}] (100 points when present). |
topics | array | SuperTitleLink topic chips on the watch page. |
hashtags | array | Hashtag tiles. |
descriptionRich | string | Attributed/expandable description with inline links and timestamps. |
structuredDescription | boolean | Whether the structured-description panel was present. |
cards | array | In-video info cards: [{teaser, startMs}]. |
endscreen | array | End-screen recommendations: [{videoId, title}]. |
transcriptSearchIndex | array | Searchable transcript panel data when present. |
formats | array | Full streamingData format list: [{itag, mimeType, bitrate, fps, width, height, qualityLabel, audioChannels, audioQuality, audioSampleRate, url}]. |
storyboards | array | Storyboard spec entries for thumbnail grids. |
playbackTracking | object | player.playbackTracking payload. |
playerConfig | object | player.playerConfig payload. |
Notes: fields are only present when YouTube returns them for the video (e.g. chapters needs chapters; formats is empty on LOGIN_REQUIRED playability-gated videos such as age/region-restricted content). commentCountExact is null when the header exposes only the "Comments" label without a count.
Transcript fields
Transcript fields appear only when includeTranscript is true and captions are successfully returned.
| Field | Type | Description |
|---|---|---|
transcript | array | Timestamped caption segments. Each segment has text, start, and duration. |
transcriptLanguage | string | Language code of the transcript actually returned. |
transcriptText | string | Full transcript joined into one plain-text string. |
Example transcript segment:
{"text": "Welcome back to the channel.","start": 12.4,"duration": 3.2}
Standby API
The Actor includes a Standby API for small interactive requests. The same validation rules apply as normal runs.
| Endpoint | Method | Use |
|---|---|---|
/ | GET | Readiness check |
/search?query=python%20automation&maxResults=10 | GET | Search videos |
/channel?url=https://www.youtube.com/@freecodecamp&maxResults=10 | GET | List recent channel videos |
/video?url=XVv6mJpFOb0 | GET | Fetch one direct video |
/run | POST | Run the normal Actor input JSON through Standby |
Limits and practical notes
- Transcripts are not guaranteed. They depend on whether YouTube exposes captions for the video and whether those captions can be fetched.
includeTranscriptcan still return a valid video row without transcript fields.- Search and channel rows may have lighter metadata than direct detail rows.
maxResultsapplies per search query and per channel URL.- Channel scraping works best with public channels and common YouTube URL formats.
- Very large transcript runs are slower than discovery runs. Shortlist first when possible.
- YouTube page structure and availability can change. If a source path fails for a specific video or channel, try the most direct input type, especially
videoUrlsfor known videos.
Pricing
This Actor uses pay-per-event pricing. Platform usage costs are included — you do not pay separate Apify compute on top of the event prices below (User pays platform usage costs: No).
| Event | Price |
|---|---|
Actor Start (apify-actor-start) | $0.005 per start |
Result (apify-default-dataset-item) | $1.50 / 1,000 rows ($0.0015 each) |
Every dataset row is billed as one result, including search, channel, detail, and transcript rows.
Store discount tiers
All Apify Store discount tiers use the same result price:
| Tier | $/1,000 | per result |
|---|---|---|
| FREE* | $1.500 | $0.0015 |
| BRONZE | $1.500 | $0.0015 |
| SILVER | $1.500 | $0.0015 |
| GOLD | $1.500 | $0.0015 |
| PLATINUM | $1.500 | $0.0015 |
| DIAMOND | $1.500 | $0.0015 |
*FREE is the list price before any Store volume discount. This Actor does not discount higher tiers.
Example cost estimates
| Rows | Approx. event cost* |
|---|---|
| 100 | ~$0.155 |
| 1,000 | ~$1.505 |
| 10,000 | ~$15.005 |
*Assumes one Actor start plus $0.0015 per Dataset item. Exact start billing can scale with allocated memory (one start event per GB, minimum one). This Actor defaults to 512 MB, so a typical run is one start event.
This price change is scheduled for 2026-10-03 14:14 UTC (22:14 CST). Until then, the Store pricing panel is the live bill.
Local tests
python -m venv .venvsource .venv/bin/activatepip install -r requirements.txt pytestpytest -q
Why use this Actor
This Actor is focused on research, not just bulk scraping. It separates discovery, detail enrichment, and transcript extraction so you can control speed and dataset size.
Use it when you need structured YouTube data for market research, creator research, competitor monitoring, content strategy, or LLM-ready transcript workflows without maintaining your own YouTube scraping stack.
Operational hardening
This Actor emits structured progress logs so long runs are easier to diagnose from Apify logs and Insights:
progress_event=run_input_readyafter the input is normalized.progress_event=source_start/source_done/source_errorfor search, channel, and video sources.progress_event=detail_enrich_start/detail_enrich_donefor optional video detail enrichment.progress_event=transcript_start/transcript_donefor optional transcript extraction.progress_event=row_push_start/row_push_donefor dataset writes and billing-event boundaries.progress_event=run_summary_readybeforeRUN_SUMMARYis written.
HTTP requests use curl_cffi Chrome impersonation plus coherent browser headers, consent cookies, InnerTube client context, and YouTube-specific JSON headers to reduce obvious datacenter/client-fingerprint mismatches while keeping the Actor lightweight and API-first.
Live-view web server OpenAPI schema
This Actor includes a real Actor Standby / Live-view web server schema at:
.actor/openapi.json
The schema is published and validated through .actor/actor.json:
{"usesStandbyMode": true,"webServerSchema": "./openapi.json"}
Documented Standby endpoints:
GET /- service information and Apify readiness-probe responseGET /health- health checkGET /input-example- quick YouTube research request examplesGET /openapi.json- returns the OpenAPI document packaged with the ActorGET /searchandPOST /search- runs a bounded YouTube searchGET /channel- scans a YouTube channelGET /video- processes one exact video URL or IDPOST /run- runs the Actor with the full YouTube Research Scraper input contract
For low-cost validation, use POST /search with a small maxResults value and includeTranscript: false.
Related Actors
All 77 public Actors from [lentic_clockss]. Click a name to open the Store detail page.
Jobs & Freelance
- LinkedIn Jobs Scraper
- Bayt Jobs Scraper
- Fiverr Gigs Scraper
- Freelancer.com Scraper
- Glassdoor Scraper
- Himalayas Jobs Scraper
- Indeed Jobs Scraper
- Jobicy Remote Jobs Scraper
- RemoteOK Jobs Scraper
- SEEK Jobs Scraper
- Upwork Jobs Scraper
Real Estate
- Zillow & Zumper Scraper
- Realtor.com Scraper
- 99.co Scraper
- Realtor.com Agents Scraper
- Apartments.com Rental Scraper
- Bayut Scraper
- Craigslist Housing Scraper
- Daft.ie Scraper
- Dot Property Scraper
- FINN.no Scraper
- Funda Scraper
- Hepsiemlak Scraper
- Idealista Scraper
- Immobiliare.it Scraper
- ImmoScout24 Scraper
- Naver Land Scraper
- OpenSooq Scraper
- Otodom Scraper
- Property Finder Scraper
- PropertyGuru Scraper
- realestate.com.au Scraper
- Realtor.ca Scraper
- Rightmove Scraper
- SeLoger Scraper
- SUUMO Scraper
- Zillow Group Scraper
E-commerce
- Shopee Search Scraper
- E-commerce Scraper
- 1688 Global Product Search Scraper
- Allegro Scraper
- Amazon Search Scraper
- ASOS Product Scraper
- Cdiscount Product Scraper
- Costco Product Scraper
- Coupang Product Scraper
- Etsy Scraper
- Lazada Scraper
- MercadoLibre Scraper
- Mercari Japan Scraper
- Rakuten Japan Scraper
- SHEIN Product Scraper
- Target Product Scraper
- Temu Product Scraper
- Walmart Product Scraper
Travel & Stays
- Booking.com & Airbnb Scraper
- Agoda Scraper
- Airbnb Listings Scraper
- Booking.com Hotels Scraper
- Despegar Scraper
- Expedia Scraper
- Traveloka Scraper
- Travelstart Flights Scraper
- Trip.com Scraper
- TripAdvisor Scraper
Social & Content
Ads Intelligence
Local & Maps
General Tools
→ Browse the full profile: apify.com/lentic_clockss