YouTube Video Scraper [FAST] | Search & Channel Videos
Pricing
from $5.00 / 1,000 results
YouTube Video Scraper [FAST] | Search & Channel Videos
Search YouTube videos by keyword or scrape channel uploads. Get views, dates, duration, thumbnails, and optional descriptions, likes, comment counts, and tags. Multi-keyword search, title filters, and resumable cursors. Pay per delivered video—no video-result charge for failed results.
Pricing
from $5.00 / 1,000 results
Rating
5.0
(5)
Developer
Apizy
Maintained by CommunityActor stats
7
Bookmarked
16
Total users
4
Monthly active users
2 days ago
Last modified
Categories
Features
Share
YouTube Video Scraper [FAST] | Keyword Search & Channel Videos
Find YouTube videos by keyword or turn a public channel into a structured video dataset. Collect titles, views, publish dates, durations, thumbnails, and channel information. Search multiple keywords in one run, filter out irrelevant titles, continue with a cursor, and optionally add video descriptions, likes, comments counts, tags, and categories.
Built for content research, competitor analysis, creator discovery, and automated monitoring. Pay per delivered video: repeated videos are saved once per run, and failed or filtered-out videos have no video-result charge. See Pricing for the current rate.
What does YouTube Video Scraper do?
| Mode | What you provide | What you get |
|---|---|---|
| Search videos | One or more keywords | Videos from across YouTube, with each matching keyword and its position |
| Channel videos | One public channel URL | Videos from that channel's Videos tab, with channel information in the run summary |
Both modes return basic video metadata by default. Enable Include video details to fetch additional public metadata for each unique result.
Search mode searches across YouTube. It does not search inside the Channel URL. Only the input section for the selected mode is used. Channel-only fields are ignored in Search mode; search-only fields are ignored in Channel mode.
What can you use it for?
- Research competitors: Compare video topics, formats, views, durations, and publishing cadence across channels.
- Discover content ideas: Find videos around a niche, product, or question and study which titles and formats attract views.
- Find creators for partnerships: Search for videos about your category, then collect the channels behind them for further research.
- Monitor brand and product mentions: Search titles and video metadata for your brand, product, or competitors. This is metadata search, not a search through every video's spoken transcript.
- Research before building an app: Find product walkthroughs, comparisons, and tutorials for ideas such as a habit tracker or calorie counter.
- Give AI tools useful research context: Feed structured titles, links, descriptions, and performance signals into a research assistant or product-planning workflow.
- Track new uploads: Continue a channel export with a cursor, or repeat searches on a schedule and compare video IDs in your own database.
- Automate reporting: Export JSON, CSV, or Excel, or connect results to Make, n8n, Zapier, a spreadsheet, or a dashboard.
Ready-to-run examples
- Find YouTube influencers for product reviews and sponsorships
- Find YouTube reviews comparing your product with competitors
- Research competitor YouTube videos before planning your content
- Monitor new YouTube reviews and mentions of your brand
- Analyze competitor YouTube upload frequency and posting schedule
How to use
- Choose Search videos or Channel videos.
- Enter keywords in the Search section or a channel URL in the Channel section. Leave the other section empty.
- Set your result limit. Add title filters or enable Include video details if needed.
- Click Run. Open the default Dataset for video rows.
- Read Full output for status, counts, issues, and continuation cursors. Download the Dataset in your preferred format.
The form groups Channel and Search inputs into separate collapsible sections. These sections do not automatically disappear when the mode changes; their labels identify which fields apply.
Which inputs should you use?
| Goal | Mode | Main fields |
|---|---|---|
| Find videos about one topic | search | searchKeywords, maxResults |
| Compare related keywords | search | Several searchKeywords; maxResults applies to each keyword |
| Find recent videos | search | uploadPeriod: today, week, month, or year |
| Prioritize popular videos | search | sortBy: "popularity" |
| Keep relevant titles | Either | titleInclude, titleMatch, titleExclude |
| Add descriptions and engagement metadata | Either | includeVideoDetails: true |
| Export one channel's uploads | channel | channelUrl, maxVideos |
| Continue one keyword or channel | Same as previous run | cursor |
| Continue several keywords | search | searchCursors, with one keyword/cursor pair per continuing keyword |
Input examples
Search for videos about an app category
{"mode": "search","searchKeywords": ["habit tracker app"],"maxResults": 20}
This searches across YouTube. No channel URL is needed. The new-form example contains only mode and searchKeywords; omitting the limit uses 20 results per keyword. Details are off, sorting is relevance, and the search context is US/English unless you choose otherwise.
Research multiple keywords in one run
{"mode": "search","searchKeywords": ["habit tracker app", "best habit tracker app"],"maxResults": 35,"country": "US","language": "en"}
This requests up to 35 matching videos per keyword, not 35 total. If a video appears in both collected result sets, it is saved once with both entries in searchMatches. Therefore, two keywords requesting 35 results each can return fewer than 70 unique rows.
Find relevant titles and prioritize popularity
{"mode": "search","searchKeywords": ["habit tracker app review"],"maxResults": 20,"sortBy": "popularity","titleInclude": ["habit", "app"],"titleMatch": "all","titleExclude": ["Notion"]}
Each saved title must contain both habit and app, and must not contain Notion. Matching is case-insensitive and uses literal substrings, not regex. Use titleMatch: "any" to accept at least one included phrase. Exclusions always take precedence. Filtered videos are skipped before saving and do not consume the requested matching-result count.
Find recent, short videos with additional details
{"mode": "search","searchKeywords": ["calorie tracker app"],"maxResults": 10,"uploadPeriod": "year","duration": "under3","includeVideoDetails": true}
This applies YouTube's upload-period and duration filters, then fetches details for each unique video. Some fields may remain unavailable. If enrichment fails, the basic video result remains available with detailStatus: "unavailable" and an explanation in OUTPUT.issues.
Collect videos from a channel
{"mode": "channel","channelUrl": "https://www.youtube.com/@mkbhd","maxVideos": "100","includeVideoDetails": false}
Channel mode reads the channel's Videos tab. Supported URL formats include /@handle, /channel/ID, /c/name, and /user/name. maxVideos is a string dropdown; maxResults in Search mode is a number.
Existing integrations that send channelUrl without mode continue to use Channel mode. For new integrations, provide mode explicitly.
Continue a single keyword
{"mode": "search","searchKeywords": ["habit tracker app"],"maxResults": 20,"cursor": "PASTE_THIS_KEYWORDS_NEXT_CURSOR"}
Copy nextCursor from that keyword's entry in OUTPUT.summary.pagination. Keep the same keyword, country, language, sort, upload period, duration, and title filters as the previous run. The example assumes the previous run used the default search settings.
Continue several keywords
{"mode": "search","searchKeywords": ["habit tracker app", "best habit tracker app"],"maxResults": 20,"searchCursors": [{"keyword": "habit tracker app","cursor": "PASTE_FIRST_KEYWORDS_NEXT_CURSOR"},{"keyword": "best habit tracker app","cursor": "PASTE_SECOND_KEYWORDS_NEXT_CURSOR"}]}
Each keyword has its own continuation. A keyword with no supplied cursor starts a fresh search. Remove exhausted keywords from searchKeywords when you only want to continue the others. Do not combine cursor and searchCursors.
Continue a channel export
{"mode": "channel","channelUrl": "https://www.youtube.com/@mkbhd","maxVideos": "100","cursor": "PASTE_CHANNEL_NEXT_CURSOR"}
Copy the value from OUTPUT.summary.pagination.nextCursor and use the same channel. You can choose a different result limit for the next run.
Input fields
Defaults below describe runtime behavior when a field is omitted. They do not all appear as extra fields in your submitted JSON.
| Field | Applies to | Default | Description |
|---|---|---|---|
mode | Both | Inferred if omitted | search or channel. New-form example selects Search. Existing channel-only inputs remain supported. |
searchKeywords | Search | None | Non-empty array of phrases. Repeated identical phrases are searched once. |
maxResults | Search | 20 | Integer from 1–1,000, per keyword. Counts matching videos before cross-keyword deduplication. |
sortBy | Search | relevance | relevance or popularity; uses YouTube's result order. |
uploadPeriod | Search | any | any, today, week, month, or year. |
duration | Search | any | any, under3, between3and20, or over20. |
country | Search | US | Search context, for example US, GB, AU, or SG; not a guarantee of creator location. |
language | Search | en | Interface/relevance context, for example en, fr, or de; does not translate content or guarantee spoken language. |
channelUrl | Channel | None | Public channel URL; required in Channel mode and ignored in Search mode. |
maxVideos | Channel | "20" | "10", "20", "50", "100", "300", "500", or "1000". |
titleInclude | Both | None | Literal phrases that must appear in the title, according to titleMatch. |
titleMatch | Both | any | any or all; applies to titleInclude. |
titleExclude | Both | None | Skip titles containing any listed phrase. |
includeVideoDetails | Both | false | Fetch additional public metadata for each unique result. |
cursor | Channel or one keyword | None | Opaque continuation from the previous output. |
searchCursors | Search | None | Array of objects with keyword and cursor, for multi-keyword continuation. |
Result limits are ceilings, not guaranteed totals. YouTube availability, filters, duplicate videos, source errors, and pagination safety limits can reduce the delivered count.
Basic results vs. video details
| Data | Basic result | With details enabled |
|---|---|---|
| ID, title, URL, thumbnail | Yes, when supplied by the listing | Retained; thumbnail may be enriched |
| Channel ID, name, URL | When available | May be enriched |
| Views | Parsed listing count; can be rounded | Exact source value when available; otherwise retains the basic value |
| Publish date | Estimated from relative listing text when needed | Exact source date when available; otherwise retains the estimate |
| Duration | Listing duration when available | Detail duration when available; otherwise retains the listing duration |
| Description | Search snippet when available | Full public description when available |
| Likes and comment count | Not included | When available |
| Tags, category, upload date, availability flags | Not included | When available; missing fields remain null or empty |
| Keyword matches and positions | Search mode | Retained |
Enrichment requires additional requests and can take longer. Enabling details does not guarantee every field. YouTube can expose a readable video listing while withholding player metadata. This can leave category, duration, likes, or comment count unavailable even when other details are returned.
detailStatus appears only when details were requested:
| Value | Meaning |
|---|---|
included | The detail lookup succeeded and its tracked metadata fields were available. |
partial | The lookup succeeded, but some tracked fields were unavailable. Other detail fields can still be null. |
unavailable | Enrichment failed or the detail page was unavailable. The basic result is retained. |
Tags are returned only when the source provides video tags; generic YouTube page keywords are not substituted. Live or availability flags remain null when their values are unknown.
Output
- Default Dataset: one row per unique delivered video in that run.
- Key-Value Store →
OUTPUT: summary, results, and operationalissues. - Pagination Dataset: one row for the channel, or one row per search keyword.
Video rows contain video data, not error-only records. Check OUTPUT.issues for missing detail fields and source problems.
Example video row
Illustrative basic search output; counts and dates change over time:
{"videoId": "W6AB-dxnAkA","title": "8 Habit Tracking Apps That Actually Work","videoUrl": "https://www.youtube.com/watch?v=W6AB-dxnAkA","publishedAt": "2025-11-06","publishedAtRaw": "1 year ago","publishedAtIsApproximate": true,"duration": "9:38","durationSeconds": 578,"durationMs": 578000,"views": 76177,"viewsRaw": "76,177 views","viewsIsApproximate": false,"thumbnailUrl": "https://i.ytimg.com/vi/W6AB-dxnAkA/hqdefault.jpg","channel": {"channelId": "UCYyaQsm2HyneP9CsIOdihBw","name": "Tool Finder","url": "https://www.youtube.com/@toolfinderhq"},"searchMatches": [{ "keyword": "habit tracker app", "position": 1 },{ "keyword": "best habit tracker app", "position": 1 }],"insight": {"ageInDays": 365,"viewsPerDay": 209,"viewsPerSecond": 131.79,"estimatedWatchHours": 12230.64,"durationCategory": "5–15 min"}}
Video fields
| Field | Meaning |
|---|---|
videoId, title, videoUrl | Video identity and direct link. |
thumbnailUrl | Available thumbnail URL. |
channel | Channel identity: channelId, name, and url; values can be unavailable. |
views, viewsRaw | Normalized view count and original listing text. |
viewsIsApproximate | Whether the normalized count came from a rounded listing value such as 1.2K. |
publishedAt, publishedAtRaw | Normalized date and original listing text. |
publishedAtIsApproximate | Whether the normalized date was estimated from relative text. |
duration, durationSeconds, durationMs | Duration as text, seconds, and milliseconds. |
descriptionSnippet | Search-result description snippet, when provided. |
searchMatches | Collected keyword matches with the video's position for each keyword; Search mode only. |
detailStatus | Detail lookup outcome, when requested. |
description, likes, commentCount | Additional metadata from a successful detail lookup, when available. |
uploadedAt, category, keywords | Additional upload metadata; tags can be an empty array. |
isLive, isUnlisted, isFamilySafe | Source-provided flags; unknown values remain null. |
insight | Derived metrics described below. |
Non-English listing counts and relative dates are preserved as raw text. The Actor does not apply English parsing rules to them; normalized values may be null. A successful detail lookup can supply language-independent numeric counts and exact dates.
Derived insights
Field inside insight | Meaning |
|---|---|
ageInDays | Days since the normalized publish date; estimated when that date is approximate. |
viewsPerDay | Lifetime views divided by video age, with a minimum divisor of one day. Not recent daily growth. |
viewsPerSecond | Views divided by video duration in seconds. Not a playback or retention measurement. |
estimatedWatchHours | Views × full duration ÷ 3,600. Assumes every view watched the whole video; not actual watch time. |
durationCategory | < 1 min, 1–5 min, 5–15 min, 15–30 min, or 30+ min. |
These metrics help compare collected videos. They do not provide YouTube Analytics, keyword search volume, revenue estimates, or a guaranteed viral-opportunity score.
Pagination and continuation
In Channel mode, OUTPUT.summary.pagination is an object. In Search mode, it is an array with one entry per keyword:
[{"keyword": "habit tracker app","currentPage": 1,"pageSize": 20,"totalPages": null,"hasNextPage": true,"nextCursor": "OPAQUE_CURSOR_FROM_THIS_RUN"}]
| Field | Meaning |
|---|---|
keyword | Search phrase; absent for Channel pagination. |
currentPage | Export batch number, beginning at 1. One batch can fetch several source pages. |
pageSize | Requested matching-video limit for this keyword or channel. |
totalPages | Channel-based estimate when possible; null for Search. |
hasNextPage | Whether a buffered result or source continuation remains. Not a promise that more matching videos exist. |
nextCursor | Pass into the next run's cursor or corresponding searchCursors entry. |
retryRequired | Present for a failed keyword that needs another attempt. A null cursor here means restart that keyword. |
Search cursors expire after 24 hours, and YouTube may invalidate them earlier. Keep the same keyword and search settings when resuming; changing them requires starting a new search without the old cursor. The result limit and detail setting can change between runs. Treat cursors as opaque strings and do not edit them.
Deduplication is per run. Search results and channels change over time. A video can reappear in a later run, including when it was previously found under a different keyword. Deduplicate by videoId in your own database when maintaining a combined export or monitoring history.
Positions count supported organic video cards, excluding ads and unrelated shelves. They reflect the collected search session, not a fixed or universal YouTube ranking.
Run summary and troubleshooting
OUTPUT.summary includes mode, keywords, successCount, filteredCount, duplicateCount, pagesFetched, sourceErrors, detailSuccessCount, detailFailedCount, detailPartialCount, pagination, and timing. Channel runs also include available channel information. detailPartialCount is part of detailSuccessCount, not an additional set of videos.
| Status | Meaning |
|---|---|
completed | The available matching videos were delivered, up to the requested limit. Individual detail fields can still be missing. |
empty | No matching video rows were delivered; check filters and the source's available results. |
invalid_input | An input, channel URL, cursor, or limit is invalid. The run ends with an explanation rather than video error rows. |
partial | Available results were retained, but a source error, scan limit, spending limit, or failed enrichment prevented a complete response. |
failed | A technical failure prevented scraping or persistence, or all keyword searches failed. Check the log and any saved output. |
Why did I get fewer videos than requested?
- Different keywords found the same videos, so those matches share one Dataset row.
- YouTube ran out of available results before your limit.
- Your title filters excluded results. Check
filteredCount. - A source request failed after retries, or a pagination safety limit stopped collection. Check
issues,stopReason, and the cursor. - The run's spending limit stopped delivery.
Channel results are saved as pages arrive. Search results are collected across the requested keywords before delivery so all keyword matches can be merged into each row. One failed keyword does not discard successfully collected results from other keywords.
Temporary source failures are retried. If requests still fail, the Actor reports the problem rather than silently presenting an unknown or blocked page as an empty result. When a resumable continuation is available, it is returned in pagination. Collection is limited to 100 source pages per keyword or channel per run and also stops on repeated continuation tokens or too many pages without new video IDs.
Use successCount and Dataset rows to measure delivery. successRate does not measure completeness of optional metadata. The current totalCharged summary is a video-result estimate at the configured base rate, not a complete Apify invoice; consult the run's charge breakdown for actual billing.
Pricing
Result pricing scheduled for November 20, 2026:
| Apify discount tier | Videos / 1,000 | Optional details / 1,000 | Total with successful details / 1,000 |
|---|---|---|---|
| Free | $2.00 | $1.00 | $3.00 |
| Bronze | $2.00 | $1.00 | $3.00 |
| Silver | $2.00 | $1.00 | $3.00 |
| Gold | $1.30 | $1.00 | $2.30 |
The primary event is video-scraped, charged once per unique video saved in a run. video-detail-scraped adds $0.001 only when optional detail enrichment succeeds and the video row is saved. A successful enrichment can still have null optional fields. Failed enrichment has no detail-event charge; the basic saved video retains its video-result charge.
For example, on Free, 100 delivered videos cost $0.20 in video events; 100 successfully enriched videos add $0.10. If only 60 of those videos are enriched, the result-event total is $0.26. Filtered and undelivered results have no video-result charge. Deduplication is per run.
During Apify's notice period, the previous $0.005 video-result rate can remain applicable, without a separate detail-event surcharge. The Actor reads the pricing assigned to each run rather than assuming a tier or charging an unregistered event. Check the Pricing tab and run charge breakdown for the rate that applies to you. Enterprise pricing is arranged through Apify.
Standard Dataset-item, Actor Start, and applicable platform usage charges are separate. The prices above cover result events only.
Notes
- Public YouTube data only. No YouTube login or user-supplied YouTube Data API key is required. Retrieval uses HTTP requests, without launching a browser.
- Channel mode reads the Videos tab. There is no dedicated Shorts-only, live-only, playlist-search, or channel-search mode in this Actor.
- Search filters describe the results YouTube returns; they do not search the entire catalog exhaustively. Narrow keywords can still produce loosely related videos. Use title filters when needed.
- Country and language set search context, not guaranteed creator location or spoken language. They do not translate content.
- Counts, rankings, publication estimates, and availability are snapshots. YouTube can change its responses or apply rate limits.
- Missing fields remain null or empty rather than being invented. Public metadata cannot guarantee exact watch time, downloads, or earnings.
- This Actor returns metadata and derived insights. It does not download videos, retrieve full comment threads, or extract transcripts.
More Actors You Might Like
Built by the same team and backed by the same transparent pricing philosophy: no hidden attempts, no wasted credits, no charge for failed results.
| Actor | What it helps you collect |
|---|---|
| YouTube Video Detail Scraper | Public metadata for known video URLs and IDs, including available engagement fields. |
| YouTube Channel Scraper [FAST] | Channel profiles, subscribers, engagement, and available contact information. |
| YouTube Comment Scraper | Comment text, authors, likes, and reply metadata. |
| YouTube Transcript Scraper | Available video transcripts and timestamps. |
| Google Play Store Scraper | Android app search, charts, and app details for market research. |
| App Store Scraper | iOS app discovery, charts, and publisher information. |
Get in Touch
Have questions or need a custom scraping workflow? Email apizy.studio@gmail.com.