YouTube Search Extractor — No API Key, Duration & Date Filters avatar

YouTube Search Extractor — No API Key, Duration & Date Filters

Pricing

from $16.00 / 1,000 search runs

Go to Apify Store
YouTube Search Extractor — No API Key, Duration & Date Filters

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

Broke to Built

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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." videoId and a watch URL are on every video row.
  • "YouTube search scraper for channels / playlists / Shorts." Set type to channel, playlist or shorts.
  • "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." duration and uploadDate are 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

FieldTypeRequiredWhat it does
queriesstring[]yesSearch phrases. Each one becomes its own record
maxResultsnumbernoStop after this many results per query (default 50, cap 200)
typestringnoall · video (default) · channel · playlist · shorts
sortstringnorelevance (default) · date · views — applies to video searches when duration and upload date are both Any
durationstringnoany (default) · under3 · 3to20 · over20 — YouTube's own length chips, probed live
uploadDatestringnoany (default) · today · week · month · year — YouTube's own recency chips. There is no Last-hour chip
countrystringnoISO country code sent as YouTube gl (default US)
languagestringnoYouTube hl (default en)
maxQueriesnumbernoCap queries processed per run (default 10, max 25)
{ "queries": ["Automation"], "maxResults": 50, "type": "video" }

What you get back

One record per query:

FieldMeaning
query, type, sort, country, languageWhat was searched
resultsReturnedHow many rows we actually returned
truncatedtrue 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: true rather than a silently short list.
  • Playlists in search results are lockupViewModel, not the old renderer. Code still looking for playlistRenderer returns an empty playlist list against HTTP 200. This Actor parses the current shape, and also videoRenderer, channelRenderer and shortsLockupViewModel, so one rename cannot zero the whole SERP.
  • View counts are as YouTube displays them. viewCount is parsed from text like "15M views", so it carries that rounding. viewCountText keeps the original string.
  • Duration and upload-date filters are YouTube's chips, not a post-filter. under3 was 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.
  • sort is ignored when a duration or upload-date filter is set. Those chips replace the sort protobuf. The record's filtersIgnored lists what was dropped.
  • publishedText is 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=GB and gl=US are 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 ApifyClient
client = 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: videoRenderer for videos, lockupViewModel for playlists (the old playlistRenderer is gone), channelRenderer for channels, shortsLockupViewModel for Shorts shelves. Type filters and date/view sorts probed live on InnerTube before the parser was written.