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

Turn a keyword list into real Google Keyword Planner metrics: monthly search volume, CPC, competition and the top-of-page bid range, plus a 12-month trend. Up to 1,000 keywords per run. Ideas mode expands one seed into hundreds of related keywords.

- **URL**: https://apify.com/garnet\_puppet/keyword-search-volume.md
- **Developed by:** [Mehmet](https://apify.com/garnet_puppet) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 keyword metrics

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Bulk Keyword Search Volume

Paste a list of keywords and get Google Keyword Planner metrics for each one:
average monthly searches, cost per click, competition, the top-of-page bid
range, and the last 12 months of search volume.

Switch to **Ideas** mode and one seed keyword returns hundreds of related
keywords with the same metrics.

*This Actor is an independent, third-party tool. It is not affiliated with,
endorsed by, or sponsored by Google LLC.*

### What you get per keyword

| Field | Meaning |
|---|---|
| `searchVolume` | Average monthly searches in the selected country |
| `cpc` | Average cost per click in USD |
| `competition` | `LOW`, `MEDIUM` or `HIGH` |
| `competitionIndex` | 0-100, finer than the label above |
| `lowTopOfPageBid` / `highTopOfPageBid` | Top-of-page bid range in USD |
| `monthlySearches` | The last 12 months, one entry per month |
| `seedKeyword` | Which seed produced this row, in Ideas mode |
| `fromCache` | Whether this row came from a recent cached lookup |

### Two modes

**Metrics** returns data for exactly the keywords you entered. Use it when you
already have a list.

**Ideas** takes the first keyword as a seed and returns related keywords. Use it
when you want to discover terms you have not thought of.

### What you pay

You are billed per delivered row. Rows that come back without a search volume
are returned but **never charged**.

`Maximum rows` is your cost ceiling: set it to 100 and you can never be billed
for more than 100 rows in that run.

### Honest limits

- Search volumes come from Google Keyword Planner and are **monthly averages,
  rounded by Google**. Two keywords both showing 12,100 are not necessarily equal.
- The 12-month trend is the best guide to whether a number is stable or spiky.
- Volume is per country and language. The same keyword in `us`/`en` and
  `de`/`de` are different questions with different answers.
- `Language` is a fixed list (`en`, `de`, `ja`, `zh-TW` and more). A code that
  is not on the list is rejected before any data is fetched, so a typo never
  costs you a run.
- `Country` and `Language` are independent. United Kingdom with Ukrainian is a
  real combination and returns Ukrainian data, so check both before you run.

# Actor input Schema

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

Keywords to look up. In Ideas mode the first keyword is used as the seed and the Actor returns related keywords instead.

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

Metrics returns data for exactly the keywords you entered. Ideas takes the first keyword as a seed and returns related keywords with their metrics.

## `maxResults` (type: `integer`):

Upper limit on delivered rows. You are billed per delivered row, so this is also your cost ceiling.

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

Country the search volume is measured in.

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

Language the keyword data is reported in. Pick from the list: a code that is not on it is rejected before any data is fetched, so you are never billed for a typo. Language is independent of Country, so check both -- for example United Kingdom with Ukrainian is a real combination and returns Ukrainian data.

## `includeMonthlyTrend` (type: `boolean`):

Adds the last 12 monthly search volumes to every row. Turn off for smaller, faster output.

## Actor input object example

```json
{
  "keywords": [
    "email marketing software",
    "crm software",
    "project management tool",
    "seo tools",
    "keyword research tool",
    "content marketing",
    "lead generation",
    "marketing automation",
    "landing page builder",
    "email verifier",
    "web scraping api",
    "social media scheduler",
    "google analytics alternative",
    "ab testing tool",
    "customer support software",
    "invoice software",
    "hr software",
    "applicant tracking system",
    "video editing software",
    "password manager"
  ],
  "mode": "metrics",
  "maxResults": 100,
  "country": "us",
  "language": "en",
  "includeMonthlyTrend": true
}
```

# Actor output Schema

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

One record per keyword carrying average monthly search volume, cost per click, competition level, top-of-page bid range, and the last 12 months of search volume trend.

## `runSummary` (type: `string`):

Counts for the whole run: rows delivered, rows billed, provider calls made, cache hits, and inputs skipped. Read this to see whether the run did what you expected.

# 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": [
        "email marketing software",
        "crm software",
        "project management tool",
        "seo tools",
        "keyword research tool",
        "content marketing",
        "lead generation",
        "marketing automation",
        "landing page builder",
        "email verifier",
        "web scraping api",
        "social media scheduler",
        "google analytics alternative",
        "ab testing tool",
        "customer support software",
        "invoice software",
        "hr software",
        "applicant tracking system",
        "video editing software",
        "password manager"
    ],
    "mode": "metrics",
    "maxResults": 100,
    "country": "us",
    "language": "en",
    "includeMonthlyTrend": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("garnet_puppet/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": [
        "email marketing software",
        "crm software",
        "project management tool",
        "seo tools",
        "keyword research tool",
        "content marketing",
        "lead generation",
        "marketing automation",
        "landing page builder",
        "email verifier",
        "web scraping api",
        "social media scheduler",
        "google analytics alternative",
        "ab testing tool",
        "customer support software",
        "invoice software",
        "hr software",
        "applicant tracking system",
        "video editing software",
        "password manager",
    ],
    "mode": "metrics",
    "maxResults": 100,
    "country": "us",
    "language": "en",
    "includeMonthlyTrend": True,
}

# Run the Actor and wait for it to finish
run = client.actor("garnet_puppet/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": [
    "email marketing software",
    "crm software",
    "project management tool",
    "seo tools",
    "keyword research tool",
    "content marketing",
    "lead generation",
    "marketing automation",
    "landing page builder",
    "email verifier",
    "web scraping api",
    "social media scheduler",
    "google analytics alternative",
    "ab testing tool",
    "customer support software",
    "invoice software",
    "hr software",
    "applicant tracking system",
    "video editing software",
    "password manager"
  ],
  "mode": "metrics",
  "maxResults": 100,
  "country": "us",
  "language": "en",
  "includeMonthlyTrend": true
}' |
apify call garnet_puppet/keyword-search-volume --silent --output-dataset

```

## MCP server setup

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