YouTube Search Results Scraper - Videos & Channels avatar

YouTube Search Results Scraper - Videos & Channels

Pricing

from $0.02 / 1,000 result extracteds

Go to Apify Store
YouTube Search Results Scraper - Videos & Channels

YouTube Search Results Scraper - Videos & Channels

Export public YouTube videos, Shorts, live results, channels, and playlists by keyword. Filter by type, date, duration, feature, country, and language; download ranks, metrics, metadata, thumbnails, and URLs via CSV, Excel, JSON, API, or MCP.

Pricing

from $0.02 / 1,000 result extracteds

Rating

0.0

(0)

Developer

Hanna Nosova

Hanna Nosova

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

6

Monthly active users

a day ago

Last modified

Share

YouTube Search Results Scraper

Export public YouTube videos, Shorts, live results, channels, and playlists by keyword. Apply native YouTube filters and country/language localization, then download ranked results with IDs, metrics, metadata, thumbnails, and source URLs.

Use it for YouTube SEO, creator discovery, content research, competitor monitoring, market mapping, and recurring search-rank snapshots. No YouTube login or API key is required.

Ready-to-run examples

What can it do?

  • Public videos, Shorts, live and upcoming video results
  • Channels and playlists
  • Result rank and source-query provenance
  • Video, channel, and playlist IDs and URLs
  • Channel names and public channel URLs
  • Visible publish time, duration, views, subscribers, and video counts
  • Numeric duration and count fields for sorting and analysis
  • Snippets, badges, and all available thumbnail URLs
  • Short, live, and upcoming classification
  • Search URL, continuation page, position on page, stable result key, and scrape timestamp

This Actor reads YouTube's public search surface. It does not open every video detail page, so it deliberately does not collect comments, transcripts, likes, exact publish timestamps, or complete channel catalogs.

Use cases

  • Track public YouTube rank snapshots for brand, product, and topic searches.
  • Find videos, Shorts, live streams, channels, and playlists for content research.
  • Discover creators and public channel metrics for outreach or market mapping.
  • Compare visible content formats, titles, publish windows, and view signals across markets.
  • Feed repeatable search exports into spreadsheets, dashboards, alerts, and research agents.

Input settings

SettingJSON fieldDescription
Search queriesqueriesOne to 50 keywords or phrases. Blank input fails before the start event is charged; duplicate queries run once.
Results per querymaxResultsPerQuerySave 1-500 unique matching rows per query.
Result typeresultTypeMixed results, videos (including Shorts/live), channels, or playlists.
SortsortByRelevance, rating, upload date, or view count.
Upload dateuploadDateAny time, hour, today, week, month, or year.
DurationdurationAny, under 4 minutes, 4-20 minutes, or over 20 minutes.
Video featurevideoFeatureAny, live, HD, subtitles/CC, or Creative Commons.
CountrycountryOptional two-letter localization code such as US, GB, PT, or DE.
LanguagelanguageOptional code such as en, pt, de, or en-GB.
Raw filter tokenspAdvanced token copied from a YouTube search URL. When set, it overrides the structured YouTube filters.
ProxyproxyConfigurationOptional Apify Proxy configuration. Retries use fresh sessions.
Reliability controlsretryCount, initialRetryDelayMillis, requestPacingMillis, runTimeSecsOptional retry, pacing, and safe-deadline tuning. Defaults suit most runs.

YouTube decides which filter combinations it supports. A raw sp token is kept for backward compatibility and advanced combinations that are not represented by the structured fields.

Example input

{
"queries": ["web scraping tutorial", "Apify automation"],
"maxResultsPerQuery": 25,
"resultType": "videos",
"sortBy": "uploadDate",
"uploadDate": "month",
"duration": "medium",
"country": "US",
"language": "en",
"proxyConfiguration": {
"useApifyProxy": true
}
}

Output fields

Each dataset item is one unique public search result. Ranks restart for every query after filtering and deduplication.

Field groupFieldsDescription
Search provenancequery, rank, searchUrl, page, positionOnPage, resultKey, scrapedAtWhere and when the unique row appeared.
IdentityresultType, title, url, videoId, channelId, playlistIdPublic result type, label, link, and identifiers.
ChannelchannelName, channelUrlVisible creator/channel attribution.
Time and countspublishedTimeText, durationText, durationSeconds, viewCountText, viewCount, subscriberCountText, subscriberCount, videoCountText, videoCountVisible text plus normalized numeric values when available.
Content signalsdescriptionSnippet, isShort, isLive, isUpcoming, badgesPublic search-card context and classifications.
ImagesthumbnailUrl, thumbnailUrlsBest and all visible thumbnail URLs.

Example output

{
"query": "web scraping tutorial",
"rank": 1,
"resultType": "video",
"title": "Web scraping tutorial",
"url": "https://www.youtube.com/watch?v=example",
"videoId": "example",
"channelId": "UCexample",
"playlistId": null,
"channelName": "Example Channel",
"channelUrl": "https://www.youtube.com/@example",
"publishedTimeText": "2 weeks ago",
"durationText": "12:34",
"durationSeconds": 754,
"viewCountText": "10K views",
"viewCount": 10000,
"subscriberCountText": null,
"subscriberCount": null,
"videoCountText": null,
"videoCount": null,
"descriptionSnippet": "A visible public search-result snippet...",
"thumbnailUrl": "https://i.ytimg.com/vi/example/hq720.jpg",
"thumbnailUrls": ["https://i.ytimg.com/vi/example/hq720.jpg"],
"isShort": false,
"isLive": false,
"isUpcoming": false,
"badges": [],
"searchUrl": "https://www.youtube.com/results?search_query=web+scraping+tutorial",
"page": 1,
"positionOnPage": 1,
"resultKey": "video:example",
"scrapedAt": "2026-07-14T12:00:00.000Z"
}

Download results as JSON, CSV, Excel, XML, or RSS, or consume them through the Apify API and MCP server. RUN_SUMMARY in the run's key-value store records each query's status, pages, retries, saved rows, recognized empty results, partial failures, and deadline state.

Reliability behavior

  • Input is validated before the start event is charged.
  • Rate limits, transient server responses, network failures, and challenge pages receive bounded retries with fresh proxy sessions.
  • Queries are isolated: one failed query does not discard rows already saved by other queries.
  • Continuation failures are reported as partial results instead of silently truncating the dataset.
  • Repeated results and continuation tokens are stopped safely.
  • A safe work deadline leaves time to persist rows and RUN_SUMMARY before the platform timeout.
  • A changed or blocked YouTube response does not become a misleading successful zero-row run.
  • Recognized valid no-match searches finish successfully with EMPTY_FILTERED in RUN_SUMMARY and no result-event charge.

YouTube may localize, personalize, reorder, or A/B test public results. Search ranks are a snapshot of the public response returned for this run, not a guarantee of a universal or complete result count.

Pricing

This Actor uses Apify pay-per-event pricing. The start event is charged once after valid input is accepted. The result event is charged atomically with each saved dataset row, so stored row count and result-event count stay aligned.

EventChargeFreeBronzeSilverGoldPlatinumDiamond
startOnce per valid run$0.005$0.005$0.005$0.005$0.005$0.005
resultPer saved row$0.000039799$0.000034608$0.000026994$0.000020765$0.000013843$0.000010

Apify can separately charge platform usage for compute, storage, proxies, or data transfer. Your run and Pricing tabs show the exact amount for your account.

API

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/youtube-search-results-scraper').call({
queries: ['web scraping tutorial'],
maxResultsPerQuery: 25,
resultType: 'videos',
country: 'US',
language: 'en',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/youtube-search-results-scraper').call(run_input={
'queries': ['web scraping tutorial'],
'maxResultsPerQuery': 25,
'resultType': 'videos',
'country': 'US',
'language': 'en',
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

cURL

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~youtube-search-results-scraper/runs?token=YOUR_APIFY_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"queries":["web scraping tutorial"],"maxResultsPerQuery":25,"resultType":"videos","country":"US","language":"en"}'

MCP and AI agents

Use this Actor as an agent tool through the Apify MCP server:

https://mcp.apify.com/?tools=fetch_cat/youtube-search-results-scraper

Add it to Claude Code:

$claude mcp add apify-youtube-search 'https://mcp.apify.com/?tools=fetch_cat/youtube-search-results-scraper'

Example MCP JSON configuration:

{
"mcpServers": {
"apify-youtube-search": {
"url": "https://mcp.apify.com/?tools=fetch_cat/youtube-search-results-scraper"
}
}
}

Example prompts:

  • “Find 50 recent YouTube videos about browser automation in the US and group them by channel.”
  • “Find channels ranking for three competitor topics and return their public subscriber counts.”
  • “Collect playlists about web scraping and give me the source URL for every row.”

The Actor's input, output, dataset, and RUN_SUMMARY schemas are published for OpenAPI, MCP, and agent clients.

FAQ

Why did I receive fewer rows than maxResultsPerQuery?

That value is a maximum. YouTube may expose fewer public matches for a filter/locale, return duplicates across continuation pages, or stop offering continuation data. Check RUN_SUMMARY for saved, filtered, duplicate, retry, empty, partial, and deadline details.

Is a zero-row run always an error?

No. A recognized valid search with no matches finishes as EMPTY_FILTERED and does not charge result events. An unrecognized layout, block, or all-query request failure fails the run instead of appearing as a misleading success.

Can it collect comments, transcripts, or full video details?

This Actor stays focused on fast public search results. Use a related Actor for detail-page, transcript, comment, channel-catalog, playlist-video, or Shorts-specific collection.

Do country and language guarantee identical results for every user?

No. They request a locale from YouTube, but public results can still change with time, source response, personalization experiments, and availability.

Scheduling and integrations

Schedule identical queries daily or weekly to compare public rank snapshots. Send datasets to Google Sheets, Airtable, a warehouse, a BI dashboard, or a webhook. Keep query, rank, searchUrl, and scrapedAt when building longitudinal reports.

Support

If a run behaves unexpectedly, open an Actor issue with:

  • The run ID or run URL.
  • The input JSON, with private proxy URLs or credentials removed.
  • The expected output and actual output returned by the dataset.
  • An example reproducible public URL or public search query, when possible.

Do not post private tokens or credentials. RUN_SUMMARY helps distinguish a valid no-match search from a YouTube layout change, block, partial continuation failure, or deadline stop.