YouTube Search Extractor — No API Key, Duration & Date Filters
Pricing
from $16.00 / 1,000 search runs
YouTube Search Extractor — No API Key, Duration & Date Filters
Search YouTube without an API key. Videos, channels, playlists, Shorts as JSON. Filter by type, duration, or upload date; sort by date or views. $0.02 per search plus $0.005 per 25 results; empty results are never charged.
Pricing
from $16.00 / 1,000 search runs
Rating
0.0
(0)
Developer
Broke to Built
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Give it a search phrase, get back the results YouTube actually shows — video ID, title, watch URL, channel, duration in seconds, view count and publish age. One query or up to 25 in a single run. No API key, no login, no browser.
$0.02 per search run, plus $0.005 per 25 results returned. A query that returns nothing is never charged.
What problem this solves
Getting YouTube search results out of YouTube normally means a Data API key with a daily quota, or a scraper keyed on a renderer name that YouTube silently retires. Both are more setup than the job deserves when all you wanted was the SERP as JSON.
This returns the list as one JSON record per query, built to be called by code and by AI agents rather than clicked.
Common requests this handles
Phrased the way people actually ask, so you — or an AI agent picking a tool — can match on the real requirement rather than the category name:
- "YouTube search to JSON / CSV." Dataset export handles JSON, CSV and Excel.
- "Search YouTube without an API key." No YouTube Data API key, no quota units, no OAuth, no cookies.
- "Get video IDs from a YouTube search."
videoIdand a watch URL are on every video row. - "YouTube search scraper for channels / playlists / Shorts." Set
typetochannel,playlistorshorts. - "Sort YouTube search by date or view count."
sort: "date"or"views"(probed live; a 'rating' sort that other scrapers copy does not actually change YouTube's mix, so it is not offered). - "YouTube search videos under 3 minutes / this week."
durationanduploadDateare YouTube's own chips, probed live — combined protobufs were read from the second chip group, not guessed. The month chip can leak older videos; we send the chip, we do not post-filter. - "Bulk: run a list of search queries at once." Pass up to 25 queries; each becomes its own record, and a query that fails does not stop the others.
- "Feed search results into a transcript or comments pipeline." The output is the input list for our YouTube Transcript Extractor, YouTube Comments Scraper and YouTube Playlist Extractor.
Input
| Field | Type | Required | What it does |
|---|---|---|---|
queries | string[] | yes | Search phrases. Each one becomes its own record |
maxResults | number | no | Stop after this many results per query (default 50, cap 200) |
type | string | no | all · video (default) · channel · playlist · shorts |
sort | string | no | relevance (default) · date · views — applies to video searches when duration and upload date are both Any |
duration | string | no | any (default) · under3 · 3to20 · over20 — YouTube's own length chips, probed live |
uploadDate | string | no | any (default) · today · week · month · year — YouTube's own recency chips. There is no Last-hour chip |
country | string | no | ISO country code sent as YouTube gl (default US) |
language | string | no | YouTube hl (default en) |
maxQueries | number | no | Cap queries processed per run (default 10, max 25) |
{ "queries": ["Automation"], "maxResults": 50, "type": "video" }
What you get back
One record per query:
| Field | Meaning |
|---|---|
query, type, sort, country, language | What was searched |
resultsReturned | How many rows we actually returned |
truncated | true when more results existed than you received |
results[] | position, type, videoId / playlistId / channelId, title, url, channelTitle, channelId, channelHandle, durationSeconds, viewCount, publishedText, thumbnail, isVerifiedChannel, isLive |
Output copied from a real probe, trimmed:
{"query": "Automation","type": "video","resultsReturned": 20,"truncated": true,"results": [{"position": 1,"type": "video","videoId": "WSKi8HfcxEk","title": "The Rise of the Machines – Why Automation is Different this Time","url": "https://www.youtube.com/watch?v=WSKi8HfcxEk","channelTitle": "Kurzgesagt – In a Nutshell","channelId": "UCsXVk37bltHxD1rDPwtNM8Q","durationSeconds": 657,"viewCount": 15017662,"publishedText": "9 years ago","isVerifiedChannel": true}]}
Honest limits
Read these before you buy — they are the things that would otherwise surprise you.
- 200 results per query is this Actor's cap, not YouTube's. InnerTube kept paging past 100 on a live probe (9 pages, 116 videos). We stop at 200 so a run cannot wander. A truncated search comes back with
truncated: truerather than a silently short list. - Playlists in search results are
lockupViewModel, not the old renderer. Code still looking forplaylistRendererreturns an empty playlist list against HTTP 200. This Actor parses the current shape, and alsovideoRenderer,channelRendererandshortsLockupViewModel, so one rename cannot zero the whole SERP. - View counts are as YouTube displays them.
viewCountis parsed from text like"15M views", so it carries that rounding.viewCountTextkeeps the original string. - Duration and upload-date filters are YouTube's chips, not a post-filter.
under3was probed at 10/10 videos under 180 seconds. YouTube's This month chip can still return older videos (a 2-year-old row appeared in the first 10 on 2026-08-27). We send the chip YouTube shows; we do not silently drop rows. sortis ignored when a duration or upload-date filter is set. Those chips replace the sort protobuf. The record'sfiltersIgnoredlists what was dropped.publishedTextis relative ("9 years ago"), because that is what the search surface provides. There is no absolute publish date on this endpoint.- An empty or junk query returns HTTP 200 with few or no rows. That is YouTube's empty SERP, recorded as an error record and not charged.
- Region (
country) changes the SERP.gl=GBandgl=USare different result lists for the same phrase.
Pricing
$0.02 per search successfully run, plus $0.005 per 25 results returned. A 20-result search costs $0.025; a 100-result search costs $0.04.
Two events rather than one flat fee because the search is fixed work and the rows are the variable value — a flat price would either overcharge a 5-result query or undercharge a 200-result one. Queries that error, or that expose no results, are recorded and cost nothing.
Use from code or AI agents
curl -X POST "https://api.apify.com/v2/acts/eliai~youtube-search-extractor/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"queries":["Automation"],"type":"video","maxResults":50}'
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("eliai/youtube-search-extractor").call(run_input={"queries": ["Automation"], "type": "video", "maxResults": 50})for item in client.dataset(run["defaultDatasetId"]).iterate_items():for r in item.get("results", []):print(r["position"], r["title"], r.get("durationSeconds"))
FAQ
Do I need a YouTube API key? No. Nothing to create, no quota to manage.
Does it work on YouTube Data API quotas? It does not use that API at all, so there is no quota to hit.
Can I search for channels only? Yes — "type": "channel". Playlists and Shorts have their own type values.
Why is there no 'rating' sort? The param other scrapers copy (CAE=) was probed on 2026-08-27 and did not change YouTube's result mix. Offering it would have been a silent no-op.
Can I filter by length or how recently it was uploaded? Yes — duration and uploadDate. Those are YouTube's own chips, probed live. Combining both uses YouTube's second-chip protobuf, not a guessed merge. The month chip can leak older videos.
Can I get transcripts of these videos? Not from this Actor — feed results[].videoId into YouTube Transcript Extractor.
What about comments? Feed the same IDs into YouTube Comments Scraper.
Who made this
Built by Broke to Built. Questions or a query that misbehaves: open an issue on the Actor page and include the search phrase.
Changelog
- 2026-08-27 — duration (
under3/3to20/over20) and upload date (today/week/month/year) chips probed live on InnerTube and added. Combined duration×date protobufs read from YouTube's second chip group. Month chip can leak older videos (observed "2 years ago" in a This-month list). Sort is ignored when a duration or date filter is set. No Last-hour chip exists on the live SERP. - 0.1 (2026-08-27) — first release. Parses the current mixed SERP:
videoRendererfor videos,lockupViewModelfor playlists (the oldplaylistRendereris gone),channelRendererfor channels,shortsLockupViewModelfor Shorts shelves. Type filters and date/view sorts probed live on InnerTube before the parser was written.