YouTube Research Scraper - Videos, Channels & Search avatar

YouTube Research Scraper - Videos, Channels & Search

Pricing

from $1.50 / 1,000 results

Go to Apify Store
YouTube Research Scraper - Videos, Channels & Search

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 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

14

Total users

1

Monthly active users

14 hours ago

Last modified

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


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 four source modes. You can mix them in one run.

InputUse it whenResult source
searchQueriesYou want to discover videos by topic or keywordYouTube search results
channelUrlsYou want recent videos from one or more channelsChannel /videos pages with browse continuation, plus RSS fallback when needed
videoUrlsYou already know the exact videos to processDirect video metadata paths with fallback metadata extraction
includeTrendingYou want popular videos for a market (gl)Topic hubs (gaming, sports, news, podcasts, live, learning, fashion) — classic /feed/trending was removed by YouTube

Every Dataset row is one billed entity with rowType and stable string id. Videos, channels, comments, and replies are deduplicated across inputs and cursor units. maxResults is the maximum number of rows for each distinct query, channel URL, video URL, or trending input. The whole run is still bounded by your maximum total charge (and by the 200-row free-plan run cap).

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; every top-level comment and reply is emitted as its own rowType=comment row with the parent video's ID, title, URL, and channel fields copied onto it. Use maxComments: 0 / maxRepliesPerComment: 0 for source-exhaustive collection within the hard safety caps and the originating input's maxResults allowance. includeRelated emits each related video as its own rowType=video row and charges it against that same input.

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

E-commerce

Real Estate

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)

  1. Click "Try for Free" at the top of this page
  2. Add at least one input: searchQueries, channelUrls, videoUrls, and/or turn on includeTrending
  3. Keep scrapeDetails / includeTranscript / includeComments off for faster discovery; turn them on only for a shortlist
  4. Click Start — rows appear in the Dataset tab
  5. 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.


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 title and description
  • creator or company from channelName
  • popularity from viewCount
  • freshness from publishedText or publishedAt
  • video length from duration or durationSeconds

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:

  • publishedAt
  • category
  • description
  • viewCount

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

FieldTypeDefaultDescription
searchQueriesarray of strings["ai workflow automation"]YouTube search keywords. Each deduplicated query is an independent input with up to maxResults billed entity rows.
channelUrlsarray of stringsemptyEach deduplicated channel URL is an independent input. With channelTab: all, videos, shorts, and streams share that channel's allowance.
videoUrlsarray of stringsemptyEach deduplicated exact video URL or ID is an independent input. Its video, comments, replies, and related videos share that input's allowance.
maxResultsinteger70Maximum Dataset rows delivered and billed for each distinct query, channel URL, video URL, or trending input. The whole run also stops at your charge/free-tier cap.
scrapeDetailsbooleanfalseFetches richer metadata for each row. Use on shortlists or smaller runs.
includeTranscriptbooleanfalseAttempts transcript extraction for each video. Use on targeted runs because this is the heaviest mode.
includeEngagementbooleantrueBackfill like/subscriber/comment counts from /next.
includeStructurebooleantrueBackfill chapters/heatmap/topics/hashtags/rich description.
includePlaybackMetabooleantrueBackfill storyboards/playbackTracking/playerConfig from /player.
includeFormatsbooleanincludePlaybackMetaBackfill streamingData formats/adaptiveFormats (manifest URLs, itag, quality). Set false to drop the formats list; many popular videos return no stream URLs to anonymous clients.
includeCardsEndscreenbooleantrueBackfill in-video cards and end-screen recommendations.
transcriptLanguagestringenPreferred 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.
includeCommentsbooleanfalseFull comment pagination; top-level comments and replies become standalone billed rows. Prefer with videoUrls.
maxCommentsinteger0Max top-level comments; 0 = all (cap 20000).
includeCommentRepliesbooleantrueExpand reply threads with full pagination.
maxRepliesPerCommentinteger0Max replies per thread; 0 = all (cap 2000).
commentSortstringtoptop or newest.
includeRelatedbooleanfalseAttach related/recommended videos per watch page.
maxRelatedinteger20Cap related videos per source video.
includeTrendingbooleanfalseDiscover popular videos via topic hubs for gl.
trendingMaxResultsintegermin(maxResults, 200)Optional smaller cap for topic-hub discovery.
gl / hlstringUS / enMarket / UI language for search, comments, and topic hubs.
includeUpdatedMetadatabooleanfalseRe-check viewCount/likeCount for each collected video with one light request each; fresh values are stored under updatedMetadata. No billed rows.
includeResolveHandlebooleanfalseResolve each channel URL/@handle to its channel ID; adds resolvedChannelId/resolvedCanonicalUrl to channel rows and diagnostics.
includeGuidebooleanfalseFetch the YouTube guide (topic/category navigation) once per run into run diagnostics. No billed rows.

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 billed YouTube entity:

  • rowType=video, id=videoId
  • rowType=channel, id=channelId
  • rowType=comment, id=commentId

Comments and replies carry the parent video fields. Related videos carry the seed video's ID, title, and URL. The Actor does not write helper rows for empty input. Large requests are split into units of at most 70 rows by the control plane, one source input at a time, and continue from a stable cursor without billing duplicate rowType + id pairs.

Core fields

FieldTypeDescription
recordVersionstringOutput contract version, currently 1.0.
enrichmentLevelstringbase, detail, or transcript. Shows how far the row was enriched.
videoIdstringYouTube video ID.
titlestringVideo title.
urlstringCanonical YouTube watch URL.
channelNamestringChannel or author name when available.
channelIdstringYouTube channel ID when available.
channelUrlstringChannel URL when available.
viewCountintegerView count when available. May be 0 when the source does not expose it.
durationstringHuman-readable duration from listing pages when available.
durationSecondsintegerDuration in seconds when available.
publishedTextstringRelative publish text from listing pages, such as 2 weeks ago, when available.
publishedAtstringPublish date when available. Detail mode can improve this field.
descriptionstringSearch snippet, RSS description, or fuller video description depending on source and enrichment.
thumbnailUrlstringVideo thumbnail URL.
categorystringVideo category when detail metadata is available.
isLivebooleanWhether the source marks the video as live content.
sourcestringSource path used for the row: search, channel, or detail.
scrapedAtstringISO 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).

FieldTypeDescription
likeCountintegerVideo like count from the engagement panel.
likeStatusstringLike button state (LIKE/INDIFFERENT) when present.
viewCountExactintegerExact view count from the viewCount factoid (more precise than the rounded label).
commentCountExactintegerExact comment count from commentsHeaderRenderer when exposed.
subscriberCountintegerChannel subscriber count parsed to integer.
subscriberCountTextstringRaw subscriber label, e.g. 4.54M subscribers.
chaptersarrayVideo chapters: [{title, startMs, thumbnailUrl}].
heatmaparrayRetention heatmap markers: [{startMs, durationMs, intensity}] (100 points when present).
topicsarraySuperTitleLink topic chips on the watch page.
hashtagsarrayHashtag tiles.
descriptionRichstringAttributed/expandable description with inline links and timestamps.
structuredDescriptionbooleanWhether the structured-description panel was present.
cardsarrayIn-video info cards: [{teaser, startMs}].
endscreenarrayEnd-screen recommendations: [{videoId, title}].
transcriptSearchIndexarraySearchable transcript panel data when present.
formatsarrayFull streamingData format list: [{itag, mimeType, bitrate, fps, width, height, qualityLabel, audioChannels, audioQuality, audioSampleRate, url}].
storyboardsarrayStoryboard spec entries for thumbnail grids.
playbackTrackingobjectplayer.playbackTracking payload.
playerConfigobjectplayer.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.

FieldTypeDescription
transcriptarrayTimestamped caption segments. Each segment has text, start, and duration.
transcriptLanguagestringLanguage code of the transcript actually returned.
transcriptTextstringFull 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.

EndpointMethodUse
/GETReadiness check
/search?query=python%20automation&maxResults=10GETSearch videos
/channel?url=https://www.youtube.com/@freecodecamp&maxResults=10GETList recent channel videos
/video?url=XVv6mJpFOb0GETFetch one direct video
/runPOSTRun 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.
  • includeTranscript can still return a valid video row without transcript fields.
  • Search and channel rows may have lighter metadata than direct detail rows.
  • maxResults applies independently to each deduplicated query, channel URL, video URL, or trending input. All row types produced by one source share that source's allowance.
  • The total run can be smaller than maxResults × input count when the user's maximum total charge or the free-plan 200-row run cap is reached.
  • 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 videoUrls for 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).

EventPrice
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,000per 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

RowsApprox. 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 .venv
source .venv/bin/activate
pip install -r requirements.txt pytest
pytest -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_ready after the input is normalized.
  • progress_event=source_start / source_done / source_error for search, channel, and video sources.
  • progress_event=detail_enrich_start / detail_enrich_done for optional video detail enrichment.
  • progress_event=transcript_start / transcript_done for optional transcript extraction.
  • progress_event=row_push_start / row_push_done for dataset writes and billing-event boundaries.
  • progress_event=run_summary_ready before RUN_SUMMARY is 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 response
  • GET /health - health check
  • GET /input-example - quick YouTube research request examples
  • GET /openapi.json - returns the OpenAPI document packaged with the Actor
  • GET /search and POST /search - runs a bounded YouTube search
  • GET /channel - scans a YouTube channel
  • GET /video - processes one exact video URL or ID
  • POST /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.


All 77 public Actors from [lentic_clockss]. Click a name to open the Store detail page.

Jobs & Freelance

Real Estate

E-commerce

Travel & Stays

Social & Content

Ads Intelligence

Local & Maps

General Tools

→ Browse the full profile: apify.com/lentic_clockss