Keyword Search Volume Checker - Bulk CPC & SEO Difficulty
Pricing
$3.00 / 1,000 keyword analyzeds
Keyword Search Volume Checker - Bulk CPC & SEO Difficulty
Paste your keyword list and get monthly search volume, CPC, advertiser competition, SEO difficulty and paid difficulty for every keyword in 50+ countries. For SEO, content and PPC teams who already know their keywords. Pay per keyword.
Keyword Search Volume Checker - Bulk Volume, CPC & SEO Difficulty
A bulk keyword search volume checker: paste a keyword list and get monthly search volume, cost per click, advertiser competition, SEO difficulty and paid difficulty for every keyword, 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 this keyword search volume checker 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, when available, rows also
get 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. The Dutch keyword
koffiezetapparaat, retrieved on 3 October 2026, had cpc 0.4174305 and
cpc_usd 0.47: 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.
How it compares to other keyword tools
| This Actor | SEO suite subscription | Free web checkers | |
|---|---|---|---|
| Bring your own list | Yes, thousands per run | Yes, within plan limits | Usually a few dozen at a time |
| Volume, CPC, competition | Yes | Yes | Often volume only |
| SEO and paid difficulty | Both, 0-100 | Usually one score | Rarely |
| Export | JSON, CSV, Excel, API | CSV inside the app | Copy and paste |
| Cost | $3 per 1,000 answered keywords | Monthly seat fee | Free, rate-limited |
| Automation | Apify API, schedules, webhooks | Separate API plan | None |
The point is not to replace a full SEO suite. It is to put numbers against a list you already have, without a seat licence, and to do it again every month on a schedule if you want to watch the figures move.
Speed, and why the trend option is slower
Core metrics are fetched ten keywords per bulk request, so 500 keywords need 50 bulk requests. Completion time depends on the source. 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
| Field | Default | What it does |
|---|---|---|
keywords | (required) | Your keyword list: a list, or pasted text with one keyword per line |
country | us | ISO country code the figures are measured in |
language | en | ISO language code used for the lookup |
include_trend | false | Adds the recent monthly trend, device split and search intent |
max_keywords | empty | Caps the list after duplicates are removed; empty processes everything |
concurrency | 8 | Parallel lookups, bounded to 1-20 |
{"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. Comma-separated
text and objects with keyword or value are also accepted. max_keywords limits
the list after removing duplicates; leave it empty to process the whole list.
concurrency defaults to 8 and is bounded to 1–20. Country and language default to
us and en, and the trend option defaults to false.
Output
A real US result retrieved on 3 October 2026:
{"keyword": "running shoes","country": "us","language": "en","found": true,"lookup_failed": false,"lookup_status": "answered","volume": 368000,"cpc": 1.08,"cpc_usd": 1.08,"competition": 1,"seo_difficulty": 65,"paid_difficulty": 100,"updated_at": 1785910766,"input_position": 0,"fetched_at": "2026-10-03T15:51:44.033Z","source": "keyword-metrics-bulk","search_volume": 368000,"keyword_difficulty": 65}
Results are written to the default dataset. The run summary is available in OUTPUT,
including requestedCount, returnedCount, foundCount, notFoundCount,
chargedCount and chargeLimitReached. Each row retains input_position, so the
original order can be recovered even when failed lookups are placed last.
lookup_failed:true with found:null describes an unanswered lookup; it does not
claim that the keyword has no search volume. Any source failures are available in errors.
The additional fields source, fetched_at, search_volume and keyword_difficulty
make results easier to combine with other search data. The original volume and
seo_difficulty remain available.
Pricing
The price is $0.003 per answered keyword ($3 per 1,000), using the existing
scraped event. A genuine found:false answer is still an answered keyword and
is billed. Failed lookups are free. There is no run start fee, and an empty list or
an unavailable source that returns no rows has no keyword charges. chargedCount
reports what the platform actually charged, including a lower amount when the run
reaches your spending limit.
FAQ
Does a missing keyword have zero search volume?
No. Its metrics are null and found is false. Zero is reserved for a real zero value
reported by the source.
Can I paste mixed-case keywords or duplicates?
Yes. The first spelling is preserved, repeated keywords are removed without regard to case, and lookups work with mixed-case input.
Does enabling monthly trends change the keyword price?
No. The price remains one answered keyword event per row. Trends require additional source requests and may increase completion time; a failed trend does not erase the keyword's successfully retrieved core metrics.
Can I check keyword search volume for another country?
Yes. Set country to one of the 50+ supported ISO codes, for example de or nl,
and language to the matching language. Compare costs across countries with
cpc_usd, not cpc.
How many keywords can I check in one run?
As many as you supply. Duplicates are removed first and core metrics are fetched ten keywords per request, so a list of a few thousand keywords is a normal run. On the Apify free plan a run stops at 10 rows.
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.