YouTube Scraper - Search and Channel Videos avatar

YouTube Scraper - Search and Channel Videos

Pricing

from $0.13 / 1,000 videos

Go to Apify Store
YouTube Scraper - Search and Channel 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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

10

Total users

3

Monthly active users

an hour ago

Last modified

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.

InputKeywords, channel links, @handles or UC ids
OutputOne row per video: id, title, watch link, channel name and id, views, age and runtime as YouTube prints them, thumbnail
Ceiling1,000 videos per keyword and per channel
Account neededNone
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 getField
The 11 character video id and the watch linkvideoId, url
Titletitle
Who uploaded itchannelName, channelId
Views, as YouTube prints themviewCountText
How long ago it went up, as YouTube prints itpublishedTimeText
RuntimelengthText
The largest thumbnail on offerthumbnail
Whether a search or a channel produced the rowmode

▶️ How to scrape YouTube videos

  1. Open YouTube Scraper and click Try for free.
  2. Type keywords into Search queries, or paste channels into Channel URLs / handles.
  3. Set Max videos per query / channel. Start at 50 while you look at the output.
  4. Click Start.
  5. 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
}
FieldDefaultWhat it is
searchQueriesnoneKeywords, one per line. Each returns up to maxItems videos. The form opens with lofi hip hop as an example.
channelUrlsnoneChannel 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.
maxItems50Per keyword and per channel, 1 to 1,000. This is also your spend cap.
notionConnector, notionParentIdnoneOptional. Write each video into a Notion database as well as the dataset.
proxyConfigurationApify defaultLeave 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"
}
FieldHow to read it
videoIdUse it as your key across runs.
channelIdCan 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.
thumbnailThe 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.

RowHow to spot itBilled
A videook: trueyes
A diagnosticok: false and an errorCodeno

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.

CodeWhat it means
BAD_INPUTThe keyword or channel could not be used, or the input named neither.
NOT_FOUNDYouTube has no channel at that address.
RATE_LIMITED, SERVER_ERROR, NETWORKThat target would not answer this run. Re-running usually clears it.
NOT_SERVEDThis video was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED.
NO_RESULTSThe run finished with nothing to show.
TIME_LIMITThe 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:

  1. Search a keyword here and copy the url column of the videos you care about.
  2. Paste those links into the Video URLs or IDs box of YouTube Transcript Scraper to get what each video says.
  3. 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 into 88,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 maxItems every 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 wantUse
Keyword search results, or a channel's newest uploadsThis one
A channel's uploads, with a higher ceiling per runYouTube Channel Scraper
Shorts from a channel or a keyword, with exact view and like countsYouTube Shorts Scraper
Videos in a playlistYouTube Playlist Scraper
The most-viewed videos for a topicYouTube Trending Scraper
Comments under a videoYouTube Comments Scraper
What a video says, as text, SRT and VTTYouTube Transcript Scraper
The video, its audio or its subtitles as a fileYouTube 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.

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.