# Keyword Research & SERP API — Volume, CPC, Difficulty + AI (`dltik/keyword-serp-research`) Actor

All-in-one SEO data: keyword research (volume, CPC, difficulty, intent), SERP analysis (organic, PAA, featured snippets), domain ranked keywords, competitor gap, and Google AI Overview visibility. Accurate licensed data — no Semrush/Ahrefs subscription needed.

- **URL**: https://apify.com/dltik/keyword-serp-research.md
- **Developed by:** [Walid](https://apify.com/dltik) (community)
- **Categories:** SEO tools, Marketing, Developer tools
- **Stats:** 9 total users, 6 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 result returneds

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 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 Research & SERP API — Volume, CPC, Difficulty + AI Visibility

⭐ **Bookmark this actor** — Apify ranks actors by bookmarks, so one click keeps accurate keyword and SERP data one run away.

All-in-one **keyword research and SERP analysis** powered by licensed SEO data. Get search volume, CPC, keyword difficulty, search intent, People-Also-Ask, ranked keywords, competitor gaps, and **Google AI Overview** citations — **without a Semrush, Ahrefs or Moz subscription**. Bulk input, 50+ countries and languages, pay only per result.

### What this Keyword Research & SERP API does

This **Keyword Research & SERP API** turns one Apify run into accurate, structured SEO data. Unlike scrapers that read capped free widgets, it returns licensed metrics, so the numbers match what you'd see inside a paid SEO suite. Pick a `mode` and submit your keywords or domain:

| Mode | What you get |
|---|---|
| `keyword_research` | Seed keyword → hundreds of ideas with **search volume, CPC, competition, keyword difficulty, search intent, 12-month trend** |
| `serp_analysis` | Keyword → top **organic results**, **featured snippet**, **People-Also-Ask** questions, related searches |
| `domain_analysis` | Domain → every **keyword it ranks for**, with position, search volume and CPC |
| `competitor_gap` | Competitor + your domain → keywords **they rank for and you don't** |
| `ai_visibility` | Keyword → does **Google AI Overview** appear, which **domains are cited**, and is yours? |

### Why use this Keyword Research & SERP API

- **No subscription needed** — no Semrush, Ahrefs or Moz login. Pay $0.004 per result, nothing else.
- **Accurate, licensed data** — not scraped free-widget estimates that break and cap out.
- **Five tools in one** — keyword research, SERP, domain, competitor gap, and AI visibility share one input.
- **AI Overview tracking** — see exactly which sites Google's AI Overview cites for your keywords. This is where classic SEO meets [GEO (Generative Engine Optimization)](https://apify.com/dltik/geo-visibility-score).
- **Bulk + global** — submit lists of keywords, target any of 50+ countries and languages.

### Input

```json
{
  "mode": "keyword_research",
  "keywords": ["running shoes"],
  "locationName": "United States",
  "languageCode": "en",
  "maxResults": 200
}
```

SERP / AI visibility example:

```json
{
  "mode": "ai_visibility",
  "keywords": ["best crm for startups", "what is rag"],
  "yourDomain": "example.com",
  "locationName": "United States",
  "languageCode": "en"
}
```

Competitor gap example:

```json
{
  "mode": "competitor_gap",
  "competitorDomain": "competitor.com",
  "domain": "example.com",
  "locationName": "United States",
  "languageCode": "en",
  "maxResults": 500
}
```

### Output

One JSON record per result row. Shape depends on the mode — e.g. a `keyword_research` row:

```json
{
  "_type": "keyword",
  "keyword": "trail running shoes",
  "search_volume": 49500,
  "cpc": 0.72,
  "competition": 0.41,
  "competition_level": "MEDIUM",
  "keyword_difficulty": 38,
  "search_intent": "commercial",
  "trend_pct": 12.5
}
```

An `ai_visibility` row tells you whether Google's AI Overview triggered and who it cited:

```json
{
  "_type": "ai_visibility",
  "keyword": "best crm for startups",
  "ai_overview_present": true,
  "cited_domains": ["hubspot.com", "zapier.com", "g2.com"],
  "cited_count": 3,
  "your_domain_cited": false
}
```

Export to JSON, CSV or Excel from the dataset.

### Pricing

**PAY\_PER\_EVENT — $0.004 per result returned** (= $4.00 per 1,000). You only pay for the rows you receive. Free Apify plan runs are capped at 25 results so you can try every mode before upgrading.

### Use cases

- **Keyword research at scale** — build content plans with real volume, CPC and difficulty.
- **SERP & SEO audits** — pull organic competitors and People-Also-Ask for any keyword.
- **Competitor analysis** — find the keywords rivals rank for and you don't.
- **AI search visibility** — track Google AI Overview citations and protect your share of voice.

### Related actors

- [SEO Data Extractor — On-Page Tags for Any URL](https://apify.com/dltik/seo-data-extractor)
- [GEO Visibility Score — AI Brand Monitoring](https://apify.com/dltik/geo-visibility-score)
- [GEO Competitor Research — AI Share of Voice & Gap](https://apify.com/dltik/geo-competitor-research)

### Author

[dltik](https://apify.com/dltik)

### License

MIT

# Actor input Schema

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

What to fetch. keyword\_research: seed keywords -> ideas with volume/CPC/difficulty/intent. serp\_analysis: keyword -> organic results, People-Also-Ask, featured snippet. domain\_analysis: domain -> the keywords it ranks for. competitor\_gap: keywords a competitor ranks for but your domain does not. ai\_visibility: does Google AI Overview trigger for a keyword and which domains are cited.

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

List of keywords. Used by keyword\_research (as seeds for idea expansion), serp\_analysis, and ai\_visibility. Ignored for domain\_analysis and competitor\_gap.

## `domain` (type: `string`):

Domain without protocol, e.g. 'example.com'. Used by domain\_analysis (the domain to analyze) and competitor\_gap (your domain — the one that should NOT rank for the gap keywords).

## `competitorDomain` (type: `string`):

Competitor domain without protocol, e.g. 'competitor.com'. Used by competitor\_gap as the domain that DOES rank for the gap keywords.

## `yourDomain` (type: `string`):

Optional. For ai\_visibility mode: if set, each result flags whether this domain is cited in the Google AI Overview for that keyword.

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

Full location name as used by Google, e.g. 'United States', 'France', 'United Kingdom'. Controls search volumes and SERP geography.

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

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

## `maxResults` (type: `integer`):

Maximum number of result rows to return (and be charged for). Default 200, max 1000. Free Apify plan is capped at 25 for a demo.

## Actor input object example

```json
{
  "mode": "keyword_research",
  "keywords": [
    "running shoes"
  ],
  "locationName": "United States",
  "languageCode": "en",
  "maxResults": 200
}
```

# Actor output Schema

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

All result rows for the run.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dltik/keyword-serp-research").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"] }

# Run the Actor and wait for it to finish
run = client.actor("dltik/keyword-serp-research").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": [
    "running shoes"
  ]
}' |
apify call dltik/keyword-serp-research --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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