# Keyword Search Volume API — Bulk Google Volume + CPC (`khadinakbar/keyword-search-volume-api`) Actor

Bulk Google keyword search volume, CPC, competition, and bid estimates via DataForSEO. Free tier (25 keywords) or bulk paid (up to 1,000). One row per keyword, MCP-ready.

- **URL**: https://apify.com/khadinakbar/keyword-search-volume-api.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** SEO tools, Lead generation, MCP servers
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 keyword metric rows

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 API — Bulk Google Volume + CPC

Turn a keyword list into one dataset row per keyword with Google Ads search volume, CPC, competition, and bid estimates. Built for SEO teams, PPC planners, and agents that already have the phrases and need structured volume plus cost data. Powered by the DataForSEO Google Ads Search Volume API on Apify, with API, schedule, and MCP access.

### Best fit for this Actor

- Look up search volume and CPC for a known keyword list, then export JSON or CSV.
- Compare bid ranges across countries before you set a Google Ads budget.
- Feed volume and CPC fields into a content or bidding workflow.

When you need keyword ideas from a seed phrase, then use [Keyword Research Tool — DataForSEO API](https://apify.com/khadinakbar/dataforseo-keyword-research). After you have ranks to watch, continue with [Keyword Rank Tracker](https://apify.com/khadinakbar/keyword-rank-tracker).

### Practical scenario

An SEO lead pastes `buy crm software`, `saas project management`, and `email marketing tool`. The run returns one row per phrase with `searchVolume`, `cpcUsd`, `competitionLevel`, and top-of-page bid estimates for the United States. The lead keeps phrases with enough volume and a workable CPC, then schedules the same input weekly.

### Quick start input

```json
{
  "keywords": ["buy crm software", "saas project management", "email marketing tool"],
  "mode": "free_tier",
  "countryName": "United States",
  "languageName": "English"
}
```

`mode: "free_tier"` processes up to 25 unique keywords. `mode: "bulk_paid"` processes up to 1,000 unique keywords per run, batched at 700 by default.

### Input reference

| Field | Type | What it controls |
|---|---|---|
| `keywords` | array | Required phrases to look up. Duplicates collapse to one row. |
| `mode` | enum | `free_tier` (25) or `bulk_paid` (1,000). Default `free_tier`. |
| `countryName` | string | DataForSEO location name. Default United States. |
| `languageName` | string | DataForSEO language name. Default English. |
| `includeCompetition` | boolean | Include competition score and level. Default true. |
| `includeLowTopOfPageBid` | boolean | Include low top-of-page bid. Default true. |
| `includeHighTopOfPageBid` | boolean | Include high top-of-page bid. Default true. |
| `maxKeywordsPerBatch` | integer | Keywords per DataForSEO call. Default 700, max 1000. |

Owner DataForSEO secrets stay in environment variables. Optional private input fields override them for a single run.

### What data you receive

One dataset item is one input keyword.

```json
{
  "keyword": "buy crm software",
  "normalizedKeyword": "buy crm software",
  "countryName": "United States",
  "languageName": "English",
  "searchVolume": 50,
  "cpcUsd": 8.72,
  "competition": 0.85,
  "competitionLevel": "HIGH",
  "lowTopOfPageBidUsd": 4.87,
  "highTopOfPageBidUsd": 12.29,
  "monthlySearches": [{ "year": 2025, "month": 12, "searchVolume": 40 }],
  "source": "dataforseo/keywords_data/google_ads/search_volume/live",
  "status": "OK"
}
```

| Field | Meaning |
|---|---|
| `searchVolume` | Monthly Google Ads volume estimate. |
| `cpcUsd` | Average cost-per-click estimate in USD. |
| `status` | `OK` when DataForSEO matched the phrase; `NO_DATA` when the phrase is unmatched. |

`OUTPUT` and `RUN_SUMMARY` in the default key-value store hold `outcome`, `itemsPushed`, `chargedEventCounts`, and `providerCostUsd`. Download the dataset as JSON, CSV, Excel, or HTML.

### Use through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~keyword-search-volume-api/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["buy crm software"],"mode":"free_tier","countryName":"United States"}'
```

### Use with AI agents through Apify MCP

> Look up Google Ads search volume and CPC for buy crm software and email marketing tool in the United States. Return keyword, searchVolume, cpcUsd, competitionLevel, status, and fetchedAt. Read OUTPUT.outcome, itemsPushed, and RUN\_SUMMARY.providerCostUsd for cost and scope.

Connect via <https://mcp.apify.com>. Start with `free_tier` so agents can confirm credentials and provenance before a bulk\_paid list.

### Connect the workflow

- When you need ideas from a seed, then search with [Keyword Research Tool — DataForSEO API](https://apify.com/khadinakbar/dataforseo-keyword-research).
- After you pick phrases, monitor ranks with [Keyword Rank Tracker](https://apify.com/khadinakbar/keyword-rank-tracker).

### Pricing

Pay per event plus platform usage. Confirm current event prices on the live Pricing tab; that tab is the source of truth if this page ever lags.

- `apify-actor-start`: $0.00005 per run
- `dataforseo-volume-request`: **$0.30** per successful DataForSEO batch
- `keyword-metric`: **$0.004** per persisted row (`OK` or `NO_DATA`)

A three-keyword prefill is about $0.312 in events plus a few seconds of Apify platform usage. Provider cost is recorded in `RUN_SUMMARY.providerCostUsd`.

### How it works

1. Deduplicate and cap the keyword list for the selected mode.
2. POST batches to DataForSEO `/keywords_data/google_ads/search_volume/live`.
3. Charge `dataforseo-volume-request` after a successful batch, then write one row per input keyword.
4. Charge `keyword-metric` with each validated dataset write.

### Best results

- Provide a focused list you already chose; start with `free_tier` to confirm the output shape.
- Use exact DataForSEO country and language names such as United Kingdom and English.
- Keep `maxKeywordsPerBatch` at 700 unless you have a specific batching reason.
- Treat volume and CPC as Google Ads planning estimates for the public keywords you are authorized to research.

### Builder's note

I found that DataForSEO returns Google Ads search-volume rows in `task.result` rather than a nested `items` envelope, and that a live call costs about nine cents regardless of a 1-keyword or 25-keyword batch. I designed the free-tier cap and the request-plus-row events around that so a one-keyword check still covers provider cost, while a 1,000-keyword bulk run stays cheap per row. Every input keyword gets a row so downstream jobs can rely on a 1-to-1 map.

### Legal and responsible use

Use this Actor with a DataForSEO account you are authorized to access, follow applicable law and DataForSEO plus Google terms, and keep the output in your own compliance workflow. Search volume and CPC are Google Ads model estimates delivered through DataForSEO.

Issues and feature requests: use the Actor Issues tab on Apify.

# Actor input Schema

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

List of keywords to look up. Each keyword gets one row with searchVolume, CPC, competition, and bid estimates. Duplicates are removed. Free tier caps at 25; bulk\_paid caps at 1,000.

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

free\_tier returns up to 25 keywords for evaluation. bulk\_paid processes up to 1,000 keywords per run for production use. Use free\_tier to validate credentials and output before a paid bulk run.

## `countryName` (type: `string`):

DataForSEO country name for search volume context. Defaults to United States. Use exact country names as DataForSEO expects them, such as United Kingdom, Germany, or India.

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

DataForSEO language name matching the selected country, such as English, German, or Spanish. Defaults to English.

## `includeCompetition` (type: `boolean`):

Return competition (0-1 float) and competitionLevel (LOW/MEDIUM/HIGH) from Google Ads. Included by default.

## `includeLowTopOfPageBid` (type: `boolean`):

Return lowTopOfPageBidUsd (Google Ads low bid estimate). Included by default.

## `includeHighTopOfPageBid` (type: `boolean`):

Return highTopOfPageBidUsd (Google Ads high bid estimate). Included by default.

## `includeClickstreamData` (type: `boolean`):

Request DataForSEO clickstream-enriched data. Off by default; enabling may affect DataForSEO API cost.

## `maxKeywordsPerBatch` (type: `integer`):

Number of keywords sent in each DataForSEO API request. Default 700; maximum 1000.

## `onPartialFailure` (type: `string`):

return\_partial saves all successful batches and marks the run PARTIAL. fail\_if\_any\_batch\_fails stops immediately on the first batch error.

## `dataforSeoLogin` (type: `string`):

Your DataForSEO API login email. Used only when the DATAFORSEO\_LOGIN actor secret is unavailable. Keep this private.

## `dataforSeoPassword` (type: `string`):

Your DataForSEO API password. Used only when the DATAFORSEO\_PASSWORD actor secret is unavailable. Keep this private.

## Actor input object example

```json
{
  "keywords": [
    "buy crm software",
    "saas project management"
  ],
  "mode": "free_tier",
  "countryName": "United Kingdom",
  "languageName": "English",
  "includeCompetition": true,
  "includeLowTopOfPageBid": true,
  "includeHighTopOfPageBid": true,
  "includeClickstreamData": false,
  "maxKeywordsPerBatch": 700,
  "onPartialFailure": "return_partial",
  "dataforSeoLogin": "your-dataforseo-login@example.com",
  "dataforSeoPassword": "your-dataforseo-api-password"
}
```

# Actor output Schema

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

Dataset items with keyword, searchVolume, cpcUsd, competition, bids, monthlySearches, and status.

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

Compact OUTPUT record with outcome, itemsPushed, batch counts, charges, and warnings.

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

Detailed RUN\_SUMMARY including providerCostUsd, billedKeywords, and timing.

# 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": [
        "buy crm software",
        "saas project management",
        "email marketing tool"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/keyword-search-volume-api").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": [
        "buy crm software",
        "saas project management",
        "email marketing tool",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/keyword-search-volume-api").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": [
    "buy crm software",
    "saas project management",
    "email marketing tool"
  ]
}' |
apify call khadinakbar/keyword-search-volume-api --silent --output-dataset

```

## MCP server setup

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

```

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/B7Wq9VHcVFdfNqNBI/builds/Rd7grGCWFvaRSDsHQ/openapi.json
