YouTube Scraper — Search, Channel & Video Data ($1/1k)
Pricing
from $1.00 / 1,000 video scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
12 days ago
Last modified
Categories
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.
| Field | What it does |
|---|---|
searchQueries | Search terms, one per line, e.g. ["dubai restaurant", "muscat cafe review"] |
channelUrls | @handle, youtube.com/@handle, /channel/UC…, or /c/name URLs |
videoUrls | Direct video URLs — watch?v=, youtu.be/…, or /shorts/… |
maxResultsPerQuery | Cap per search query or per channel (default 50, max 5000) |
sortBy | relevance / date / views — search queries only |
uploadDate | any / hour / today / week / month / year — search queries only |
locale | Two-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,channelUrlsorvideoUrlsthe run logs a warning, writes aSUMMARYrecord withvideos: 0and 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
videoUrlsentry 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
videoIdacross all sources, then written. A failure in one source never removes rows already collected from another. - Cost behaviour:
video-scrapedis 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 ApifyClientclient = 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
- Google Maps MX-Checked Email Scraper
- Airbnb Listings Scraper
- E-commerce Price & Restock Monitor
- App Store Review Monitor
- Local Review Booster
- Website Contact Extractor
- Bulk Email Verifier
- USA Business Email Finder
- UK Business Email Finder
- UAE Business Email Finder
- UAE Property Broker Contacts
- LinkedIn Jobs Scraper
Using this actor? A quick review helps other buyers find it: youtube-video-scraper
Find us on RapidAPI
- YouTube Data on RapidAPI: a REST API for YouTube search, channel uploads and video metadata, with a free plan.
Related actors
- 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.