YouTube Scraper - $0.135 per 1,000, No API Key
Pricing
from $0.14 / 1,000 video returneds
YouTube Scraper - $0.135 per 1,000, No API Key
YouTube's search response never carries a date. It carries "4 years ago", and the view count as "56,651,173 views", the exact strings the page prints. Rows keep them, beside videoId, title, URL, channel and thumbnail. No API key, no OAuth, no quota. $0.135 per 1,000 videos.
Pricing
from $0.14 / 1,000 video returneds
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
YouTube Scraper
YouTube's search response never carries a date. It carries "4 years ago", and the view count as
"56,651,173 views", the exact strings the results page is about to print. Both come through here
as written, because turning them into numbers would mean guessing.
Keyword searches and channel pulls produce the same flat rows: videoId, title, watch url,
channelName, channelId, view count, published time, length and the largest thumbnail. It reads
YouTube's internal InnerTube JSON API and follows continuation tokens to reach whatever count you
asked for. That's the API the site itself uses, so there's no Data API key to register, no OAuth
consent screen, and none of the daily quota that comes with either.
$0.135 per 1,000 videos ($0.000135 each), plus $0.001 when a run starts. Flat on every plan.
What you get
{"ok": true,"videoId": "n61ULEU7CO0","title": "Best of lofi hip hop 2021 ✨ [beats to relax/study to]","url": "https://www.youtube.com/watch?v=n61ULEU7CO0","channelName": "Lofi Girl","channelId": "UCSJ4gkVC6NrvII8umztf0Ow","viewCountText": "56,648,381 views","publishedTimeText": "4 years ago","lengthText": "6:10:58","thumbnail": "https://i.ytimg.com/vi/n61ULEU7CO0/hq720.jpg","mode": "search"}
Note that the counts are strings, as YouTube renders them — "56,648,381 views",
"4 years ago""6:10:58". They aren't parsed into numbers or timestamps, because YouTube doesn't give exact
ones here. You'll want to parse them yourself if you're doing maths on them.
Live streams and premieres are the ragged edge: viewCountText comes back as something like
"490 watching", and publishedTimeText and lengthText can both be empty strings, because a
stream has no duration and no publish date yet. channelId can also be empty on some channel-grid
rows, where YouTube's grid layout doesn't carry it. videoId, title and url are always there.
thumbnail falls back to i.ytimg.com/vi/<videoId>/hqdefault.jpg when no source URL is present, so
it's rarely empty.
Input
| Field | Notes |
|---|---|
searchQueries | Keywords, one per line. Each returns up to maxItems. |
channelUrls | Full channel URLs, @handles, or raw UC… ids. Each returns up to maxItems of its newest videos. |
maxItems | Per query and per channel, 1–1000, default 50. |
proxyConfiguration | Apify Proxy, datacenter, on by default. See below. |
{"searchQueries": ["lofi hip hop", "python tutorial"],"channelUrls": ["https://www.youtube.com/@LofiGirl", "UCSJ4gkVC6NrvII8umztf0Ow"],"maxItems": 50}
Use either mode or both. Results are de-duplicated by videoId across every query and channel, so a
video that shows up in two searches is charged once.
maxItems is per query and per channel, not per run. Two keywords plus one channel at
maxItems: 50 is up to 150 videos, not 50.
About the proxy
Apify Proxy is on by default, on datacenter addresses. YouTube blocks datacenter and cloud addresses
hard, so if you're seeing BLOCKED or empty results, switch the proxy to the RESIDENTIAL group.
That clears up most of it. Residential is billed by the gigabyte on your own account, but these are
small JSON responses rather than video, so the traffic is modest.
Pushing maxItems toward 1000 means a lot of paginated requests and raises your odds of a rate
limit. If you're running big, keep the residential proxy on.
Billing
| Event | Price |
|---|---|
| Actor start | $0.001 per run |
| Video returned | $0.000135, so $0.135 per 1,000 |
1,000 videos is $0.136 all in. A two-keyword, one-channel run at the default maxItems: 50 returns
up to 150 videos for about $0.02.
Blocked, rate-limited, network-error and empty runs are never charged. When something goes wrong you
get an ok: false row with an errorCode instead of a charge:
errorCode | Meaning |
|---|---|
BAD_INPUT | Neither searchQueries nor channelUrls was provided. |
BLOCKED | YouTube blocked the request. Use a residential proxy. |
RATE_LIMITED | A 429. It backed off and retried; lower the volume or add a proxy. |
SERVER_ERROR | A 5xx from YouTube. Usually transient. |
NO_RESULTS | The request worked and matched nothing. |
NETWORK | Couldn't reach YouTube. |
If a channel won't resolve
You'll get BAD_INPUT: could not resolve channel. Check the handle or URL, or skip the guesswork and
pass the raw UC… channel id.