# Google Keyword Search Volume: Planner Volume, CPC, Competition (`quarra/google-keyword-search-volume`) Actor

Google keyword search volume from Keyword Planner data: monthly volume, 12-month history, CPC, competition level and index, top-of-page bids, for thousands of keywords per run in any country. Optional keyword ideas from seed keywords. No Google Ads account needed.

- **URL**: https://apify.com/quarra/google-keyword-search-volume.md
- **Developed by:** [Quarra Labs](https://apify.com/quarra) (community)
- **Categories:** SEO tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 keyword with data

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Keyword Search Volume: Keyword Planner volume, CPC and competition

Get the **Google search volume** of any list of keywords: average monthly searches, the **12-month history**, **CPC**,
**competition** (level and 0-100 index) and the **top-of-page bid range**, for any country. Add seed keywords and get **keyword
ideas** with the same data. This is the data of **Google Keyword Planner** (Google Ads), without a Google Ads account.

Send thousands of keywords in one run: they go out in batches of 1,000, and you get one row per keyword.

### What you get

Per keyword:

| Field | Meaning |
|---|---|
| `searchVolume` | Average monthly searches (Keyword Planner estimate) |
| `monthlySearches` | The last 12 months (or your period), oldest first: `year`, `month`, `searchVolume` |
| `cpc` | Average cost per click, US dollars |
| `competition`, `competitionIndex` | Advertiser competition: LOW / MEDIUM / HIGH and 0-100 |
| `lowTopOfPageBid`, `highTopOfPageBid` | Top-of-page bid range, US dollars |
| `source` | `input` (your keyword), `idea` (a keyword idea) or `seed` |
| `status` | `ok`, `noData`, `invalid`, `notProcessed` |

Example (real run, country US):

```json
{
  "type": "keyword",
  "status": "ok",
  "keyword": "ergonomic chair",
  "source": "input",
  "searchVolume": 60500,
  "monthlySearches": [{ "year": 2025, "month": 10, "searchVolume": 60500 }, "... 11 more months"],
  "cpc": 2.99,
  "competition": "HIGH",
  "competitionIndex": 100,
  "lowTopOfPageBid": 0.72,
  "highTopOfPageBid": 4.35,
  "country": "US"
}
```

### Why this Actor

- **Every run ends with a clear answer.** A keyword with no data is returned with a note and is never charged. A keyword Google
  does not accept (a symbol such as `!` or `%`, an emoji, more than 80 characters or 10 words) is listed as not accepted, free,
  before anything is sent, so one bad keyword never costs you the whole batch.
- **Fair billing.** You pay for the keywords that come back with data, plus one fixed fee per request (up to 1,000 keywords).
  No per-keyword charge for duplicates, errors or keywords without data. The request fee is charged when the request is sent,
  so it applies even when Google has no data for any keyword of the batch, or when the data service then refuses the request,
  is busy or does not answer: the run summary says so. Your "maximum charge per run" is never exceeded: the Actor stops and
  tells you how many keywords were left.
- **Big lists.** 10,000 keywords are 10 requests. Duplicates (any capitalisation or spacing) are removed. Match-type syntax
  (`[keyword]`, `"keyword"`) is removed with a note: Keyword Planner volumes do not depend on match type.
- **Keyword ideas.** Give seed keywords, a maximum number of ideas and an order (most relevant, or highest volume).
- **Any period.** The last 12 months by default, or any months of the last four years.

### Input

| Field | What it does |
|---|---|
| `keywords` | Keywords to look up (thousands are fine) |
| `ideaSeeds` | Optional. Seeds for keyword ideas (sent 20 per request) |
| `maxIdeas` | Most ideas returned in the whole run (default 100) |
| `ideasSort` | `relevance` or `search_volume` |
| `country` | `US`, `GB`, `FR`, `DE`, `IN`... a country or territory name (Hong Kong, Taiwan, Puerto Rico...), or `WORLDWIDE` |
| `searchPartners` | Also count Google's search partners |
| `dateFrom`, `dateTo` | Optional history period (`YYYY-MM-DD`; whole months, up to last month) |
| `maxItems` | Optional. Stop after this many keywords with data |

Keyword Planner volumes depend on the **country**, not on the language you type in.

### Price

Pay per event. You pay for what comes back:

| Event | FREE / BRONZE | SILVER | GOLD and above |
|---|---|---|---|
| Actor start | $0.005 | $0.005 | $0.005 |
| Request (one per 1,000 keywords, or per 20 idea seeds) | $0.15 | $0.15 | $0.15 |
| Keyword with data | $0.005 | $0.004 | $0.0035 |

Examples at the FREE / BRONZE price: 100 keywords $0.66, 1,000 keywords $5.16, 10,000 keywords $51.51. Keywords without data,
keywords Google does not accept and duplicates have no per-keyword charge; the request fee is charged for each request sent,
even when no keyword in it has data. The start fee is per GB of memory (256 MB: one start).

### Output and run summary

The dataset has one row per keyword. Rows with no per-keyword charge say why: `noData` (Google has no data for it), `invalid`
(not accepted by Keyword Planner), `notProcessed` (a limit or a temporary problem stopped the run before it; run it again later).
The `OUTPUT` record of the run lists the counts, the request fees charged and the reason a run stopped.

### Limits, said plainly

- Volumes are **Google Keyword Planner estimates** (rounded ranges for small keywords), updated monthly by Google, usually in
  the middle of the month. The latest month available is last month.
- Google Ads gives no data for some categories (weapons, tobacco, drugs, violence...) and for very rare keywords.
- Keyword Planner can group near-identical variants (singular/plural). If you need each variant's own number, check them in
  separate runs.
- CPC and bids are in US dollars, as Google Ads reports them.
- One request is 1,000 keywords at most. A request usually takes 5 to 25 seconds, rarely up to a few minutes: the Actor only
  starts a request if the run has about 5 minutes left, so keep the default run timeout (1 hour) for big lists.
- Another run may share the same service limit: when it is busy the Actor waits and tries again, and tells you if it could not
  finish. A request that was sent but got no answer in time is never sent again in the same run (it may already have been
  counted): its keywords are returned as `notProcessed`.

### FAQ

**Do I need a Google Ads account?** No.

**Is anything different on Apify's free plan?** Yes: live lookups need a paid Apify plan. On the free plan, the prefilled example (keyword research tool, seo audit, standing desk, country US) returns a stored sample result, marked `sample: true` with the date of the data; only the start fee is charged. Any other input returns one row explaining that a paid plan is needed.

**What happens if I set a low maximum charge?** The Actor only sends a request if its fee and at least one keyword fit in your
limit. Keywords without data do not use your limit. Keywords with data beyond the limit are returned as `notProcessed` rows
(free) and the run summary says how many.

**Does the Actor send anything to Quarra?** Only when a run fails or runs out of time: the Actor name, build, kind of problem and
the place in our code. Never your input, your results or your account.

**Can I run it from the API or on a schedule?** Yes, like any Apify Actor. The output schema and dataset views are ready for the
Apify API, Make, Zapier, n8n and Google Sheets.

**Something looks wrong.** Open an issue on the Actor page with the run link: issues are answered within 14 days.

# Actor input Schema

## `keywords` (type: `array`):

Keywords to get the Google search volume for: up to thousands per run (they are sent in batches of 1,000). Each keyword: 80 characters and 10 words at most; Google does not accept symbols such as ! , % ( ) @ or emoji (those are listed as not accepted, free). Duplicates are removed.

## `ideaSeeds` (type: `array`):

Get related keyword ideas from Google Keyword Planner for these seeds, each with volume, CPC and competition. Seeds are sent 20 per request. Ideas are charged like keywords (see 'Maximum keyword ideas').

## `maxIdeas` (type: `integer`):

Most keyword ideas to return in the whole run, spread over your seeds. Each idea is charged like a keyword with data.

## `ideasSort` (type: `string`):

Which ideas are kept when there are more than 'Maximum keyword ideas'.

## `country` (type: `string`):

Country of the searches: a two-letter code (US, GB, FR, DE, IN...), a country name, or WORLDWIDE for all countries together. Keyword Planner volumes depend on the country, not on the language.

## `searchPartners` (type: `boolean`):

Also count searches on Google's partner sites. Off: Google Search only.

## `dateFrom` (type: `string`):

First month of the history, as YYYY-MM-DD. Default: the last 12 months. Google keeps four years.

## `dateTo` (type: `string`):

Last month of the history, as YYYY-MM-DD. Google reports whole months up to last month.

## `maxItems` (type: `integer`):

Stop after this many keywords with data (ideas included). Keywords without data are free and do not count. Leave empty for no limit other than your maximum charge per run.

## Actor input object example

```json
{
  "keywords": [
    "keyword research tool",
    "seo audit",
    "standing desk"
  ],
  "maxIdeas": 100,
  "ideasSort": "relevance",
  "country": "US",
  "searchPartners": false
}
```

# Actor output Schema

## `results` (type: `string`):

Every keyword with all its fields, and free rows with the reason.

## `overview` (type: `string`):

One line per keyword: volume, CPC, competition, bids.

## `summary` (type: `string`):

Counts, why the run stopped, notes.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "keyword research tool",
        "seo audit",
        "standing desk"
    ],
    "country": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("quarra/google-keyword-search-volume").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": [
        "keyword research tool",
        "seo audit",
        "standing desk",
    ],
    "country": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("quarra/google-keyword-search-volume").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "keyword research tool",
    "seo audit",
    "standing desk"
  ],
  "country": "US"
}' |
apify call quarra/google-keyword-search-volume --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,quarra/google-keyword-search-volume"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/D4qAPbZ4gLGkeKpe7/builds/N9wBtKjlebIF71Gdh/openapi.json
