YouTube Keyword Research - Autocomplete & Competition Score
Pricing
from $10.00 / 1,000 keyword scoreds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 days ago
Last modified
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
| Field | Type | Default | Notes |
|---|---|---|---|
seeds | array of strings | ["ai tools", "home gym"] | 1–25 seed topics. Lowercased and deduplicated. |
apiKey | string (secret) | empty | Your own YouTube Data API v3 key. Empty = keyword list only, no scores. |
expansionLevel | basic / standard / deep | standard | Autocomplete queries per seed: 1 / 14 / 40. |
regionCode | string | US | Two-letter ISO 3166-1 code. Sets autocomplete gl and the API's regionCode. |
language | string | en | Two-letter ISO 639-1 code. Sets autocomplete hl and the API's relevanceLanguage. |
maxScoredKeywords | integer | 20 | 1–500. How many keywords get the full profile. ~102 API quota units each. |
maxKeywords | integer | 200 | 1–5000. Hard cap on total records saved, scored and unscored combined. |
includeUnscoredKeywords | boolean | true | Off = only fully scored keywords are saved. |
topResultsPerKeyword | integer | 25 | 5–50. How many top results each competition profile is computed over. No extra quota cost. |
smallChannelMaxSubscribers | integer | 100000 | 100–100,000,000. Below this, a ranking channel counts as "small". |
proxyConfiguration | object | { "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:
| Seeds | Level | Queries sent | Unique keywords found |
|---|---|---|---|
2 (ai tools, home gym) | standard | 28 | 286 |
1 (ai video editing) | deep | 40 | 417 |
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
| Field | Meaning |
|---|---|
keyword | The autocomplete suggestion, verbatim. |
seed | Which of your seeds it came from. |
searchUrl | YouTube search page for this keyword — the fastest way to sanity-check a score. |
suggestRank | Best position the keyword held in an autocomplete list (1 = first). |
suggestHits | How many of your expansion queries surfaced it. Repeats mean broader demand. |
suggestProminence | 0–1 blend of suggestRank and suggestHits. |
discoveredFrom | The expansion query that first surfaced it. |
scored | Whether the competition profile was computed. |
analyzedResults | How many top results the profile is based on. |
estimatedResultCount | YouTube's own estimate of matching videos. Rough — see limitations. |
medianTopViews | Median view count across the analysed top results. The demand signal. |
medianTopSubscribers | Median subscriber count of the channels holding those slots. |
smallChannelShare | 0–1 share of ranking channels under smallChannelMaxSubscribers. |
smallChannelCount | Count behind that share. |
channelsWithKnownSubscribers | Denominator — channels that hide their subscriber count are excluded. |
medianUploadAgeDays | Median age of the ranking videos. Old = a stale page you can displace. |
medianEngagementRate | Median (likes + comments) / views of the ranking videos. |
topVideoTitle / topVideoUrl / topChannelTitle / topChannelSubscribers | The current #1 result. |
demandScore / competitionScore / opportunityScore | 0–100. See below. |
opportunityLabel | excellent ≥ 70, good ≥ 60, fair ≥ 45, otherwise poor. |
scoreNote | Why 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.
| Run | Result | Cost |
|---|---|---|
| Defaults, no API key | 200 keywords, no scores | $0.20 |
| Defaults, with API key | 20 scored + 180 unscored | $0.38 |
With API key, includeUnscoredKeywords: false | 20 scored only | $0.20 |
deep, 1 seed, 90 scored, unscored off | 90 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.listcosts 100 quota units per keyword and the default free quota is 10,000/day.maxScoredKeywordsaccepts 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 ascoreNote— 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.
suggestRankandsuggestHitsare ordering signals from YouTube's own suggestion ranking;medianTopViewsis the closest thing to a demand measurement available, and that is whatdemandScoremostly uses. If a tool quotes you an exact YouTube "search volume" number, it is modelled, not measured. estimatedResultCountis unreliable. It is YouTube's owntotalResultsestimate, 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. UsemedianTopViewsandsmallChannelShare.- 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/languagematerially change both the suggestions and the ranking sets. A keyword that looks open inUSmay be saturated inGB. Run each market separately. - Channels can hide subscriber counts. Those channels are excluded from
medianTopSubscribersandsmallChannelShare;channelsWithKnownSubscriberstells 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.
Legal
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.