# Keyword Research Tool: Search Volume, CPC & Keyword Ideas (`santhej/keyword-research-tool`) Actor

Bulk keyword research: accurate Google search volume, CPC, competition & thousands of keyword ideas for any seed or market. Clean JSON/CSV for SEO, PPC & content. Up to 5,000 keywords/run, 190+ countries. No subscriptions, no API keys.

- **URL**: https://apify.com/santhej/keyword-research-tool.md
- **Developed by:** [Santhej Kallada](https://apify.com/santhej) (community)
- **Categories:** SEO tools, AI, MCP servers
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: 5.00 out of 5 stars

## 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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Research Tool — Search Volume, CPC, Competition & Keyword Ideas

**Stop guessing what to rank for. Get real Google search volume, cost-per-click, competition, and thousands of keyword ideas — in seconds, at a fraction of the price of Ahrefs, Semrush or Moz.**

Paste your own keyword list and get accurate metrics for every term, or drop in a single seed keyword and discover thousands of related long-tail opportunities. Clean, structured output ready for spreadsheets, dashboards, or your AI agent. No bloated subscription. No login. No API keys to manage.

---

### What this keyword research tool does

- 📊 **Accurate search volume** — real monthly Google search volume for any keyword, in 190+ countries and any language.
- 💰 **CPC & commercial intent** — cost-per-click, top-of-page bids (low/high), and a competition score so you can spot money keywords.
- 💡 **Keyword ideas & related keywords at scale** — expand one seed keyword into up to 3,000 suggestions, or pull semantically related "people also search" terms — each with full metrics.
- 🎯 **Keyword difficulty (0–100)** — know how hard a keyword is to rank for before you commit a single hour of content.
- 🧭 **Search intent** — informational, commercial, transactional or navigational, so you target the right stage of the funnel.
- 📈 **Full 12-month trend** — complete month-by-month search history, not just a single number, so you see what's rising or fading.
- 🔎 **Min-volume filter** — drop low-demand noise and keep only keywords worth your time.
- ⚡ **Bulk by design** — up to 5,000 keywords per run, sorted by volume, exported as JSON, CSV, or Excel.
- 🤖 **AI-agent & MCP friendly** — predictable structured output that plugs straight into automations and LLM workflows.

### Why it beats the big SEO suites

| | This actor | Ahrefs / Semrush / Moz |
|---|---|---|
| **Price** | Pay only for keywords you pull | $99–$199 / month minimum |
| **Commitment** | None — run it once or 1,000 times | Annual contracts, seat limits |
| **Bulk lookups** | 5,000 keywords per run | Capped by plan tier |
| **Output** | JSON / CSV / Excel, automation-ready | Locked in their dashboard |
| **Countries** | 190+ | Add-on tiers for more |
| **API access** | Built in | Enterprise-only |

### Perfect for

- **SEO keyword research** — find low-competition, high-volume keywords to target.
- **PPC & Google Ads planning** — pull CPC and bid ranges to forecast ad spend.
- **Content & blog planning** — turn one topic into a full content calendar of long-tail keywords.
- **Niche & market validation** — measure real demand before launching a product or site.
- **Agencies & freelancers** — deliver client keyword reports without paying for another SEO seat.
- **AI SEO agents** — feed structured keyword data into automated content pipelines.

### How to use it

1. Pick a **mode**: *Search volume* (paste your keywords), *Keyword ideas* (expand a seed keyword), or *Related keywords* (semantic discovery).
2. Choose your **country** and **language**, and optionally turn on **keyword difficulty** and **search intent**.
3. Run it. Download results as JSON, CSV, or Excel — or pull them via the API.

#### Example input (Keyword ideas mode)

```json
{
  "mode": "keyword_ideas",
  "seedKeyword": "email marketing",
  "limit": 500,
  "minVolume": 100,
  "includeDifficulty": true,
  "includeSearchIntent": true,
  "locationCode": "2840",
  "languageCode": "en"
}
````

#### Example output (one row per keyword)

```json
{
  "keyword": "email marketing software",
  "search_volume": 33100,
  "keyword_difficulty": 72,
  "search_intent": "commercial",
  "cpc": 18.4,
  "competition": "HIGH",
  "competition_index": 100,
  "low_top_of_page_bid": 6.12,
  "high_top_of_page_bid": 32.5,
  "trend_3mo_pct": 12.5,
  "source": "keyword_ideas"
}
```

### Pricing

Simple pay-per-result. You're charged a tiny amount per keyword returned — no monthly fee, no minimum. Keyword difficulty and search intent are an optional low-cost add-on charged only when you turn them on. A 1,000-keyword research run costs about the price of a coffee, versus a $99+/month SEO subscription.

### FAQ

**Where does the search volume come from?**
Real Google advertising and search-demand data — the same class of data the major SEO suites are built on — delivered through enterprise-grade infrastructure.

**How accurate is it?**
Volumes are averaged monthly Google search data with a 12-month history, so you see the trend, not just a single number.

**Can I research keywords for other countries?**
Yes — 190+ countries and any language. Pick your country in the input.

**Can I use this with an AI agent or automation?**
Absolutely. Output is clean structured JSON, ideal for MCP servers, n8n, Make, and custom LLM agents.

**Do I need an account with any SEO provider or an API key?**
No. Everything is handled for you — just run the actor.

***

*Tags: keyword research, keyword research tool, search volume, keyword ideas, SEO keywords, CPC, Google keyword planner alternative, keyword finder, PPC research, long tail keywords, keyword difficulty, SEO tool, Ahrefs alternative, Semrush alternative.*

# Actor input Schema

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

‘Search volume’ = paste your own keywords and get metrics for each. ‘Keyword ideas’ = expand one seed into thousands of suggestions. ‘Related keywords’ = discover semantically related terms from the ‘people also search’ graph.

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

The keywords to look up. One keyword per line. Up to 5,000 per run. Used only in ‘Search volume’ mode.

## `seedKeyword` (type: `string`):

One seed keyword to expand (e.g. ‘email marketing’). Used in ‘Keyword ideas’ and ‘Related keywords’ modes.

## `limit` (type: `integer`):

How many keywords to return in ‘Keyword ideas’ / ‘Related keywords’ modes (1–3,000).

## `minVolume` (type: `integer`):

Only return keywords with at least this monthly search volume. 0 = no filter.

## `includeDifficulty` (type: `boolean`):

Add an SEO ranking-difficulty score (0 = easy, 100 = very hard) to each keyword. Small extra charge per keyword.

## `includeSearchIntent` (type: `boolean`):

Add the dominant search intent (informational, commercial, transactional, navigational) to each keyword. Small extra charge per keyword.

## `locationCode` (type: `string`):

Target country for search-volume data. Default United States (2840). Common: UK 2826, Canada 2124, Australia 2036, India 2356, Germany 2276.

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

Language code for results (e.g. en, es, de, fr).

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

Add the full monthly search-volume history for each keyword (larger output).

## `maxBudgetUsd` (type: `integer`):

Optional safety cap. If the estimated charge exceeds this, the run is flagged. Apify also enforces your account charge limits.

## Actor input object example

```json
{
  "mode": "search_volume",
  "keywords": [
    "keyword research tool",
    "seo software",
    "rank tracker"
  ],
  "seedKeyword": "email marketing",
  "limit": 200,
  "minVolume": 0,
  "includeDifficulty": false,
  "includeSearchIntent": false,
  "locationCode": "2840",
  "languageCode": "en",
  "includeMonthlyTrend": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

All keyword rows with metrics.

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

Mode, location, language, and counts.

# 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 tool",
        "seo software",
        "rank tracker"
    ],
    "seedKeyword": "email marketing"
};

// Run the Actor and wait for it to finish
const run = await client.actor("santhej/keyword-research-tool").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 tool",
        "seo software",
        "rank tracker",
    ],
    "seedKeyword": "email marketing",
}

# Run the Actor and wait for it to finish
run = client.actor("santhej/keyword-research-tool").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 research tool",
    "seo software",
    "rank tracker"
  ],
  "seedKeyword": "email marketing"
}' |
apify call santhej/keyword-research-tool --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=santhej/keyword-research-tool",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Keyword Research Tool: Search Volume, CPC & Keyword Ideas",
        "description": "Bulk keyword research: accurate Google search volume, CPC, competition & thousands of keyword ideas for any seed or market. Clean JSON/CSV for SEO, PPC & content. Up to 5,000 keywords/run, 190+ countries. No subscriptions, no API keys.",
        "version": "0.0",
        "x-build-id": "7WX0zjGwHmz8KWpam"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/santhej~keyword-research-tool/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-santhej-keyword-research-tool",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/santhej~keyword-research-tool/runs": {
            "post": {
                "operationId": "runs-sync-santhej-keyword-research-tool",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/santhej~keyword-research-tool/run-sync": {
            "post": {
                "operationId": "run-sync-santhej-keyword-research-tool",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search_volume",
                            "keyword_ideas",
                            "related_keywords"
                        ],
                        "type": "string",
                        "description": "‘Search volume’ = paste your own keywords and get metrics for each. ‘Keyword ideas’ = expand one seed into thousands of suggestions. ‘Related keywords’ = discover semantically related terms from the ‘people also search’ graph.",
                        "default": "search_volume"
                    },
                    "keywords": {
                        "title": "Keywords (Search-volume mode)",
                        "maxItems": 5000,
                        "type": "array",
                        "description": "The keywords to look up. One keyword per line. Up to 5,000 per run. Used only in ‘Search volume’ mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "seedKeyword": {
                        "title": "Seed keyword (Keyword-ideas / Related-keywords mode)",
                        "type": "string",
                        "description": "One seed keyword to expand (e.g. ‘email marketing’). Used in ‘Keyword ideas’ and ‘Related keywords’ modes."
                    },
                    "limit": {
                        "title": "Max keyword ideas",
                        "minimum": 1,
                        "maximum": 3000,
                        "type": "integer",
                        "description": "How many keywords to return in ‘Keyword ideas’ / ‘Related keywords’ modes (1–3,000).",
                        "default": 200
                    },
                    "minVolume": {
                        "title": "Minimum search volume",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return keywords with at least this monthly search volume. 0 = no filter.",
                        "default": 0
                    },
                    "includeDifficulty": {
                        "title": "Include keyword difficulty (0–100)",
                        "type": "boolean",
                        "description": "Add an SEO ranking-difficulty score (0 = easy, 100 = very hard) to each keyword. Small extra charge per keyword.",
                        "default": false
                    },
                    "includeSearchIntent": {
                        "title": "Include search intent",
                        "type": "boolean",
                        "description": "Add the dominant search intent (informational, commercial, transactional, navigational) to each keyword. Small extra charge per keyword.",
                        "default": false
                    },
                    "locationCode": {
                        "title": "Country",
                        "enum": [
                            "2840",
                            "2826",
                            "2124",
                            "2036",
                            "2356",
                            "2276",
                            "2250",
                            "2724",
                            "2380",
                            "2528"
                        ],
                        "type": "string",
                        "description": "Target country for search-volume data. Default United States (2840). Common: UK 2826, Canada 2124, Australia 2036, India 2356, Germany 2276.",
                        "default": "2840"
                    },
                    "languageCode": {
                        "title": "Language",
                        "type": "string",
                        "description": "Language code for results (e.g. en, es, de, fr).",
                        "default": "en"
                    },
                    "includeMonthlyTrend": {
                        "title": "Include 12-month search trend",
                        "type": "boolean",
                        "description": "Add the full monthly search-volume history for each keyword (larger output).",
                        "default": false
                    },
                    "maxBudgetUsd": {
                        "title": "Max budget (USD, optional)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional safety cap. If the estimated charge exceeds this, the run is flagged. Apify also enforces your account charge limits."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
