Skip to content

September 23, 2026 · 13 min read

YouTube Search Scraper: Up to 1,000 Free Results a Month (2026)

By Crawlerbros Engineering Team

Each video record carries 19 fields, including view counts, durations, and channel identifiers, without requiring cookies or an account. Apify's free plan includes $5.00 of monthly usage, covering up to 1,000 results of this Actor at $0.005 per result. The scraper supports search filters across upload date, content type, duration, and regional markets. It is built for analysts, researchers, and developers who need structured search output, and not for anyone who requires authenticated user actions or private video data.

Try it before you read further. Apify's free plan includes $5.00 of usage every month with no credit card, enough for up to 1,000 results at $0.005 each before platform usage. Open YouTube Search Scraper on Apify and run the prefilled example.

How reliable is YouTube Search Scraper in production?

Across the last 30 days of public runs on the Apify platform, YouTube Search Scraper recorded 134 runs with the following outcomes.

Outcome Runs Share
Succeeded 106 79.1%
Failed 27 20.1%
Aborted by the user 1 0.7%
Timed out 0 0.0%
Total 134 100.0%

When scheduling automated runs, expect about 20 runs in a hundred to fail or time out, roughly one run in 5. Build robust retry mechanisms and alerting around your execution pipeline to catch these interruptions early. Account for the fact that one run in 5 requires intervention or subsequent re-runs to capture complete datasets.

What does it cost to run YouTube Search Scraper?

Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.

Apify plan Per result Per 1,000 results
FREE $0.005 $5.00
BRONZE $0.00433 $4.33
SILVER $0.00367 $3.67
GOLD $0.003 $3.00
PLATINUM $0.003 $3.00
DIAMOND $0.003 $3.00

Worked example: collecting 10,000 results costs $50.00 in result charges before run-start fees and platform usage. With 20.1% of runs failing or timing out in the last 30 days, budget for re-running a portion of those batches rather than assuming every run completes.

The primary cost driver is the searchQueries control combined with maxResults, which determines how many total items are written to the dataset. Result charges apply only to items written to the dataset, while the run-start fee is charged every time a run starts. The cheapest way to test this Actor is to run the default configuration, which caps maxResults at 20 and costs at most $0.10 in result charges.

How do you run YouTube Search Scraper from the API?

The schema marks 1 of its 8 controls as required: searchQueries. Every value in the payload below comes from the published schema's own prefills, which means you can paste it, swap the token, and get a real result.

Call the synchronous endpoint to start a run and receive dataset items in one request:

curl -X POST "https://api.apify.com/v2/acts/crawlerbros~youtube-search-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["apify web scraping","python tutorial"],"maxResults":20,"sortBy":"relevance","uploadDate":"","type":"","duration":"","features":[],"market":"US"}'

The same run from Python, using the official client:

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run_input = {
  "searchQueries": [
    "apify web scraping",
    "python tutorial"
  ],
  "maxResults": 20,
  "sortBy": "relevance",
  "uploadDate": "",
  "type": "",
  "duration": "",
  "features": [],
  "market": "US"
}

run = client.actor("crawlerbros~youtube-search-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

And from Node.js:

import { ApifyClient } from 'apify-client'

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })

const input = {
  "searchQueries": [
    "apify web scraping",
    "python tutorial"
  ],
  "maxResults": 20,
  "sortBy": "relevance",
  "uploadDate": "",
  "type": "",
  "duration": "",
  "features": [],
  "market": "US"
}

const run = await client.actor('crawlerbros~youtube-search-scraper').call(input)
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)

That endpoint blocks until the run completes. Fine while you are testing a handful of records, risky once a run takes minutes: a dropped connection loses the response even though the run itself finished. Switch to an asynchronous start with polling or a webhook before you schedule anything.

Which YouTube Search Scraper inputs matter, and which can you skip?

The searchQueries control is the only required input and accepts a list of search terms. Leave optional filters such as duration, uploadDate, and features at their defaults on your first run to verify baseline data retrieval.

  • searchQueries (array): List of YouTube search queries. Each query will be searched separately and results combined in the output.
  • maxResults (integer): Maximum number of results to return per search query. YouTube typically returns ~20 results per page. Default: 20.
  • sortBy (string): How to sort search results. Default: "relevance".
  • uploadDate (string): Filter results by upload date. Leave empty for no date filter. Default: "".
  • type (string): Filter by content type. Leave empty to include all types. Default: "".
  • duration (string): Filter videos by duration. Leave empty for any duration. Default: "".
  • features (array): Filter by video features. Select multiple or leave empty for no feature filter. Default: [].
  • market (string): Country/region for localized results (sets gl and hl URL parameters). Default: "US".

Fixed-choice controls: sortBy accepts relevance, upload_date (Upload Date), view_count (View Count), rating; uploadDate accepts (Any time), `last_hour` (Last hour), `today`, `this_week` (This week), `this_month` (This month), `this_year` (This year); `type` accepts (All), video, channel, playlist, short (under 4 min / Shorts); duration accepts `` (Any duration), short (Under 4 minutes), medium (4-20 minutes), long (Over 20 minutes); market accepts 31 values (default US), including US (United States), GB (United Kingdom), CA (Canada), AU (Australia).

What does YouTube Search Scraper return?

Returned records are structured into separate groups for video metadata, channel profiles, and playlists, making them suitable for keyword tracking and market research. They do not contain comments, transcripts, or private account metrics.

Video results

  • videoId: "dQw4w9WgXcQ"
  • title: "Never Gonna Give You Up"
  • url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  • description: "The official video for..."
  • channelName: "Rick Astley"
  • channelUrl: "https://www.youtube.com/@RickAstley"
  • channelId: "UCuAXFkgsw1L7..."
  • viewCount: 1500000000
  • viewCountText: "1.5B views"
  • publishedTimeText: "15 years ago"
  • duration: "3:33"
  • durationSeconds: 213
  • thumbnails: Array of {url, width, height}
  • richThumbnailUrl: Animated preview URL (or null)
  • badges: ["CC", "4K"]
  • isLive: false
  • estimatedResults: 1234567
  • searchQuery: "web scraping tutorial"
  • scrapedAt: "2026-02-10T12:00:00+00:00"

Channel results

  • channelId: "UCxxxxxx"
  • channelName: "Python Programmer"
  • channelUrl: "https://www.youtube.com/@gilesmcmullen"
  • handle: "@gilesmcmullen"
  • description: "Hi I'm Giles..."
  • subscriberCount: 782000
  • subscriberCountText: "782K subscribers"
  • thumbnails: Array of {url, width, height}
  • channelThumbnailUrl: Single highest-res channel avatar URL
  • verified: true

Playlist results

  • playlistId: "PLxxxxxxx"
  • title: "Python Full Course"
  • url: "https://www.youtube.com/playlist?list=PLxxxxxxx"
  • channelName: "CodeWithHarry"
  • ownerName: "CodeWithHarry" (alias for channelName)
  • channelUrl: "https://www.youtube.com/@CodeWithHarry"
  • channelId: "UCxxxxxx"
  • firstVideoId: "dQw4w9WgXcQ" (first video in the playlist)
  • videoCount: 100
  • videoCountText: "100 lessons"
  • thumbnails: Array of {url, width, height}

These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.

How do you build the workflow end to end?

Open YouTube Search Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.

  1. Enter a term into searchQueries and leave maxResults at 20 for an initial test run.
  2. Inspect the resulting dataset to verify that videoId, title, and channelName fields are populated.
  3. Adjust sortBy to view_count or upload_date to target specific content rankings.
  4. Set uploadDate or duration filters to narrow down the retrieved result set.
  5. Configure the market control to retrieve region-specific results when testing international queries.
  6. Add multiple search terms to searchQueries once the single-query output is verified.

How do you apply it? Three worked playbooks

These are YouTube Search Scraper's own documented use cases, each worked through as an operating pattern rather than a description.

Use case 1: Market research

Outcome: Find top-performing videos in any niche by view count or upload date

Configure: Set searchQueries to target niche keywords, set sortBy to view_count, and set uploadDate to this_year.

Working method: Run the query with the sort order set to view_count, inspect the highest view counts returned in the dataset, and then toggle the sort order to upload_date to identify recent breakout content.

Deliverable: A structured JSON dataset containing video metadata, view counts, and publication dates for top-performing niche content.

Stop condition: Zero records returned or repeated timeout errors during dataset generation.

Use case 2: SEO analysis

Outcome: Track which channels rank for specific keywords

Configure: Populate searchQueries with target keyword phrases, set sortBy to relevance, and set type to channel.

Working method: Execute the query restricting results to channel type, compare ranking channels against target keyword lists, and verify subscriber counts in the returned channel records.

Deliverable: A list of channel metadata records including handles, subscriber counts, and verified status for ranking creators.

Stop condition: Channel results return null subscriber counts or mismatch the requested keyword.

Use case 3: Influencer discovery

Outcome: Use channel search to find YouTubers in any niche

Configure: Set searchQueries to niche categories, set type to channel, and configure market to the target region.

Working method: Run the query across regional markets, review the returned channel profiles for subscriber thresholds, and cross-reference channel URLs for outreach planning.

Deliverable: A compiled dataset of channel profiles, descriptions, and subscriber statistics for niche influencers.

Stop condition: Results return empty channel arrays or fail to match regional filters.

What breaks, and how do you design around it?

  • YouTube returns approximately 20 results per page. For larger result counts, the scraper automatically paginates.
  • Some filters may return fewer results than requested if YouTube doesn't have enough matching content.
  • No authentication or cookies are required - the scraper works with publicly available search results only.

YouTube returns approximately 20 results per page, so pagination runs automatically for larger result counts. If filters return fewer results than requested, narrow down query parameters or broaden category selections.

When should you not use YouTube Search Scraper?

Do not use this Actor if you need deep comment trees or video transcripts, which are handled by dedicated tools. If you require full channel comment extraction, use YouTube Comment Scraper instead. If you need complete historical video catalogs from a specific creator rather than search rankings, use YouTube Channel Scraper. When your primary requirement is downloading media files rather than text metadata, use YouTube Video Downloader.

What should you check before trusting the output?

  • Verify that video results contain non-null viewCount and viewCountText values before processing downstream metrics.
  • Check that channel records return valid handle and subscriberCount values.
  • Ensure playlist records include a non-empty firstVideoId and correct videoCount.
  • Stop scheduled runs if the dataset returns empty records or missing title fields for consecutive items.
  • Monitor dataset output volume to ensure pagination matches expected query counts.

None of this proves a record is correct. It gives a scheduled YouTube Search Scraper run defined points where it should stop instead of quietly passing bad data downstream.

Frequently asked questions

How does the pricing work for results and run starts?

Each result costs $0.005, which equals $5.00 per 1,000 results. Per-result charges apply only to results written to the dataset. Additionally, a run-start fee is charged every time a run starts, regardless of whether results are returned. Apify's free plan includes $5.00 of monthly usage with no credit card required, covering up to 1,000 results before run-start fees.

What is the expected success rate for automated runs?

Telemetry over the last 30 days shows 134 runs, with 106 succeeding, 27 failing, 1 aborted by users, and 0 timing out. This results in a 79.1% success rate and a 20.1% failure or timeout rate, meaning about 20 runs in a hundred fail or time out, or roughly one run in 5.

Can I scrape search results without a YouTube account or cookies?

Yes. The scraper operates entirely without cookies or a YouTube account by accessing publicly available search results. It supports all standard search filters including sort order, upload date, and content type without requiring user authentication.

How many results can I retrieve per query?

You can configure maxResults up to 1,000 per search query. YouTube typically returns around 20 results per page, and the scraper automatically handles pagination to retrieve larger requested volumes up to your specified cap.

What content types can the scraper return in the dataset?

The scraper returns structured records divided into three groups: video results containing 19 fields, channel results containing 10 fields, and playlist results containing 11 fields. You can filter the content type using the result type control.

Where to go next

When you are ready to run it, open YouTube Search Scraper on Apify; the free plan covers up to 1,000 results a month.

Start with the YouTube Search Scraper Actor page for the current input schema, pricing tier, and run history.

It is part of the YouTube Scraping Suite, which puts every related Actor on one page with its price and run history.

If you are comparing approaches rather than committing to one Actor, these category pages list every option we publish:

Readers running YouTube Search Scraper commonly pair it with:

Related guides:

Resources

  • Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-23.

  • Actor last updated by its maintainers on 2026-06-22.

  • Run outcome figures cover the 30 day public window ending 2026-09-23.

  • YouTube Search Scraper on Apify

● Featured actors

Youtube Search Scraper

Scrape YouTube search results without cookies. Extracts video metadata (title, views, duration, channel info), channel profiles, and playlists. Supports all YouTube search filters (sort, upload date, type, duration, features).

Run on Apify ↗