Bulk Keyword Search Volume, CPC & SEO Difficulty Checker
Pricing
$3.00 / 1,000 keyword analyzeds
Bulk Keyword Search Volume, CPC & SEO Difficulty Checker
Bring your own keyword list and get monthly search volume, CPC, competition, SEO difficulty and paid difficulty for every one of them, in 50+ countries. Optionally add the recent monthly trend, the desktop/mobile split and search intent.
Paste a keyword list, get monthly search volume, cost per click, advertiser competition, SEO difficulty and paid difficulty for every one of them, in 50+ countries. No subscription, no seat licence, no API key to obtain. Run it from the Apify Store with one click, or call it from your own service via the Apify API, and pay only for the rows you get back.
What it is for
Most keyword tools answer the question "what else could I target?". This one answers a different one: "here are the keywords I already care about, tell me what they are worth." That is the job when you have a list and need numbers against it, for example:
- a content calendar somebody already wrote, that needs volume before it gets approved
- a competitor's ranking keywords exported from somewhere else, that need difficulty scores to be triaged
- a Google Ads account's search terms report, that needs CPC and paid difficulty to decide what to bid on
- a product catalogue turned into search phrases, to see which categories actually have demand in a new country before you localise anything
If instead you want to discover keywords from one seed, use the Google Keywords Research Actor, which expands a seed through autocomplete first. This Actor deliberately does no expansion: what you put in is what you get out, in the same order.
What every row carries
| Field | What it means |
|---|---|
keyword | The keyword, exactly as you supplied it |
volume | Average monthly searches in the chosen country |
cpc / cpc_usd | Cost per click, local currency and US dollars |
competition | Advertiser competition, 0 to 1 |
seo_difficulty | How hard the organic top ten is, 0-100 |
paid_difficulty | How contested the paid results are, 0-100 |
updated_at | When the source last refreshed this keyword |
found | False when the source holds nothing for this keyword |
Turn on Include monthly trend, device split and intent and each row also
gets monthly_volume, desktop_share, mobile_share, search_intent and
global_breakdown.
Two numbers that are easy to misread
cpc is in local currency, cpc_usd is not. A Dutch keyword at cpc
0.52 and cpc_usd 0.60 is the same click priced twice. If you are comparing
across countries, compare cpc_usd or you will conclude that the cheapest
market is whichever one has the weakest currency.
paid_difficulty saturates at 100 quickly. On commercial keywords it is
100 far more often than not, so it separates "commercial" from
"non-commercial" well and separates two commercial keywords from each other
badly. competition and cpc_usd do the finer work.
What the source will and will not tell you
found: false means the source holds no record for that keyword. The row is
still returned, with every metric null rather than 0, because a keyword
with genuinely zero volume and a keyword the source has never seen are
different facts and a 0 would hide the difference.
monthly_volume holds four recent months, not a rolling year. That is the
source's own window. It is enough to see a direction, not enough to establish
seasonality: for a yearly pattern you need a dedicated trends tool.
Volume figures are monthly aggregates and are refreshed on the source's own
schedule, which updated_at reports per keyword. A recent stamp does not mean
today's traffic.
If the source does not answer at all, the run still succeeds but writes zero
rows and sets upstreamReachable: false in the run's OUTPUT record. Nothing
is billed. That is deliberate: a dataset full of zeroes would look like a real
answer, and silently wrong numbers are worse than no numbers.
Speed, and why the trend option is slower
Core metrics are fetched ten keywords per request, so 500 keywords is 50 requests and finishes in well under a minute. The trend option costs one request per keyword instead of one per ten, because only the single-keyword endpoint carries the monthly series and the device split. On a 500-keyword list that is 500 requests rather than 50. Leave it off unless you need those fields.
Input
{"keywords": ["running shoes", "best running shoes", "trail running shoes"],"country": "us","language": "en","include_trend": false}
keywords accepts a list or pasted text, one per line. Duplicates are removed
case-insensitively and the first spelling you used is the one returned.
Free plan
On the Apify free plan a run returns at most 10 rows and stops there, and the run's OUTPUT record says so. The Actor stops fetching once it has enough for that limit rather than fetching your whole list and discarding most of it, so a capped run is fast instead of slow and pointless. Any paid Apify plan removes the cap.
Countries
50+ countries by ISO code: ar, at, au, be, br, ca, ch, cl, cn, co, cz, de, dk,
eg, es, fi, fr, gb, gr, hk, hu, id, ie, il, in, it, jp, kr, mx, my, nl, no, nz,
pe, ph, pl, pt, ro, rs, ru, sa, se, sg, sk, th, tr, tw, ua, us, ve, vn, za. An
unrecognised code falls back to us.