YouTube Search Scraper & Channel Contact Links avatar

YouTube Search Scraper & Channel Contact Links

Pricing

from $2.99 / 1,000 results

Go to Apify Store
YouTube Search Scraper & Channel Contact Links

YouTube Search Scraper & Channel Contact Links

Turn YouTube search results into structured data. This scraper extracts videos, titles, channels, views, thumbnails, and links from keyword searches, helping you analyze trends and build video datasets quickly.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

Scrape YouTube search results and keep the two things most YouTube search scrapers throw away: the complete video description with every link in it, and the channel About page behind each result — subscribers, country, joined date, and the channel's real external link list.

Most search scrapers truncate descriptions at a few hundred characters and either skip channel contact data entirely or emit it as a hardcoded empty array. This actor extracts links from the full, untruncated description (measured: one real result had 29 links in its description with zero of them inside the first 500 characters) and fetches each unique channel's About page once per run, regardless of how many search results came from that channel.

It's an Apify actor that searches YouTube by keyword (or accepts direct video/channel URLs) and returns each result enriched with a full contact-and-link surface. Every URL and email in the description is extracted and classified by destination host, on the complete text — not a truncated preview. Each unique channel behind the results gets its About page fetched once and cached, adding subscriber count, country, joined date, description, and the channel's actual declared links (channelLinks[]), which many implementations either skip or emit as an empty placeholder despite having parsed the data. Videos and movies use a full per-video extraction tier (residential-proxy priced); channel and playlist results use a cheaper flat tier since they don't carry a video description to extract.

FieldDescription
title / url / id / typeResult identity and kind (video, channel, playlist, movie).
textThe complete video description — untruncated by default.
descriptionLinkCount / descriptionLinks / descriptionLinkHosts / descriptionLinksDetailedEvery URL in the full description, extracted before any optional truncation, classified by destination host.
descriptionEmailsEmail addresses found in the description text.
channelName / channelUrl / channelUsername / channelIdChannel identity.
channelAboutStatus"ok", "failed", "disabled", "budgetExhausted", or "notApplicable" — always states why About data is or isn't present.
channelLinkCount / channelLinks / channelLinksDetailedThe channel's own declared links from its About page, fetched once per unique channel.
channelCountry / channelJoinedDate / numberOfSubscribers / channelViewCount / channelVideoCount / channelDescriptionChannel profile data.
date / duration / viewCount / likes / commentsCount / commentsTurnedOffStandard video engagement fields.

Why not build this yourself?

Full per-video extraction (needed to get the complete description) was measured returning 0 rows with a "Sign in to confirm you're not a bot" block on a datacenter IP, and 3/3 successes on a residential proxy — this actor makes that substitution a visible, logged decision (forceResidentialForFullExtraction) rather than a silent one, and estimates the residential-traffic cost up front (~0.6MB per video row) so you're not surprised by usage. It also de-duplicates channel About lookups per unique channel across an entire run — 10 results from one creator cost exactly 1 About fetch, not 10 — which is the difference between an affordable run and an expensive one on any search returning results clustered around a few channels.

Two honest, disclosed defaults worth knowing: resultsPerTerm defaults to a conservative 5 specifically because of the residential-proxy cost of full extraction, and maxChannelAboutLookups defaults to 10 — rows beyond that ceiling still emit with channelAboutStatus: "budgetExhausted" rather than a fabricated value, so you always know why a row lacks channel data.

  • Influencer/UGC outreach teams — search a niche keyword and get every result's creator contact links in the same pass, filtered to only results that actually carry a link with onlyResultsWithLinks.
  • Brand and competitive research — pull every link a set of creators has placed in recent video descriptions (sponsor links, affiliate links, socials) for market mapping.
  • Content researchers — get full untruncated descriptions for text analysis, not a 500-character preview that cuts off mid-link.
  • Growth marketers — sort by view count or upload date (verified: viewCount sort shared only 2/6 result IDs with relevance sort) to find genuinely different result sets for the same keyword.

🔼 Input sample

ParameterRequiredTypeDescriptionExample
searchTermsNoarraySearch terms, one per line. Base key queries also accepted.["mkbhd smartphone review"]
startUrlsNoarrayDirect video or channel URLs, in addition to search terms. Base key urls also accepted.["https://www.youtube.com/@mkbhd"]
resultsPerTermNointegerResults per term (1-2000). Common pitfall: full descriptions require per-video extraction, measured at ~0.6MB of residential proxy traffic per row — 100 results ≈ 60MB. Default 5 is deliberately conservative. Base key maxResults also accepted.5
resultOrderNostringrelevance, date, viewCount, rating, encoded as YouTube's real sp= parameter. Verified to genuinely change results. Base key sortBy also accepted."viewCount"
publishedWithinNostringTime window: lastHour, today, thisWeek, thisMonth, thisYear. Base key uploadDate also accepted."thisMonth"
videoLengthNostringshort (under 4 min), medium (4-20 min), long (over 20 min). Base key duration also accepted."medium"
resultKindNostringvideo, channel, playlist, movie. Videos/movies use full extraction (residential-priced); channels/playlists use the cheap flat tier. Base key type also accepted. Default "video"."video"
includeChannelAboutNobooleanFetch each unique channel's About page once per run for subscribers, country, joined date and real links. Default true.true
maxChannelAboutLookupsNointegerHard ceiling on About fetches per run, after de-duplication. Rows beyond it get channelAboutStatus: "budgetExhausted" instead of invented data. 0 = no ceiling. Default 10.10
descriptionMaxCharsNointeger0 = keep complete description (default). Links are always extracted from the full text before any truncation.0
onlyResultsWithLinksNobooleanDrop results with no description link and no channel About link. Uncharged, excluded from output. Default false.true
proxyConfigurationNoobjectUsed for channel About pages and, unless overridden below, for search too. Default RESIDENTIAL.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}
forceResidentialForFullExtractionNobooleanON: video/movie searches always use RESIDENTIAL regardless of your proxy choice, logged plainly. OFF: your choice is used as-is — expect bot checks on datacenter IPs. Default true.true
verboseLogsNobooleanDetailed About-fetch failure logging and un-suppressed yt-dlp warnings. Base key debug also accepted. Default false.false
{
"searchTerms": ["home espresso machine review"],
"resultsPerTerm": 5,
"includeChannelAbout": true,
"onlyResultsWithLinks": true
}

🔽 Output sample

{
"type": "video",
"title": "Example Espresso Machine Review",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"channelName": "Example Coffee Channel",
"channelUrl": "https://www.youtube.com/@examplecoffee",
"descriptionLinkCount": 4,
"descriptionLinkHosts": ["amazon.com", "instagram.com"],
"descriptionEmails": ["business@examplecoffee.com"],
"channelAboutStatus": "ok",
"channelLinkCount": 3,
"channelLinks": ["https://examplecoffee.com", "https://instagram.com/examplecoffee"],
"channelCountry": "United States",
"numberOfSubscribers": 84200,
"viewCount": 152000,
"text": "Full untruncated video description text with all links preserved..."
}

▶️ Want to try other scrapers?

ActorWhat it does
youtube-playlist-scraper-with-creator-contact-linksScrape playlists with creator contact links.
youtube-channel-keyword-research-scraperResearch channels by keyword and SEO signal.
youtube-video-details-comments-scraperGet video details and comments.

How to extract YouTube search results and channel contacts programmatically

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("SimpleAPI/youtube-search-scraper-channel-contact-links").call(run_input={
"searchTerms": ["home espresso machine review"],
"resultsPerTerm": 5,
"onlyResultsWithLinks": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["channelName"], item.get("channelLinks"), item.get("descriptionEmails"))

Every run's dataset can also be exported straight to JSON, CSV, Excel or an API endpoint from the Apify Console — no code needed for a one-off pull.

Scraping publicly accessible data — including public search results and channel About pages — is generally lawful in the US under the precedent set in hiQ Labs v. LinkedIn, which held that scraping data not gated behind a login does not violate the Computer Fraud and Abuse Act. This actor reads only public YouTube content, with no login required. Because this actor surfaces contact links and emails tied to identifiable channel owners, GDPR (EU) and CCPA (California) apply to what you do with that output — review your legal basis before using extracted contacts for outreach, especially at scale.

❓ FAQ

Why does full video extraction need a residential proxy? It was measured directly: video/movie searches with per-video extraction returned 0 rows and a "Sign in to confirm you're not a bot" block on a datacenter IP, and succeeded 3/3 times on residential. forceResidentialForFullExtraction makes this substitution a visible, logged decision by default rather than a silent one.

Why is the default resultsPerTerm only 5? Full description extraction costs roughly 0.6MB of residential proxy traffic per video row — the default is deliberately conservative so a first run doesn't burn unexpected proxy usage. Raise it once you know your expected volume.

How does channel About de-duplication work? Each unique channel's About page is fetched once per run and cached — 10 search results from the same creator cost exactly 1 About lookup, not 10.

What does channelAboutStatus: "budgetExhausted" mean? It means maxChannelAboutLookups was hit before this channel's turn — the row still ships with all its video/search fields, just without channel enrichment, rather than silently guessing at the missing data.

Why is the description never truncated by default? Because links can appear anywhere in a long description — one measured real-world result had 29 links with none inside the first 500 characters. Set descriptionMaxChars above 0 only if you specifically want shorter text; links are still extracted from the full text regardless.

What's the difference between the "full" and "flat" extraction tiers? Video and movie results get full per-video extraction (complete description, all engagement fields) because that's where the description-link surface lives. Channel and playlist results use a cheap flat tier since they have no video description to extract — channel results still get full About enrichment.

How is this different from other YouTube search scrapers on Apify? As observed on the Apify Store on 2026-07-26, other YouTube search/contact scrapers we reviewed either truncate descriptions at a few hundred characters or return a channel-links field that's technically present but empty. This actor extracts from the complete text and fills the channel-links field with real, deduplicated data.

Conclusion

YouTube Search Scraper & Channel Contact Links turns a keyword search into a full contact-surface sweep — complete descriptions, every link classified, and each channel's real declared contacts, fetched efficiently once per creator.