YouTube Scraper
Pricing
$2.50 / 1,000 video returneds
YouTube Scraper
Scrape YouTube video metadata by search keyword or channel (URL, @handle, UC id): videoId, title, watch URL, channel, views, publish time, length, thumbnail. No API key.
Pricing
$2.50 / 1,000 video returneds
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Scrape YouTube videos by search keyword or by channel (URL, @handle, or UC… id) using YouTube's internal InnerTube (youtubei/v1) JSON API. No API key, no cookies, no login. Auto-paginates via continuation tokens to reach your requested item count.
For every video it returns: videoId, title, watch url, channelName, channelId, viewCountText, publishedTimeText, lengthText, and the largest thumbnail.
What it does
- Search mode — give one or more keywords; each query returns up to
maxItemsmatching videos. - Channel mode — give one or more channels; each returns up to
maxItemsof its newest videos.
You can use either mode or both in a single run. Results are de-duplicated by videoId across all queries and channels, so you never pay for the same video twice in one run.
Input
| Field | Type | Description |
|---|---|---|
searchQueries | string[] | Keywords to search, one per line. Optional if you supply channelUrls. |
channelUrls | string[] | Channel URLs, @handles, or raw UC… ids. Optional if you supply searchQueries. |
maxItems | integer | Max videos per query and per channel (1–1000, default 50). |
proxyConfiguration | object | Proxy for all requests. Residential Apify Proxy is strongly recommended — YouTube blocks datacenter/cloud IPs aggressively. |
You must provide at least one of searchQueries or channelUrls. If both are empty the actor pushes an uncharged BAD_INPUT diagnostic row (it does not crash).
Example input
{"searchQueries": ["lofi hip hop", "python tutorial"],"channelUrls": ["https://www.youtube.com/@LofiGirl", "UCSJ4gkVC6NrvII8umztf0Ow"],"maxItems": 50,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Output
Each successful video is one dataset row with ok: true:
{"ok": true,"videoId": "n61ULEU7CO0","title": "lofi hip hop radio - beats to relax/study to","url": "https://www.youtube.com/watch?v=n61ULEU7CO0","channelName": "Lofi Girl","channelId": "UCSJ4gkVC6NrvII8umztf0Ow","viewCountText": "123,456 views","publishedTimeText": "2 years ago","lengthText": "1:02:33","thumbnail": "https://i.ytimg.com/vi/n61ULEU7CO0/hqdefault.jpg","mode": "search"}
Nullable / empty fields
YouTube's modern channel grid uses a different layout than search results, so a few fields can come back as an empty string "" depending on which layout a video uses:
channelId— may be empty for some channel-grid videos (the grid layout does not always carry the id).viewCountText,publishedTimeText,lengthText— may be empty for live streams, premieres, or radio-style "videos" that have no view count or fixed duration.thumbnail— falls back tohttps://i.ytimg.com/vi/<videoId>/hqdefault.jpgif no source URL is present, so it is rarely empty.
videoId, title, and url are always present on ok: true rows.
Pricing
This actor charges per returned video (pay-per-result). You are charged only for genuine ok: true video rows.
- Blocked, rate-limited, network-error, and empty (
NO_RESULTS) runs are never charged. When something goes wrong the actor pushes anok: falsediagnostic row with anerrorCodeinstead of charging you.
Diagnostics
On any failure the actor pushes a diagnostic row (ok: false) carrying a clear errorCode rather than silently returning nothing:
errorCode | Meaning |
|---|---|
BAD_INPUT | No searchQueries or channelUrls were provided. |
BLOCKED | YouTube blocked the request (anti-bot / 403). Use a residential proxy. |
RATE_LIMITED | Hit a 429. The actor backed off and retried; lower volume or add a proxy. |
SERVER_ERROR | YouTube returned a 5xx. Usually transient — retry later. |
NO_RESULTS | The request succeeded but matched no videos for your input. |
NETWORK | A network error reaching YouTube. |
Troubleshooting
- Got
NO_RESULTSorBLOCKEDfor a channel you know has videos? YouTube blocks cloud/datacenter IPs aggressively. Enable Apify Proxy with theRESIDENTIALgroup and re-run — this resolves the large majority of empty/blocked results. RATE_LIMITEDon large runs? A highmaxItems(toward 1000) requires many paginated requests. LowermaxItems, run fewer queries per run, or keep the residential proxy on.- Channel won't resolve (
BAD_INPUT: could not resolve channel)? Double-check the handle/URL, or pass the rawUC…channel id directly.