YouTube Search Scraper
Pricing
from $0.01 / 1,000 results
YouTube Search Scraper
Type a keyword, get structured YouTube video results — videoId, title, URL, channel name and ID, view count, published time, duration, description and thumbnail — straight from YouTube's InnerTube API. No API key, no browser, no cookies.
Pricing
from $0.01 / 1,000 results
Rating
0.0
(0)
Developer
Assia Fadli
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Turn any keyword into a tidy list of YouTube videos — no API key, no browser, no cookies.
Give this actor one or more search terms and it returns clean, flat rows: the video's ID, title and URL, the channel name and ID, view count, published time, duration, an optional description snippet, and the best available thumbnail. Perfect for topic research, competitor tracking, content ideation, or feeding a downstream pipeline.
How it works
The actor talks directly to YouTube's internal InnerTube API using the ANDROID client — the same endpoint YouTube's own mobile app uses. That client still returns full search data from youtubei/v1/search without a Proof-of-Origin (PoToken) token, consent cookies, or a headless browser, which keeps every run fast and cheap.
- A
POSTtohttps://www.youtube.com/youtubei/v1/searchwith the ANDROID client context and your{ query }returns the first page ofcompactVideoRendereritems. - Each subsequent page is fetched with the
nextContinuationData.continuationtoken from the previous response. - Results are de-duplicated by
videoId, and paging stops oncemaxResultsis reached, a token repeats, or YouTube stops returning a next token.
Features
- Search one keyword or many in a single run — each query is scraped independently.
- Pages through results with continuation tokens up to your
maxResultslimit. - Returns clean, flat rows (one per video) ready for spreadsheets, databases or downstream actors.
- Routes requests through Apify residential proxies, with an automatic fallback to a direct request if the proxy fails.
- Resilient: a query that returns nothing or errors is written as a
{ query, error }row instead of crashing the run.
Pricing — pay per result
This actor uses Apify's pay-per-event model with a single event, result-scraped. You are charged once for each video result that is actually delivered to your dataset. Rows that carry no video (empty-result or error rows) are never charged, and once your run's charge limit is reached the actor stops early so you are never billed beyond your budget.
Input
| Field | Type | Description |
|---|---|---|
queries | array (required) | One or more keywords. Each is searched independently. Aliases: keywords. |
query | string | Optional single keyword, merged with queries. Alias: search. |
maxResults | integer | Max results per query. Default 30. Alias: maxItems. |
proxyCountryCode | string | Two-letter country code for the residential proxy exit IP. Default US. Alias: proxyCountry. |
language | string | Language code (hl) for localized fields such as view counts and publish times. Default en. Alias: hl. |
Example input
{"queries": ["apify web scraping", "playwright tutorial"],"maxResults": 30,"proxyCountryCode": "US"}
Output
One dataset row per video result:
{"query": "apify web scraping","videoId": "5kcaHAuGxmY","title": "How to scrape ANY website with Apify's Web Scraper API","url": "https://www.youtube.com/watch?v=5kcaHAuGxmY","channelName": "Apify","channelId": "UCTgwcoeGGKmZ3zzCXN2qo_A","views": "39,802 views","published": "1 year ago","duration": "5:30","description": null,"thumbnail": "https://i.ytimg.com/vi_webp/5kcaHAuGxmY/sddefault.webp"}
Note: the ANDROID search client does not always include a
descriptionsnippet, so that field may be absent for some videos.
Running locally
npm installnpm run build# create storage/key_value_stores/default/INPUT.json with your input, then:apify run
Disclaimer
This actor scrapes publicly available search results. Use it responsibly and in line with YouTube's Terms of Service and applicable laws.