Bulk Keyword Search Volume, CPC & SEO Difficulty Checker avatar

Bulk Keyword Search Volume, CPC & SEO Difficulty Checker

Pricing

$3.00 / 1,000 keyword analyzeds

Go to Apify Store
Bulk Keyword Search Volume, CPC & SEO Difficulty Checker

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.

Pricing

$3.00 / 1,000 keyword analyzeds

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

a day ago

Last modified

Share

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

FieldWhat it means
keywordThe keyword, exactly as you supplied it
volumeAverage monthly searches in the chosen country
cpc / cpc_usdCost per click, local currency and US dollars
competitionAdvertiser competition, 0 to 1
seo_difficultyHow hard the organic top ten is, 0-100
paid_difficultyHow contested the paid results are, 0-100
updated_atWhen the source last refreshed this keyword
foundFalse 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.