Keyword Search Volume Checker - Bulk CPC & SEO Difficulty avatar

Keyword Search Volume Checker - Bulk CPC & SEO Difficulty

Pricing

$3.00 / 1,000 keyword analyzeds

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

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.

Pricing

$3.00 / 1,000 keyword analyzeds

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

9

Monthly active users

21 days ago

Last modified

Share

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

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, 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 ActorSEO suite subscriptionFree web checkers
Bring your own listYes, thousands per runYes, within plan limitsUsually a few dozen at a time
Volume, CPC, competitionYesYesOften volume only
SEO and paid difficultyBoth, 0-100Usually one scoreRarely
ExportJSON, CSV, Excel, APICSV inside the appCopy and paste
Cost$3 per 1,000 answered keywordsMonthly seat feeFree, rate-limited
AutomationApify API, schedules, webhooksSeparate API planNone

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

FieldDefaultWhat it does
keywords(required)Your keyword list: a list, or pasted text with one keyword per line
countryusISO country code the figures are measured in
languageenISO language code used for the lookup
include_trendfalseAdds the recent monthly trend, device split and search intent
max_keywordsemptyCaps the list after duplicates are removed; empty processes everything
concurrency8Parallel 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.

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.