Competitor Keyword Research - See Any Site's Ranked Keywords
Pricing
from $2.50 / 1,000 per delivered keywords
Competitor Keyword Research - See Any Site's Ranked Keywords
See every keyword any competitor ranks for in Google - volume, difficulty, intent & traffic value - plus the keyword gap vs your own domain. Live native SEO data, no scraping, no broken tools. Semrush & Ahrefs alternative - pay per keyword, no subscription.
Pricing
from $2.50 / 1,000 per delivered keywords
Rating
0.0
(0)
Developer
Dawid S
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Competitor Keyword Research — See Any Site's Ranked Keywords (+ Keyword Gap) · Semrush / Ahrefs Alternative API
Paste any competitor's domain → get every keyword it ranks for in Google, each with search volume, keyword difficulty, search intent, exact ranking position, ranking URL and estimated traffic value. Then flip to keyword-gap mode to see exactly where a competitor ranks and you don't — your content roadmap, ranked by opportunity.
Built on live native SEO data straight from Google's index — not a scrape of a third-party SEO tool. That's the whole point: tools that scrape Ahrefs/Semrush dashboards break the moment the dashboard changes and risk being shut off. This pulls the data natively, so your runs don't silently die.
Pay per keyword. No subscription. No seat. No login. A full 1,000-keyword competitor teardown costs about the price of a coffee.
⚡ Quick Start — try in 30 seconds
- Click Try for free.
- Leave the prefilled input (
target: "ahrefs.com"), or paste any domain you want to dissect. - Start → in seconds you get a clean table of the keywords that domain ranks for.
{ "target": "ahrefs.com", "maxKeywords": 100 }
Want the gap vs your own site? Add one field:
{ "mode": "gap", "target": "ahrefs.com", "compareToDomain": "yourdomain.com", "maxKeywords": 500 }
🎯 What this actor does
Two jobs, one actor:
Mode A — Ranked keywords (default)
Input a domain → every keyword it ranks for in Google organic, with the full picture per keyword: volume, keyword difficulty (0–100), search intent, the exact position it holds, the page that ranks, and the estimated traffic that keyword sends. Sort/filter to find a competitor's biggest organic assets in minutes.
Mode B — Keyword gap
Input a competitor and your own domain → the shared keyword universe with both domains'
positions side by side, plus a gap_type on every row:
gap_type | meaning | what to do |
|---|---|---|
missing | they rank, you don't appear | net-new content opportunity |
weaker | you rank, but below them | optimize / build links |
stronger | you outrank them | defend, monitor |
tied | same position bracket | push for the edge |
Filter to missing + low difficulty + high volume = a prioritized content roadmap, generated from
real ranking data instead of guesswork.
💰 Pricing — pay per keyword, no subscription
You're charged per keyword delivered, on success only. Empty results and failed runs cost nothing. Apify automatically discounts the per-keyword price on higher plans (Bronze → Gold).
| What you run | Keywords delivered | Approx. cost (Gold) |
|---|---|---|
| Quick competitor peek | 100 | ~$0.25 |
| Standard competitor report | 1,000 | ~$2.50 |
| Deep teardown | 3,000 | ~$7.50 |
| Keyword-gap (you vs them) | 1,000 | ~$2.50 |
Compare that to a Semrush/Ahrefs seat (subscription, from ~$100+/mo, login required). Here there's no seat and no monthly commitment — run a teardown when you're pitching a client or planning a quarter, pay for exactly those keywords, done.
Cost control: every run is hard-capped (
maxKeywords, default 250, max 5,000) so a single run can never run away with your credits.
🆚 How this compares
vs. Ahrefs / Semrush / Moz (the SaaS dashboards)
Same core data — the keywords a domain ranks for + the gap vs yours — but pay-per-scan instead of a monthly seat, delivered as clean JSON over an API (and MCP), ready to drop into a sheet, a pipeline, or an AI agent. No login, no per-seat pricing, no UI to click through.
vs. other Apify "SEO scraper" actors
Most competing actors scrape a third-party SEO tool's dashboard. That's fragile (the scrape breaks when the dashboard's HTML changes), slow, and on shaky terms-of-service ground. This actor reads live native SEO data instead — so it doesn't break when someone else redesigns a page, and there's no third-party account in the loop.
vs. building it yourself on a raw SEO data API
You could wire up a raw data provider — then build pagination, the filter layer, the gap logic, intent + difficulty enrichment, and a stable output schema yourself. This actor is that work, finished: ranked + gap modes, difficulty and intent already on every row, traffic value, content hashing, clean schema, one call.
🛡️ The reliability moat — native data, not a scrape
The single most important thing about this actor: it does not scrape a SaaS SEO tool. It reads ranking data natively from Google's search surface. Practically, that means:
- Runs don't silently die when a third-party dashboard ships a redesign.
- No third-party account to get rate-limited or banned.
- Difficulty + search intent arrive with the ranking data in one pass — no second lookup.
If you've been burned by an Apify "Ahrefs/Semrush scraper" that worked for a month and then started returning empty rows, this is the fix.
📊 What you get — output fields
One dataset item per ranked keyword:
| Field | Description |
|---|---|
keyword | the search term the domain ranks for |
search_volume | monthly Google searches (location-specific) |
cpc | cost-per-click signal (commercial value) |
competition_level | LOW / MEDIUM / HIGH |
keyword_difficulty | 0–100 ranking difficulty (see coverage note below) |
search_intent | informational / commercial / transactional / navigational |
competitor_domain | the domain analyzed |
competitor_rank | exact organic position held |
competitor_url | the page that ranks |
estimated_traffic_value | estimated traffic value of that ranking |
is_featured_snippet | whether it holds the featured snippet |
| Gap mode adds: | |
your_domain / your_rank / your_url | your side of the comparison (your_rank null = you don't rank) |
gap_type | missing / weaker / stronger / tied |
| Always: | |
location, language, content_hash | locale + a stable dedup hash per keyword |
Note on
keyword_difficultycoverage. Difficulty data is densest in major markets (US / UK / DE / …). For some smaller-market or non-English locales the underlying SEO data has sparse difficulty coverage and returns0for many keywords — that's a data-availability limit of the source, not a scoring error. Every other field (search volume, intent, rank, ranking URL, estimated traffic value) is unaffected and fully populated. Tip: run with the target's nativelocation/languagefor the most relevant volumes, and lean onsearch_volume+competitor_rankwhen difficulty is unavailable for your market.
🚀 Input — what you pass in
| Field | Type | Default | Notes |
|---|---|---|---|
target | string | — | required. Competitor domain (e.g. ahrefs.com) |
mode | enum | ranked | ranked or gap |
compareToDomain | string | — | required in gap mode — your domain |
maxKeywords | int | 250 | 1–5,000 |
location | string | United States | any supported location |
language | string | English | any supported language |
minVolume | int | 0 | filter |
maxKeywordDifficulty | int | 100 | filter (0–100) |
intentFilter | array | [] | subset of the four intents |
positionFrom / positionTo | int | 1 / 100 | rank range |
📦 Sample output
Ranked mode (target: "ahrefs.com"):
{"keyword": "keyword generator","search_volume": 90,"competition_level": "LOW","keyword_difficulty": 40,"search_intent": "informational","competitor_domain": "ahrefs.com","competitor_rank": 1,"competitor_url": "https://ahrefs.com/keyword-generator","estimated_traffic_value": 27.36,"is_featured_snippet": false,"location": "United States","language": "English","content_hash": "a1b2c3d4e5f60718"}
Gap mode (competitor ahrefs.com vs your moz.com):
{"keyword": "googlebot","search_volume": 550000,"keyword_difficulty": 26,"competitor_domain": "ahrefs.com","competitor_rank": 8,"your_domain": "moz.com","your_rank": 29,"gap_type": "weaker","location": "United States","language": "English"}
🧭 Who this is for
- SEO agencies — instant competitor teardowns for pitches and audits, no extra seat.
- Content teams — a
missing+ low-difficulty gap list is a ready content roadmap. - Founders / marketers — see what's actually winning organic traffic for rivals.
- Developers / AI agents — clean JSON + MCP; drop ranked-keyword + gap data into any pipeline.
⏱️ Scale & speed
A typical 1,000-keyword report returns in seconds. Larger pulls paginate automatically up to the 5,000-keyword cap. Need ongoing monitoring? Schedule the actor — each run is independent and priced per keyword.
🛡️ Legal & compliance
Reads public search-results data only — the same organic rankings anyone sees in Google. No logins, no paywalled data, no third-party SEO-tool accounts. You control the domains and locations you query.
🧰 FAQ
How do I see what keywords a competitor ranks for?
Paste their domain as target, run, and you get every keyword they rank for with volume,
difficulty, intent, position and traffic value.
How do I find the keyword gap between two websites?
Set mode: "gap", target = competitor, compareToDomain = your site. Every row shows both
positions and a gap_type. Filter to missing for net-new opportunities.
What is a content gap analysis?
Finding the keywords a competitor ranks for that you don't — exactly what gap mode's missing
rows give you, prioritized by volume and difficulty.
Is this a Semrush / Ahrefs alternative? For the competitor-keyword and keyword-gap job: yes — same data, pay-per-scan instead of a monthly seat, as an API/MCP instead of a dashboard.
Do I need a subscription? No. You pay per keyword delivered, on success only. No subscription, no seat, no login.
Where does the data come from — is it accurate? Live native SEO data from Google's search surface (not a scraped dashboard). Difficulty and intent come with the ranking data in the same pass.
Does it work for non-US / non-English domains?
Yes — set location and language to any supported market.
What does a competitor report cost? About $2.50 for 1,000 keywords on the Gold tier; ~$0.25 for a 100-keyword peek. You're never charged for empty or failed runs.
How do I keep costs predictable?
Every run is capped by maxKeywords (default 250, max 5,000), so one run can't drain your credits.
🗺️ Roadmap
Shipped (v1.0): ranked-keyword mode, keyword-gap mode, difficulty + intent + traffic value on every row, location/language, volume/difficulty/intent/position filters, pay-per-keyword.
Coming soon (v0.2): onlyNewSinceLastRun delta feed (only keywords that changed since your
last run) · standalone search-intent + difficulty mode · multi-competitor share-of-voice.
🏷️ Keywords
competitor keyword research, competitor keyword analysis, ranked keywords, see what keywords a site ranks for, keyword gap analysis, content gap analysis, competitor analysis seo, find competitor keywords, semrush alternative, ahrefs alternative, moz alternative, spyfu alternative, similarweb alternative, ranked keywords api, seo data api, competitor keyword api, keyword research api, domain keyword research, organic competitor analysis, keyword difficulty api, search intent api, pay per scan seo, no subscription seo tool, mcp seo, seo data api.
🤝 Built by doesaiknow
Part of the doesaiknow competitive-SEO + market-intelligence suite — runs great on its own, even better together:
- Keyword Metrics API — bulk Google + Bing search volume, CPC & 12-month trend for any keyword list.
- AI Keyword Clustering Tool — group keywords into an AI topical map + content clusters, validated with live SERPs.
- AI Brand Visibility Tracker — see how your brand shows up across ChatGPT, Perplexity & Gemini answers.
- Seeking Alpha API — News & Dividend Data — news, earnings & dividend data for any ticker.
A natural workflow: pull a competitor's ranked keywords here → enrich with volume/CPC in Keyword Metrics → organize into clusters for your content plan.
No subscription. Pay per scan. API + MCP-ready.