# Keyword Search Volume Checker (`blueskyscraper/keyword-search-volume-checker`) Actor

\[from $8/1K keywords] Bulk keyword search volume checker for Google: monthly search volume, CPC, competition, top-of-page bids, keyword difficulty, search intent, 12-month history and trend. Keyword ideas mode. No run fee; keywords without data are free. Export, run via API or use with AI agents.

- **URL**: https://apify.com/blueskyscraper/keyword-search-volume-checker.md
- **Developed by:** [BlueskyScraper](https://apify.com/blueskyscraper) (community)
- **Categories:** SEO tools, Marketing, AI
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.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.
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

### What is Keyword Search Volume Checker?

**Keyword Search Volume Checker** is a **bulk keyword search volume API** for Google. Paste a list of keywords, pick a country and a language, and get one row per keyword with **monthly search volume**, **CPC**, **Google Ads competition**, **top-of-page bids**, **keyword difficulty**, **search intent**, the **last 12 months of searches** and a computed **3-month and 12-month trend**. It is a **Google Keyword Planner alternative** that needs no Google Ads account, no API key and no login.

One row is one keyword. The numbers are aggregated from Google Ads Keyword Planner and clickstream data via a licensed data provider, for **94 countries**. A second mode, **Keyword ideas**, turns a seed keyword into longer phrases that contain it, sorted by search volume, with the same metrics.

- 💰 **From about $0.008 per keyword with data** on paid plans ($0.012 on the Apify Free plan) — no start fee, no monthly subscription
- 🆓 **Keywords without data are free** — they stay in the table with `hasData: false`, so your list is complete
- 📈 **12-month history and computed trend** on every row: `change3mPct`, `change12mPct`, `trend`, `peakMonth`
- 📦 **Bulk**: up to 10,000 keywords per run, sent in batches of 700
- 🤖 Works from the **Apify API**, **MCP server** (Claude, ChatGPT, Cursor), n8n, Make and Zapier

### What data can Keyword Search Volume Checker extract?

| Field | Example | What it means |
|---|---|---|
| 🔍 `keyword` | `running shoes` | The keyword (lowercase) |
| 📊 `searchVolume` | `301000` | Average monthly Google searches over the last 12 months |
| 💵 `cpc` | `1.09` | Average cost per click in USD (Google Ads) |
| ⚔️ `competition` | `HIGH` | Google Ads competition: LOW, MEDIUM or HIGH |
| `competitionIndex` | `100` | Google Ads competition index, 0–100 |
| `lowTopOfPageBid` | `0.47` | Low range of the top-of-page bid, USD |
| `highTopOfPageBid` | `2.17` | High range of the top-of-page bid, USD |
| 🧗 `keywordDifficulty` | `43` | SEO difficulty 0–100: how hard it is to reach the organic top 10 |
| 🎯 `searchIntent` | `transactional` | Main intent: informational, navigational, commercial or transactional |
| `secondaryIntents` | `["transactional"]` | Other intents the keyword also carries |
| 📅 `monthlySearches` | `[{"year":2026,"month":8,"searchVolume":301000}, …]` | Last 12 months, newest first |
| 📈 `change3mPct` | `22.4` | Computed: latest month vs 3 months earlier, % |
| `change12mPct` | `-45.3` | Computed: latest month vs the first month of the 12-month window, % |
| `yearOverYearPct` | `-45` | The provider's year-over-year trend, % |
| `trend` | `falling` | Computed: rising (≥ +10%), falling (≤ −10%) or stable over 12 months |
| `peakMonth` | `2025-09` | Computed: the month with the most searches |
| `hasData` | `true` | `false` = no data for this keyword (free row) |
| `seedKeyword` | `trail running shoes` | Keyword ideas mode: the seed the idea came from |
| `location`, `locationCode` | `United States`, `2840` | Country |
| `language`, `languageCode` | `English`, `en` | Language |
| `dataUpdatedAt` | `2026-09-15T04:30:26.000Z` | When the provider last refreshed this keyword |
| `scrapedAt` | `2026-10-01T13:38:12.000Z` | When the row was made |

The computed fields (`change3mPct`, `change12mPct`, `trend`, `peakMonth`) are calculated by the Actor from the 12 monthly values, so you can sort a list by momentum or seasonality without a spreadsheet formula.

### 💰 How much does it cost to check keyword search volume?

Keyword Search Volume Checker uses **pay-per-event** pricing. You pay only for keyword rows that have data:

| Event | Free plan | Starter (Bronze) | Scale (Silver) | Business (Gold) | What you get |
|---|---|---|---|---|---|
| `keyword` | $0.012 | **$0.0080025** | $0.0069975 | $0.006 | One keyword row with search volume and metrics — in either mode |

Platinum and Diamond plans pay the Business price.

- **No start fee** and no charge per run.
- **Keywords without data are free.** If the database has no search volume for a keyword, it appears with `hasData: false` and is not charged. Switch on *Skip keywords without data* to leave them out.
- **Error rows are free** (a keyword that is too long, an unsupported country).
- **Starter plan: $1 ≈ 125 keywords, 1,000 keywords ≈ $8.00.** On Scale 1,000 keywords cost about $7.00, on Business and above $6.00, on the Free plan $12.
- Apify's **free plan** includes $5 of monthly credit, which covers about **400 keywords a month**.
- Keywords dropped by *Minimum search volume* are not charged.

The default run (5 running-shoes keywords, United States, English) costs **about $0.04** on the Starter plan ($0.06 on the Free plan) and finishes in about 5 seconds.

### How to check keyword search volume in bulk

1. Open **Keyword Search Volume Checker** in Apify Console and sign in (a free account works).
2. Paste your keywords into **🔍 Keywords**, one per line — or upload a list through the API.
3. Type the **📍 Country** (`United States`, `US`, `Germany`, `DE`…) and **🗣️ Language** (`English`, `en`…).
4. Keep **Mode** on *Search volume for my keywords*, or choose *Keyword ideas from seed keywords*.
5. Click **Start**. A few hundred keywords take seconds.
6. Download the table as **CSV, Excel, JSON or HTML**, or open the **Monthly searches** tab for one row per keyword and month.

### ⬇️ Input

#### Search volume for your keywords (default)

```json
{
  "keywords": ["running shoes", "trail running shoes", "best running shoes", "running shoes women", "nike running shoes"],
  "location": "United States",
  "language": "English"
}
```

| Field | Type | Description |
|---|---|---|
| 🔍 `keywords` | array | Keywords, one per item. Up to 10,000 per run; each up to 80 characters and 10 words. |
| 📍 `location` | string | Country name or two-letter code. 94 countries; an unsupported one returns a free error row with the full list. |
| 🗣️ `language` | string | Language name or code. Must be available for the country (United States: English or Spanish). Empty = the country's main language. |
| `mode` | string | `metrics` (default) or `ideas`. |
| 💯 `maxIdeasPerSeed` | integer | Ideas mode: ideas per seed, highest volume first (1–1,000, default 50). |
| `minSearchVolume` | integer | Optional: drop keywords below this monthly volume (not charged). |
| `skipKeywordsWithoutData` | boolean | Leave out keywords with no data instead of returning free rows. |
| `maxKeywords` | integer | Safety cap per run (default 1,000, max 10,000). |

#### Keyword ideas from seed keywords

```json
{
  "mode": "ideas",
  "keywords": ["trail running shoes"],
  "location": "United States",
  "language": "English",
  "maxIdeasPerSeed": 10
}
```

For each seed, the Actor returns longer phrases that contain the seed's words — `best trail running shoes`, `salomon trail running shoes`, `hoka trail running shoes` — sorted by search volume, with the same metrics. Most close word-order variants are collapsed, the seed itself is left out (check it in the default mode), and an idea found for two seeds appears once.

### ⬆️ Output

Each keyword is one flat row. Real output for `running shoes`, United States, English (checked 1 October 2026):

```json
{
  "type": "keyword",
  "keyword": "running shoes",
  "hasData": true,
  "searchVolume": 301000,
  "cpc": 1.09,
  "competition": "HIGH",
  "competitionIndex": 100,
  "lowTopOfPageBid": 0.47,
  "highTopOfPageBid": 2.17,
  "keywordDifficulty": 43,
  "searchIntent": "transactional",
  "secondaryIntents": null,
  "change3mPct": 22.4,
  "change12mPct": -45.3,
  "yearOverYearPct": -45,
  "trend": "falling",
  "peakMonth": "2025-09",
  "monthlySearches": [
    { "year": 2026, "month": 8, "searchVolume": 301000 },
    { "year": 2026, "month": 7, "searchVolume": 246000 },
    { "year": 2026, "month": 6, "searchVolume": 201000 }
  ],
  "seedKeyword": null,
  "location": "United States",
  "locationCode": 2840,
  "language": "English",
  "languageCode": "en",
  "dataUpdatedAt": "2026-09-15T04:30:26.000Z",
  "scrapedAt": "2026-10-01T13:38:12.000Z"
}
```

(`monthlySearches` is shortened here; every row with data carries 12 months.)

The dataset has five tabs:

- **Keyword metrics** — volume, CPC, competition, difficulty, intent and trend for each keyword
- **Google Ads (CPC & bids)** — CPC, competition index and the top-of-page bid range for PPC planning
- **Monthly searches** — one row per keyword and month, ready for a chart or a pivot table
- **Keyword ideas** — seed, idea and its metrics (ideas mode)
- **All fields** — everything

#### A keyword without data

```json
{ "type": "keyword", "keyword": "zzqx blorptangle shoes", "hasData": false, "searchVolume": null, "cpc": null, "location": "United States", "language": "English" }
```

Free. It means nobody searches for the phrase often enough to be in the keyword database for that country and language.

### Use cases for keyword search volume data

#### SEO keyword research

Check the volume and **keyword difficulty** of every phrase in a content plan, then sort by volume ÷ difficulty to find the easy wins. `searchIntent` separates blog topics (informational) from landing-page topics (transactional, commercial).

#### PPC and Google Ads planning

The **Google Ads** tab gives CPC, competition and the **top-of-page bid range** for each keyword — the numbers Keyword Planner shows, without opening a Google Ads account.

#### Trend and seasonality checks

`monthlySearches`, `change3mPct`, `change12mPct` and `peakMonth` show which topics are growing, which are fading, and when demand peaks — useful for timing a campaign or a product launch.

#### Bulk validation of keyword lists

Got 5,000 keywords from an autocomplete scraper, a competitor export or a brainstorm? Run them all at once and keep only those with real demand. Pair it with our [Keyword Suggestions Scraper](https://apify.com/lergassy/keyword-suggestions-scraper): it collects long-tail phrases from 10 search engines' autocomplete, and this Actor adds the search volume.

#### AI agents and LLM workflows

An agent writing an article or planning ads can call the Actor through the Apify MCP server, pass a list of candidate keywords and pick the ones with demand — one flat row per keyword, field names that explain themselves.

### Integrations

#### Apify API (JavaScript)

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('lergassy/keyword-search-volume-checker').call({
    keywords: ['running shoes', 'trail running shoes'],
    location: 'United States',
    language: 'English',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((r) => [r.keyword, r.searchVolume, r.cpc]));
```

#### Apify API (Python)

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("lergassy/keyword-search-volume-checker").call(run_input={
    "keywords": ["running shoes", "trail running shoes"],
    "location": "US",
    "language": "en",
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["keyword"], row["searchVolume"], row["keywordDifficulty"])
```

#### One HTTP call

`POST https://api.apify.com/v2/acts/lergassy~keyword-search-volume-checker/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN` with the input JSON as the body returns the rows directly.

#### No-code tools

Use the Apify integrations for **n8n**, **Make**, **Zapier**, **Google Sheets**, **Airtable** or a **webhook** after each run. A scheduled run with the same keyword list gives you a monthly volume tracker.

#### MCP server

Connect `https://mcp.apify.com` to Claude, ChatGPT, Cursor or any MCP client and ask for `lergassy/keyword-search-volume-checker`. The agent sees the input fields and gets one flat row per keyword back.

### 🤖 For AI Agents & LLM Apps

Compact reference for agents calling `lergassy/keyword-search-volume-checker` through the Apify MCP server or API.

**Purpose:** one row per keyword with Google search demand and advertising cost for a country and language: is this phrase searched, how much, how competitive, which intent, rising or falling.

**Minimal input:**

```json
{ "keywords": ["keyword one", "keyword two"], "location": "US", "language": "en" }
```

**Output:** type, keyword, hasData, searchVolume, cpc, competition, competitionIndex, lowTopOfPageBid, highTopOfPageBid, keywordDifficulty, searchIntent, secondaryIntents, change3mPct, change12mPct, yearOverYearPct, trend, peakMonth, monthlySearches (array of year, month, searchVolume), seedKeyword, location, locationCode, language, languageCode, dataUpdatedAt, scrapedAt. Error rows: type = error, input, error.

**Behaviors an agent should know:**

- `searchVolume` is a 12-month average, rounded the way Google Ads rounds it; `monthlySearches` holds the 12 months, newest first.
- `hasData: false` means the phrase is not in the keyword database for that country and language — treat it as near-zero demand, not as an error. It is not billed.
- Close variants (word order, plurals, "best" vs "good") often share identical Google Ads numbers.
- Use `minSearchVolume` to filter on the server instead of post-filtering; dropped rows are not billed.
- Billing: `keyword` event per row with data, in both modes. No start fee.
- Location and language are required together; the country must support the language (United States: en, es).

### Error items / Troubleshooting

Error rows look like `{ "type": "error", "input": "Narnia", "error": "Unknown or unsupported location …. Not charged.", "scrapedAt": "…" }` and are always free. They appear when:

- the country is not one of the 94 supported (the message lists them all);
- the language is not available for the country (the message lists the ones that are);
- a keyword is longer than 80 characters, has more than 10 words, or has no letters or digits.

If a large run contains mostly phrases with no data, the Actor stops early with one error row and keeps every row it already returned — check that the keywords match the chosen country and language.

### ❓ FAQ

#### How accurate is the search volume?

The numbers come from the same family of data Google Keyword Planner shows: monthly averages, rounded into Google's buckets (9,900, 12,100, 14,800…). They are estimates of demand, not exact counts. Use them to compare keywords and spot trends.

#### What is the difference between this and Google Keyword Planner?

Keyword Planner needs a Google Ads account, shows ranges unless you run ads, and exports one list at a time. This Actor returns 12 monthly figures, keyword difficulty and intent for up to 10,000 keywords per run, through an API.

#### How is keyword difficulty calculated?

`keywordDifficulty` (0–100) is the data provider's estimate of how hard it is to rank in Google's organic top 10, based on the strength of the pages already ranking.

#### Why do some keywords return no data?

Very rare phrases, misspellings and brand-new terms are not in the keyword database for that country. They come back as free rows with `hasData: false`.

#### Can I check search volume for any country?

94 countries are supported, including the United States, United Kingdom, Germany, France, Spain, Italy, India, Indonesia, Brazil, Mexico, Japan, Australia and Canada. Worldwide totals and cities are not available.

#### How much does it cost to check 1,000 keywords?

About $8.00 on the Starter plan ($0.0080025 per keyword with data), about $7.00 on Scale and $6.00 on Business and above; $12 on the Free plan. Keywords without data, filtered keywords and error rows are free. There is no start fee.

#### Are repeated checks of the same list cheaper?

Identical requests within 7 days may be answered from a cache (keyword volumes are monthly figures, so they do not change within a week). The price per row is the same; the run is faster.

#### Is it legal to use keyword search volume data?

The Actor returns aggregated, anonymous statistics about search demand — no personal data. Using such statistics for SEO and advertising research is common practice. If you have doubts about your specific use, consult a lawyer.

#### Can I use Keyword Search Volume Checker with the Apify API?

Yes. Every run can be started, scheduled and read through the Apify API, with the JavaScript and Python clients above or a single HTTP call.

#### Can I use it through an MCP server?

Yes. Add the Apify MCP server (`https://mcp.apify.com`) to Claude, ChatGPT, Cursor or another MCP client; the Actor is available as a tool with its input schema.

#### Can I integrate it with other apps?

Yes — n8n, Make, Zapier, Google Sheets, Airtable, Slack and webhooks through Apify integrations.

#### Do I get one row per keyword?

Yes. Every keyword you send is one row (with data or a free `hasData: false` row). The **Monthly searches** tab unwinds the 12 months into separate rows when you need them.

### Your feedback

Found a keyword that looks wrong, or need a field we do not return yet? Open an issue in the **Issues** tab — we answer quickly and ship fixes fast. A review helps other users find the Actor.

### You might also like

| Actor | What it does |
|---|---|
| [Keyword Suggestions Scraper](https://apify.com/lergassy/keyword-suggestions-scraper) | Long-tail keyword ideas from Google, YouTube, Amazon, Bing, eBay, TikTok and more autocomplete — then check their volume here |
| [Google Trends Scraper](https://apify.com/lergassy/google-trends-scraper) | Interest over time, by region and related queries from Google Trends |
| [Google Ads Transparency Scraper](https://apify.com/lergassy/google-ads-transparency-scraper) | Every ad an advertiser runs on Google: format, first and last shown, previews |
| [Domain Intelligence Scraper](https://apify.com/lergassy/domain-intelligence-scraper) | WHOIS, DNS records, SSL certificate, technology stack and subdomains for any domain |
| [Website Tech Gap Scanner](https://apify.com/lergassy/website-tech-gap-scanner) | Technology stack of any website and the tools it is missing: booking, live chat, CRM, analytics, ad pixels |

# Actor input Schema

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

Enter one keyword per line (up to 10,000 per run, 80 characters and 10 words each). Bulk lists are sent in batches of 700, so a big list costs the same per keyword as a small one. In <b>Keyword ideas</b> mode these are the seed keywords.

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

Enter a country name or two-letter code: United States, US, United Kingdom, GB, Germany, DE, India, IN, Indonesia, ID… 94 countries are supported; an unsupported one returns a free error row listing them all.

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

Enter a language name or code: English, en, Spanish, es, German, de… It must be a language the country has data for (United States: English or Spanish). Leave empty to use the country's main language.

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

<b>Search volume for my keywords</b>: one row per keyword you typed. <b>Keyword ideas</b>: for each seed, find longer phrases that contain it (sorted by search volume) with the same metrics. Both modes cost the same per keyword row.

## `maxIdeasPerSeed` (type: `integer`):

Keyword ideas mode only: set how many ideas to return for each seed, highest search volume first (1–1,000).

## `minSearchVolume` (type: `integer`):

Optional: drop keywords with fewer average monthly searches than this. Dropped keywords are not charged. In ideas mode the filter is applied before the ideas are counted.

## `skipKeywordsWithoutData` (type: `boolean`):

Switch on to leave out keywords the database has no search volume for. When off (default), they appear as free rows with hasData = false so your list stays complete.

## `maxKeywords` (type: `integer`):

Safety cap: the first N keywords are checked (metrics mode), or at most N keyword ideas are returned in total (ideas mode). Raise it for bulk lists up to 10,000.

## Actor input object example

```json
{
  "keywords": [
    "running shoes",
    "trail running shoes",
    "best running shoes",
    "running shoes women",
    "nike running shoes"
  ],
  "location": "United States",
  "language": "English",
  "mode": "metrics",
  "maxIdeasPerSeed": 50,
  "skipKeywordsWithoutData": false,
  "maxKeywords": 1000
}
```

# Actor output Schema

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

One row per keyword: search volume, CPC, competition, top-of-page bids, keyword difficulty, search intent, 12 monthly volumes and trend changes.

# 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": [
        "running shoes",
        "trail running shoes",
        "best running shoes",
        "running shoes women",
        "nike running shoes"
    ],
    "location": "United States",
    "language": "English"
};

// Run the Actor and wait for it to finish
const run = await client.actor("blueskyscraper/keyword-search-volume-checker").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": [
        "running shoes",
        "trail running shoes",
        "best running shoes",
        "running shoes women",
        "nike running shoes",
    ],
    "location": "United States",
    "language": "English",
}

# Run the Actor and wait for it to finish
run = client.actor("blueskyscraper/keyword-search-volume-checker").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": [
    "running shoes",
    "trail running shoes",
    "best running shoes",
    "running shoes women",
    "nike running shoes"
  ],
  "location": "United States",
  "language": "English"
}' |
apify call blueskyscraper/keyword-search-volume-checker --silent --output-dataset

```

## MCP server setup

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

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/vyW9Ev871ahhMWM37/builds/NLSfmk3pZFldYVJhF/openapi.json
