YouTube Search Scraper: Country & Language Targeting
Pricing
from $3.99 / 1,000 results
YouTube Search Scraper: Country & Language Targeting
YouTube Search Scraper: Country & Language Targeting extracts YouTube search results by country and language, including titles, channels, URLs, views, likes, publish dates, thumbnails, and metadata. Ideal for localized SEO, content research, and competitor analysis.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
YouTube Search Scraper — Videos, Channels and Playlists by Country
Run one YouTube search from inside several countries at once, and see the ranked results each market actually gets. YouTube Search Scraper: Country & Language Targeting sends every query out through a residential exit IP in the country you pick, with a matching interface language, and returns typed JSON rows — no HTML parsing required. Each row carries the country, language and rank a video was seen at, plus which other countries surfaced the same video and where. This guide covers every input and output field, how the country/language targeting was verified to actually change results, and how teams run it for keyword research, rank tracking and dataset building.
What Does This YouTube Search Scraper Do?
It runs a list of search terms against YouTube's search results page once per requested country, using a real residential exit IP located in that country and (by default) YouTube's matching interface language. No YouTube account, login, cookie or API key is required — every request hits the public search page or a public channel's About page. It returns videos, channels, playlists or movies (selectable per run), with an optional cross-country rollup that shows which markets ranked the same video, at what position, and which countries missed it entirely.
- Issues each search term separately in every country listed in
targetCountries - Routes each country's search through a residential proxy exit physically located there
- Matches YouTube's interface language to the country by default, or lets you force one
- Encodes sort order, upload window, video length and result type into YouTube's real
sp=search parameter - Adds
countriesFound,rankByCountry,bestRankand related columns so you can compare markets in the same dataset - Can merge per-country rows into one row per video, or keep the per-market breakdown
- Also accepts direct video and channel URLs for one-off lookups outside the search flow
Features & Capabilities
The Actor's feature set splits into search execution, cross-market comparison, and cost control.
Core features
- Country-targeted search via residential exit IP.
targetCountriesaccepts ISO 3166 two-letter codes; the Actor's own measurement found that&gl=/&hl=URL parameters are inert (Brazil returned an identical 8-of-8 result set to the US), so it targets countries through the proxy exit instead — verified overlap with the US result set: DE 2/8, BR 2/8, JP 3/8. - Independent language targeting.
interfaceLanguage: "auto"maps each country to its default YouTube interface language (DE→de, BR→pt, JP→ja) as a second lever on the result set — measured overlap with an English search: ja 5/8, pt 5/8, de 6/8. - Verified search filters.
sortBy,uploadDate,durationandtypeare encoded into YouTube's realsp=protobuf parameter, not simulated client-side. Theshortduration filter was verified live to return videos of 13–144 seconds where the unfiltered search returned 7,341–43,200 seconds. - Cross-country rollup columns:
countriesFound,countriesFoundCount,rankByCountry,missingFromCountries,bestRank,bestRankCountry,isCountryExclusive,countriesSearchedCount. - Two metadata tiers.
flat(default) reads the search page only (~2 KB/row): rank, title, channel, views, length, verified badge and search snippet.fulladditionally opens every unique video (~587 KB/video, roughly 280× the traffic) for likes, comment count, subscriber count, exact publish timestamp, tags and the untruncated description. - Direct URL lookups. A video URL is fully extracted; a channel URL is read from its public About page, returning
description,country,joined,subscribers,channelIdand the channel's externallinks.
How this Actor compares to other YouTube scrapers
| Feature | This Actor | api-ninja/youtube-search-scraper | grow_media/youtube-search-api |
|---|---|---|---|
| Output format | Typed JSON | Typed JSON, plus a nested raw payload object | Typed JSON |
| Simultaneous multi-country search in one run | ✅ — one run fans out over every listed country | ❌ not documented — single geo value per run | ❌ not documented — single regionCode value per run |
Cross-country rank comparison (bestRank, rankByCountry, etc.) | ✅ built in | ❌ not documented | ❌ not documented |
| Entity coverage | video, channel, playlist, movie | video, channel, playlist, movie, shorts | video only (per their listed Limitations) |
| Pricing model (observed 2026-07-26) | Pay per event | Pay per event | Pay per event |
(Competitor rows reflect each Actor's own README on the Apify Store as of 2026-07-26; they are not independently verified beyond what those listings state.)
If your use case is feeding structured data to an LLM or a pipeline, the output-format row is the one that matters — parsing raw HTML inside an agent loop is a reliability failure mode, not a feature.
When another tool might suit you better
If you need YouTube's official channel-statistics fields — channelViewCount, channelVideoCount, channelCreatedAt, hiddenSubscriberCount — grow_media/youtube-search-api draws on the YouTube Data API and returns those directly; this Actor does not, since it reads the public search and About pages rather than the API. If fine-grained YouTube feature filters (HD, subtitles/CC, Creative Commons, 3D, Live, 4K, 360, HDR, VR180) matter more to your workflow than comparing a query across countries, api-ninja/youtube-search-scraper documents a features object for exactly that; this Actor has no equivalent.
This Actor within the Scrapio YouTube toolset
This Actor covers YouTube search results — videos, channels, playlists and movies, compared across countries and languages. For a channel's public contact details, use YouTube Channel Contact Extractor. For playlist contents with transcripts, use YouTube Playlist Scraper (Transcripts & Subtitles). For a single video's full metadata and subtitle translations, use YouTube Video Details Scraper (Subtitles & Translations). For Shorts specifically, use YouTube Shorts Scraper (Transcripts & Captions).
Why do developers and data teams scrape YouTube search results?
🏢 SEO, ASO and international marketing teams
A marketing team enters its brand or product keywords into queries and its launch markets into targetCountries, runs on sortBy: relevance with crossCountryRollup on, and reads bestRank, bestRankCountry and missingFromCountries straight from the dataset. That answers, per keyword, which market the brand ranks best in, which markets it does not appear in at all, and whether a competitor's video occupies the top slot in one country but not another — all without manually repeating the same search from behind five different VPN exits.
📊 AI training data and RAG indexing
The title, text (description or search snippet) and keywords (tags, full tier only) fields are the highest-information text fields per row — they carry the actual subject matter, unlike numeric fields such as viewCount or duration. For RAG enrichment, indexing title and text alongside searchCountry and searchRank lets a retrieval system answer "what ranks for X in market Y" directly from the dataset. For training data, the numeric fields (viewCount, likes, commentsCount, numberOfSubscribers) return as typed integers with no string cleanup required across every row.
📱 Competitive and market intelligence
Track a competitor's channel by re-running the same queries on a schedule and watching bestRank and countriesFound move over time — a channel that drops out of countriesFound for a market it previously held signals a real ranking or availability change, not a data artifact.
🔬 Research and academic use
Cross-cultural and platform-ranking researchers can compare how the same search term surfaces different content by country and language without needing YouTube API quota or a research partnership. Only publicly returned search data is collected — no account interaction, no private engagement metrics.
🎥 Product and SaaS development
Rank-tracking dashboards, keyword-research tools and localization-planning products can build directly on rankByCountry and bestRank instead of re-implementing country-aware search themselves.
⬇️ Input Parameters
All parameters are optional — required in the schema is empty. Read directly from .actor/actor.json.
| Parameter | Type | Default | Description |
|---|---|---|---|
queries | array of strings | ["coffee recipe"] | One search term per line. Each term is searched separately in every listed country. |
targetCountries | array of strings | ["US"] | ISO 3166 two-letter country codes, one per line (e.g. US, GB, DE, BR, JP, IN, MX). Each is a separate residential exit IP. |
interfaceLanguage | string | "auto" | auto matches each country's interface language; a code like es forces one language for every country; off always searches in English. |
resultsPerCountry | integer (min 1, max 2000) | 10 | Results per search term per country. A run costs roughly this number × queries × targetCountries rows. |
crossCountryRollup | boolean | true | Adds countriesFound, rankByCountry, missingFromCountries, bestRank, bestRankCountry and isCountryExclusive to every row. |
mergeCountryRows | boolean | false | Off: one row per video per country. On: one row per video at its best rank, with per-country positions kept in rankByCountry. |
sortBy | select — relevance, date, viewCount, rating | "relevance" | Encoded into YouTube's real sp= parameter; applied identically in every country. |
uploadDate | select — "", lastHour, today, thisWeek, thisMonth, thisYear | "" (any time) | Restricts every country's search to videos published in this window. |
duration | select — "", short, medium, long | "" (any length) | Short = under 4 min, medium = 4–20 min, long = over 20 min. |
type | select — video, channel, playlist, movie | "video" | Channel and playlist searches return channel/playlist rows (UC… / PL… ids); video-only columns are empty for them. |
metadataDepth | select — flat, full | "flat" | flat = search page only (~2 KB/row). full = also opens every unique video (~587 KB/video, ~280× the traffic). Fields exclusive to full are left empty, never zero-filled, on flat. |
proxyConfiguration | object (proxy editor) | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} | Country targeting requires residential exits, so the Actor overrides this for the search requests themselves (logged at the start of every run) and keeps your setting only as a fallback. |
debug | boolean | false | Logs each country's search attempts, the generated sp= parameter, and any yt-dlp error text. |
⚠️ Read before your first run.
queriesships with a real schemadefaultof["coffee recipe"], not just a prefill — starting the Actor from an empty{}input does not fail or no-op. It runs a genuine search for "coffee recipe" from the US and charges arow_resultevent for every row returned. Setqueriesexplicitly if that default term is not what you intend to run.
Example input
{"queries": ["coffee recipe"],"targetCountries": ["US", "DE", "JP"],"interfaceLanguage": "auto","resultsPerCountry": 10,"crossCountryRollup": true,"mergeCountryRows": false,"sortBy": "relevance","metadataDepth": "flat"}
Supported URL types and input formats
Beyond the schema's search fields, the source code also accepts direct video and channel URLs (kept for compatibility with an earlier input shape; pass them as raw JSON under urls when you need single-item lookups rather than a search):
- A video URL (
https://www.youtube.com/watch?v=…,https://youtu.be/…, or a/shorts/…URL) — fully extracted atfulldepth regardless of themetadataDepthsetting. - A channel URL (
https://www.youtube.com/@handleor/channel/UC…) — its public About page is read for description, country, join date, subscriber text and external links. - A plain search query in
queries, one per line, run against every country intargetCountries— e.g."coffee recipe"searched acrossUS,BRandJPproduces three separate ranked result sets.
Countries recognized by targetCountries and their default interface language
normalise_country() accepts any casing or hyphenated form (de, DE, de-DE all resolve to DE) and any two-letter code is passed through to the proxy layer, but only the codes below are known to country_name() and default_language() — outside this table, searchCountryName is left empty and, under interfaceLanguage: "auto", no language override is sent. This is the complete table read from src/geo.py:
| Code | Country | Default language | Code | Country | Default language |
|---|---|---|---|---|---|
| US | United States | en | RU | Russia | ru |
| GB | United Kingdom | en | UA | Ukraine | uk |
| CA | Canada | en | TR | Turkey | tr |
| AU | Australia | en | SE | Sweden | sv |
| NZ | New Zealand | en | NO | Norway | no |
| IE | Ireland | en | DK | Denmark | da |
| IN | India | en | FI | Finland | fi |
| PH | Philippines | en | CZ | Czechia | cs |
| SG | Singapore | en | GR | Greece | el |
| ZA | South Africa | en | HU | Hungary | hu |
| NG | Nigeria | en | RO | Romania | ro |
| KE | Kenya | en | JP | Japan | ja |
| DE | Germany | de | KR | South Korea | ko |
| AT | Austria | de | TW | Taiwan | zh-Hant |
| CH | Switzerland | de | HK | Hong Kong | zh-Hant |
| FR | France | fr | TH | Thailand | th |
| BE | Belgium | fr | VN | Vietnam | vi |
| ES | Spain | es | ID | Indonesia | id |
| MX | Mexico | es | MY | Malaysia | ms |
| AR | Argentina | es | PK | Pakistan | ur |
| CO | Colombia | es | BD | Bangladesh | bn |
| CL | Chile | es | SA | Saudi Arabia | ar |
| PE | Peru | es | AE | United Arab Emirates | ar |
| IT | Italy | it | EG | Egypt | ar |
| PT | Portugal | pt | IL | Israel | iw |
| BR | Brazil | pt | |||
| NL | Netherlands | nl | |||
| PL | Poland | pl |
A country code you list that isn't in this table is still sent to the residential proxy layer as a country filter — it just won't get an automatic language mapping or a display name in searchCountryName.
⬆️ Output Format
Every result is a typed JSON row pushed to the default dataset; the flat and merged modes differ only in row count, not in shape. Row-building logic lives in build_row() in src/main.py.
Output for a search result (video, channel, playlist or movie)
{"title": "How I make coffee at home","type": "video","channelName": "Daily Brew","date": "2025-11-02T14:00:00Z","text": "Full description or search-page snippet","thumbnailUrl": "https://i.ytimg.com/vi/…/hqdefault.jpg","order": 4,"input": "coffee recipe","hashtags": ["#coffee", "#recipe"],"channelId": "UCxxxxxxxxxxxxxxxxxxxxxx","channelUrl": "https://www.youtube.com/channel/UCxxxxxxxxxxxxxxxxxxxxxx","channelUsername": "@dailybrew","numberOfSubscribers": 128000,"id": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","viewCount": 1043221,"likes": 21500,"commentsCount": 340,"commentsTurnedOff": false,"duration": "6:19","durationSeconds": 379,"keywords": ["coffee", "recipe", "brewing"],"isMembersOnly": false,"searchCountry": "DE","searchCountryName": "Germany","searchLanguage": "de","searchRank": 4,"searchUrl": "https://www.youtube.com/results?search_query=coffee+recipe&sp=…","isVerifiedChannel": true,"availability": "public","liveStatus": "not_live","metadataDepth": "flat","scrapedAt": "2026-07-26T00:00:00Z","rankByCountry": { "US": 7, "DE": 4 },"countriesFound": ["US", "DE"],"countriesFoundCount": 2,"countriesSearchedCount": 3,"missingFromCountries": ["JP"],"bestRank": 4,"bestRankCountry": "DE","isCountryExclusive": false}
The last eight fields (rankByCountry through isCountryExclusive) are added only when crossCountryRollup or mergeCountryRows is on (the rollup is on by default). The Apify Console's default dataset view surfaces 27 of these columns as a table; the remaining fields — id, text, durationSeconds, channelId, channelUsername, thumbnailUrl, hashtags, keywords, isMembersOnly, availability, liveStatus, searchUrl, order, countriesSearchedCount — are present on every row but not shown in that default view. Open Export on the dataset to reach all of them.
Field coverage by metadataDepth
| Field | flat (default) | full |
|---|---|---|
searchRank, order, title, id, url, viewCount, duration, durationSeconds, channelName, channelId, channelUrl, channelUsername, thumbnailUrl, isVerifiedChannel, liveStatus, all searchCountry*/rollup columns | ✅ present | ✅ present |
text (description) | search-page snippet only | full untruncated description |
date (exact publish timestamp) | ❌ empty | ✅ present |
likes, commentsCount, numberOfSubscribers, keywords (tags) | ❌ empty | ✅ present |
commentsTurnedOff | always null — not knowable from the search page | true/false, inferred from whether comment_count came back |
isMembersOnly, availability | populated only when the search page happens to expose them | populated from the full video extraction |
Fields with no value at a given depth are left as null, never filled with 0 or an empty string — an empty likes column means "not collected at this depth," not "zero likes."
Output for a direct channel URL lookup
Passing a channel URL through the raw urls input produces a structurally different row, read from the channel's public About page instead of a search result:
{"type": "channel","id": "UCxxxxxxxxxxxxxxxxxxxxxx","url": "https://www.youtube.com/channel/UCxxxxxxxxxxxxxxxxxxxxxx","title": null,"input": "https://www.youtube.com/@dailybrew","text": "Channel description text","channelId": "UCxxxxxxxxxxxxxxxxxxxxxx","channelUrl": "https://www.youtube.com/channel/UCxxxxxxxxxxxxxxxxxxxxxx","channelUsername": "@dailybrew","country": "Germany","joined": "Jan 12, 2015","subscribers": "128K subscribers","links": [{ "title": "Website", "url": "https://example.com", "displayText": "example.com" }],"aboutUrl": "https://www.youtube.com/@dailybrew/about","searchCountry": "US","scrapedAt": "2026-07-26T00:00:00Z"}
A run with no usable query or URL, a country/query pair with zero results, or a failed direct-URL lookup instead pushes a type: "error" or type: "info" row (with message/detail/error text) — these accounting rows are pushed without a charged_event_name, so they are never billed. Every billed row carries charged_event_name: "row_result"; to isolate billed rows in an export, filter out items where type is "error" or "info".
Schema stability and export options
Field names are additive and kept stable across runs of this Actor version — a YouTube front-end change affects what yt-dlp can extract, not the field names this Actor writes. Fields that a given tier or path cannot populate are left empty (null), never zero-filled or guessed. Results are stored in the standard Apify dataset and can be exported from the Console or the API as JSON, CSV, Excel, XML, HTML or RSS — the same export formats every Apify dataset supports.
💡 YouTube Search Scraper: Country & Language Targeting Strategy Guide
🎯 Strategy 1: Real-time keyword-rank check
Trigger a run on demand with queries set to your target keyword and targetCountries set to your launch markets, resultsPerCountry: 20, crossCountryRollup: true. Read bestRank, bestRankCountry and missingFromCountries off the finished dataset and write them into a spreadsheet or CRM record keyed by input (the query) and channelId. Useful right after publishing a new video, to see which market picked it up first.
🎯 Strategy 2: Scheduled rank monitoring
Set up an Apify Schedule to run the same queries/targetCountries pair daily or weekly. After each run, diff the new dataset against the previous one on bestRank and countriesFound for the same channelId; alert when bestRank worsens or a country disappears from countriesFound. The Actor itself runs once per schedule trigger — the diff logic lives outside it, in whatever pulls the dataset via the Apify API.
🎯 Strategy 3: Bulk multi-market dataset build
Load a long queries list (brand terms, competitor names, category keywords) against every market you operate in, in a single run, with mergeCountryRows: false so each country's ranking is preserved as its own row. resultsPerCountry is capped at 2000 by the schema, though YouTube's own search pages thin out well before that — the schema places no documented limit on how many queries or targetCountries a single run can list. Export the finished dataset to CSV for a research or business-intelligence pipeline.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time rank check | One-off launch or campaign check | Manual, on demand | JSON, read directly from the Console |
| Scheduled rank monitoring | Ongoing brand or competitor tracking | Apify Schedule, recurring | JSON, diffed run-over-run externally |
| Bulk multi-market dataset build | Research or BI datasets across many keywords/markets | Single large run | CSV/Excel export |
🔗 Related YouTube Scrapers & Tools
| Scraper | What it extracts |
|---|---|
| YouTube Channel Contact Extractor | Public contact details from a channel's page |
| YouTube Playlist Scraper (Transcripts & Subtitles) | Playlist contents with video transcripts |
| YouTube Video Details Scraper (Subtitles & Translations) | Full single-video metadata and subtitle translations |
| YouTube Shorts Scraper (Transcripts & Captions) | Shorts-specific video and caption data |
| YouTube Community Posts Scraper (Engagement Analytics) | Channel community-tab posts and engagement |
| Google Search Autocomplete Scraper | Autocomplete keyword suggestions to feed into queries |
How to integrate this Actor with your stack
This Actor works with any language or tool that can call the Apify API — there is no separate authentication scheme beyond your Apify account token.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("<APIFY_TOKEN>")run_input = {"queries": ["coffee recipe"],"targetCountries": ["US", "DE", "JP"],"resultsPerCountry": 10,"crossCountryRollup": True,}run = client.actor("<YOUR_USERNAME>/youtube-search-scraper-country-language-targeting").call(run_input=run_input)rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())billed_rows = [r for r in rows if r.get("type") not in ("error", "info")]with open("youtube_ranks.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=["searchCountry", "input", "searchRank", "title", "bestRank", "bestRankCountry"])writer.writeheader()for row in billed_rows:writer.writerow({k: row.get(k) for k in writer.fieldnames})print(f"Wrote {len(billed_rows)} rows.")
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('<YOUR_USERNAME>/youtube-search-scraper-country-language-targeting').call({queries: ['coffee recipe'],targetCountries: ['US', 'DE', 'JP'],resultsPerCountry: 10,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const billed = items.filter((r) => r.type !== 'error' && r.type !== 'info');console.log(`${billed.length} billed rows`, billed.slice(0, 3));
Async and scheduled pipelines
For large queries/targetCountries combinations, start the run with client.actor(...).start(run_input=...) instead of .call(...) and poll client.run(run_id).get() until status is SUCCEEDED, or use an Apify Schedule for recurring runs rather than holding a connection open. Dataset items can also be pulled incrementally through the API while a long run is still in progress.
Who Needs This YouTube Search Scraper? (Use Cases & Industries)
SEO, ASO and international marketing teams
A team launching a product video in five countries runs one search per market and reads bestRankCountry and missingFromCountries to see exactly where the video is not surfacing at all, rather than guessing from a single home-market search.
AI and RAG engineering teams
Indexing title, text and keywords per searchCountry builds a retrieval corpus that already carries market context, so a RAG system can answer country-specific "what's ranking for X" questions without a second enrichment pass.
Competitive intelligence teams
Tracking a rival's channel across the same keyword set on a recurring schedule surfaces bestRank movement and countriesFound changes as an early signal of a ranking or content-strategy shift.
Researchers
Cross-cultural media and platform-ranking researchers get a reproducible, publicly sourced dataset of search rankings by country and language without API quota constraints — public search data only, no account interaction involved.
Growth and localization product teams
Products that plan market entry or content localization can pull rankByCountry directly instead of building country-aware YouTube search themselves.
Is it legal to scrape YouTube search results?
Yes — collecting data that is publicly visible without logging in is generally lawful in the United States; in hiQ Labs, Inc. v. LinkedIn Corp. (9th Cir. 2019), the court held that scraping publicly accessible web data does not violate the Computer Fraud and Abuse Act. That case concerned public profile pages, not YouTube specifically, but the underlying principle — that public data is not "unauthorized access" — is the same one that applies here.
Separately, YouTube's Terms of Service generally restrict automated data collection from the platform. Violating a platform's Terms of Service is a potential contractual or civil matter between the user and the platform, not a criminal one, and is a different question from the legality of scraping public data itself.
This Actor does not collect private account data, emails, phone numbers or anything requiring a login — only channel names, subscriber counts, view counts and other information YouTube displays publicly on its search and channel pages. If a channel identifies a private individual, some data-protection regimes may still treat that channel's public details as personal data; deciding the lawful basis for storing and reusing it is the user's responsibility.
YouTube Search Scraper: Country & Language Targeting returns only publicly accessible data. What you do with that data is your responsibility — consult legal counsel for commercial applications involving personal data.
❓ Frequently asked questions
Does this Actor work without a YouTube account?
Yes. No YouTube login, cookie or API key is used anywhere in the source — search requests hit the public search results page and, for direct channel lookups, the public About page.
How does this Actor handle YouTube's anti-scraping measures?
It routes every search through Apify Residential proxies with a country-specific exit IP, retries a search up to three times if it returns zero rows, limits concurrent extractions to four at a time (asyncio.Semaphore(4)), and deliberately does not use --geo-bypass header spoofing, since faking an X-Forwarded-For header would contradict the country the exit IP is actually in.
Can I run this Actor at scale without getting blocked?
The Actor caps concurrent yt-dlp calls at four and retries empty results up to three times per country/query pair; there is no documented uptime or success-rate guarantee beyond that behavior. resultsPerCountry is capped at 2000 by the schema, though YouTube's search pages return fewer than that in practice.
How fresh is the data this Actor returns?
Every run performs a live search at run time — nothing is cached or reused between runs. scrapedAt on each row is the real timestamp of that specific request.
Which fields work best for AI training and RAG indexing?
For RAG, title and text (the description or search snippet) carry the actual subject matter and are the fields worth embedding. For training data, viewCount, likes, commentsCount, numberOfSubscribers and durationSeconds are typed integers with a consistent structure across every row and need no string parsing.
Does scraping YouTube collect personal data I need to handle carefully?
Only public channel and video metadata is returned — no email addresses, phone numbers or private account fields. If a channel belongs to an identifiable private individual, its public details may still count as personal data under some regimes; the lawful basis for storing or reusing that data sits with the user, not the Actor.
Does this Actor work with Claude, ChatGPT and other AI agent tools?
There is no MCP server for this Actor. It is callable as a standard Apify Actor run through the apify-client SDK (Python or JavaScript) from any agent framework or script that can make an HTTP request; every response is typed JSON that needs no parsing before it enters an LLM's context window.
How does this Actor compare to other YouTube search scrapers?
As observed on their Apify Store listings on 2026-07-26: api-ninja/youtube-search-scraper offers a features filter object (HD, subtitles, Creative Commons, 3D, Live, 4K, 360, HDR, VR180) this Actor does not have, and returns a nested raw payload alongside the typed fields. grow_media/youtube-search-api draws on the official YouTube Data API and returns official channel-statistics fields (channelViewCount, channelVideoCount, channelCreatedAt) this Actor does not populate, but documents video-only coverage. Neither competitor's listing documents running one query from multiple country exit IPs in a single run or a cross-country rank rollup — that comparison is this Actor's core focus.
Disclaimer
YouTube Search Scraper: Country & Language Targeting extracts only publicly available data from YouTube. This tool is intended for lawful use cases only. Users are responsible for complying with YouTube's Terms of Service and applicable data protection laws in their jurisdiction.