YouTube Scraper - Search and Channel Videos
Pricing
from $0.13 / 1,000 videos
YouTube Scraper - Search and Channel Videos
Search YouTube or scrape a channel's newest uploads. Each row has the videoId, title, watch URL, channel, thumbnail, and the views, age and runtime exactly as YouTube prints them ("4 years ago", "34,811,276 views"). $0.135 per 1,000 videos.
Pricing
from $0.13 / 1,000 videos
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
10
Total users
3
Monthly active users
an hour ago
Last modified
Categories
Share
Scrape YouTube search results and channel uploads without an API key: give it keywords, channels, or both, and you get one flat row per video with the id, title, watch link, channel, view count, age, runtime and the largest thumbnail YouTube offers. No Google API key needed.
The part that surprises people on run two: the counts and dates are the strings YouTube renders, not
numbers. You get "34,811,276 views" and "4 years ago", because that is all the results page
carries, and turning them into a real figure would mean guessing.
| Input | Keywords, channel links, @handles or UC ids |
| Output | One row per video: id, title, watch link, channel name and id, views, age and runtime as YouTube prints them, thumbnail |
| Ceiling | 1,000 videos per keyword and per channel |
| Account needed | None |
| Price | $0.135 per 1,000 videos on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 37,000 |
🔍 What YouTube Scraper does
Two modes, same row shape. A keyword runs a YouTube search and returns the videos it matched. A
channel returns that channel's newest uploads. Mix them in one run and the rows come back together,
with mode telling you which produced each one.
Results are deduplicated by videoId across every keyword and channel in the run, so a video found
by two searches is returned once and billed once.
maxItems is per keyword and per channel, not per run. Two keywords and one channel at 50 is up
to 150 videos.
📋 What data you get from each YouTube video
| What you get | Field |
|---|---|
| The 11 character video id and the watch link | videoId, url |
| Title | title |
| Who uploaded it | channelName, channelId |
| Views, as YouTube prints them | viewCountText |
| How long ago it went up, as YouTube prints it | publishedTimeText |
| Runtime | lengthText |
| The largest thumbnail on offer | thumbnail |
| Whether a search or a channel produced the row | mode |
▶️ How to scrape YouTube videos
- Open YouTube Scraper and click Try for free.
- Type keywords into Search queries, or paste channels into Channel URLs / handles.
- Set Max videos per query / channel. Start at 50 while you look at the output.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or read it over the Apify API.
Give it neither keywords nor channels and you get one uncharged row telling you so.
💰 How much does it cost to scrape YouTube videos?
$0.135 per 1,000 videos on the Free plan. Paid plans pay a little less: $0.133 on Starter, $0.131 on Scale and $0.129 on Business. On the free plan, the $5 Apify gives you each month covers about 37,000 videos.
You pay per video row delivered. Diagnostic rows and duplicates inside a run are never billed, so a run that finds nothing delivers no charged rows. A two keyword plus one channel run at the default 50 returns up to 150 videos, which is about two cents.
📥 What you give it
{"searchQueries": ["lofi hip hop", "python tutorial"],"channelUrls": ["https://www.youtube.com/@LofiGirl", "UCSJ4gkVC6NrvII8umztf0Ow"],"maxItems": 50}
| Field | Default | What it is |
|---|---|---|
searchQueries | none | Keywords, one per line. Each returns up to maxItems videos. The form opens with lofi hip hop as an example. |
channelUrls | none | Channel links, @handles or bare UC ids. Each returns up to maxItems of its newest uploads. If a channel will not resolve, pass the full link or the UC id instead of the handle. |
maxItems | 50 | Per keyword and per channel, 1 to 1,000. This is also your spend cap. |
notionConnector, notionParentId | none | Optional. Write each video into a Notion database as well as the dataset. |
proxyConfiguration | Apify default | Leave it alone unless you have your own servers you want the run to go out through. |
📤 What you get back
A real row from a run on 3 October 2026, with the thumbnail link trimmed:
{"ok": true,"videoId": "CLeZyIID9Bo","title": "Chill Lofi Mix [chill lo-fi hip hop beats]","url": "https://www.youtube.com/watch?v=CLeZyIID9Bo","channelName": "Settle","channelId": "UCkKT4qf-TcPFOmpqhTawrGA","viewCountText": "34,811,276 views","publishedTimeText": "4 years ago","lengthText": "1:44:52","thumbnail": "https://i.ytimg.com/vi/CLeZyIID9Bo/hq720.jpg?sqp=...","mode": "search"}
| Field | How to read it |
|---|---|
videoId | Use it as your key across runs. |
channelId | Can be empty on a search row whose byline is a collaboration. channelName is still there. |
viewCountText | "34,811,276 views" on a normal video, "8,188 watching" on a live stream. |
publishedTimeText | "4 years ago". Empty on a live stream or a premiere, which has no publish date yet. |
lengthText | "1:44:52". Empty on a live stream, which has no duration yet. |
thumbnail | The largest one YouTube offers, falling back to hqdefault.jpg when the grid carries no link. |
🧾 Reading the output
Two kinds of row land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| A video | ok: true | yes |
| A diagnostic | ok: false and an errorCode | no |
Filter on ok == true and you have your data. A failed keyword or channel gets its own row and the
run carries on to the next target.
| Code | What it means |
|---|---|
BAD_INPUT | The keyword or channel could not be used, or the input named neither. |
NOT_FOUND | YouTube has no channel at that address. |
RATE_LIMITED, SERVER_ERROR, NETWORK | That target would not answer this run. Re-running usually clears it. |
NOT_SERVED | This video was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
NO_RESULTS | The run finished with nothing to show. |
TIME_LIMIT | The run got close to its time limit and stopped on its own. The videos delivered before that are in the dataset and charged as usual. Give the run more time, or ask for fewer videos, to get the rest. |
A run ends as failed only when the time limit stopped it before any video came back.
One quirk of the Overview table: it shows the video columns only, so a diagnostic row reads as a
blank line there. Open the row or download the JSON and the errorCode is present.
💡 What people use it for
- Watching what ranks for a keyword you care about, then comparing the list next week.
- Building a channel's recent uploads as rows for a sheet, then digging into only the ones worth it.
- Finding the videos an audience actually searches for before scripting your own.
- Collecting video links for the transcript or comments actors, which want links rather than keywords.
From a keyword to what is said and what viewers say back, in three runs:
- Search a keyword here and copy the
urlcolumn of the videos you care about. - Paste those links into the Video URLs or IDs box of YouTube Transcript Scraper to get what each video says.
- Paste the same links into the Video URLs box of YouTube Comments Scraper to read the replies.
🚧 What it does not do
- No exact view counts and no real dates. The strings are what the page carries.
"88M views"cannot be turned back into88,041,233, so plan around that rather than parsing hopefully. - Search returns ordinary videos only. Shorts, playlists and channel cards that appear in a YouTube search are skipped rather than returned as rows.
- Channel mode reads the Videos tab. The Shorts and Live tabs are not read, so a channel that posts Shorts only comes back empty here.
- No descriptions, likes, comments or subscriber counts. Those live in other actors, in the table below.
- Very large limits come back short. 1,000 per keyword or channel is the most, and a big number takes longer and often stops before it.
- A keyword that matches nothing is quiet. There is no per keyword diagnostic row, only a run-level one when the whole run found nothing.
- Newest, not complete. There is no offset or resume, so a long channel gives you its latest
maxItemsevery time. - It is not an official YouTube tool. Dami's Studio is independent and is not affiliated with or endorsed by YouTube or Google, or by any other company named on this page.
🧭 Which YouTube scraper do you need?
| If you want | Use |
|---|---|
| Keyword search results, or a channel's newest uploads | This one |
| A channel's uploads, with a higher ceiling per run | YouTube Channel Scraper |
| Shorts from a channel or a keyword, with exact view and like counts | YouTube Shorts Scraper |
| Videos in a playlist | YouTube Playlist Scraper |
| The most-viewed videos for a topic | YouTube Trending Scraper |
| Comments under a video | YouTube Comments Scraper |
| What a video says, as text, SRT and VTT | YouTube Transcript Scraper |
| The video, its audio or its subtitles as a file | YouTube Downloader Pro |
❓ Questions people ask
Do I need a YouTube or Google account?
No. Nothing here is signed in.
Is maxItems per run?
No, per keyword and per channel. Three targets at 50 is up to 150 rows.
Why is channelId empty on some rows?
Search rows whose byline is a collaboration carry no channel link to read. channelName is still
there.
Can I get exact YouTube view counts?
Not from a results page. YouTube Shorts Scraper returns exact view and like counts, because a Short's own page carries them.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made code for
Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/youtube-scraper. Either way the run
happens on your Apify account at the same price.
Is scraping YouTube legal?
This reads public search results and public channel pages, nothing signed in. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Include the keyword or channel you used and the run ID, and the log is enough for us to see what happened.