Competitor Keywords, Keyword Gap & Competitor Finder
Pricing
from $2.00 / 1,000 ranked keywords
Competitor Keywords, Keyword Gap & Competitor Finder
Every Google keyword any website ranks for, the keywords competitors rank for and you don't, and who your organic competitors are. Position, URL, traffic, volume, CPC, difficulty, intent. Semrush and Ahrefs alternative: $2 per 1,000 keywords, $0.60 after 500.
Pricing
from $2.00 / 1,000 ranked keywords
Rating
0.0
(0)
Developer
Pravus
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
15 days ago
Last modified
Categories
Security
Limited permissionsShare
Three competitor-research tools in one, pay per use. A Semrush and Ahrefs alternative with no subscription and no SEO-suite seat:
- Ranked keywords: every Google keyword any website, or a single page, ranks for, with position, ranking URL, estimated monthly visits, search volume, CPC, keyword difficulty and search intent.
- Keyword gap: the keywords your competitors rank for and you don't, with brand terms filtered out so you get keywords you can actually target. Or the keywords you both rank for, with both positions side by side.
- Competitor finder: who your real organic competitors are, ranked by shared keywords, with their total keywords and traffic. Giant sites like Wikipedia and Amazon are left out.
- Up to 10,000 keywords per domain and 100 domains per run, sorted by the traffic each keyword brings.
- Organic, paid ads, featured snippets, local pack and Google AI Overview citations.
- Free domain overview for every site: total ranked keywords, estimated monthly organic traffic and its ad value, top-3 and top-10 counts, and new and moving keywords.
- $2 per 1,000 keywords, dropping to $0.60 per 1,000 after the first 500 of a run. Competitors are $0.003 each.
Built for SEO teams, content strategists, agencies doing competitor audits, PPC managers, and AI agents that need competitor data mid-task (works over Apify's MCP server in Claude, Cursor, ChatGPT and other clients).
What you get for each keyword
| Field | Meaning |
|---|---|
target | The domain or page you asked about |
keyword | A keyword it ranks for |
position | Its Google position among results of that type (1 = top organic result) |
positionChange, previousAbsolutePosition | new, up, down or same since the previous check |
url, title | The page that ranks and its title |
estimatedTraffic | Estimated monthly visits this ranking brings |
trafficValueUsd | What that traffic would cost per month as Google Ads clicks |
searchVolume, monthlySearches | Average monthly Google searches, plus the last 12 months |
trendMonthlyPct, trendQuarterlyPct, trendYearlyPct | Percentage change in search volume |
cpc, competition, competitionLevel | Google Ads cost per click (USD) and competition |
keywordDifficulty | How hard it is to rank in the top 10 organically (0–100) |
searchIntent | informational, commercial, transactional or navigational |
resultType | organic, paid, featured_snippet, ai_overview_reference or local_pack |
serpFeatures | Which Google result features appear for the keyword |
comparedWith, gapType, yourPosition, yourUrl | Keyword gap: your domain, missing or shared, and (shared) where you rank |
found | false on rows that explain a domain with no results, or an invalid or rejected target |
What you get for each competitor (competitor finder)
| Field | Meaning |
|---|---|
competitor | A domain competing with your target for the same keywords |
sharedKeywords | Keywords both sites rank for |
avgPositionOnShared | The competitor's average position on those keywords |
competitorTotalKeywords, competitorTop10Keywords | All keywords the competitor ranks for, and how many are on page one |
competitorEstimatedTraffic, competitorTrafficValueUsd | The competitor's estimated monthly organic visits and their ad value |
competitorTrafficOnShared, targetTrafficOnShared | Estimated visits each site gets from the shared keywords: who wins the overlap |
The Domain overview output (DOMAINS) gives each site's totals for free: matching ranked keywords, estimated monthly traffic and traffic value, keywords in the top 3 and top 10, and how many are new, moved up or moved down, per ranking type.
Examples
A competitor's top 500 keywords by traffic
{"targets": ["competitor.com"],"maxKeywordsPerTarget": 500}
First-page keywords for several competitors, in the UK
{"targets": ["competitor-one.com", "competitor-two.co.uk", "competitor-three.com"],"location": "uk","maxPosition": 10,"minSearchVolume": 100,"maxKeywordsPerTarget": 1000}
One page: what does a competitor's pricing page rank for?
{ "targets": ["https://competitor.com/pricing"], "sortBy": "position" }
Keyword gap: what do my competitors rank for that I don't?
{"mode": "gap","targets": ["competitor-one.com", "competitor-two.com"],"yourDomain": "my-site.com","maxKeywordsPerTarget": 500,"minSearchVolume": 100}
Brand keywords (theirs and yours) are excluded by default in gap mode. Set "gapType": "shared" for keywords you both rank for, with your position next to theirs.
Who are my organic competitors?
{ "mode": "competitors", "targets": ["my-site.com"], "maxCompetitors": 50 }
Feed the result into a keyword gap run to see what each of them ranks for that you don't.
Which questions does a site get cited for in Google's AI Overviews?
{ "targets": ["healthline.com"], "resultType": "ai_overview_reference", "keywordContains": "how" }
sortBy:traffic(default, the keywords that matter most),searchVolumeorposition.location: a country name ("Germany"), a two-letter code ("us","uk","de") or a numeric location code (2840).language: leave empty to use the country's main language (English for the US and UK, German for Germany...), or set"en","es"and so on. Countries with several languages (Belgium, Switzerland...) need it set for gap and competitor runs.brandKeywords:"exclude"skips keywords containing the site's brand name,"include"keeps them. The default,"auto", excludes them in gap mode only.
Output example
{"target": "https://www.nike.com/w/sale-3yaep","keyword": "nike outlet","found": true,"resultType": "organic","position": 1,"absolutePosition": 1,"previousAbsolutePosition": 4,"positionChange": "up","url": "https://www.nike.com/w/sale-3yaep","title": "Shop All Sale","searchVolume": 301000,"estimatedTraffic": 60942.2,"trafficValueUsd": 59113.98,"cpc": 0.97,"competition": 1,"competitionLevel": "HIGH","keywordDifficulty": 19,"searchIntent": "navigational","trendMonthlyPct": 0,"trendQuarterlyPct": 50,"trendYearlyPct": -18,"monthlySearches": [{ "year": 2026, "month": 8, "searchVolume": 368000 }],"serpFeatures": ["organic", "local_pack", "people_also_ask", "related_searches", "knowledge_graph", "images"],"location": "United States","language": "en","dataUpdatedAt": "2026-07-30 03:41:45 +00:00"}
Competitor finder row (nike.com, real data)
{"target": "nike.com","competitor": "dickssportinggoods.com","found": true,"sharedKeywords": 314855,"avgPositionOnShared": 14.4,"competitorTotalKeywords": 1613684,"competitorEstimatedTraffic": 8962786,"competitorTrafficValueUsd": 5430338,"competitorTop10Keywords": 499933,"targetTrafficOnShared": 6015630,"competitorTrafficOnShared": 1470119,"location": "United States","language": "en"}
Pricing
Pay per use, with no subscription:
| Price | |
|---|---|
| Domain data request (up to 1,000 keywords or competitors for one domain or page), charged per successful request | $0.04 |
| Ranked keyword: first 500 keywords of each run | $0.002 each ($2 per 1,000) |
| Ranked keyword: every keyword after the first 500 in a run | $0.0006 each ($0.60 per 1,000) |
| Competitor domain (competitor finder) | $0.003 each |
| Run | Cost |
|---|---|
| 1 domain, top 100 keywords | $0.24 |
| 1 domain, top 1,000 keywords | $1.34 |
| 10 competitors, top 100 keywords each | $1.70 |
| 1 domain, 10,000 keywords | $7.10 |
| Keyword gap vs 3 competitors, top 200 each | $1.18 |
| Your top 20 competitors | $0.10 |
- Invalid domains, duplicates, and requests that fail are never charged. A domain with no results (a brand-new site, or filters that match nothing) costs only the $0.04 request fee, and the free domain overview tells you why.
- Free Apify plan: try it on 1 domain with up to 20 keywords per run. Any paid Apify plan unlocks up to 100 domains and 10,000 keywords per domain.
- Set a maximum cost per run in the run options and the Actor stops before doing work that would exceed it, so you're never charged past your limit.
Use it from code
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('pravus/competitor-keywords').call({targets: ['competitor.com'],maxKeywordsPerTarget: 1000,maxPosition: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const domains = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord('DOMAINS');
Use it from an AI agent (MCP)
Add the Apify MCP server to your client and the agent can call this Actor as a tool, for example: "Find the 300 keywords that bring competitor.com the most traffic, keep the ones with difficulty under 30 where we could realistically rank, and group them into content topics."
Pair it with keyword research
To check volumes and difficulty for your own keyword list, or find new keyword ideas from seed terms, use Keyword Research API: Search Volume, CPC, Difficulty & Intent.
FAQ
Where does the data come from? A licensed SEO data provider that tracks Google results for millions of keywords. The database is updated weekly; dataUpdatedAt shows when each keyword's ranking was last checked. Search volume and CPC come from Google Ads data.
How accurate is the traffic estimate? estimatedTraffic is a model: search volume times the typical click-through rate for that position. It is best for comparing keywords and competitors, not as an exact visit count.
Why are the totals different from Semrush or Ahrefs? Every SEO database tracks a different set of keywords, so totals differ between tools. Relative rankings and the top keywords usually agree.
What counts as a "brand keyword"? Any keyword containing the domain's name, e.g. "adidas samba" for adidas.com. Hyphenated names match the spaced and joined spellings, so foot-locker.com excludes "foot locker" and "footlocker". If a site's name is an everyday word (apartments.com, cars.com), its "brand" keywords are its main topic: set "brandKeywords": "include" for those.
Domain or page: which should I use? A domain (competitor.com) covers every page on the site. A full URL (https://competitor.com/blog/post) covers that page only. A subdomain (blog.competitor.com) covers just that subdomain. Keyword gap and competitor finder work on domains.
Is there a limit? 100 domains per run, 10,000 keywords or 1,000 competitors per domain, and about 60,000 keywords per run in total. A run that reaches a limit stops cleanly, keeps everything it collected and lists what it didn't reach (not charged). Start another run for the rest.
What happens with very large runs? Big lists (for example 100 domains with 10,000 keywords each) can take longer than the default run timeout. The Actor stops cleanly shortly before the timeout, keeps everything it collected, and tells you which domains it didn't reach (those aren't charged). Raise the timeout in the run options, or split the list across runs.