# Keyword Search Volume: Bulk Google Volume & CPC (`steady-scrape/keyword-search-volume`) Actor

Bulk keyword search volume checker: Google search volume, CPC, competition, top-of-page bids and a 12-month trend for up to 10,000 keywords per run, by country and language. Keyword Planner data without a Google Ads account. $3 per 1,000 keywords with data.

- **URL**: https://apify.com/steady-scrape/keyword-search-volume.md
- **Developed by:** [SteadyScrape](https://apify.com/steady-scrape) (community)
- **Categories:** SEO tools, Marketing, Developer tools
- **Features:** Limited permissions
- **Stats:** 8 total users, 4 monthly users, 91.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.25 / 1,000 keyword results

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: Bulk Google Volume & CPC

**Who it's for:** SEOs, PPC marketers, content teams and AI agents who need Google search volume for a keyword list without a Google Ads account.

**What you get:** Monthly search volume, CPC, competition, top-of-page bids and a 12-month trend per keyword, for any country and language, up to 10,000 keywords per run.

**Price:** $3 per 1,000 keywords with data ($0.003 each) plus a $0.12 lookup fee per run when fresh data is fetched. Keywords with no data are free.

Get **Google search volume, CPC, competition, top-of-page bids and a 12-month trend** for up to 10,000 keywords per run, for any country and language. It's Keyword Planner data **without a Google Ads account**, and you get clean JSON that's ready for spreadsheets, SEO tools and AI agents. It costs **$3 per 1,000 keywords with data** ($0.003 each) plus a **$0.12 lookup fee per run** when fresh data is fetched; keywords without data are free.

*Built and maintained by **SteadyScrape (steady-scrape)**. [See all our Actors](https://apify.com/steady-scrape).*

- 📊 **Keyword Planner metrics**: average monthly searches, CPC, competition (LOW/MEDIUM/HIGH plus a 0-100 index), and low/high top-of-page bids
- 📈 **12-month trend**: searches for each month, oldest first
- 🌍 **190+ countries, 50+ languages**: pass names ("Germany", "German"), ISO codes ("DE", "de") or Google Ads location codes (2276)
- ⚡ **Fast by default**: results in seconds. Keywords looked up in the last 30 days come back instantly from a cache
- 🧹 **Clean input**: lowercases, trims and dedupes keywords. Keywords Google Ads rejects are flagged `invalid` and never charged
- 💸 **You pay only for keywords that return data**: `no_data`, `invalid` and `error` rows are free

### Use cases

- **Content planning:** score a list of article ideas by monthly searches and trend before you write them.
- **PPC budgeting:** get CPC, competition and top-of-page bids for a new campaign's keyword list without opening Google Ads.
- **Client reports and SEO tools:** refresh volumes for thousands of tracked keywords once a month on a schedule and push them to a sheet or database.
- **Market and product research:** compare demand for product names, features or locations across countries with the 12-month trend.
- **AI agents:** let an agent check "how many people search for this?" mid-task through the API or MCP and get a structured answer.

### Quick start

```json
{
  "keywords": ["keyword research", "seo tools", "best running shoes"],
  "location": "United States",
  "language": "English"
}
```

### Sample output

A real excerpt from one of our own runs on Oct 26, 2026 (20 keywords, United States, English). Selected fields only; each row in your dataset has more.

| keyword | status | searchVolume | cpc | competition | competitionIndex |
|---|---|---|---|---|---|
| keyword research | ok | 135,000 | 16.68 | LOW | 0 |
| best running shoes | ok | 60,500 | 1.16 | HIGH | 100 |
| email marketing software | ok | 135,000 | 83.18 | LOW | 2 |
| crm for small business | ok | 4,400 | 51.28 | LOW | 22 |
| website builder | ok | 201,000 | 29.40 | LOW | 16 |
| backlink checker | no_data |  |  |  |  |

Rows with `status: "no_data"` (like `backlink checker` here) are not charged.

### Output

One item per keyword, in the same order as your input:

| Field | Example | Notes |
|---|---|---|
| `keyword` | `best running shoes` | Normalized keyword |
| `inputKeyword` | `Best Running Shoes!` | As you typed it |
| `status` | `ok` | `ok`, `no_data`, `invalid` or `error` |
| `searchVolume` | `201000` | Average monthly searches (last 12 months) |
| `monthlySearches` | `[{"month": "2025-10", "searchVolume": 165000}, …]` | Last 12 months |
| `cpc` | `1.42` | USD |
| `competition` / `competitionIndex` | `HIGH` / `100` | Paid-search competition |
| `lowTopOfPageBid` / `highTopOfPageBid` | `0.61` / `2.07` | USD |
| `keywordDifficulty` / `searchIntent` | `71` / `commercial` | Only when the data comes from the keyword database (auto and labs modes) |
| `spellCorrection` | `null` | The spelling Google Ads used, when it corrected the keyword |
| `location`, `locationCode`, `language`, `languageCode` | `United States`, `2840`, `English`, `en` | |
| `dataDate` | `2026-09` | Latest month in the data |
| `source` | `live` | `live` (fetched this run) or `cache` (looked up in the last 30 days) |
| `dataSource` | `google_ads` | `google_ads` (Keyword Planner) or `dataforseo_labs` (keyword database built from Google Ads data) |
| `fetchedAt` | `2026-10-26T22:11:36Z` | When the data was fetched |

The run summary (counts, cached vs fresh, and the mode used) is saved in the key-value store as `OUTPUT`.

### Modes

| Mode | Speed | Data source | Best for |
|---|---|---|---|
| `auto` (default) | seconds | DataForSEO Labs keyword database, then Google Ads live for anything missing | Most lists: fast and complete |
| `live` | ~7 s per 1,000 keywords | Google Ads Keyword Planner (live) | When you want every number straight from Keyword Planner |
| `labs` | seconds | DataForSEO Labs keyword database only | Adds keyword difficulty and search intent; keywords not in the database come back as `no_data` |
| `queue` | 1-3 hours | Google Ads Keyword Planner (standard queue) | Very large lists (5,000+ keywords) where waiting is fine |

All modes return the same fields. Keyword Planner numbers only change once a month, so keywords looked up in the last 30 days for the same country and language can come back instantly from a cache.

#### AI search volume (optional)

Turn on **Include AI search volume** (`"includeAiVolume": true`) to see how often people ask AI assistants (ChatGPT, Gemini and similar) about each keyword, next to its Google volume. Each row gets `aiSearchVolume` (monthly average), `aiMonthlySearches` (last 12 months), `aiDataDate` and `aiStatus`. It costs **$0.005 per keyword with an AI value**; keywords without one are free. Available in 94 countries in their main languages (for example the US in English or Spanish, Germany in German), not for worldwide. AI answers are cached for 30 days like the rest; when AI data is fetched fresh, the run pays the $0.12 lookup once (also if the Google numbers came from the cache).

Example: 500 keywords with Google + AI volume: 500 × ($0.003 + $0.005) + $0.12 = **$4.12**.

### Pricing

Pay per event, no subscription:

| Event | Price | When |
|---|---|---|
| **Lookup** | **$0.12 per run** | Once per run, only when fresh data is requested from the provider. Runs answered fully from the cache don't pay it |
| **Keyword result** | **$0.003 per keyword ($3 per 1,000)** | Per keyword that returns a search volume |
| **AI search volume** (optional) | **$0.005 per keyword** | Only with `includeAiVolume`, per keyword that has an AI value |
| Actor start | $0.00005 | Apify's standard start fee |

**Keywords without data are free**: `no_data`, `invalid` and `error` rows are never charged as keyword results. The lookup is charged only when at least one freshly fetched keyword returns data, so a run where every fresh keyword comes back without data doesn't pay the lookup fee. To keep this free, keywords that came back without data in the last 30 days aren't looked up again, obvious junk such as long random strings is flagged `invalid`, and each Apify account has a daily limit on fresh lookups that return no data (it resets at 00:00 UTC); keywords over the limit come back as free `error` rows to retry the next day.

Examples: 20 keywords = $0.18, 100 keywords = $0.42, 1,000 keywords = $3.12 (if every keyword has data).

**Worked example:** a monthly refresh of 500 tracked keywords costs 500 × $0.003 + $0.12 = **$1.62** per run. If you rerun the same list within 30 days (same country and language), the answers come from the cache: you still pay $0.003 per keyword with data, but not the $0.12 lookup.

Set **Max cost per run** in the run options to cap spending. The Actor only processes as many keywords as your limit covers.

The default maximum charge per run is $2.00, about 10–20 typical runs. Raise it in the run options if you need a larger job.

### Run time and cost examples

Costs use the current list prices on the Apify Free plan, including Apify's $0.00005 start event. Run times are from our own test runs in October 2026 at the default memory; yours depend on the input.

| Run | Run time (our tests) | Cost (Free plan) |
|---|---|---|
| Up to 20 keywords (fresh lookup) | about 2 to 8 seconds | about $0.18 |
| 100 keywords (fresh lookup) | not measured yet | about $0.42 |
| 1,000 keywords (fresh lookup) | not measured yet | about $3.12 |
| 500 keywords rerun within 30 days (from cache) | not measured yet | about $1.50 |

Price per keyword with data: $0.003 on the Apify Free plan, $0.0027 on Starter (Bronze), $0.0024 on Scale (Silver), $0.00225 on Business (Gold) and above. The discount is applied automatically. The $0.12 lookup fee is the same on every plan.

### How it compares

| Option | Good for | Trade-offs |
|---|---|---|
| **This Actor** | Bulk lookups by API, pay per keyword, no Google Ads account | Monthly averages only (Keyword Planner data doesn't change more often) |
| Google Keyword Planner in the Google Ads UI | Free, the original source | Needs a Google Ads account; accounts with little ad spend often see volume ranges instead of exact numbers; manual export |
| An SEO suite subscription | Many tools in one place, keyword difficulty, SERP data | A monthly plan; bulk exports and API access often cost extra |
| A keyword data API directly | Full control over endpoints | Its own account, billing and integration code |

### Data source

Data comes from [DataForSEO](https://dataforseo.com), from its Google Ads Keyword Planner API and its DataForSEO Labs keyword database. DataForSEO's site says its customers may show its data in tools they sell to their own users. This Actor is built by SteadyScrape and isn't affiliated with Google or DataForSEO.

### Limits & notes

- Each keyword can have at most 80 characters and 10 words. Characters Google Ads rejects are removed when **Clean up keywords** is on.
- Google Ads groups close variants, so for example `running shoe` and `running shoes` can show the same volume.
- Very low-volume keywords may return `no_data`.
- Worldwide (no location) is only available in `live` and `queue` modes.
- Up to 1,000 keywords per run by default (**Max keywords per run**, up to 10,000). Very large fresh lists may be asked to split into smaller runs.

### Integrations

- **Schedule:** save your input as a task and add a schedule (hourly, daily, weekly) in Apify Console.
- **API:** start runs and read the keyword rows with the Apify API or the official Python and JavaScript clients (`apify-client`). `POST https://api.apify.com/v2/acts/steady-scrape~keyword-search-volume/run-sync-get-dataset-items` runs the Actor and returns the dataset in one request (JSON, CSV or Excel).
- **Make, Zapier and n8n:** use Apify's apps for Make and Zapier, or the Apify node for n8n, to start this Actor and send the keyword rows to Google Sheets, Slack, a CRM or a database without code.
- **Webhooks:** call your own URL when a run succeeds or fails.
- **AI agents (MCP):** the [Apify MCP server](https://mcp.apify.com) exposes this Actor as a tool to Claude, Cursor and other MCP clients, so an agent can run it and read structured output. The input and output fields are documented for that.

### Use it from an AI agent (Apify MCP)

Give Claude, Cursor, VS Code or any other MCP client this Actor as a tool through the [Apify MCP server](https://mcp.apify.com). Add this to your client's MCP config; you sign in to Apify with OAuth on first connect:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=steady-scrape/keyword-search-volume"
    }
  }
}
```

Clients without OAuth can send an `Authorization: Bearer <APIFY_TOKEN>` header instead. Then ask, for example: *"Get the US monthly search volume and CPC for these 50 keywords and sort them by volume."* The agent starts a normal run, so the prices above and your maximum charge per run still apply.

### FAQ

**What is AI search volume?** An estimate of monthly prompts mentioning the keyword in AI assistants, from DataForSEO's AI keyword data. Use it to spot topics people research in AI tools, not to replace Google volume.

**Is this the same number Keyword Planner shows?** In `live` and `queue` modes it comes from the Google Ads Keyword Planner API. In `auto` and `labs` modes it can come from a keyword database built from Google Ads data; `dataSource` on each row tells you which.

**Why do `running shoe` and `running shoes` have the same volume?** Google Ads groups close variants and returns one volume for the group.

**Why is a keyword `no_data`?** Its volume is too low for Google Ads to report, or (in `labs` mode) it isn't in the keyword database. `no_data` rows are free.

**How fresh is the data?** Keyword Planner volumes update monthly. `dataDate` shows the latest month and `source` says whether it was fetched live or from the 30-day cache.

**Can I cap spend?** Yes. Set *Max cost per run* in the run options; the Actor processes only as many keywords as the limit covers.

**How can I get keyword search volume without a Google Ads account?** Run this Actor with your keyword list, country and language. It returns monthly volume, CPC, competition and a 12-month trend per keyword, with no Google Ads account or spend needed.

**What's the cheapest way to check search volume for thousands of keywords?** Put them all in one run: the $0.12 lookup fee is charged once per run, so 1,000 keywords cost $3.12 and keywords without data are free.

**Can I get search volume for a specific country or language?** Yes. Set `location` and `language`, for example `United Kingdom` and `English`.

**Does it give keyword difficulty?** No. It returns Keyword Planner data: volume, CPC, competition, top-of-page bids and the monthly trend.

### More from SteadyScrape

- [Keyword Research Tool: Ideas, Volume, KD & Intent](https://apify.com/steady-scrape/keyword-research-explorer): no keyword list yet? Turn one seed into hundreds of keyword ideas, suggestions or related searches with volume, CPC, difficulty and intent, then check the shortlist here.
- [Google Images API](https://apify.com/steady-scrape/google-images-api): Google Images results as JSON, with real image sizes, source pages, site names and related searches.
- [Google Rank Tracker API: Daily Keyword Positions](https://apify.com/steady-scrape/google-rank-tracker): track where your site ranks on Google for the keywords you research, with SERP features, AI Overview, top competitors and changes since the last run.
- [Competitor Keyword Gap: Missing & Ranked Keywords](https://apify.com/steady-scrape/competitor-keywords-gap): find the keywords your competitors rank for and you don't, with search volume, CPC, difficulty and their positions, ready to feed into a volume check.

See every **SteadyScrape (steady-scrape)** Actor on [our Apify profile](https://apify.com/steady-scrape).

### Need something else?

Open an issue in the **Issues** tab. SteadyScrape usually replies within a day.

### Acceptable use

You may not use results from this service to build or operate a search engine, or any product or service that competes with or harms the business of search engine providers.

— SteadyScrape

# Actor input Schema

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

Keywords or phrases, one per line (up to 80 characters and 10 words each, Google Ads limits). Duplicates and casing differences are merged.

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

Country name ("United States", "Germany"), ISO code ("US", "GB"), Google Ads location code (2840) or a full DataForSEO location name such as "London,England,United Kingdom". Use "worldwide" for all locations (mode live or queue only).

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

Language name ("English", "Spanish", "Chinese (Simplified)") or code ("en", "es").

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

Where fresh data comes from. All modes return the same fields; cached keywords are returned instantly in every mode.

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

Add monthlySearches: search volume for each of the last 12 months.

## `includeAiVolume` (type: `boolean`):

Also add aiSearchVolume: how often each keyword appears in prompts to AI assistants (ChatGPT, Gemini and similar), with a 12-month AI trend. Extra charge per keyword with an AI value; cached for 30 days. Available in 94 countries (not worldwide), in each country's main languages.

## `normalizeKeywords` (type: `boolean`):

Lowercase, trim, collapse spaces and remove characters Google Ads rejects (! @ % , ? quotes...). Invalid keywords are reported, never charged.

## `dedupe` (type: `boolean`):

Return each normalized keyword once.

## `useCache` (type: `boolean`):

Keyword Planner data changes monthly, so keywords looked up in the last 30 days for the same market come from the cache instantly.

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

Safety limit: keywords beyond this are skipped.

## `queueMaxWaitMinutes` (type: `integer`):

How long a queue-mode run waits for the provider before returning what is ready.

## Actor input object example

```json
{
  "keywords": [
    "keyword research",
    "seo tools",
    "best running shoes"
  ],
  "location": "United States",
  "language": "English",
  "mode": "auto",
  "includeMonthlyTrend": true,
  "includeAiVolume": false,
  "normalizeKeywords": true,
  "dedupe": true,
  "useCache": true,
  "maxKeywords": 1000,
  "queueMaxWaitMinutes": 180
}
```

# Actor output Schema

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

One item per keyword. Use /items without ?view for all fields, including the 12-month trend.

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

Counts (ok, no data, invalid, cached vs fresh) and the mode used.

# 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",
        "seo tools",
        "best running shoes"
    ],
    "location": "United States",
    "language": "English"
};

// Run the Actor and wait for it to finish
const run = await client.actor("steady-scrape/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",
        "seo tools",
        "best running shoes",
    ],
    "location": "United States",
    "language": "English",
}

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

```

## MCP server setup

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