YouTube Search Scraper
Pricing
from $0.35 / 1,000 videos
YouTube Search Scraper
Scrape YouTube search results without an API key or quota. Returns video ID, title, channel name and ID, view count, duration, publish time and thumbnail for every result, paginated as deep as you need. Counts and dates come back exactly as YouTube renders them, plus a parsed number.
Pricing
from $0.35 / 1,000 videos
Rating
0.0
(0)
Developer
Superslow Sloth
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Runs a list of search terms against YouTube and returns the result rows: video ID, title, channel, duration, view count, thumbnail and whether the video is a live stream. It talks to the same internal endpoint the YouTube website itself calls, so it needs no API key and is not subject to the Data API's search quota.
Input
| Field | Type | Notes |
|---|---|---|
searchQueries | array | Required. One or more search terms. Each is scraped independently. |
maxResults | integer | Videos per query, default 50. Pagination follows YouTube's continuation tokens automatically. |
language | string | hl code, default en. Changes the language of the display strings YouTube returns. |
country | string | gl code, default US. Search rankings are region-specific, so this changes the results. |
proxyConfiguration | object | Strongly recommended - see Proxies below. |
Output
One dataset item per video:
{"query": "python tutorial","position": 2,"video_id": "fWjsdhR3z3c","url": "https://www.youtube.com/watch?v=fWjsdhR3z3c","title": "Learn Python in Less than 10 Minutes for Beginners (Fast & Easy)","channel_name": "Indently","channel_id": "UCuudpdbKmQWq2PPzYgVCWlA","channel_url": "https://www.youtube.com/@Indently","published_time_text": "5 years ago","published_at_estimate": "2021-08-25","view_count_text": "1,594,228 views","view_count": 1594228,"concurrent_viewers": null,"duration_text": "10:30","duration_seconds": 630,"thumbnail_url": "https://i.ytimg.com/vi/fWjsdhR3z3c/hq720.jpg","is_live": false}
position is the video's 1-based rank in YouTube's own ordering for that query,
after duplicates have been removed.
What the source will and will not give you
YouTube's search response carries display strings, not numbers. This actor emits the string exactly as YouTube printed it, and a parsed number beside it only where the string could be read without inventing precision.
view_countis parsed only from an exact count such as"1,594,228 views". When YouTube shows a rounded figure such as,"1.5M views"view_countisnullandview_count_textcarries the rounding. Reporting1500000would be a number the source never stated.published_at_estimateis an approximation, and should be treated as one. The response contains no timestamp at all - only text such as, which names a bucket roughly a year wide. The estimate is computed by subtracting the average length of that unit from the run date. Use"3 years ago"published_time_textwhen you need what YouTube actually said. For an exact publication date you need the watch page or the Data API, not search.- Live streams have no duration and no publish date.
duration_text,duration_seconds,published_time_textandpublished_at_estimateare allnull,is_liveistrue, and the viewer figure lands inconcurrent_viewersrather thanview_count, because"12,185 watching"is not a view count. - A missing field is
null, never0or"". A zero here would read as a measurement, and it would be a false one. - Search results are a ranked page, not a database. YouTube decides how many results exist for a term; asking for 500 when it offers 200 returns 200.
Proxies
YouTube answers datacenter addresses with "Sign in to confirm you're not a bot". The actor treats that refusal, along with HTTP 403, 429 and 5xx, as transient: it rotates to a new proxy exit address and retries. Genuinely broken responses are permanent and are skipped without burning retries. Run this with the Apify residential proxy. Without a proxy configuration, expect blocks.
Billing
One video-scraped event per row, charged after the row is written to the
dataset, plus a small actor-start fee. Duplicates that YouTube repeats across
continuation pages are removed before anything is charged, and a query that
legitimately returns nothing is logged but never charged.