# Keyword Search Volume, CPC & Keyword Ideas (`earlytern/keyword-search-volume`) Actor

Get Google Ads monthly search volume, CPC, competition, top-of-page bids and 12-month trends for up to 10,000 keywords per run in any of 217 countries, plus related keyword ideas. No Google Ads account needed.

- **URL**: https://apify.com/earlytern/keyword-search-volume.md
- **Developed by:** [earlytern](https://apify.com/earlytern) (community)
- **Categories:** SEO tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 keyword with search volume (small runs)s

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

## Keyword Search Volume, CPC & Keyword Ideas

Get **Google Ads search volume** for up to 10,000 keywords per run, in any of 217 countries or worldwide: average
monthly searches, **monthly searches for each month**, **cost per click (CPC)**, advertiser **competition**, top-of-page
bid range and a 3-month trend. Add **keyword ideas** to find related searches with the same numbers. No Google Ads
account and no API key needed.

### What does Keyword Search Volume do?

- **Search volume in bulk**: paste a list of keywords, or link a CSV or text file, and get one row per keyword.
- **Google Ads Keyword Planner numbers**: average monthly searches over the last 12 months, searches per month, CPC,
  competition (LOW / MEDIUM / HIGH and 0-100), low and high top-of-page bids, spelling Google Ads used.
- **Trend at a glance**: `trend3MonthsPercent` compares the last 3 months with the 3 months before.
- **Keyword ideas**: related searches found from your keywords, with the same numbers, highest volume first.
- **217 countries** (Vietnam, Germany, Brazil, India, Japan…) or all countries together.
- **Two speeds**: live (results in seconds) or queued (results in 1-3 hours, lower price per batch in large runs).
  Lists of up to 50 keywords in the 92 countries of the keyword database are answered in seconds either way.
- **Source on every row**: `dataSource` says whether the numbers were asked from Google Ads during the run or come from
  a keyword database of Google Ads numbers refreshed monthly.
- **Fair billing**: keywords Google Ads would refuse are free, small lists pay only for keywords with a search volume,
  and batches that fail in live mode or that the data service turns down are free.

### Who uses it?

- **SEO and content teams**: size topics before writing, and pick the keyword with the most searches.
- **PPC managers**: estimate CPC and competition before building a campaign.
- **Agencies**: check search demand for a client's product list in several countries.
- **E-commerce sellers and product teams**: compare demand for product names and features.
- **Developers and AI agents**: add search volume to dashboards, spreadsheets and research tools through the API.

### How to use it

1. Click **Try for free**.
2. In **Keywords**, add one keyword per line, for example `coffee grinder`. For a long list, put a link to a CSV or
   text file in **Keyword file**.
3. Pick a **Country** (the default is United States).
4. Choose **Speed**: **Live** for results in seconds, **Queued** for a lower price per batch when you can wait 1-3
   hours (give the run a timeout of at least 4 hours in Run options).
5. Optional: under **Keyword ideas**, choose **My keywords and keyword ideas** or **Only keyword ideas**, and set
   **Maximum keyword ideas**.
6. Click **Start**. Download the results as JSON, CSV or Excel, or use the API.

**Keyword file**: a public link to a CSV or text file (the file itself, not a web page showing it), up to 2 MB. Either one keyword per line, or a CSV with a column
named `keyword` (also `keywords`, `query`, `search term` or `term`); without such a column the first column is used.
Keywords from the file are added to the list.

### Use with AI agents (MCP)

AI assistants and AI agents can call this Actor through Apify's MCP server at [mcp.apify.com](https://mcp.apify.com)
or through the Apify API. Questions it answers well:

- "How many people search for 'coffee grinder' in Germany each month?" Read `searchVolume` (and `monthlySearches`
  for each month) with `country` set to `DE`.
- "Which of these 50 product names has the most searches?" Sort the rows by `searchVolume`.
- "Find related keywords for 'espresso machine' with their CPC." Run with **Only keyword ideas** and read `keyword`,
  `searchVolume` and `cpc` of each idea row.
- "Is interest in 'standing desk' going up?" Read `trend3MonthsPercent`.

Only `keywords` (or `keywordsFileUrl`) is needed. Use live mode for quick answers.

### Input example

```json
{
  "keywords": ["coffee grinder", "espresso machine", "burr grinder"],
  "country": "US",
  "mode": "live",
  "ideas": "also",
  "maxIdeas": 200
}
```

### Output example

One keyword row (numbers for illustration, monthly list shortened):

```json
{
  "keyword": "buy laptop",
  "type": "keyword",
  "seedKeywords": null,
  "status": "ok",
  "message": null,
  "searchVolume": 2900,
  "cpc": 7.95,
  "competition": "HIGH",
  "competitionIndex": 100,
  "lowTopOfPageBid": 1.69,
  "highTopOfPageBid": 10.04,
  "monthlySearches": [
    { "month": "2026-10", "searchVolume": 2400 },
    { "month": "2026-09", "searchVolume": 2900 },
    { "month": "2026-08", "searchVolume": 3600 }
  ],
  "trend3MonthsPercent": 8.5,
  "spellCorrection": null,
  "country": "US",
  "locationCode": 2840,
  "language": null,
  "searchPartners": false,
  "mode": "live",
  "dataSource": "google-ads",
  "checkedAt": "2026-11-03T10:00:00.000Z"
}
```

Keyword ideas have `"type": "idea"` and list the keywords they were found from in `seedKeywords`. Every row has a
`status`:

| Status | Meaning | Charged in runs priced per keyword |
|---|---|---|
| `ok` | Has search volume | Yes |
| `no-data` | No search volume was found for it in the chosen country | No |
| `invalid` | Not looked up: too long, more than 10 words, or a character Google Ads refuses (`message` says which) | No |
| `failed` | The lookup failed | No |

In runs priced per batch, each batch is charged as a whole, whatever the status of its rows (see
[How much does it cost?](#how-much-does-it-cost)). `invalid` keywords are never charged.

`dataSource` tells where the numbers come from:

- `google-ads`: asked from Google Ads during the run (used for lists of more than 50 keywords, keyword ideas, all
  countries together, search partners, and countries or languages the keyword database does not cover).
- `keyword-database`: Google Ads numbers stored in a keyword database and refreshed once a month, used for lists of up
  to 50 keywords (and Free plan trial runs) in the 92 countries it covers. Answers in about 2 seconds. Very rare
  keywords may be missing there and come back as `no-data`.

The **OUTPUT** record of each run sums up the counts and why a run stopped early.

### How much does it cost?

How a run is charged follows from your input (keywords that are refused are not counted). It is decided once, when the
run starts, and shown in the log and the status message:

- **Priced per keyword**: runs under 40 keywords that the keyword database answers alone (one country it covers, no
  search partners, no keyword ideas). You pay for each keyword saved with a search volume. No batch fee.
- **Priced per batch**: every other run, that is 40 keywords or more, keyword ideas, **All countries**, search
  partners, or a country or language the keyword database does not cover. You pay a fee for each batch of up to 1,000
  keywords (keyword ideas: 20 seed keywords per batch), whether or not its keywords have a search volume. No
  per-keyword fee.

When a batch fee is charged:

- **Live**: when the batch finishes. A live batch that fails is free.
- **Queued**: when the data service accepts the batch. It stays charged if the run is aborted or times out before the
  results arrive. A batch the data service turns down is free.

No start fee. Prices by Apify plan:

| Event | Free | Bronze | Silver | Gold and up |
|---|---|---|---|---|
| Keyword with search volume (runs priced per keyword) | $0.0075 | $0.006 | $0.005 | $0.004 |
| Live batch of up to 1,000 keywords (runs priced per batch) | $0.30 | $0.24 | $0.195 | $0.165 |
| Queued batch of up to 1,000 keywords (runs priced per batch) | $0.25 | $0.20 | $0.167 | $0.133 |

- **Free**: keywords that were not looked up (`invalid`), and in runs priced per keyword, keywords without data.
- Set a **maximum cost per run** and the Actor plans the run to stay under it, then stops cleanly.

Examples on Bronze:

- **30 keywords** in the United States, all with a search volume: 30 × $0.006 = **$0.18**, live or queued.
- **1 keyword** in **All countries**: one batch, so **$0.24** live or **$0.20** queued.
- **3 keywords with up to 200 keyword ideas**, live: one search volume batch and one keyword ideas batch, so
  2 × $0.24 = **$0.48**.
- **50 keywords**: one batch, so **$0.20** queued or **$0.24** live.
- **5,000 keywords**: 5 batches of 1,000, so 5 × $0.20 = **$1.00** queued, or 5 × $0.24 = **$1.20** live.

**Apify Free plan**: each run looks up one trial batch of up to 10 keywords, without keyword ideas, then stops and says
so. Trial runs use the keyword database, so they work in its 92 countries, one country at a time, without search
partners. Any paid Apify plan looks up the full list in every country.

### FAQ

**Where do the numbers come from?** From Google Ads Keyword Planner, through a licensed data provider. They are the
same numbers advertisers see when planning campaigns: rounded monthly averages, updated once a month. Each row's
`dataSource` says whether they were asked during the run or read from the monthly keyword database.

**Why does a keyword have no data?** No searches were found for it in the chosen country, often because it is rare or
misspelled. Such rows are free. Try **All countries** (always asked from Google Ads) or a broader keyword.

**Why was a keyword not looked up?** Google Ads refuses keywords with more than 80 characters, more than 10 words or
some characters (such as `!`, `,`, `?`, `%`, `(`, `)` and emoji). Those keywords are listed with status `invalid` and
the reason, and the rest of the list is looked up as usual.

**Does the language setting change the numbers?** Usually not: Google Ads gives the same search volume for any
language, so it is best left empty.

**Live or queued?** Both give the same data. In runs priced per batch, queued costs less per batch; in runs priced per
keyword both speeds cost the same. Queued results take 1-3 hours for lists over 50 keywords, so it suits large lists and
scheduled runs.

### Limits

- Up to 10,000 keywords per run (list and file together), 1,000 per batch.
- Keyword ideas: one batch of 20 seed keywords for every 100 ideas wanted, up to 10 batches and 20,000 ideas per run.
  Ideas come from the first keywords of the list (20 per batch); the log says when some keywords were not used.
- Keyword file: up to 2 MB, public http or https link.
- Keywords are looked up in lowercase; duplicates are removed.

### Related

- [SEO Site Audit & Broken Link Checker](https://apify.com/earlytern/seo-site-audit): technical SEO audit of every
  page of a website.

### Questions and feedback

Open an issue on the **Issues** tab.

# Actor input Schema

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

One keyword per line, up to 10,000 per run (with the keyword file). Keywords are looked up in lowercase; up to 80 characters and 10 words each. Keywords with characters Google Ads does not accept (such as , ! @ % ( ) ? emoji) are listed as rejected and not charged. On the Apify Free plan each run looks up one trial batch of 10 keywords, without keyword ideas, in the 92 countries of the keyword database.

## `keywordsFileUrl` (type: `string`):

Link to a public CSV or text file (the file itself, not a web page) with more keywords: one per line, or a column named keyword. Up to 2 MB. Keywords from the file are added to the list above.

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

Search volume, cost per click and competition are for searches in this country. All countries, and countries outside the 92 of the keyword database, are priced per batch, whatever the number of keywords.

## `mode` (type: `string`):

Both return the same data. Queued runs wait for the results, so give them a run timeout of at least 4 hours; a queued batch is charged when the data service accepts it. Lists of up to 50 keywords in the 92 countries of the keyword database (Google Ads numbers refreshed monthly) are answered in seconds in both modes. Runs under 40 keywords that the keyword database answers alone are priced per keyword, the same in both modes.

## `ideas` (type: `string`):

Keyword ideas are related searches found from your keywords (20 keywords per batch, up to 10 batches per run), each with the same data as your keywords. Runs with keyword ideas are priced per batch.

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

Ideas with the highest search volume are kept, up to this many per run. One batch of 20 seed keywords is used for every 100 ideas.

## `language` (type: `string`):

A language code such as en, de or vi. Usually best left empty: Google Ads gives the same numbers for any language.

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

Add searches on Google search partner sites to the numbers. Runs with search partners are priced per batch.

## Actor input object example

```json
{
  "keywords": [
    "coffee grinder",
    "espresso machine"
  ],
  "country": "US",
  "mode": "live",
  "ideas": "none",
  "maxIdeas": 200,
  "searchPartners": false
}
```

# Actor output Schema

## `keywords` (type: `string`):

No description

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

No description

# 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": [
        "coffee grinder",
        "espresso machine"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("earlytern/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": [
        "coffee grinder",
        "espresso machine",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("earlytern/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": [
    "coffee grinder",
    "espresso machine"
  ]
}' |
apify call earlytern/keyword-search-volume --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,earlytern/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/N4jw5VkqgMN9U843X/builds/35DRebaWM7Lb6stY4/openapi.json
