YouTube Search Scraper - Keyword to Video Rows, No Browser avatar

YouTube Search Scraper - Keyword to Video Rows, No Browser

Pricing

$0.50 / 1,000 video row delivereds

Go to Apify Store
YouTube Search Scraper - Keyword to Video Rows, No Browser

YouTube Search Scraper - Keyword to Video Rows, No Browser

Search YouTube by keyword and get one row per result: title, channel, views, duration, publish date, URL and the rank it held. HTTP only, no headless browser. Charged per row delivered.

Pricing

$0.50 / 1,000 video row delivereds

Rating

0.0

(0)

Developer

Lee Kung

Lee Kung

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

2

Monthly active users

21 days ago

Last modified

Categories

Share

YouTube Search Scraper - Ranked Video Rows, No Browser

Search YouTube by keyword and get the results as data: one row per video, with the rank it held for your query, title, channel, views, duration, thumbnail and URL. Give it one search term, a list of terms, or a pasted YouTube results URL. For SEO and content teams, researchers and AI agents who need to know which videos YouTube shows for a term, and in what order.

  • No browser. Plain HTTP; no headless browser is started.
  • Rank is a field on every row.
  • $0.50 per 1,000 video rows. A query that fails or finds nothing is reported in the dataset and costs nothing.
  • No YouTube API key, quota or account. You only need an Apify account.

What data you get

  • query - the search term the row came from
  • rank - its position in YouTube's results for that query (1 = first)
  • video_id and url - the YouTube video ID and its watch URL
  • title - the video title
  • channel, channel_id, channel_url - the publishing channel
  • view_count - views, as YouTube shows them in search
  • duration_seconds - length in seconds
  • published_at - ISO 8601 publish date when search results include one (often empty, see Limits)
  • live_status - e.g. is_live, is_upcoming; otherwise empty
  • thumbnail - a thumbnail image URL
  • description - the description snippet shown in search (often cut off with "...")
  • type (video) and status (ok)

Queries that fail or return nothing get their own row instead (type: "query").

Use cases

  • YouTube keyword research - see which videos and channels rank for a term, and at what position.
  • Rank tracking over time - run the same set of terms on a schedule and compare rank between runs.
  • Channel monitoring - check whether a channel appears for a set of terms, and where.
  • Content gap research - filter by views and duration to see what long-form or Shorts content exists on a topic.
  • Research corpus - search here, then pass the URLs to YouTube Transcript Scraper for the spoken text.

How to use it (quick start)

  1. Open YouTube Search Scraper in Apify Console.
  2. Enter your Search terms (one per line), Max results per query and any filters.
  3. Click Start. When the run finishes, open the Dataset tab and export as JSON, CSV or Excel.

For code and AI agents, see below.

Input

FieldWhat it doesDefault
queriesSearch terms (required). A pasted YouTube results URL also works; a leading search: is ignored.["cold plunge recovery"]
maxResultsPerQueryRows to request per term, 1 to 1000.20
minViewsDrop results below this view count.0 (off)
minDurationSecondsDrop results shorter than this. 61 excludes Shorts.0 (off)
maxDurationSecondsDrop results longer than this. 60 keeps only Shorts.0 (off)
skipLiveAndUpcomingDrop live streams, upcoming premieres and just-ended streams.false
countryTwo-letter country code passed to YouTube as a location hint, e.g. US, GB, DE. Not a guarantee of that country's ranking (see Limits).empty
languageInterface language hint, e.g. en, de, es. Titles come back translated where YouTube has a translation.empty
maxRetriesAttempts per query (1 to 8) before it is reported as failed.3
proxyConfigurationProxy settings.Apify residential proxy

A missing value never fails a filter: if YouTube did not report a result's views or duration, the row is kept.

Example: two terms, long-form only, no live streams

{
"queries": ["cold plunge recovery", "best budget espresso machine"],
"maxResultsPerQuery": 50,
"minDurationSeconds": 61,
"skipLiveAndUpcoming": true
}
{
"queries": ["https://www.youtube.com/results?search_query=standing+desk+review"],
"country": "GB",
"language": "en",
"minViews": 10000
}

Output

A real row from a default-input run (cold plunge recovery, 20 rows; run 1Pzamc6kZM96a626U, 2026-10-02 UTC), thumbnail URL shortened:

{
"query": "cold plunge recovery",
"rank": 1,
"video_id": "MS4jsI_TVCc",
"url": "https://www.youtube.com/watch?v=MS4jsI_TVCc",
"title": "The Science Behind Cold Plunges, Explained in Four Minutes",
"channel": "The Wall Street Journal",
"channel_id": "UCK7tptUDHh-RYDsdxO1-5QQ",
"channel_url": "https://www.youtube.com/channel/UCK7tptUDHh-RYDsdxO1-5QQ",
"view_count": 624696,
"duration_seconds": 248,
"published_at": null,
"live_status": null,
"thumbnail": "https://i.ytimg.com/vi/MS4jsI_TVCc/hq720.jpg?...",
"description": "Cold plunges are exalted for their health benefits, like increasing metabolism and reducing the risk for chronic conditions.",
"type": "video",
"status": "ok"
}

A failed query, or one with nothing left after your filters, looks like this (not charged):

{"type": "query", "query": "your term", "status": "error", "error": "the reason, up to 200 characters"}
{"type": "query", "query": "your term", "status": "no_results", "listed": 20}

listed is how many results YouTube returned before your filters.

FieldTypeNotes
ranknumberPosition in YouTube's list before your filters run, so filtered-out videos leave gaps (1, 2, 4...).
statusstringok for video rows; error or no_results for query rows.

A run summary (queries, rows delivered, filtered out, failed queries) is saved in the key-value store as SUMMARY.

Why "no browser" matters

This Actor never starts a headless browser. It asks YouTube for search results over HTTP and reads the response directly. That means:

  • No page to load or render, so a run never waits on a browser starting or a page finishing loading.
  • Each attempt uses an 8-second network timeout with no internal retries, so a stalled connection is dropped quickly and the query retried on a fresh proxy session, up to maxRetries attempts.

Reliability so far, measured on our own runs: 43 of 43 runs in the last 30 days succeeded (our account's run history, read 2026-10-02). These are our own test and monitoring runs, not customer runs.

Use it with AI agents (MCP)

Apify's hosted MCP server can expose this Actor as a tool to an MCP client. Server URL:

https://mcp.apify.com?tools=actors,docs,leekung125/youtube-search-scraper

Send your Apify token as Authorization: Bearer <YOUR_APIFY_TOKEN>. Example client config:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=actors,docs,leekung125/youtube-search-scraper",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}

Apify's MCP docs also describe a browser sign-in flow that works without pasting a token.

Example prompt: "Get the top 30 YouTube results for 'standing desk review', long-form only, and list the channels that appear more than once."

Use it from code

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("leekung125/youtube-search-scraper").call(run_input={
"queries": ["cold plunge recovery", "best budget espresso machine"],
"maxResultsPerQuery": 50,
})
rows = client.dataset(run.default_dataset_id).list_items().items

JavaScript (npm i apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('leekung125/youtube-search-scraper').call({
queries: ['cold plunge recovery'],
maxResultsPerQuery: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

cURL (run and get rows in one request):

curl -X POST "https://api.apify.com/v2/acts/leekung125~youtube-search-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries": ["cold plunge recovery"], "maxResultsPerQuery": 20}'

Schedules, webhooks and integrations (Make, Zapier, n8n, Google Sheets) work as they do for any Apify Actor.

Pricing

Pay-per-event, one event:

  • Video row delivered: $0.0005 per row ($0.50 per 1,000 rows)
Video rows deliveredArithmeticCost
1,0001,000 x $0.0005$0.50
10,00010,000 x $0.0005$5.00
100,000100,000 x $0.0005$50.00

What is never charged:

  • A query that fails after all its attempts (the error row is free).
  • A query with no results or with every result filtered out (the no_results row is free), and any result a filter drops.
  • Compute and platform usage, including the proxy: you pay only the per-row price above.

You pay for rows delivered, not for maxResultsPerQuery: asking for 1,000 and getting 300 costs $0.15.

Limits and honesty notes

  • Publish dates are often missing. Search results frequently carry no date: in the run cited above, published_at was empty on all 20 rows. Do not rely on this field for exact dates.
  • Description is a snippet from the results page, often cut off, not the full video description.
  • View count and duration can be empty for some results; filters keep those rows rather than guess.
  • Up to 1,000 rows per query. YouTube may return fewer than you ask for.
  • country and language are hints, not guarantees. language changes the language of titles where YouTube has a translation. country does not set the proxy's exit country, and how much it changes the ranking is up to YouTube: in a test on 2026-10-02, football highlights with country: GB still returned US NFL videos at ranks 1 and 2.
  • Ranks move between runs. Each run goes out through a different residential IP. Two identical runs of cold plunge recovery minutes apart on 2026-10-02 shared 8 of their top 10 videos, and 4 held the same rank. For rank tracking, compare positions over several runs rather than one run against the next.
  • Results are not de-duplicated across queries. A video ranking for two terms appears, and is charged, once per term.
  • On Apify the Actor always uses a proxy. If you switch the proxy off, it falls back to Apify residential proxy.
  • It does not download videos and does not fetch transcripts. For transcripts, chain it with the Actors below.
  • At least one search term is required. An empty queries list is refused before anything is searched or charged.

FAQ

Do I need a YouTube API key?

No. It does not use the YouTube Data API, so there is no key and no quota. You do need an Apify account.

It collects publicly visible search results. You are responsible for using the data lawfully and in line with YouTube's terms. Do not use it to resell personal data.

Can I export to CSV or Excel?

Yes. Export from the run's Dataset tab, or fetch the rows from the Apify API.

Can I run it on a schedule to track rankings?

Yes. Create a schedule in Apify Console with the same input, then compare rank per query between runs.

Can I use it from an AI agent or MCP?

Yes, through Apify's hosted MCP server; see the MCP section above.

Why did I get fewer rows than I asked for?

YouTube returned fewer results than maxResultsPerQuery, your filters removed some, or a result had no video ID and was skipped. SUMMARY shows how many were filtered out.

What happens when a search fails?

Each query gets up to maxRetries attempts, each on a fresh proxy session. If all fail, you get one status: "error" row with the reason, it is not charged, and the run moves on to your next query.

What is charged?

Only video rows with status: "ok", at $0.0005 each. Error and no-results rows are free.

ActorWhat it does
YouTube Transcript ScraperTranscripts for a list of YouTube videos.
YouTube Channel TranscriptsEvery video of a channel or playlist, with its transcript.
Google Play Reviews ScraperReviews of Android apps on Google Play.
App Store Reviews ScraperReviews of apps on the Apple App Store.
Google Trends ScraperGoogle Trends interest over time, regions and related queries.

Support

Open an issue on the Issues tab with the run ID and your input; we read every issue.