# Keyword Search Volume & CPC – DataForSEO API (`brisaworks/keyword-volume`) Actor

Bulk Google Ads keyword search volume, CPC, competition and 12-month trend for thousands of keywords, using your own DataForSEO API login. You pay DataForSEO's wholesale rate directly plus $2 per 1,000 keywords. Free preview without credentials.

- **URL**: https://apify.com/brisaworks/keyword-volume.md
- **Developed by:** [Brisa Works](https://apify.com/brisaworks) (community)
- **Categories:** SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

Get **keyword search volume**, cost per click (CPC), competition and a 12-month trend from Google Ads data for thousands of keywords in one run. This bulk keyword volume checker uses **your own DataForSEO API login**, so you pay DataForSEO's wholesale rate directly instead of a reseller's mark-up, plus $2 per 1,000 keywords here.

### What it does

- Sends your keyword list to DataForSEO's Google Ads `search_volume/live` endpoint in batches of 1,000 keywords per request.
- Returns one row per keyword: monthly search volume, CPC, competition (LOW/MEDIUM/HIGH and a 0–100 index), low and high top-of-page bids, and the month-by-month trend.
- Cleans the list first: lowercases, trims, removes duplicates, and flags keywords DataForSEO would reject (over 80 characters or 10 words) without charging for them.
- Works for any DataForSEO location and language (country, region or city).
- Saves a `SUMMARY` record with the number of requests and the DataForSEO cost the run put on your account.

Typical uses: sizing keyword lists for SEO and PPC plans, refreshing volumes in a content calendar, pricing keywords for client proposals.

### How to use

1. Create a DataForSEO account and copy the API login and password from *Dashboard → API Access*.
2. Paste your keywords, one per line.
3. Enter the login and password (secret inputs, stored encrypted by Apify and used only for this run).
4. Pick a location code (2840 = United States) or a full location name, and a language code.
5. Run, then export the dataset as CSV, Excel or JSON, or call the Actor through the Apify API from your own scripts.

Without credentials the run is a free preview: it checks and cleans the keyword list and makes no API calls.

### Input

| Field | Description |
|---|---|
| `keywords` | Keywords, one per line (required). |
| `dataforseoLogin`, `dataforseoPassword` | Your DataForSEO API credentials (secret fields). |
| `locationCode` / `locationName` | DataForSEO location, e.g. `2840` or `"London,England,United Kingdom"`. |
| `languageCode` | e.g. `en`, `es`, `de`. |
| `includeMonthlySearches` | Add the monthly trend (default on). |
| `dateFrom`, `dateTo` | Optional trend window (`yyyy-mm-dd`). |
| `searchPartners` | Include Google search partners. |

```json
{
  "keywords": ["running shoes", "trail running shoes", "marathon training plan"],
  "dataforseoLogin": "you@example.com",
  "dataforseoPassword": "••••••",
  "locationCode": 2840,
  "languageCode": "en"
}
```

### Output

One row per keyword (illustrative values):

```json
{
  "keyword": "running shoes",
  "status": "ok",
  "searchVolume": 201000,
  "cpc": 1.12,
  "competition": "HIGH",
  "competitionIndex": 100,
  "lowTopOfPageBid": 0.71,
  "highTopOfPageBid": 2.43,
  "locationCode": 2840,
  "languageCode": "en",
  "monthlySearches": [{ "year": 2026, "month": 9, "searchVolume": 233160 }]
}
```

Rows with `status` `missing_credentials`, `invalid_keyword`, `no_data` or `error` explain what went wrong and are free.

### Pricing

| Event | Price | Per 1,000 | Charged when |
|---|---|---|---|
| `keyword` | $0.002 | $2.00 | DataForSEO returns a row for the keyword |

A keyword is charged when DataForSEO returns a row for it, including rows where Google reports no volume (`searchVolume: null`). Keywords DataForSEO returns nothing for, rejected keywords and failed requests are free.

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

- 1,000 keywords: $2.00 here, plus DataForSEO's own fee on your DataForSEO account (it bills per request of up to 1,000 keywords; the example request in its documentation cost $0.075).
- 10,000 keywords: $20.00 here, plus about ten DataForSEO requests.
- Apify adds its standard small run-start fee.

Set a maximum cost per run in the run options: the Actor checks it before saving each keyword and stops before going over it.

### FAQ

#### Why bring my own DataForSEO account?

Keyword volume Actors that resell the data have to charge for it. Here DataForSEO bills you its wholesale price directly and this Actor charges only for the work of running it.

#### Can I try it without credentials?

Yes. Without a login and password the run is free: it shows the cleaned keyword list and flags keywords DataForSEO would reject.

#### Is this the same data as Google Keyword Planner?

It is Google Ads keyword planning data, supplied by DataForSEO's Google Ads endpoint. Google groups close variants, so near-duplicates can show the same numbers.

#### Are my DataForSEO credentials safe?

They are secret inputs, encrypted by Apify, sent only to DataForSEO, and never logged or written to the dataset.

### Limits

- DataForSEO allows 12 requests per minute on Google Ads Live endpoints; the Actor sends one request every 5 seconds, so 1,000 keywords take one request and 100,000 keywords take about 8.5 minutes.
- Keywords longer than 80 characters or 10 words are rejected by DataForSEO and flagged here for free.
- Google Ads groups close variants; DataForSEO may return the same figures for near-duplicates.
- The trend cannot include the current month.

### Data source

- DataForSEO Keywords Data API, Google Ads Search Volume (Live): <https://docs.dataforseo.com/v3/keywords_data/google_ads/search_volume/live/> — read on 2026-10-14 (endpoint, Basic auth, 1,000 keywords per task, 80-character and 10-word limits, 12 requests per minute, per-request billing).
- The data is Google Ads keyword planning data supplied by DataForSEO under your own DataForSEO agreement; this Actor does not resell it.

### Privacy

Only your keyword list and credentials are processed. Credentials are used for this run's requests and never logged or stored by the Actor.

### Support

Open an issue on the Actor's Issues tab; issues are answered within a few days and fixed within 14 days.

# Actor input Schema

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

One keyword per line. Up to 80 characters and 10 words each; duplicates and letter case are ignored. Sent to DataForSEO in batches of 1,000.

## `dataforseoLogin` (type: `string`):

Your DataForSEO API login (Dashboard → API Access). Without credentials the run only previews the cleaned keyword list, for free.

## `dataforseoPassword` (type: `string`):

Your DataForSEO API password. Stored encrypted by Apify and used only for this run's requests.

## `locationCode` (type: `integer`):

DataForSEO location code, e.g. 2840 United States, 2826 United Kingdom, 2724 Spain, 2276 Germany.

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

Optional full DataForSEO location name, e.g. "London,England,United Kingdom".

## `languageCode` (type: `string`):

Two-letter language code, e.g. en, es, de.

## `searchPartners` (type: `boolean`):

Include search-partner network volume.

## `includeMonthlySearches` (type: `boolean`):

Add the month-by-month search volume (12 months by default).

## `dateFrom` (type: `string`):

Optional start of the monthly trend; default is the past 12 months.

## `dateTo` (type: `string`):

Optional end of the monthly trend; cannot be in the current month.

## Actor input object example

```json
{
  "keywords": [
    "running shoes",
    "trail running shoes",
    "marathon training plan"
  ],
  "locationCode": 2840,
  "languageCode": "en",
  "searchPartners": false,
  "includeMonthlySearches": true
}
```

# Actor output Schema

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

One row per result, in the dataset (overview view).

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

Keywords checked, keywords charged, DataForSEO requests and their cost.

# 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",
        "marathon training plan"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("brisaworks/keyword-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": [
        "running shoes",
        "trail running shoes",
        "marathon training plan",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("brisaworks/keyword-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": [
    "running shoes",
    "trail running shoes",
    "marathon training plan"
  ]
}' |
apify call brisaworks/keyword-volume --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,brisaworks/keyword-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/bFdjR1rJp4h68lNPJ/builds/412902ZxG7t9VU54p/openapi.json
