YouTube Scraper: What the Data API Will Not Give You
The official API allows 100 searches a day and no money raises it. That ceiling, not price, is why YouTube scrapers exist. Here is what each one returns.

Copy this line to your agent to pull YouTube search results with channel stats attached.
set up https://monid.ai/SKILL.md and use apify /streamers/youtube-scraper to search YouTube and return video plus channel metadata
There is one number behind the entire YouTube scraping category and it is not a price. Google's Data API gives a project 100 search.list calls per day, and no amount of money raises that without an audit. Everything else about the official API is generous; that ceiling is what sends people looking for something else. This guide is about what the alternatives actually return, and what you give up by using them, running through Monid, the OpenRouter for agent tools.
What is a YouTube scraper, and why does one exist?
A YouTube scraper reads public YouTube pages and returns structured records for videos, channels, playlists and search results. It exists because the official API is not primarily rate limited by requests per second; it is capped by a daily allowance that assumes you are building a consumer app rather than analysing the platform.
The number that creates the category
Per Google's own quota documentation, read on 2026-08-25, a project gets a default allocation of 100 search.list calls per day, 100 videos.insert calls, and 10,000 units per day shared across every other endpoint.
Read that first figure again. One hundred searches. Not a hundred thousand results, a hundred queries. A monitoring job that checks fifty keywords twice a day has consumed the entire daily allowance before it does anything else. A researcher sampling a topic exhausts it in an afternoon.
The 10,000 unit pool for everything else is comparatively roomy, so fetching known videos and channels is rarely the constraint. Discovery is. That asymmetry is exactly the shape of the problem people bring to a scraper.
What the quota is not
It is worth being precise, because a lot of writing on this topic is not. This is not a paywall with a higher tier. The published route to more quota is an audit and an extension request, judged against your use case, and analytics and research use cases are not what the form is designed around. There is no self serve upgrade button, which is the practical difference between a rate limit and a ceiling.
The second reason: fields per call
Even inside the quota, the official API returns data the way a database returns normalised tables. A search gives you video IDs. Video details are a second call. Channel subscriber counts are a third. Getting one row of the thing an analyst actually wants, a video with its stats and its channel's size, is three round trips and three quota deductions.
📖 See also The Real Cost of Scraping YouTube Yourself
What does the YouTube Data API not give you?
Mostly it is not that the fields are missing, it is that they arrive separately or not in the shape you need. Here is a real response to compare against.
The fields that arrive together
Running apify/streamers/youtube-scraper on the query "crawl4ai tutorial" on 2026-08-25 returned, per video, in a single record: title, id, url, thumbnailUrl, viewCount, date, likes, duration, commentsCount, the full description as text, a hashtags array, and then channelName, channelUrl, channelUsername, channelId and numberOfSubscribers.
That last field is the point. numberOfSubscribers arrives attached to every video row. In the official API it is a separate channels.list call, which means an analysis over a thousand search results costs a thousand extra requests, or a caching layer you now maintain.
The parsed fields nobody advertises
The same response carried descriptionLinks, an array of every URL in the description with its anchor text already extracted. On one of the two videos returned, that array held the creator's chapter timestamps as individual entries with their labels, so the video's table of contents came back structured rather than as a wall of text to regex. The official API returns descriptions as a single string and leaves that to you.
Also present and useful: isMembersOnly, isPaidContent, commentsTurnedOff and isMonetized. Those are moderation and monetisation signals that matter for creator research and are not part of the standard public API surface.
What it costs you to leave the official API
Be clear about the trade rather than pretending there is not one. Scraped data has no service level agreement, no deprecation notice and no support contract. Fields can change shape when YouTube redesigns a page. And you are reading public pages rather than being handed records by the platform, which is a different relationship with different terms, covered properly in our guide on scraping and the law.
Official API vs a scraping endpoint: what actually differs
| Aspect | YouTube Data API | A scraping endpoint |
|---|---|---|
| Search allowance | 100 calls per day | Bounded by what you spend |
| Raising it | Audit and extension request | Nothing to raise |
| Video plus channel stats | Two or three calls | One record |
| Description links | A string you parse | Parsed array |
| Transcripts | Separate, and restricted | Available as an option |
| Stability guarantee | Yes | None |
| Cost | Free inside the quota | Per result or per call |
The honest summary: inside the quota the official API is better, free and safer. The entire question is whether your job fits inside 100 searches a day.
How do you scrape YouTube search results and channels?
Three steps, two of them free.
For agents
Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:
set up https://monid.ai/SKILL.md
It learns the whole discover, inspect, run workflow itself. More in the agent quickstart.
For humans
npm install -g @monid-ai/cli
monid keys add -k <your-api-key> -l main
Step 1. Find the endpoint that matches the job
What it does. Shows which providers cover YouTube and how each one bills, which is the decision in this category.
The endpoints. apify/streamers/youtube-scraper for search and bulk, tikhub channel endpoints for per call lookups.
The call.
monid discover -q "youtube channel videos"
monid inspect -p apify -e /streamers/youtube-scraper
What comes back. A ranked list with provider, price, billing shape and a verified flag, then the full input schema. The Apify actor takes searchQueries or startUrls plus roughly twenty filters: videoType, dateFilter, lengthFilter, sortingOrder, oldestPostDate, hasSubtitles, isLive and more.
What it costs. Nothing.
Step 2. Search, with the limit set low the first time
What it does. Runs a YouTube search and returns full records rather than IDs.
The endpoints. apify/streamers/youtube-scraper, billed per result.
The call.
monid run -p apify -e /streamers/youtube-scraper -w -i '{
"searchQueries": ["crawl4ai tutorial"],
"maxResults": 2,
"videoType": "video",
"sortingOrder": "relevance",
"downloadSubtitles": false
}'
What comes back. The field list from the section above, one record per video, with channel statistics inline.
What it costs. A fraction of a cent per result. The critical detail is in the pricing note that inspect prints: the per result price applies per query, so total results are roughly the number of queries multiplied by the per query limit. Pass one query at a time until you know what a run returns. This is the single most common way a bill in this category surprises somebody.
Step 3. Go per call when you know the channel
What it does. Fetches a known channel's videos without paying per row.
The endpoints. tikhub channel video endpoints, billed per call.
The call.
monid inspect -p tikhub -e /api/v1/youtube/web_v2/get_channel_videos
monid run -p tikhub -e /api/v1/youtube/web_v2/get_channel_videos -w \
--query '{"channel_id": "UCJHBJ7F-nAIlMGolm0Hu4vg", "language_code": "en-US"}'
What comes back. The channel's video list, with a continuation_token for the next page and a need_format flag that returns a cleaned, simplified record instead of the raw structure.
What it costs. A fraction of a cent per call regardless of how many videos come back in the page, which is why this shape wins for deep channel pulls. Note the input is a UC... channel ID rather than an @handle; resolving a handle to an ID is a separate step.
There is a worked end to end version of this pull in Export a YouTube Channel's Videos to CSV in One Run, and the metadata side in Channel Stats and Video Metadata From One Endpoint.
Give this to your agent![]()
Set up https://monid.ai/SKILL.md, and then use Monid to search youtube for the ten most viewed videos about crawl4ai from the last month, and give me title, views, channel and subscriber count as a table.What are the best web scraping APIs for AI agents and automation?
For YouTube specifically the answer is not a vendor, it is a billing shape, and picking the wrong one costs more than picking the wrong vendor.
Per result wins when you do not know how many rows you want
Search is inherently open ended. You asked for videos about a topic; the number that exist is not yours to control. Per result billing matches that: you pay for what came back, and a query that returns nothing costs nothing. This is why the Apify shape fits discovery work.
Per call wins when you know exactly what you are asking for
A specific channel's video list is a bounded request. Paying per row for a channel with eight hundred videos is paying for volume you already knew about. Per call billing turns that into a flat cost per page, and for deep channel pulls the gap is large.
The rule
Discovery bills per result, retrieval bills per call. Route each job to the shape that matches its uncertainty, on one key and one balance, and the cost curve stays flat as the work grows. The general form of that argument, across every category rather than just YouTube, is in The Best Web Scraping API for AI Agents in 2026 and What Is the Best API for Social Media Scraping in 2026?.
Which endpoint should I use for which job?
| Endpoint | What it does | Input | Output | Best for | Billing |
|---|---|---|---|---|---|
apify/streamers/youtube-scraper | Search, channels, playlists, shorts | Queries or URLs plus filters | Video record with channel stats, description links, hashtags | Discovery and bulk | Per result, per query |
tikhub channel videos | One channel's video list | Channel ID | Video list plus continuation token | Deep pulls on known channels | Per call |
apify/dataovercoffee/youtube-channel-business-email-scraper | Contact details from channel pages | Channel URLs | Business emails where public | Creator outreach | Per result |
context.dev/web/search | Finds the channel or video URL first | A query | Ranked URLs | You have a name, not an ID | Per result |
Every row verified with monid inspect on 2026-08-25. Billing shape is what the table states; figures move and current ones are on monid.ai/tools.
Worked through: a weekly competitive scan of fifty search queries at twenty results each is a thousand rows, in single digit dollars. A one time backfill of a four hundred video channel through the per call endpoint is a handful of paged calls and lands in cents. Same platform, same data, an order of magnitude apart, decided entirely by which shape you routed the job to.
When should you use the official YouTube Data API?
Three cases, and the first one covers most projects.
Your job fits in the quota. If you are pulling stats for a fixed list of your own videos, or running a handful of searches a day, use the official API. It is free, it is stable, it has a deprecation policy, and none of the arguments in this article apply to you. The videos.list and channels.list pool of 10,000 units is genuinely large.
You need write access. Uploading, playlist management, comment moderation on your own channel. No scraper does this and none should.
You need contractual stability. If a broken field is a production incident with a customer on the other end, an unofficial source is the wrong dependency, and that is true regardless of who sells it.
There is also a case for going to a specialist rather than a marketplace. If YouTube is the entirety of your product and you need very deep coverage of one surface, a vendor who does only that will out-cover a general catalog. Per call access through a catalog is optimised for the opposite: many platforms, unpredictable volume, no contract per vendor.
And to state the bias plainly, this is Monid's blog and we sell per call access to tools. The argument we make best is the one where the job does not fit the free quota and does not justify a contract. Inside the quota, Google's API wins and we would rather say so than have you find out.
Conclusion
The reason YouTube scrapers exist is a single line in Google's quota documentation: 100 search calls per day. Everything downstream, the vendors, the pricing debates, the roundups, is a response to that ceiling. So the first question is not which scraper, it is whether your work fits in a hundred searches. If it does, stop reading and use the official API.
If it does not, the choice that matters is the billing shape rather than the brand. Discovery is open ended and belongs on per result billing. Retrieval from a known channel is bounded and belongs on per call. Getting that routing right is worth more than any per row price difference between vendors, and it is the thing every comparison article leaves out.
Free next step: run monid discover -q "youtube channel videos" and monid inspect the top two results. Both are free, and you will see the real schemas and prices before spending anything. Start at monid.ai.
FAQ
How do you scrape YouTube comments?
Comments are a separate job from video metadata and usually a separate endpoint, because the volume profile is completely different: one video can carry tens of thousands of comments, so comment endpoints almost always bill per result. The official API does return comments inside the 10,000 unit pool, which makes it a reasonable choice for a modest number of videos. Reach for a scraper when you need every comment on a large set of videos, and set a per video cap before the first run.
How do you scrape YouTube transcripts and subtitles?
The Apify actor above takes downloadSubtitles, subtitlesLanguage, subtitlesFormat and preferAutoGeneratedSubtitles, so transcripts come back in the same run as the metadata rather than as a second pipeline. Turning subtitles on changes the size and cost of the run substantially, so treat it as a separate job with its own budget. We covered the retrieval side of this, including chunking transcripts with timestamps so a model can cite the exact moment, in YouTube Transcript API for RAG and compared it against the free workarounds in Free YouTube Transcript Hacks vs a Reliable API.
How do you scrape YouTube channel emails?
Some creators publish a business email on their channel's about page, and there is a dedicated actor for collecting the ones that are public. Two caveats worth stating plainly: coverage is limited to channels that chose to publish an address, so a run over a hundred channels will not return a hundred emails, and a published business address carries expectations about what it is for. Contacting creators is a legitimate use; bulk unsolicited sending is a good way to burn a sending domain.
How do you scrape YouTube with Python?
The same way you would call any HTTP API, which is the point: the Python part is not the hard part, and libraries like yt-dlp or pytube solve extraction while leaving you the access problem. Call an endpoint from Python and keep whatever analysis code you already have. There is a fuller version of that argument, with the subprocess pattern, in Web Scraping in Python Without Maintaining a Scraper, and a worked research example in I Summarized 500 YouTube Videos Without Watching One.
Last updated August 2026.


