YouTube Scraper - $0.135 per 1,000, No API Key avatar

YouTube Scraper - $0.135 per 1,000, No API Key

Pricing

from $0.14 / 1,000 video returneds

Go to Apify Store
YouTube Scraper - $0.135 per 1,000, No API Key

YouTube Scraper - $0.135 per 1,000, No API Key

Search YouTube or scrape a channel, with no API key. YouTube never gives a real date. It gives "4 years ago", and views as "56,651,173 views". Rows keep those exact strings, next to the videoId, title, URL, channel and thumbnail. 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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

2

Monthly active users

a day ago

Last modified

Share

YouTube Scraper: search results and channel uploads, without an API key

Give it keywords, channels, or both, and you get one flat row per video: id, title, watch link, channel, view count, age, runtime and the largest thumbnail YouTube offers. No Google API key, no OAuth screen, no daily quota to watch.

The part that surprises people on run two: the counts and dates are the strings YouTube renders, not numbers. You get "56,648,381 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
Ceiling1,000 videos per keyword and per channel
Account neededNone from you
Price$0.135 per 1,000 videos, flat on every plan

πŸ” 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 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.
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.

Give it neither keywords nor channels and you get one uncharged row telling you so.

πŸ“€ What you get back

A real row from a real run. This one is a live stream, which is where the string fields show their edges, and the title is cut short because it carries an emoji:

{
"ok": true,
"videoId": "rFZHOHl-L8A",
"title": "lofi hip hop radio ... beats to relax/study to",
"url": "https://www.youtube.com/watch?v=rFZHOHl-L8A",
"channelName": "Lofi Girl",
"channelId": "UCSJ4gkVC6NrvII8umztf0Ow",
"viewCountText": "8,732 watching",
"publishedTimeText": "",
"lengthText": "",
"thumbnail": "https://i.ytimg.com/vi/rFZHOHl-L8A/hq720.jpg?v=6a85616e&sqp=...",
"mode": "search"
}
FieldWhat it is
videoId, urlThe 11 character id, and the canonical watch link. Use videoId as your key across runs.
channelName, channelIdWho uploaded it. channelId can be empty on a search row whose byline is a collaboration.
viewCountText"56,648,381 views" on a normal video, "8,732 watching" on a live stream.
publishedTimeText"4 years ago". Empty on a live stream or a premiere, which has no publish date yet.
lengthText"6:10:58". 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.
modesearch or channel, so you can tell which target produced the row.

🧾 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. BAD_INPUT means the keyword or channel could not be used, BLOCKED and RATE_LIMITED mean YouTube pushed back on that request, SERVER_ERROR is a 5xx, NETWORK means it could not be reached, and NO_RESULTS means the run finished with nothing to show. None of them are charged and the run carries on to the next target.

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.

▢️ How to run it

  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 shape.
  4. Click Start.
  5. Download the dataset as JSON, CSV or Excel, or read it over the Apify API.

πŸ’° How much does it cost?

$0.135 per 1,000 videos. Flat on every Apify plan, no volume tiers.

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 people use it for

  • Watching what ranks for a keyword you care about, then diffing the list next week.
  • Building a channel's back catalogue as rows for a sheet, then enriching only the ones worth it.
  • Finding the videos an audience actually searches for before scripting your own.
  • Feeding video links into the transcript or comments actors, which want ids rather than keywords.

🚧 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, two of them linked below.
  • Paging stops at 60 pages per target, which is what sets the 1,000 row ceiling in practice.
  • 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.

🧭 Which YouTube scraper do you need?

If you wantUse
Keyword search results, or a channel's uploadsThis one
Only a channel's uploads, with a higher per run ceilingYouTube Channel Scraper
Shorts, with exact view and like countsYouTube Shorts Scraper
Every video in a playlistYouTube Playlist Scraper
Comments under a videoYouTube Comments Scraper

❓ Questions people ask

Do I need a YouTube or Google account? No. Nothing here is signed in, and there is no quota.

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 for the scraper to read. channelName is still there.

Can I get exact view counts? Not from a results page. The Shorts actor returns exact view and like counts, because a Short's own page carries them.

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.

Can I run it on a schedule? Yes. Apify's scheduler, or start it from the API and read the dataset when it finishes.

πŸ†˜ 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.