Search Volume: Google Keyword Planner & Keyword Volume Data avatar

Search Volume: Google Keyword Planner & Keyword Volume Data

Pricing

from $0.50 / 1,000 keyword with volumes

Go to Apify Store
Search Volume: Google Keyword Planner & Keyword Volume Data

Search Volume: Google Keyword Planner & Keyword Volume Data

Google Ads search volume, CPC, competition and 12 months of searches for up to 100,000 keywords per run, per country. Close variants get their own figures. Optional difficulty and intent, keyword ideas, monthly watch, webhook. From $1.02 per 1,000 keywords.

Pricing

from $0.50 / 1,000 keyword with volumes

Rating

0.0

(0)

Developer

Alexis Morain

Alexis Morain

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

a day ago

Last modified

Features

Limited permissions

Share

What does Keyword Volume Scraper do?

Keyword Volume Scraper returns the Google search volume, CPC, top-of-page bids, paid competition and 12 months of searches for up to 100,000 keywords per run, per country and language. It reads the same Google Ads data as the Google Keyword Planner, through the DataForSEO Google Ads API, without a Google Ads account, an API key or a minimum ad spend. Optionally it adds the keyword difficulty and search intent, turns seed keywords into keyword ideas, and watches volume changes from one month to the next.

It does not scrape Google result pages and it does not estimate traffic. It gives you the numbers Google gives advertisers, in a dataset you can download as JSON, CSV or Excel, or call by API.

Read this first. Google Keyword Planner merges the figures of keywords it considers the same search. Send "sale agreement format" and "format of sale agreement" in one request and only the first one comes back with data. This Actor sends such keywords in separate requests, so each one gets its own row. The next section has the measured numbers. This Actor is an independent project and is not affiliated with, endorsed by or sponsored by Google, Ahrefs or Semrush. Google Keyword Planner is named only to say what kind of data this is.

Why use Keyword Volume Scraper?

  • A list does not break on one bad keyword. One keyword with a symbol Google Ads refuses (!, ?, ,, %, an emoji) makes the whole request fail, so a list of 1,000 keywords returns nothing. We measured it on 9 November 2026: three keywords, one of them crm software!, came back as 40501 Invalid Field: 'keywords'. Keyword text has invalid characters or symbols, zero rows. The Actor removes those symbols before sending, flags the row with keywordCleaned: true, and keeps the original text in input.
  • Close variants get their own figures. Google Ads groups near-identical keywords and returns data for the first of the group only. Measured on 9 November 2026, same four keywords, United States, English:
KeywordAll four in one requestEach one sent alone
sale agreement format880880
format of sale agreementno data880
agreement for sale formatno data10
sale agreement formatsno datano data (Google gives none, the row says so)

One request returned 1 keyword out of 4. Sent separately, 3 out of 4. The Actor groups keywords that Google merges (word order, plural, small words like "of" and "for", accents) and never puts two of them in the same request. A keyword Google still merges is sent again alone, up to 4 rounds.

  • The country is in every row, and worldwide is not the default. Without a location the API returns the figure for all countries merged: crm software is 450,000 worldwide and 201,000 in the United States, sale agreement format is 6,600 worldwide and 880 in the United States. The default here is us, and worldwide is an explicit choice.
  • Cheap in bulk. From $1.02 per 1,000 keywords ($0.62 on the Gold plan), difficulty and ideas billed separately and only when you ask for them. Details in the cost section.
  • Rows that cost nothing are free. A keyword rejected before sending, a keyword Google has no figure for, a refused request: delivered as a row with a status and a note, not charged.
  • A monthly watch. Google updates the volumes once a month. Schedule the Actor monthly, turn on Monitor volume changes and get previousVolume, volumeChange and volumeChangePercent, or only the keywords that moved.
  • On the Apify platform: schedule it, call it by API, send results to Google Sheets, Make, Zapier, n8n, or a webhook at the end of the run.

Use it to prioritise a keyword list before writing content, size a market in several countries, price a Google Ads campaign with real CPCs, feed an SEO dashboard, or alert a client when the demand for their keywords moves.

What data can Keyword Volume Scraper extract?

Two row types, told apart by rowType. Every column is present in every row of a run, null when it does not apply.

Keyword rows (rowType: keyword)

FieldExampleDescription
inputCRM Software!The keyword exactly as you gave it
keywordcrm softwareWhat was sent to Google Ads: lowercased, cleaned, unique
keywordCleanedtrueSymbols Google Ads refuses were removed from the input
statusokok, no_data, invalid_input, error or close_variant. Only ok rows are charged
country, languageus, enCountry and language of the figures. worldwide and null when you chose worldwide
searchVolume201000Average monthly searches on Google in that country
cpc37.13Average cost per click in USD
lowTopOfPageBid, highTopOfPageBid7.14, 51.57Range of the bid to show an ad at the top of the page, USD
competition, competitionIndexLOW, 4Paid competition level and index 0-100 (ads, not organic results)
monthlySearches[{"month": "2025-10", "searchVolume": 165000}, ...]The last 12 months, oldest first
keywordDifficulty, searchIntent, secondaryIntents58, commercial, ["informational"]Only with Add difficulty and intent
isNew, previousVolume, previousCheckedAt, volumeChange, volumeChangePercentfalse, 3600, 2026-11-09, 0, 0.0Only with Monitor volume changes
note, groupedWithWhy a row has no figure, and for close_variant rows the keyword whose figures Google gives to the group
scrapedAt2026-11-09T20:56:27ZWhen the figures were read

Keyword idea rows (rowType: idea, mode Ideas)

seed, keyword, searchVolume, cpc, lowTopOfPageBid, highTopOfPageBid, competition, competitionIndex, monthlySearches, trendMonthly, trendQuarterly, trendYearly (volume change in percent against the previous month, quarter and year), keywordDifficulty, searchIntent, secondaryIntents, country, language.

What the statuses mean

  • ok: Google Ads gave a volume. Charged.
  • no_data: Google Ads gave nothing. Very low volume, a restricted category (adult, weapons, some finance and political terms) or a variant Google merged. Not charged.
  • invalid_input: not sent, because nothing was left after cleaning, or the keyword has more than 80 characters or 10 words. Not charged.
  • error: the data provider refused the request. Not charged.
  • close_variant: Google merges the keyword with another one, even when it is sent alone. groupedWith names it. Not charged.

How to get the search volume of a keyword list

  1. Click Try for free.
  2. Paste your keywords into Keywords, one per line.
  3. Pick the Country you sell to. Leave the language empty to use the main language of the country, or write a code such as fr or es.
  4. Optional: turn on Add difficulty and intent, or switch the mode to Keyword ideas from seed keywords.
  5. Click Start. A list of 1,000 keywords takes about 15 seconds. 100,000 keywords take about 10 minutes, because Google Ads allows 12 requests a minute on this account.
  6. Open the Output tab, pick the Keywords view, and download the dataset as JSON, CSV, Excel, XML or HTML.

How much will it cost to get keyword volumes?

You pay for events, and every cost is visible before you start.

EventPrice (Free and Bronze)GoldWhat it is
Actor start$0.002 per GBsameOnce per run
Google Ads request$0.12$0.12Per request of up to 1,000 keywords
Keyword with volume$0.0009$0.0005Per ok row
Difficulty request$0.02$0.02Per request of up to 700 keywords, only with difficulty on
Keyword difficulty and intent$0.0004$0.0002Per keyword the provider returns data for
Keyword ideas request$0.03$0.03Per page of up to 1,000 ideas of one seed
Keyword idea$0.001$0.0005Per idea row

Silver sits between Bronze and Gold: $0.0007 per keyword, $0.0003 for difficulty, $0.00075 per idea.

RunCost on Free and BronzeCost on Gold
100 keywords$0.21$0.17
1,000 keywords, no close variants$1.02$0.62
1,000 keywords with difficulty and intent$1.46$0.86
10,000 keywords$10.20$6.20
1,000 ideas for one seed$1.03$0.53

A very small run costs more per keyword, because the Google Ads request is billed whole: one keyword is $0.12. Put your keywords in one run.

Close variants add requests. The Actor sends a group of near-identical keywords in as many requests as the group has members, so that each gets its own figures. A list with no variants takes one request per 1,000 keywords. A list of related long-tail keywords, with many reorderings and plurals, can take two to five requests per 1,000. The SUMMARY record of the run shows googleAdsCalls and variantRounds. If you prefer one request and accept merged figures, remove the variants from the list before the run.

Set a maximum cost per run on the Apify start screen. The Actor reads it before every request, shrinks the last request to what fits, delivers what it paid for and stops with a clear message.

Input

See the Input tab for every option. The ones worth knowing:

  • Keywords: up to 100,000, one per line. In ideas mode they are seeds, up to 200.
  • Country: 86 countries, plus worldwide (all countries merged into one figure).
  • Language: a two-letter code. Empty uses the main language of the country.
  • Add difficulty and intent: needs a country. Ideas mode always includes both.
  • Ideas per seed keyword and Minimum volume of an idea: ideas mode. The minimum volume is a filter at the source, so skipped ideas are not read and not charged.
  • Monitor volume changes and Only keywords that changed: the monthly watch.
  • Webhook URL: the run summary is sent there by POST at the end of the run.

Example input:

{
"keywords": ["crm software", "best crm for small business", "free crm"],
"country": "us",
"includeDifficulty": true
}

Output

You can download the dataset in various formats such as JSON, HTML, CSV or Excel. Example, a volume run for France with difficulty on (real run, 9 November 2026):

[
{
"rowType": "keyword",
"status": "ok",
"input": "logiciel crm",
"keyword": "logiciel crm",
"keywordCleaned": false,
"country": "fr",
"language": "fr",
"searchVolume": 3600,
"cpc": 16.3,
"lowTopOfPageBid": 2.38,
"highTopOfPageBid": 18.32,
"competition": "MEDIUM",
"competitionIndex": 56,
"monthlySearches": [{"month": "2025-10", "searchVolume": 3600}, "...", {"month": "2026-09", "searchVolume": 2400}],
"keywordDifficulty": 40,
"searchIntent": "commercial",
"note": null,
"scrapedAt": "2026-11-09T20:56:27Z"
},
{
"rowType": "keyword",
"status": "invalid_input",
"input": "x x x x x x x x x x x",
"keyword": null,
"searchVolume": null,
"note": "Not sent: more than 10 words."
}
]

A keyword idea row:

{
"rowType": "idea",
"seed": "crm software",
"keyword": "crm system",
"country": "us",
"searchVolume": 33100,
"cpc": 36.54,
"competition": "MEDIUM",
"keywordDifficulty": 56,
"searchIntent": "commercial",
"trendMonthly": 0,
"trendYearly": 0
}

The run also writes a SUMMARY record: keywords received, rejected, without data, requests sent, rounds for close variants, rows charged by event, stop reason.

Run it from code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("alexmorain/keyword-volume-scraper").call(run_input={
"keywords": ["crm software", "best crm", "free crm"],
"country": "us",
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["keyword"], row["searchVolume"], row["cpc"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('alexmorain/keyword-volume-scraper').call({
keywords: ['crm software', 'best crm', 'free crm'],
country: 'us',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((r) => [r.keyword, r.searchVolume]));

cURL:

curl -X POST "https://api.apify.com/v2/acts/alexmorain~keyword-volume-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"keywords": ["crm software", "best crm", "free crm"], "country": "us"}'

Tips and advanced options

  • Pick the country you sell to. A global figure hides where the demand is. Run the same list for us, gb and de and compare.
  • Schedule it monthly. Google updates once a month, so a second run in the same month shows no change. With Monitor volume changes on, the Actor keeps the last volume of every keyword per country and language in a named key-value store of your account (keyword-volume-monitor), and Only keywords that changed returns just the ones that moved. Unchanged keywords are neither returned nor charged. A request to Google is still made for them: the watch saves rows, not requests.
  • Read monthlySearches for seasonality. The average volume hides a keyword that peaks in December.
  • Use ideas mode to grow a list, then run the keywords you keep in volume mode if you want Google Ads figures for them. Idea rows come from the DataForSEO keyword database, which is derived from Google Ads data, so the volume of an idea can differ a little from the volume of the same keyword in volume mode.
  • Resume after a migration. If the platform moves your run to another server, the Actor continues where it stopped and does not charge twice for a row already delivered.

FAQ, disclaimers and support

Is the search volume exact?

It is the number Google gives advertisers, already rounded by Google (you will see 590, 720, 880, 1,000, 1,300 and never 874). Treat it as an order of magnitude, good for ranking keywords against each other.

Why does a keyword come back without data?

Google Ads returns nothing for very low-volume terms, for restricted categories (adult content, weapons and drugs, some financial products, some political terms, some terms about children) and for a keyword it merges with a close variant. The row has status: no_data or close_variant and a note. It is not charged.

Why does a worldwide figure differ so much from a country figure?

Worldwide merges every country and every language into one number. crm software is 450,000 worldwide and 201,000 in the United States. Pick a country.

Is the keyword difficulty the same as in Ahrefs or Semrush?

No. The difficulty (0 to 100) and the search intent come from the DataForSEO keyword database. They are computed with their own method, so they will not match the difficulty shown by other tools number for number. Use them to compare keywords of the same list.

Is the CPC what I would pay?

It is the historical average cost per click paid by advertisers for the keyword in that country. Your own bid, quality score and competition will differ. The top-of-page bid range is a better guide for a new campaign.

Why not the cheaper queued mode of the data provider?

Queued requests cost $0.06 instead of $0.09 per request of 1,000 keywords and take minutes. The Actor uses live requests: a result in seconds is worth more than three cents to most users.

Can I use it as a Google Keyword Planner API?

Yes, as a data source. Call the Actor by API (see above) with the keywords and read the dataset, or run it synchronously with run-sync-get-dataset-items. It is not the Google Ads API itself and it does not need a Google Ads account.

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. This Actor reads keyword statistics, not personal data. The data comes from the DataForSEO API, resold under an agreement with DataForSEO. If you are unsure about your use case, consult your lawyers.

Support

Something wrong, missing or surprising? Open an issue on the Issues tab of the Actor page, with the run link. We answer there. The API tab has everything you need for programmatic access.