# Keyword Research API: Search Volume, CPC, Difficulty & Intent (`pravus/keyword-overview`) Actor

Keyword research API: Google search volume, CPC, keyword difficulty, search intent and up to 8 years of trends for 10,000 keywords per run, plus keyword ideas and optional Bing data. $3 per 1,000 keywords, $0.40 per 1,000 after the first 100. No-data keywords are free.

- **URL**: https://apify.com/pravus/keyword-overview.md
- **Developed by:** [Pravus](https://apify.com/pravus) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 keyword with data

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

## Keyword Research API: Search Volume, CPC, Difficulty & Intent

Two tools in one, with no subscription and no Google Ads account:

- **Metrics:** monthly Google search volume, CPC, competition, **keyword difficulty**, **search intent** and **trends** with up to ~8 years of monthly history, for up to 10,000 keywords per run.
- **Keyword ideas:** turn a few seed keywords into hundreds or thousands of related keywords, each with the same full data, sorted by search volume.

Optional **Bing search volume** ($0.25 per request) and **Google SERP features**. You pay only for keywords that return data, and the price drops to **$0.40 per 1,000** after the first 100 keywords of a run.

Built for SEO teams, content planners, PPC managers and **AI agents** that need keyword data mid-task (works over Apify's MCP server in Claude, Cursor, ChatGPT and other clients).

### What you get for each keyword

| Field | Meaning |
|---|---|
| `searchVolume` | Average monthly Google searches |
| `monthlySearches` | Monthly search volume history: up to ~8 years in metrics mode, the last 12 months for keyword ideas |
| `trendMonthlyPct`, `trendQuarterlyPct`, `trendYearlyPct` | Percentage change in volume |
| `cpc` | Average cost per click in USD |
| `competition`, `competitionLevel` | Google Ads competition (0–1, LOW/MEDIUM/HIGH) |
| `lowTopOfPageBid`, `highTopOfPageBid` | Top-of-page bid range in USD |
| `keywordDifficulty` | How hard it is to rank in the top 10 organically (0–100) |
| `searchIntent`, `secondaryIntents` | informational, commercial, transactional or navigational |
| `serpFeatures`, `serpResultsCount` | Optional: which Google result features appear (featured snippet, People Also Ask, shopping…) |
| `bingSearchVolume`, `bingCpc`, `bingCompetition`, `bingMonthlySearches` | Optional: Bing data (English, French, German) |
| `seedKeyword` | Ideas mode ("contains"): the seed an idea came from |
| `found` | `false` when there's no data for the keyword. **These rows are free.** |

### Examples

**Metrics for your keywords**

```json
{
  "keywords": ["running shoes", "best running shoes for flat feet", "trail running shoes"],
  "location": "United States",
  "language": "en"
}
```

**Discover keyword ideas**

```json
{
  "mode": "ideas",
  "keywords": ["running shoes"],
  "maxIdeas": 500,
  "minSearchVolume": 50
}
```

- `ideaType: "related"` (default): keywords related to all your seeds, for broad discovery (up to 200 seeds). Sorted by relevance; set `"sortBy": "searchVolume"` for biggest-first.
- `ideaType: "contains"`: keywords that contain each seed phrase, e.g. *"best running shoes for women"* (up to 20 seeds; ideas are split across them).

**Add Bing and SERP features**

```json
{ "keywords": ["running shoes"], "includeBing": true, "includeSerpInfo": true }
```

Location can be a country name (`"Germany"`), a two-letter code (`"us"`, `"uk"`, `"de"`) or a numeric location code (`2840`).

### Output example

```json
{
  "keyword": "trail running shoes",
  "found": true,
  "source": "metrics",
  "location": "United States",
  "language": "en",
  "searchVolume": 165000,
  "cpc": 1.03,
  "competition": 1,
  "competitionLevel": "HIGH",
  "keywordDifficulty": 3,
  "searchIntent": "transactional",
  "secondaryIntents": [],
  "trendMonthlyPct": 22,
  "trendQuarterlyPct": 50,
  "trendYearlyPct": -87,
  "monthlySearches": [{ "year": 2026, "month": 9, "searchVolume": 201000 }],
  "dataUpdatedAt": "2026-10-01 07:02:03 +00:00"
}
```

### Pricing

Pay per use, with no subscription:

| | Price |
|---|---|
| Data request (up to 700 keywords, or up to 1,000 ideas), charged per successful request | $0.03 |
| Keyword with data: first 100 keywords of each run | $0.003 each ($3 per 1,000) |
| Keyword with data: every keyword after the first 100 in a run | **$0.0004 each ($0.40 per 1,000)** |
| Bing data request (optional, per 700 keywords or page of ideas) | $0.25 |

| Run | Cost |
|---|---|
| 10 keywords | $0.06 |
| 100 keywords | $0.33 |
| 1,000 keywords | $0.72 |
| 10,000 keywords | $4.71 |
| 500 keyword ideas | $0.49 |

- Keywords **without data, invalid keywords and duplicates are never charged** (the data request fee still applies to a successful request). Failed requests are never charged.
- Bing is charged per successful Bing request, only when you turn it on. Only keywords with Google data are sent to Bing.
- **Free Apify plan:** try it with up to 20 keywords or ideas per run (one seed keyword for "contains" ideas). Any paid Apify plan unlocks up to 10,000.
- Set a **maximum cost per run** in the run options and the Actor stops *before* doing work that would exceed it, so you're never charged past your limit.

### Use it from code

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('pravus/keyword-overview').call({
    mode: 'ideas',
    keywords: ['running shoes'],
    maxIdeas: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

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

Add the Apify MCP server to your client and the agent can call this Actor as a tool, for example: *"Find 200 keyword ideas around 'home espresso machine' with at least 500 monthly searches and difficulty under 30, then group them by search intent."*

### Pair it with competitor research

To see every keyword a competitor ranks for, the keywords they rank for and you don't (keyword gap), or who your organic competitors are, use [Competitor Keywords, Keyword Gap & Competitor Finder](https://apify.com/pravus/competitor-keywords).

### FAQ

**Where does the data come from?** Google search volume and Ads metrics aggregated by a licensed SEO data provider, updated monthly. Difficulty and intent are computed from Google results data. Bing data comes from Microsoft Advertising.

**Why is a keyword with an empty search volume charged?** The database returned it with other data (CPC, difficulty or intent), and returned keywords are billed. Keywords it has no record of come back as `found: false` and are free.

**Why does a keyword show `found: false`?** It has too little search volume to be tracked in that location and language, or it's misspelled. You aren't charged for it.

**Why are some year-over-year trends large?** Trends compare the latest month with the same month a year earlier, so seasonal keywords (gifts, sports, holidays) can swing a lot.

**Can I get data for other countries?** Yes. Use the `location` field. Most countries are supported; Bing supports English, French and German.

**Is there a limit?** 10,000 keywords or ideas per run. Start more runs for bigger lists.

# Actor input Schema

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

"metrics": get data for the exact keywords you list. "ideas": treat your keywords as seeds and discover related keywords, each with full data.

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

Metrics mode: up to 10,000 keywords per run (max 80 characters / 10 words each). Ideas mode: up to 200 seed keywords (20 for "contains" ideas). Duplicates are removed, and keywords without data are never charged.

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

Country to get data for. Use a country name ("United States", "Germany"), a two-letter code ("us", "uk", "de") or a DataForSEO location code (2840).

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

Language of the keywords: a two-letter code ("en", "de", "es") or a language name ("English").

## `ideaType` (type: `string`):

"related": keywords related to all your seeds (broad discovery). "contains": keywords that contain each seed phrase, like "best running shoes for women" for "running shoes".

## `sortBy` (type: `string`):

"relevance": closest to your seeds first (recommended). "searchVolume": biggest keywords first, which can include broader terms. "contains" ideas are always sorted by search volume.

## `maxIdeas` (type: `integer`):

How many keyword ideas to return, sorted by search volume (up to 10,000).

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

Skip ideas with fewer monthly searches than this.

## `includeBing` (type: `boolean`):

Also return Bing search volume, CPC and competition (English, French and German only; paid Apify plans). Costs one extra "Bing data request" per 700 keywords.

## `includeSerpInfo` (type: `boolean`):

Also return which Google result features appear for each keyword (featured snippet, People Also Ask, shopping, etc.) and the total results count. No extra cost.

## Actor input object example

```json
{
  "mode": "metrics",
  "keywords": [
    "running shoes",
    "best running shoes for flat feet",
    "trail running shoes"
  ],
  "location": "United States",
  "language": "en",
  "ideaType": "related",
  "sortBy": "relevance",
  "maxIdeas": 100,
  "minSearchVolume": 10,
  "includeBing": false,
  "includeSerpInfo": false
}
```

# Actor output Schema

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

All result rows (JSON). Rows with found=true carry the metrics.

## `allFields` (type: `string`):

Every field for every row, including the full monthly search history (up to ~8 years in metrics mode), secondary intents, SERP features and Bing data when requested.

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

Counts of keywords with data, without data, invalid, and skipped by the spending limit, plus charged events.

# 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",
        "best running shoes for flat feet",
        "trail running shoes"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pravus/keyword-overview").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",
        "best running shoes for flat feet",
        "trail running shoes",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("pravus/keyword-overview").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",
    "best running shoes for flat feet",
    "trail running shoes"
  ]
}' |
apify call pravus/keyword-overview --silent --output-dataset

```

## MCP server setup

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

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/IOZp5TJVt0klWlejO/builds/nTE9ztVuvrAXFo9gs/openapi.json
