Bulk Keyword Search Volume & CPC Checker avatar

Bulk Keyword Search Volume & CPC Checker

Under maintenance

Pricing

from $5.00 / 1,000 keyword results

Go to Apify Store
Bulk Keyword Search Volume & CPC Checker

Bulk Keyword Search Volume & CPC Checker

Under maintenance

Bulk keyword search volume, CPC, competition, top of page bid, 12-month trend for up to 10,000 keywords per run in any country. No Google Ads account needed. Seasonal keywords flagged by peak month. Keyword ideas and search intent included. Keywords without data are free. Not affiliated with Google.

Pricing

from $5.00 / 1,000 keyword results

Rating

0.0

(0)

Developer

Data Pulse

Data Pulse

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

This Actor looks up Google Ads keyword data for a list of keywords: average monthly searches, CPC, competition, the top-of-page bid range and the last 12 months of search volume. You can send up to 10,000 keywords in one run. There is also a keyword ideas mode that takes a few seed keywords and returns related keywords with the same numbers.

Data is provided by a licensed third-party data provider that sources it from the Google Ads API.

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Google. Google, Google Ads and Google Keyword Planner are trademarks of Google LLC.

Output

One row per keyword. A real row from a US test run:

{
"keyword": "best crm software",
"searchVolume": 9900,
"cpc": 37.4,
"competition": "LOW",
"competitionIndex": 18,
"lowTopOfPageBid": 7.81,
"highTopOfPageBid": 50.08,
"trendDirection": "up",
"trendChangePct": 518.8,
"seasonalPeakMonth": "August",
"isSeasonal": true,
"intent": "commercial",
"intentSignal": "best",
"intentConfidence": "rule",
"latestMonth": "2026-09",
"latestMonthSearchVolume": 2900,
"monthlySearches": [{ "month": "2025-10", "searchVolume": 1900 }, "... 12 months, oldest first"],
"monthlySearchesText": "2025-10:1900|2025-11:1300|...|2026-09:2900",
"spellCorrection": null,
"location": "United States",
"locationCode": 2840,
"language": "English",
"languageCode": "en",
"mode": "searchVolume",
"hasData": true,
"source": "live",
"fetchedAt": "2026-10-21T20:42:23.000Z"
}

cpc and the bids are in USD. monthlySearchesText holds the same 12 months as monthlySearches in a single string, because nested arrays do not survive a CSV or spreadsheet export. Every other field is a plain value, so the dataset can go straight into a spreadsheet, an automation workflow, or an AI agent's tool output.

Pricing

$0.008 per keyword that comes back with data ($8 per 1,000), plus $0.05 once per run when the run has to request new data. A run that is answered entirely from the cache does not pay the $0.05. Keywords without data and invalid keywords are free.

For example, 1,000 new keywords that all return data cost $8.05. Running the same list again within 30 days costs $8.00, because every row comes from the cache.

Rows served from the cache cost the same $0.008 as fresh rows. You get the same numbers, and Google only refreshes them once a month.

If you set a maximum cost per run, the Actor calculates how many keywords fit in that budget before it requests anything, requests only those, and lists the rest under skippedForBudget in the run summary.

Apify free plan limit

Users on the Apify free plan get up to 20 keywords with data per run. In search volume mode the Actor looks up the first 20 valid keywords of the list and names the rest under freePlanLimit.skipped in the run summary. In keyword ideas mode it stops after 20 ideas. The run still finishes as succeeded, and its status message says that the free plan limit was reached.

This limit was set by the developer of this Actor, not by Apify. The keyword data is paid per request, and runs by free plan users bring the developer no revenue. Any paid Apify plan removes the limit, and nothing else about the run changes.

Examples

Search volume for US keywords:

{
"mode": "searchVolume",
"keywords": [
"buy running shoes",
"best running shoes for flat feet",
"how to clean white sneakers",
"nike store near me",
"hubspot vs salesforce"
],
"location": "United States",
"language": "en"
}

The 500 highest-volume ideas for two seed keywords:

{
"mode": "keywordIdeas",
"keywords": ["crm software", "email marketing software"],
"location": "us",
"maxResults": 500,
"sortBy": "search_volume"
}

Use cases and common questions

Bulk keyword search volume for a long list

Paste the list from your spreadsheet or content plan into keywords. Up to 1,000 keywords go into one data request, so 2,000 keywords take two requests. You get one row per keyword with search volume, CPC and the 12-month history side by side, which makes it easy to sort a content plan by demand.

For a bulk keyword CPC check before a paid campaign, leave includeNoDataRows off. Keywords that Google reports nothing for are then left out of the dataset and are not charged.

What the top of page bid fields mean

lowTopOfPageBid and highTopOfPageBid are the low and high end of what advertisers have paid for an ad shown above the organic results, in USD. In the example row above, best crm software has a CPC of 37.40 and a top of page bid range of 7.81 to 50.08. When a keyword has only a few advertisers, the range tells you more about the budget you need than the CPC alone.

Finding seasonal keywords

Filter the dataset on isSeasonal = true and sort by seasonalPeakMonth. That gives you the seasonal keywords in your list and the month each one peaks, worked out from the last 12 months as described under Derived fields. best crm software peaks in August in the run above, so a page or campaign for it should be ready by July.

Is this a keyword planner?

It returns the kind of numbers a keyword planner shows: average monthly searches, competition, CPC, the bid range, and related keyword ideas for seed keywords. It is a separate tool, not Google's Keyword Planner, and it is not affiliated with Google. The data comes from a licensed third-party provider that sources it from the Google Ads API.

Input

FieldDefaultWhat it does
modesearchVolumesearchVolume for your own list, keywordIdeas for related keywords from seeds
keywordsexampleYour keywords, or up to 100 seed keywords in ideas mode (sent 20 at a time). Without this field the Actor runs a small example (5 keywords, or one seed with up to 20 ideas)
stripInvalidCharactersfalseRemove characters Google Ads rejects instead of skipping the keyword
locationUnited StatesCountry name, two-letter code (us), Google Ads location code (2840), a full location name such as New York,New York,United States, or Worldwide for all locations combined. Leaving the field out means the United States. An empty value, an unknown location or an unknown language is invalid input. Invalid input ends the run as SUCCEEDED with a clear error message and no charge ($0).
languageenLanguage code or name
maxResults1000Ideas mode: maximum number of ideas returned
sortByrelevanceIdeas mode: relevance, search_volume, competition_index, low_top_of_page_bid or high_top_of_page_bid
searchPartnersfalseInclude Google search partner traffic
useCache, cacheTtlDaystrue, 30Reuse results up to 30 days old
includeNoDataRowsfalseAlso output keywords without data (free)
pushSummaryToDatasetfalseAdd the run summary as the last dataset row

Worldwide figures ("location": "Worldwide", also accepted as global or all) are one aggregate across all locations for which data is available. The data source does not document in detail how the per-location data is combined, so treat a worldwide number as a guide to overall demand and do not expect it to equal the sum of country figures. Rows are labelled Worldwide with an empty locationCode. The language setting still applies.

Supported countries and languages

Search volume and CPC are available for any country that Google Ads targets, and also for regions and cities, using their full location name such as New York,New York,United States. Russia and Belarus are not available. A country can be given by name, two-letter code or location code. The language is a language code or name. Some examples:

CountrylocationLocation codeTypical language
United Statesus2840en
United Kingdomuk2826en
Indiain2356en or hi
Germanyde2276de
Francefr2250fr
Brazilbr2076pt
Spaines2724es
Mexicomx2484es
IndonesiaIndonesia2360id
Japanjp2392ja

Keywords in German for Germany:

{
"keywords": ["laufschuhe", "laufschuhe damen", "trailschuhe"],
"location": "Germany",
"language": "de"
}

For one combined figure across all locations, set "location": "Worldwide". Keep the language that matches your keywords, usually en for English keywords. Results for each location, and for Worldwide, are cached separately.

How keywords are cleaned

Google Ads refuses a whole request if one keyword in it contains a character it does not accept. So every keyword is checked before anything is sent.

First the text is trimmed, lower-cased and repeated spaces are collapsed. Curly quotes and long dashes are turned into ' and -, and match-type syntax ("phrase", [exact], +word, -word) is removed. Running Shoes and running shoes then count as the same keyword and are looked up once.

Then the keyword is checked against Google's list of forbidden characters. That list includes ! @ % ^ * ( ) = { } ; ~ ? < > \ |, backticks, commas, emoji and a long tail of Unicode symbols. &, ', ., -, +, /, #, $ and accented letters are fine, so at&t plans, men's shoes, c++ tutorial and nike.com are looked up as written. A keyword with a forbidden character is skipped, not charged, and listed under invalidKeywords in the summary with the exact character, for example forbidden character '%' (U+0025). With stripInvalidCharacters the character is removed and the rest is looked up.

Keywords longer than 80 characters or 10 words are skipped the same way.

If Google still rejects a batch because of one keyword, the Actor splits the batch in half and retries each half until it finds the keyword that caused it. That keyword goes into invalidKeywords and the others are returned normally.

Derived fields

These come from simple rules on Google's numbers. They are useful for sorting and filtering, but they are not a forecast.

trendDirection compares the median of the last 3 months with the median of the 9 months before them: up at +15% or more, down at -15% or less, flat in between. Medians keep a single spike month from deciding the direction. It is null when fewer than 6 months have data.

seasonalPeakMonth is the calendar month with the most searches. isSeasonal is true when that month is at least 1.5 times the 12-month average.

intent is set from words in the keyword. buy, price, coupon or near me make it transactional. best, vs, review or alternatives make it commercial, and how to, what is or guide make it informational. It is navigational when the keyword contains a domain (amazon.com), an account word (login, sign in, sign up, account, app download) or is just the name of a very common site such as youtube or gmail. intentSignal shows the word that matched. intentConfidence is rule, brand (whole keyword is a known site name) or none. When nothing matches, intent is null. I would rather leave it empty than guess. Brand names outside the short built-in list, like nike, end up there.

Run summary

Each run writes a SUMMARY record to its key-value store (linked from the Output tab). It has the counts of valid, duplicate, invalid, cached, missing, failed and budget-skipped keywords, the lists themselves (up to 1,000 each), the charged events, the number of data requests and how long the run waited on rate limits. If the input has nothing the Actor can use (no valid keywords, every keyword rejected by Google Ads, an unknown location or language, or a maximum charge per run too low for one keyword), the run ends as succeeded with an empty dataset, nothing is charged, and the status message says what was wrong and how to fix it; the summary status is then invalid_input.

Cache

Results are kept for 30 days in a named key-value store in your account, keyword-search-volume-cache, keyed by keyword, location and language. running shoes in the US, in the UK and worldwide are separate entries. Keywords that had no data are kept for 7 days. Ideas from ideas mode are cached too, so a later search volume run for them is served from the cache.

The cache is updated after every batch, so a run that stops halfway still keeps what it fetched. Two runs at the same time each add their own keywords to the cache; neither overwrites the other's entries. Turn off useCache to always fetch fresh data. You can delete the store whenever you like.

Speed and rate limits

Keywords are requested in batches of 1,000. The keyword data source allows 12 requests per minute, and that limit is shared by everyone running this Actor at the same moment. Each run leaves at least 5 seconds between its own requests. When the shared limit is hit anyway, the run waits and tries again rather than failing, for up to 15 minutes in total.

So a few hundred keywords take a few seconds, a 10,000-keyword run needs 10 requests and at least a minute, and very large runs can take noticeably longer when other people are using the Actor at the same time. Cached keywords do not count toward the limit.

Why some keywords have no data

Google does not report volume for keywords in restricted ad categories such as weapons, tobacco and drugs. In my US test buy bitcoin and best vpn came back empty. Google also groups close variants, so a misspelling or plural can return the numbers of the grouped keyword; spellCorrection shows the spelling Google used when it changed it. Search volume is rounded by Google into buckets (880, 1,000, 1,300 and so on), and the current month is never included. Google updates the data around the middle of each month.

Calling it from code

curl -X POST "https://api.apify.com/v2/acts/datapulsehq~keyword-search-volume/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords": ["buy running shoes", "best running shoes"], "location": "us"}'

This returns a JSON array with one object per keyword. Add &format=csv for CSV.