# Keyword Search Volume Checker Scraper (`automation-lab/bulk-keyword-metrics-checker`) Actor

Check Google keyword search volume, CPC, competition, intent, categories, and 12-month trends for a bulk list without buyer API credentials.

- **URL**: https://apify.com/automation-lab/bulk-keyword-metrics-checker.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** SEO tools
- **Stats:** 2 total users, 2 monthly users, 88.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#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

## Keyword Search Volume Checker Scraper

Turn a keyword list into structured Google search-demand metrics without opening a Google Ads account or supplying DataForSEO credentials.

This **keyword search volume checker** returns one normalized row per unique keyword with search volume, CPC, paid competition, competition level, intent, category IDs, and the latest 12 monthly volume points.

It is designed for bounded list scoring, scheduled SEO dashboards, no-code enrichment, and AI-agent research.

### What does this Actor do?

The Actor sends one efficient, bounded request to DataForSEO Labs Keyword Overview and writes the response to the default Apify dataset.

It can:

- check 1–700 keywords in one run;
- use a supported Google location and language;
- deduplicate repeated keywords before the paid request;
- preserve unavailable metrics as `null` rather than inventing zeroes;
- retain the latest 12 monthly search-volume points;
- enforce estimated and actual upstream-cost ceilings;
- produce integration-ready JSON, CSV, Excel, XML, RSS, or HTML through Apify dataset exports.

It does not generate keyword suggestions, scrape SERPs, track rankings, send alerts, or query Bing and other engines.

### Who is it for?

#### SEO agencies

Score client keyword lists and feed repeatable metrics into reporting dashboards.

#### Content and growth teams

Compare demand, CPC, intent, and trend before prioritizing a content backlog.

#### No-code operators

Enrich rows from Make, Zapier, n8n, Airtable, or Google Sheets without managing another API account.

#### AI-agent developers

Give an agent typed keyword evidence instead of asking it to estimate demand from general knowledge.

#### Data teams

Schedule the same bounded input and compare stored datasets over time in your own warehouse.

### Why use this keyword metrics checker?

- **No buyer API key:** company-managed credentials stay in secret Actor configuration.
- **One row per keyword:** results are easy to join back to a list.
- **Nullable by design:** missing source values remain missing.
- **Cost guarded:** input is rejected before a paid call when its published estimate exceeds the selected ceiling.
- **Bulk efficient:** all accepted keywords use one DataForSEO Live task.
- **Apify native:** schedule runs, trigger webhooks, export datasets, or call the Actor over API.

### What keyword data is returned?

| Field | Meaning | Nullable |
| --- | --- | --- |
| `keyword` | Trimmed, deduplicated input keyword | No |
| `locationCode` | DataForSEO location code | Yes |
| `languageCode` | DataForSEO language code | Yes |
| `searchVolume` | Current average monthly Google search volume | Yes |
| `cpc` | Historical average Google Ads CPC in USD | Yes |
| `competition` | Paid-search competition from 0 to 1 | Yes |
| `competitionLevel` | Source level such as `LOW`, `MEDIUM`, or `HIGH` | Yes |
| `intent` | Primary detected search intent | Yes |
| `foreignIntents` | Additional detected intents | No; empty array when absent |
| `categories` | DataForSEO category identifiers | No; empty array when absent |
| `monthlySearchVolume` | Latest 12 `{ year, month, searchVolume }` points | No; empty array when absent |
| `dataUpdatedAt` | Source metric update time | Yes |
| `checkedAt` | Actor extraction time in ISO 8601 | No |

### Getting started

1. Open the Actor input page.
2. Add at least one keyword to **Keywords**.
3. Keep `United States` and `English`, or enter another exact DataForSEO-supported location and language name.
4. Optionally lower the upstream-cost ceiling for a small automation.
5. Click **Start**.
6. Open the **Keyword metrics** dataset view.
7. Export the rows or connect the dataset to your next workflow step.

The prefilled three-keyword input is intentionally small and is suitable for a first run.

### Input parameters

#### `keywords`

Required array of 1–700 keyword phrases.

Each phrase may contain at most:

- 80 characters;
- 10 words.

Whitespace is normalized and duplicates are removed case-insensitively. The first spelling of a duplicate is retained.

#### `locationName`

Exact DataForSEO location name.

Default: `United States`.

Examples include `United Kingdom`, `Germany`, and `Australia`.

An unsupported name produces a clear upstream validation error; the Actor does not silently switch geography.

#### `languageName`

Exact DataForSEO language name.

Default: `English`.

Examples include `German`, `Spanish`, and `French`.

#### `maxUpstreamCostUsd`

Optional per-run safety ceiling from `$0.01212` to `$0.10`.

Default: `$0.10`.

This can lower the Actor's fixed hard ceiling but cannot raise it.

The pre-call estimate follows the current DataForSEO formula: `$0.012 + $0.00012 × unique keyword count`.

### Example input

```json
{
  "keywords": [
    "keyword search volume checker",
    "bulk keyword volume checker",
    "google keyword planner alternative"
  ],
  "locationName": "United States",
  "languageName": "English",
  "maxUpstreamCostUsd": 0.02
}
```

### Example output

A current US-English source response is normalized like this:

```json
{
  "keyword": "keyword search volume checker",
  "locationCode": 2840,
  "languageCode": "en",
  "searchVolume": 390,
  "cpc": 10.52,
  "competition": 0.37,
  "competitionLevel": "MEDIUM",
  "intent": "informational",
  "foreignIntents": [],
  "categories": [10008],
  "monthlySearchVolume": [
    { "year": 2026, "month": 6, "searchVolume": 210 },
    { "year": 2026, "month": 5, "searchVolume": 390 },
    { "year": 2026, "month": 4, "searchVolume": 390 }
  ],
  "dataUpdatedAt": "2026-07-14 09:13:02 +00:00",
  "checkedAt": "2026-07-29T02:15:00.000Z"
}
```

The actual `monthlySearchVolume` array contains up to 12 points; it is shortened above for readability.

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

Pay-per-event pricing has two parts:

- `$0.33` once after the input passes validation;
- a tiered price for each keyword row saved to the dataset.

At the BRONZE tier, each saved keyword row costs `$0.0008`.

| Unique keywords | BRONZE calculation |
| ---: | --- |
| 3 | $0.33 + (3 × $0.0008) |
| 100 | $0.33 + (100 × $0.0008) |
| 500 | $0.33 + (500 × $0.0008) |
| 700 | $0.33 + (700 × $0.0008) |

Per-row prices are `$0.00092` FREE, `$0.0008` BRONZE, `$0.000624` SILVER, `$0.00048` GOLD, `$0.00032` PLATINUM, and `$0.000224` DIAMOND. Apify shows the applicable price before a run.

Invalid input fails before the start event and before any paid DataForSEO request. A valid run charges the start event before the upstream request, then charges only rows emitted after a successful response and cost verification.

### Upstream cost and safety limits

DataForSEO currently charges `$0.012` per Live task plus `$0.00012` per keyword for this endpoint.

The Actor protects the shared account in four ways:

1. it validates every keyword before the request;
2. it caps the request at 700 unique keywords;
3. it rejects estimated cost above the user's ceiling or the fixed `$0.10` ceiling;
4. it checks the task's returned actual cost before charging or saving item rows.

The Actor never accepts buyer DataForSEO credentials and never logs company credentials.

At 700 keywords, the fixed hard ceiling limits upstream API cost to `$0.096`. Using the lowest DIAMOND customer price, gross revenue is `$0.4868`; after Apify's 20% platform margin and the measured representative platform cost, the remaining net margin is above 70%.

### Scheduled SEO dashboard workflow

Use an Apify schedule to run the same keyword list weekly or monthly.

For change analysis:

1. schedule this Actor with a stable location and language;
2. store each run ID and dataset ID in your warehouse;
3. join rows by `keyword`;
4. compare `searchVolume`, `cpc`, `competition`, and monthly points;
5. alert or report from your own downstream system.

The Actor supplies snapshots. It does not calculate deltas or send alerts itself.

### No-code list enrichment

A typical Make, Zapier, or n8n workflow is:

1. collect a bounded keyword list from a sheet or form;
2. start the Actor synchronously;
3. read dataset items;
4. branch on nullable fields;
5. write metrics back to the original rows.

Keep keyword batches together when they share a location and language. Separate runs are needed for different locale combinations.

### API usage with cURL

Set `APIFY_TOKEN` in your shell, then run:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~bulk-keyword-metrics-checker/runs?token=$APIFY_TOKEN&waitForFinish=300" \
  -H "Content-Type: application/json" \
  -d '{
    "keywords": ["seo reporting dashboard", "keyword performance dashboard"],
    "locationName": "United States",
    "languageName": "English",
    "maxUpstreamCostUsd": 0.02
  }'
```

Read items from the run's `defaultDatasetId`.

### API usage with JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/bulk-keyword-metrics-checker').call({
  keywords: ['seo reporting dashboard', 'keyword performance dashboard'],
  locationName: 'United States',
  languageName: 'English',
  maxUpstreamCostUsd: 0.02,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/bulk-keyword-metrics-checker").call(run_input={
    "keywords": ["seo reporting dashboard", "keyword performance dashboard"],
    "locationName": "United States",
    "languageName": "English",
    "maxUpstreamCostUsd": 0.02,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with Apify MCP

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/bulk-keyword-metrics-checker"
```

For Claude Desktop, Cursor, or VS Code, use this equivalent JSON configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/bulk-keyword-metrics-checker"
    }
  }
}
```

Example prompts:

- “Check these 20 keywords for US English volume and CPC, then rank them by volume.”
- “Get UK English intent and 12-month volume points for this content backlog.”
- “Return only keywords with commercial intent and non-null CPC.”

### Limits and expected behavior

- Google is the only supported search engine in this MVP.
- One run uses one location and one language.
- The hard limit is 700 unique keywords.
- Metrics reflect DataForSEO's latest available data, not real-time searches.
- Monthly history is limited to the latest 12 supplied points.
- Location and language names must match DataForSEO's supported names.
- Sparse or unknown keywords can produce rows with nullable metrics.
- Deduplication means repeated case variants do not create repeated rows or repeated item charges.
- The Actor does not use proxies or a browser.

### Failure and retry behavior

The Actor retries only transient HTTP conditions such as `429` and selected `5xx` responses, with bounded backoff.

It does not blindly retry deterministic authentication, input, or location errors.

A failed upstream task causes a failed Actor run; it does not emit misleading partial data.

If the returned actual upstream cost exceeds a ceiling, the Actor fails without charging or saving item rows. The upstream provider may already have charged its task cost, which is why the stricter pre-call estimate is also mandatory.

### Troubleshooting

#### “keywords must be a non-empty array”

Add at least one string under `keywords`. Objects and numbers are not accepted.

#### “Estimated upstream cost exceeds the run ceiling”

Reduce the unique keyword count or raise `maxUpstreamCostUsd` up to the fixed maximum of `$0.10`.

#### DataForSEO rejects the locale

Use an exact supported location and language name. Check spelling and do not combine locale codes into the name fields.

#### A metric is null

`null` means the source did not provide that metric. It does not mean zero. Preserve this distinction in filters and dashboards.

#### A repeated keyword is missing

The Actor intentionally emits one row per unique case-insensitive keyword. Join duplicates back to your original list downstream if needed.

### Legality and responsible use

Use keyword metrics for lawful SEO, advertising, research, and automation purposes.

Do not present estimates as guaranteed traffic, revenue, or advertising outcomes.

The Actor uses DataForSEO through company-managed credentials and does not expose those credentials or raw authentication details.

DataForSEO markets its APIs for building SEO software and its current public Terms of Service do not state a resale prohibition. Terms can change; the publication owner must recheck the current agreement before first Store publication.

You are responsible for complying with Apify terms, DataForSEO terms, and laws applicable to your downstream use.

### Related Automation Lab Actors

- [Google Trends Scraper](https://apify.com/automation-lab/google-trends-scraper) for relative trend interest and regional trend exploration.
- [Google Autocomplete Scraper](https://apify.com/automation-lab/google-autocomplete-scraper) for generating suggestion phrases before checking their metrics here.
- [SEO Audit Tool](https://apify.com/automation-lab/seo-audit-tool) for page-level technical SEO checks after keyword prioritization.

These Actors solve adjacent jobs. They are not automatic fallbacks and are not invoked by this Actor.

### FAQ

#### Do I need a DataForSEO account?

No. Do not put DataForSEO credentials in the Actor input.

#### Can it generate related keywords?

No. Supply the exact list you want checked. Use a keyword discovery source first when you need suggestions.

#### Can it track Google rankings?

No. This Actor returns keyword metrics, not domain positions or SERP results.

#### Can I check multiple countries in one run?

No. Start one run per location/language pair so every row has an unambiguous locale.

#### Does a missing keyword disappear?

No. The Actor emits a row with nullable metrics when the upstream result omits an accepted keyword.

#### Can I request more than 700 keywords?

No. The official Live endpoint and the Actor safety contract cap a run at 700.

#### Are monthly values guaranteed to contain 12 points?

No. The Actor keeps up to the latest 12 points available from the source.

#### How do I export CSV?

Open the default dataset and select CSV, or request the dataset items endpoint with `format=csv`.

#### Is the output suitable for agents?

Yes. Field names and nullability are stable and documented, but agents should not infer a value when a metric is `null`.

# Actor input Schema

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

Keywords to check. Duplicates are removed case-insensitively before the paid upstream request. Each keyword may contain at most 80 characters and 10 words.

## `locationName` (type: `string`):

Exact DataForSEO location name used for Google metrics, for example United States, United Kingdom, or Germany.

## `languageName` (type: `string`):

Exact DataForSEO language name, for example English, German, or Spanish.

## `maxUpstreamCostUsd` (type: `number`):

Optional safety ceiling for this run. The Actor rejects the input before the paid request when the published estimate exceeds this value. It can only lower, never raise, the fixed $0.10 hard ceiling.

## Actor input object example

```json
{
  "keywords": [
    "keyword search volume checker",
    "dataforseo api",
    "bulk keyword volume checker"
  ],
  "locationName": "United States",
  "languageName": "English",
  "maxUpstreamCostUsd": 0.1
}
```

# Actor output Schema

## `overview` (type: `string`):

Open all normalized keyword metrics in the overview view.

# 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 search volume checker",
        "dataforseo api",
        "bulk keyword volume checker"
    ],
    "locationName": "United States",
    "languageName": "English",
    "maxUpstreamCostUsd": 0.1
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/bulk-keyword-metrics-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": [
        "keyword search volume checker",
        "dataforseo api",
        "bulk keyword volume checker",
    ],
    "locationName": "United States",
    "languageName": "English",
    "maxUpstreamCostUsd": 0.1,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/bulk-keyword-metrics-checker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 search volume checker",
    "dataforseo api",
    "bulk keyword volume checker"
  ],
  "locationName": "United States",
  "languageName": "English",
  "maxUpstreamCostUsd": 0.1
}' |
apify call automation-lab/bulk-keyword-metrics-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/bulk-keyword-metrics-checker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/QVMVczkfyv3CNy0gR/builds/ch4TfagqjzDS0YgDB/openapi.json
