# Keyword Search Volume & CPC (Google Keyword Planner) (`precisionlabs/keyword-search-volume`) Actor

Bulk Google keyword search volume, CPC, competition and trends from official Google Keyword Planner data. Check up to 100,000 keywords per run, or get keyword ideas for keyword research, in 50 countries. About $2 per 1,000 keywords.

- **URL**: https://apify.com/precisionlabs/keyword-search-volume.md
- **Developed by:** [Precision Labs](https://apify.com/precisionlabs) (community)
- **Stats:** 2 total users, 1 monthly users, 33.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 keyword with search volumes

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

**Get Google search volume, CPC, competition and trends for up to 100,000 keywords in one run, at about $2 per 1,000 keywords.** The data is the official Google Ads Keyword Planner data, the same numbers Keyword Planner shows. You don't need a Google Ads account or an SEO tool subscription. Built by Precision Labs.

### What it does

For every keyword you get:

- **Monthly search volume:** the 12-month average, plus a month-by-month history of 12, 24 or 36 months
- **Trends:** the change over the last 3 months, and the change against the same 3 months a year earlier
- **Google Ads cost data:** average cost per click, plus the low and high top-of-page bids, in USD
- **Competition:** low, medium or high, and an index from 0 to 100
- **Keyword ideas** (optional): related keywords Google suggests for your seed keywords, most searched first

Choose from 50 countries, worldwide, or any region or city Google Ads supports, and optionally a language.

### Who it's for

- **SEO and content teams:** size topics and plan content around real demand.
- **PPC managers:** estimate costs before building campaigns.
- **Agencies:** check thousands of client keywords without a seat in an expensive SEO tool.
- **Developers and AI agents:** call it from the API or through Apify's MCP server as a keyword data tool.

### How to use it

1. Paste your keywords into **Keywords**, one per line.
2. Pick a **Country**, and optionally a **Language**.
3. Click **Start**. Most runs finish within a minute.
4. Open the **Overview** tab, or export to CSV, Excel or JSON.

For keyword research, set **Mode** to **Keyword ideas** and enter a few seed keywords instead.

### Pricing

You pay only for data you get:

| Event            | Price  | When                                                                                   |
| ---------------- | ------ | -------------------------------------------------------------------------------------- |
| `data-request`   | $0.12  | One Google Ads request, covering up to 1,000 keywords (or 20 seed keywords for ideas). |
| `keyword-result` | $0.002 | Each keyword or idea that has search volume.                                           |

| Keywords in a run | Cost   |
| ----------------- | ------ |
| 10                | $0.14  |
| 100               | $0.32  |
| 1,000             | $2.12  |
| 10,000            | $21.20 |

**Free:** keywords Google has no data for, and keywords rejected before the lookup. **No request fee** when you repeat a lookup (same keywords and settings) before Google's next monthly update: the results come from your own Apify storage. Set **Maximum cost per run** and the Actor never looks up more keywords than that budget can pay for.

### Input

| Field                              | Description                                                                                              |
| ---------------------------------- | -------------------------------------------------------------------------------------------------------- |
| **Keywords**                       | One per line, up to 100,000. Punctuation Google Ads doesn't accept, like `?` or `!`, is removed for you. |
| **Mode**                           | **Search volume** for your keywords, or **Keyword ideas** from seed keywords.                            |
| **Country**                        | 50 countries, or worldwide.                                                                              |
| **Language**                       | All languages (the default), or one of 25 languages.                                                     |
| **Monthly history**                | 12, 24 or 36 months.                                                                                     |
| **Max keyword ideas**              | Keyword ideas mode only. Caps the number of ideas, and so the cost.                                      |
| **Custom location**                | Any Google Ads location, such as `London,England,United Kingdom`. Overrides Country.                     |
| **Include Google search partners** | Adds searches on Google's partner sites. Off by default, as in Keyword Planner.                          |

```json
{
    "keywords": ["seo tools", "keyword research", "best running shoes"],
    "location": "2826",
    "language": "en"
}
```

### Output

One row per keyword:

```json
{
    "keyword": "on cloud shoes",
    "searchedAs": "on cloud shoes",
    "spellingCorrectedTo": null,
    "type": "keyword",
    "hasData": true,
    "searchVolume": 550000,
    "trend3MonthsPct": -5.6,
    "trendYearOverYearPct": -27.9,
    "monthlySearches": [
        {
            "month": "2026-08",
            "searchVolume": 673000
        },
        {
            "month": "2026-09",
            "searchVolume": 450000
        }
    ],
    "cpcUsd": 1.48,
    "lowTopOfPageBidUsd": 0.4,
    "highTopOfPageBidUsd": 3.39,
    "competition": "high",
    "competitionIndex": 100,
    "location": "United States",
    "language": "English",
    "searchPartners": false,
    "error": null,
    "fetchedAt": "2026-10-19T10:56:23.347Z"
}
```

`monthlySearches` is shortened here; you get 12, 24 or 36 months.

#### How the trends are calculated

- **3-month trend:** average searches over the last 3 months, against the 3 months before that.
- **Year-over-year:** the same last 3 months, against the same 3 months a year earlier, which removes most seasonality.

Both are percentages, and are empty when there isn't enough history or the earlier figure is zero.

### FAQ

#### Where does the data come from?

From Google Ads, the source behind Keyword Planner. The Actor fetches it live through the DataForSEO API each time you run it. Precision Labs is independent and isn't affiliated with, or endorsed by, Google or DataForSEO.

#### Do I need a Google Ads or DataForSEO account?

No. You only need an Apify account, and you pay only for what you look up.

#### Why are the numbers so round?

Google Ads reports search volume in ranges, such as 390, 5,400 or 74,000, not exact counts. Every tool that uses Google's data shows the same rounded figures.

#### Why do some similar keywords have exactly the same volume?

Google Ads groups close variants, such as singular and plural forms, and reports one combined figure for the group. Keyword Planner and every tool built on Google Ads data does the same.

#### Why does a keyword have no data?

Google has too few searches to report, or the topic is restricted in Google Ads, for example weapons, tobacco or drugs. Keywords without data are free.

#### When does new data arrive?

Google adds the previous month's figures around the middle of each month.

#### Why is there a new storage in my account?

The Actor keeps this month's results in a key-value store called `precisionlabs-keyword-search-volume-cache` in your own account, so repeat lookups skip the request fee. Google only updates the figures around the middle of each month, so cached results are almost always as current as a new lookup. You can delete the store at any time.

#### Can I look up a city or a region?

Yes. Put a Google Ads location name in **Custom location**, such as `Manchester,England,United Kingdom` or `Bavaria,Germany`.

#### Something looks wrong?

Open an issue on the **Issues** tab with your input, and I'll look into it.

### More from Precision Labs

- [Poland Company Check](https://apify.com/precisionlabs/poland-company-check): checks Polish companies against official registers, with red flags and bank account verification.

# Actor input Schema

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

One keyword per line, up to 100,000. In <b>Keyword ideas</b> mode these are the seed keywords. Punctuation Google Ads doesn't accept, such as <code>?</code> or <code>!</code>, is removed automatically.

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

<b>Search volume</b>: metrics for your exact keywords. <b>Keyword ideas</b>: related keywords Google suggests for your seeds, most searched first.

## `location` (type: `string`):

Where the searches happen. For a region or city, use <b>Custom location</b> below.

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

Only count searches in this language. Most tools default to all languages.

## `historyMonths` (type: `string`):

How many months of search volume to return per keyword. Trends are calculated either way.

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

Keyword ideas mode only: stop after this many ideas in total. Each idea is billed as one keyword.

## `customLocation` (type: `string`):

Overrides Country. A Google Ads location name, such as <code>London,England,United Kingdom</code> or <code>California,United States</code>.

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

Add searches on Google's partner sites to Google Search. Off matches Google Keyword Planner's default.

## Actor input object example

```json
{
  "keywords": [
    "seo tools",
    "keyword research",
    "best running shoes"
  ],
  "mode": "volume",
  "location": "2840",
  "language": "all",
  "historyMonths": "12",
  "maxIdeas": 500,
  "searchPartners": false
}
```

# Actor output Schema

## `results` (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": [
        "seo tools",
        "keyword research",
        "best running shoes"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precisionlabs/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": [
        "seo tools",
        "keyword research",
        "best running shoes",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precisionlabs/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": [
    "seo tools",
    "keyword research",
    "best running shoes"
  ]
}' |
apify call precisionlabs/keyword-search-volume --silent --output-dataset

```

## MCP server setup

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