YouTube Scraper — Search, Channel & Video Data ($1/1k) avatar

YouTube Scraper — Search, Channel & Video Data ($1/1k)

Pricing

from $1.00 / 1,000 video scrapeds

Go to Apify Store
YouTube Scraper — Search, Channel & Video Data ($1/1k)

YouTube Scraper — Search, Channel & Video Data ($1/1k)

YouTube scraper: title, channel, views, likes, duration, description and publish date from a search, channel or video URL. $1 per 1,000.

Pricing

from $1.00 / 1,000 video scrapeds

Rating

0.0

(0)

Developer

Mohammed Samaan

Mohammed Samaan

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

12 days ago

Last modified

Share

YouTube Video Scraper

Scrape YouTube by search query, channel or direct video URL — title, channel, views, likes, duration, description, thumbnail, publish date. No browser: it talks straight to YouTube's own InnerTube web API (the same JSON the youtube.com website itself loads), so it's fast and cheap to run.

Price: $1 per 1,000 videos. Rows are de-duplicated by video ID across every search query, channel and direct URL in one run — you never pay twice for the same video.

Who it's for

  • Creator and competitor research — pull every upload from a channel with view counts
  • Trend and niche research — scrape search results for a keyword, sorted by date or views
  • Influencer discovery — search a niche term, get channels and view counts back
  • Content calendars — track what a set of channels has published recently

Inputs

At least one of the three lists below is required.

FieldWhat it does
searchQueriesSearch terms, one per line, e.g. ["dubai restaurant", "muscat cafe review"]
channelUrls@handle, youtube.com/@handle, /channel/UC…, or /c/name URLs
videoUrlsDirect video URLs — watch?v=, youtu.be/…, or /shorts/…
maxResultsPerQueryCap per search query or per channel (default 50, max 5000)
sortByrelevance / date / views — search queries only
uploadDateany / hour / today / week / month / year — search queries only
localeTwo-letter language code (default en)

Note: sortBy and uploadDate are both applied through single YouTube filter params. If you set both on the same run, uploadDate wins and sortBy is skipped for search — YouTube encodes the two together as a format we don't attempt to build. Run them as separate queries if you need both at once.

Example input

{
"searchQueries": ["dubai restaurant"],
"channelUrls": ["https://www.youtube.com/@GoogleDevelopers"],
"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
"maxResultsPerQuery": 100,
"sortBy": "date"
}

Example output

One row per video. This is a real row from a searchQueries run on "dubai restaurant" (28 Sep 2026). Because it came from a search listing, publishedAt and likeCount are null, publishedText is relative and description is a snippet (see the note below):

{
"videoId": "SDp9phplV3U",
"url": "https://www.youtube.com/watch?v=SDp9phplV3U",
"title": "Dubai Fine Dining 2026: Luxury vs Budget Showdown (14 Must‑Try Restaurants!)",
"channelName": "Travelspot",
"channelId": "UCHimPuWxxAN-y8sa7oh2qlg",
"channelUrl": "https://www.youtube.com/channel/UCHimPuWxxAN-y8sa7oh2qlg",
"publishedText": "10 months ago",
"publishedAt": null,
"durationSeconds": 527,
"viewCount": 8026,
"likeCount": null,
"description": "Join Travelspot as we explore Dubai's 14 best fine‑dining restaurants for 2026, from sky‑high luxury at the Burj Khalifa to hidden ...",
"thumbnailUrl": "https://i.ytimg.com/vi/SDp9phplV3U/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCpmeu0UoHFChWoGOGkCVx9ow4aOw",
"isLive": false,
"isShort": false,
"keywords": [],
"searchQuery": "dubai restaurant",
"sourceChannel": null,
"scrapedAt": "2026-09-28T16:04:42.663Z"
}

Detail depth depends on the source. A videoUrls row gets an exact view count, ISO publish date, full description and (approximate) like count — it comes from YouTube's own player + video-details endpoints. A row from searchQueries or channelUrls gets an approximate view count, a relative published date ("3 months ago" — YouTube's search/channel listings don't expose the exact date, so publishedAt is null there), and a description snippet rather than the full text. likeCount is only fetched for videoUrls rows and is read off YouTube's abbreviated display count (e.g. "19M"), so it's an approximation, not an exact figure.

How it works

YouTube's own web client calls https://www.youtube.com/youtubei/v1/{search,browse,next,player} with a plain JSON POST body — no API key, no login, no browser. This is the exact same server-rendered payload the youtube.com website itself parses to draw the page. Channel URLs are resolved by fetching the channel's /videos page HTML and reading ytInitialData, then paginated further pages come through the same InnerTube /browse continuation endpoint. Confirmed working 14 Sep 2026.

How it compares

No browser means no Chromium to boot, no memory overhead, no proxy tax — just a handful of HTTP requests per query. That's faster and materially cheaper to run than a browser-based YouTube scraper for the same result set.

Errors and limits

  • No input: with no searchQueries, channelUrls or videoUrls the run logs a warning, writes a SUMMARY record with videos: 0 and finishes.
  • Empty results: a search or channel that returns nothing adds no rows; the run still finishes.
  • Blocked, throttled or erroring (429, 5xx, other 4xx, timeouts): every request has a 30-second timeout and is retried up to 3 times with backoff. If a search or channel still fails, it is logged as failed and the run continues with the next source. A channel URL or handle that cannot be resolved fails only that channel. A run where every source fails ends with an empty dataset, so check the log and SUMMARY.
  • Direct videos: a videoUrls entry that cannot be parsed into a video ID is skipped with a warning. A video whose detail lookup fails or returns nothing is counted as failed in the log and gets no row.
  • EU consent page: requests to YouTube pages send a consent cookie, and if the consent interstitial still appears the actor retries once with it re-sent.
  • Partial results: sources are collected first, de-duplicated by videoId across all sources, then written. A failure in one source never removes rows already collected from another.
  • Cost behaviour: video-scraped is charged once per row written. Duplicates, failed lookups and retries are not charged. If your max-charge cap is reached the run stops and keeps what it already wrote.

FAQ

Does it need my own API key? No — it uses YouTube's public web endpoints, the same ones your browser calls when you use youtube.com.

Can I get Shorts specifically? isShort is set true when duration ≤ 60s (for videoUrls) or estimated from duration for search/channel rows — it isn't a guaranteed YouTube-side flag, so treat it as a strong signal, not a certainty.

Why is publishedAt sometimes null? Only videoUrls rows carry YouTube's exact ISO publish date. Search and channel listings only expose a relative string like "3 months ago" — we pass that through as publishedText rather than guess a date.

Does it use proxies? No — plain outbound HTTP requests, no browser, no proxy configuration needed or offered.

Use it from an AI agent (MCP)

Add this Actor to any MCP client (Claude, Cursor, VS Code) with one URL:

https://mcp.apify.com?tools=leadharbor/youtube-video-scraper

Or call it through the Apify API with an input like this:

{
"searchQueries": [
"dubai restaurant"
],
"maxResultsPerQuery": 50
}

Returns one row per video: title, channel, views, likes, duration and publish date. Results land in the run's default dataset (JSON, CSV or Excel). No login or API key is needed for the sites it reads, and pay-per-event pricing works with Apify's x402 agent payments.

API usage

Run it from your own code with an Apify API token. The input below is this actor's prefilled example.

curl (runs the actor and returns the dataset items):

curl -X POST "https://api.apify.com/v2/acts/leadharbor~youtube-video-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"searchQueries": [
"dubai restaurant"
],
"maxResultsPerQuery": 50
}'

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("leadharbor/youtube-video-scraper").call(run_input={
"searchQueries": [
"dubai restaurant"
],
"maxResultsPerQuery": 50
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Changelog

28 Sep 2026 — MCP agent section; public example tasks. Plus 5 public example tasks with their own pages.

More from leadharbor


Using this actor? A quick review helps other buyers find it: youtube-video-scraper

Find us on RapidAPI

  • Disposable Email & Domain Checker — Flags throwaway and free-provider email domains using 5 merged public lists. $0.30 per 1,000 checks.
  • Domain Trust Check — 0-100 trust score for a domain from domain age, SSL, SPF/DKIM/DMARC and disposable-domain lists. $2.50 per 1,000 domains.
  • Website Contact Extractor — Pulls emails, phone numbers and social links from website URLs.
  • Telegram Channel Scraper — Public Telegram channel posts: text, views, dates, media links. $1.50 per 1,000 messages.
  • Substack Scraper — Substack post metadata, dates, reactions and authors from public archives. $0.90 per 1,000 posts.