YouTube Keyword Research - Autocomplete & Competition Score avatar

YouTube Keyword Research - Autocomplete & Competition Score

Pricing

from $10.00 / 1,000 keyword scoreds

Go to Apify Store
YouTube Keyword Research - Autocomplete & Competition Score

YouTube Keyword Research - Autocomplete & Competition Score

Expands seed topics into YouTube autocomplete keywords and scores each for demand, competition and opportunity via the official YouTube Data API v3: median views of top results, ranking channel size, small-channel share and upload age.

Pricing

from $10.00 / 1,000 keyword scoreds

Rating

0.0

(0)

Developer

Mikkel Bech-Hansen

Mikkel Bech-Hansen

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

19 days ago

Last modified

Categories

Share

Give this actor a few seed topics. It expands each one against YouTube's own search autocomplete — the suggestions that drop down when you type in the YouTube search box — and deduplicates everything into a keyword list. Then, for as many of those keywords as you allow, it looks at the top YouTube search results through the official YouTube Data API v3 and works out how hard each keyword actually is to rank for: the median view count of the top results, how big the channels that hold those slots are, what share of them are small channels, and how old the ranking videos are. Each keyword comes back with those raw numbers plus a demand score, a competition score, and a composite opportunity score from 0 to 100.

The keyword list works with no configuration and no API key. The scores need a free YouTube Data API v3 key of your own, which you paste into the apiKey input.

What a first run does

Press Start with the defaults and you get roughly 200 deduplicated autocomplete keywords for the seeds ai tools and home gym, with each keyword's autocomplete rank, how many expansion queries surfaced it, and a direct YouTube search link. No key, no signup, no proxy.

Add a YouTube Data API v3 key and the same run also scores the 20 most prominent keywords (configurable) with the full competition profile.

Input

FieldTypeDefaultNotes
seedsarray of strings["ai tools", "home gym"]1–25 seed topics. Lowercased and deduplicated.
apiKeystring (secret)emptyYour own YouTube Data API v3 key. Empty = keyword list only, no scores.
expansionLevelbasic / standard / deepstandardAutocomplete queries per seed: 1 / 14 / 40.
regionCodestringUSTwo-letter ISO 3166-1 code. Sets autocomplete gl and the API's regionCode.
languagestringenTwo-letter ISO 639-1 code. Sets autocomplete hl and the API's relevanceLanguage.
maxScoredKeywordsinteger201–500. How many keywords get the full profile. ~102 API quota units each.
maxKeywordsinteger2001–5000. Hard cap on total records saved, scored and unscored combined.
includeUnscoredKeywordsbooleantrueOff = only fully scored keywords are saved.
topResultsPerKeywordinteger255–50. How many top results each competition profile is computed over. No extra quota cost.
smallChannelMaxSubscribersinteger100000100–100,000,000. Below this, a ranking channel counts as "small".
proxyConfigurationobject{ "useApifyProxy": false }Off by default. Turn on datacenter proxy if autocomplete starts rate-limiting you.

How many keywords do you get?

Autocomplete returns roughly 10–14 suggestions per query, with heavy overlap between modifier queries. Measured on live runs at the time of writing:

SeedsLevelQueries sentUnique keywords found
2 (ai tools, home gym)standard28286
1 (ai video editing)deep40417

Output

One record per keyword. Scored keywords come first, highest opportunityScore at the top, then the unscored ones — ordered by autocomplete prominence within each seed, taken round-robin across your seeds so one noisy seed cannot crowd out the others.

A scored record:

{
"keyword": "ai tools for video editing",
"seed": "ai tools",
"regionCode": "US",
"language": "en",
"searchUrl": "https://www.youtube.com/results?search_query=ai%20tools%20for%20video%20editing",
"suggestRank": 2,
"suggestHits": 2,
"suggestProminence": 0.67,
"discoveredFrom": "ai tools",
"scored": true,
"demandScore": 80.6,
"competitionScore": 48.7,
"opportunityScore": 65.9,
"opportunityLabel": "good",
"analyzedResults": 25,
"estimatedResultCount": 1000000,
"medianTopViews": 128000,
"medianTopSubscribers": 47500,
"smallChannelShare": 0.68,
"smallChannelCount": 17,
"channelsWithKnownSubscribers": 25,
"medianUploadAgeDays": 412,
"medianEngagementRate": 0.0341,
"topVideoTitle": "I Tested 12 AI Video Editors So You Don't Have To",
"topVideoUrl": "https://www.youtube.com/watch?v=XXXXXXXXXXX",
"topChannelTitle": "Example Creator",
"topChannelSubscribers": 214000,
"scoreNote": null,
"scrapedAt": "2026-08-21T23:32:29.198Z"
}

An unscored record — this is exactly what a default, keyless run produces:

{
"keyword": "ai tools for video editing",
"seed": "ai tools",
"regionCode": "US",
"language": "en",
"searchUrl": "https://www.youtube.com/results?search_query=ai%20tools%20for%20video%20editing",
"suggestRank": 2,
"suggestHits": 2,
"suggestProminence": 0.67,
"discoveredFrom": "ai tools",
"scrapedAt": "2026-08-21T23:32:29.198Z",
"scored": false,
"opportunityScore": null,
"opportunityLabel": null,
"demandScore": null,
"competitionScore": null,
"medianTopViews": null,
"medianTopSubscribers": null,
"smallChannelShare": null,
"medianUploadAgeDays": null,
"topVideoTitle": null,
"topVideoUrl": null,
"scoreNote": "Not scored: no 'apiKey' was supplied, so only the autocomplete keyword itself was collected."
}

Field reference

FieldMeaning
keywordThe autocomplete suggestion, verbatim.
seedWhich of your seeds it came from.
searchUrlYouTube search page for this keyword — the fastest way to sanity-check a score.
suggestRankBest position the keyword held in an autocomplete list (1 = first).
suggestHitsHow many of your expansion queries surfaced it. Repeats mean broader demand.
suggestProminence0–1 blend of suggestRank and suggestHits.
discoveredFromThe expansion query that first surfaced it.
scoredWhether the competition profile was computed.
analyzedResultsHow many top results the profile is based on.
estimatedResultCountYouTube's own estimate of matching videos. Rough — see limitations.
medianTopViewsMedian view count across the analysed top results. The demand signal.
medianTopSubscribersMedian subscriber count of the channels holding those slots.
smallChannelShare0–1 share of ranking channels under smallChannelMaxSubscribers.
smallChannelCountCount behind that share.
channelsWithKnownSubscribersDenominator — channels that hide their subscriber count are excluded.
medianUploadAgeDaysMedian age of the ranking videos. Old = a stale page you can displace.
medianEngagementRateMedian (likes + comments) / views of the ranking videos.
topVideoTitle / topVideoUrl / topChannelTitle / topChannelSubscribersThe current #1 result.
demandScore / competitionScore / opportunityScore0–100. See below.
opportunityLabelexcellent ≥ 70, good ≥ 60, fair ≥ 45, otherwise poor.
scoreNoteWhy a keyword was not scored, when it wasn't.

How the scores are calculated

Deliberately simple and fully reproducible from the raw fields, so you can re-weight it yourself if you disagree with the weights.

suggestProminence = clamp01( 0.6 × clamp01( (20 − (suggestRank − 1)) / 20 )
+ 0.4 × clamp01( (suggestHits − 1) / 4 ) )
demandScore = 100 × clamp01( 0.75 × log10(1 + medianTopViews) / 6
+ 0.25 × suggestProminence )
competitionScore = 100 × clamp01( 0.40 × log10(1 + medianTopSubscribers) / 6
+ 0.40 × (1 − smallChannelShare)
+ 0.20 × clamp01(1 − medianUploadAgeDays / 540) )
opportunityScore = clamp01( (demandScore − competitionScore + 100) / 200 ) × 100

Demand and competition are built from disjoint signals on purpose — demand from how much audience the topic pulls, competition from how entrenched the incumbents are — so they do not cancel out. opportunityScore of 50 is neutral: demand and competition are balanced. Above 60 means real audience with beatable incumbents.

The score is a judgement call, not ground truth. Every input to it ships in the same record, so if you think upload age matters more than subscriber size for your niche, rescore from the raw columns.

Cost

Pay-per-event: $0.01 per scored keyword, $0.001 per unscored keyword returned.

RunResultCost
Defaults, no API key200 keywords, no scores$0.20
Defaults, with API key20 scored + 180 unscored$0.38
With API key, includeUnscoredKeywords: false20 scored only$0.20
deep, 1 seed, 90 scored, unscored off90 scored only$0.90

Set a maximum charge on the run and the actor stops cleanly inside it — it checks the remaining budget before every charge, and before spending your YouTube API quota, so it never scores keywords it cannot deliver.

The YouTube Data API quota is your cost, not a charge from this actor: scoring one keyword uses about 102 units of the 10,000 units/day a fresh Google Cloud project gets for free — roughly 90–95 scored keywords per day per key. The autocomplete half uses no quota at all.

Limitations — please read before your first run

  • Scores need your own API key. There is no way around this: YouTube Data API quota is per-project and the actor cannot supply one for you. Without a key you get the keyword list and nothing else. Getting a key is free and takes about two minutes (console.cloud.google.com → Create credentials → API key → enable "YouTube Data API v3").
  • ~90 scored keywords per day, per key. search.list costs 100 quota units per keyword and the default free quota is 10,000/day. maxScoredKeywords accepts up to 500, but anything above ~90 will exhaust a default-quota key partway through. When that happens the run keeps everything it scored before the wall and marks the rest with a scoreNote — it degrades, it does not throw the run away.
  • Autocomplete is not search volume. YouTube does not publish per-keyword search volume, and neither does this actor, and neither does anyone else honestly. suggestRank and suggestHits are ordering signals from YouTube's own suggestion ranking; medianTopViews is the closest thing to a demand measurement available, and that is what demandScore mostly uses. If a tool quotes you an exact YouTube "search volume" number, it is modelled, not measured.
  • estimatedResultCount is unreliable. It is YouTube's own totalResults estimate, which is frequently a round number like 1,000,000 regardless of the query. It is included for completeness; do not build decisions on it. Use medianTopViews and smallChannelShare.
  • The autocomplete endpoint is undocumented. It is the same public endpoint the YouTube search box uses, it needs no key and no login, and it has been stable for years — but Google can change or throttle it without notice. The actor retries with backoff and fails loudly rather than returning a silently empty dataset. If your IP gets rate-limited, switch on Apify Proxy in proxyConfiguration.
  • Results are country- and language-specific. regionCode/language materially change both the suggestions and the ranking sets. A keyword that looks open in US may be saturated in GB. Run each market separately.
  • Channels can hide subscriber counts. Those channels are excluded from medianTopSubscribers and smallChannelShare; channelsWithKnownSubscribers tells you how many were actually counted. If every channel on a keyword hides its count, the competition score falls back to a neutral assumption for that component.
  • A snapshot, not a trend. One run is one day's ranking set. Opportunity moves. Schedule the run weekly against the same seeds if you want to see a keyword opening up.
  • It does not touch private data. No comments, no user profiles, no logged-in data — only public search suggestions and public video/channel statistics.

Not affiliated with, endorsed by, or sponsored by YouTube or Google LLC. "YouTube" is a trademark of Google LLC.

This actor gets its data two ways, with different terms attached to each.

Search autocomplete comes from clients1.google.com/complete/search, the public, undocumented endpoint behind YouTube's search box. No key, no login and no access control is involved, and the suggestions are what any visitor sees when typing. Even so: Google's and YouTube's Terms of Service very likely restrict automated or programmatic access to their services regardless of whether the data is public, and using this actor may not comply with those terms. "Publicly visible" and "permitted by the Terms of Service" are different questions. You are responsible for your own compliance and for what you do with the data.

Competition metrics come from the official YouTube Data API v3, called with your API key under your Google Cloud project. That means you — not the operator of this actor — are the developer bound by the YouTube API Services Terms of Service and the YouTube API Services Developer Policies. Things worth knowing before you store the output:

  • Stored YouTube API data generally must be refreshed or deleted within 30 days. Treat this actor's dataset as a snapshot with an expiry date, not a permanent archive.
  • The policies require attribution to YouTube where API data is displayed, and prohibit using API data to build a substitute for, or replicate the experience of, YouTube.
  • Aggregating API data into public metrics or reselling it can require separate permission from Google. Read the policies before you publish or resell anything derived from this output.

Read those terms yourself and use the data accordingly. Nothing here is legal advice.