YouTube Search Scraper avatar

YouTube Search Scraper

Pricing

from $0.35 / 1,000 videos

Go to Apify Store
YouTube Search Scraper

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

Superslow Sloth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

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

FieldTypeNotes
searchQueriesarrayRequired. One or more search terms. Each is scraped independently.
maxResultsintegerVideos per query, default 50. Pagination follows YouTube's continuation tokens automatically.
languagestringhl code, default en. Changes the language of the display strings YouTube returns.
countrystringgl code, default US. Search rankings are region-specific, so this changes the results.
proxyConfigurationobjectStrongly 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_count is parsed only from an exact count such as "1,594,228 views". When YouTube shows a rounded figure such as
    "1.5M views"
    , view_count is null and view_count_text carries the rounding. Reporting 1500000 would be a number the source never stated.
  • published_at_estimate is an approximation, and should be treated as one. The response contains no timestamp at all - only text such as
    "3 years ago"
    , 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 published_time_text when 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_text and published_at_estimate are all null, is_live is true, and the viewer figure lands in concurrent_viewers rather than view_count, because "12,185 watching" is not a view count.
  • A missing field is null, never 0 or "". 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.