# Keyword Search Volume & Difficulty: Ahrefs Alternative (`plainrows/keyword-search-volume`) Actor

An Ahrefs and Semrush alternative without a subscription: Google search volume, CPC, competition, keyword difficulty, intent and monthly history for up to 10,000 keywords per run, or keyword ideas from seed keywords, in 94 countries. You only pay for keywords with data.

- **URL**: https://apify.com/plainrows/keyword-search-volume.md
- **Developed by:** [PlainRows](https://apify.com/plainrows) (community)
- **Categories:** SEO tools, AI, Developer tools
- **Stats:** 3 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 keywords

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Search Volume & Difficulty: Ahrefs Alternative

Get **Google monthly search volume, CPC, competition, keyword difficulty, search intent and up to 8 years of monthly history** for up to 10,000 keywords per run, in 94 countries. **You only pay for keywords that have data**: keywords with no data are returned for free, so you know they were checked.

Need new keywords rather than metrics for your own list? Switch to **ideas mode**: each keyword becomes a seed and you get related keyword ideas with the same metrics.

### Typical uses

- Prioritise a content plan: volume, difficulty and intent for every keyword idea in one table.
- Estimate ad budgets with CPC and top-of-page bid ranges per country.
- Spot seasonality and rising topics with up to 8 years of monthly history.
- Enrich keyword lists in Google Sheets, n8n / Make workflows or AI agents.

### Why this one

- **All the metrics in one row**: volume, CPC, competition, difficulty, search intent, SERP features and up to 8 years of monthly history together, not volume alone.
- **Big lists in one run**: up to 10,000 keywords (or 100 seeds in ideas mode), not a few dozen rows.
- **No fee per run** and **no charge for keywords without data**: a test with 5 keywords costs 5 results at most (plus AI search volume, if you turn it on).
- **Hard cost cap**: the run stops before the maximum cost you set.

### What you get for each keyword

| Field | Description |
|---|---|
| `keyword` | Your keyword, lowercased with single spaces |
| `found` | `false` when no data exists for the keyword (not billed) |
| `searchVolume` | Average monthly Google searches |
| `cpcUsd` | Average cost per click, in USD |
| `competition`, `competitionLevel` | Google Ads competition, 0 to 1, and LOW / MEDIUM / HIGH |
| `lowTopOfPageBidUsd`, `highTopOfPageBidUsd` | Typical top-of-page bid range |
| `keywordDifficulty` | 0 (easy) to 100 (hard) to rank organically |
| `searchIntent` | informational, navigational, commercial or transactional |
| `trendMonthlyPct`, `trendQuarterlyPct`, `trendYearlyPct` | Change in search volume, in percent |
| `serpFeatures`, `searchResultsCount`, `serpUpdatedAt` | Google result types on the keyword's results page (e.g. `organic, people_also_ask, popular_products`), the result count, and when that page was last checked by the data source (often a few weeks or months ago). No extra cost; `null` when not available |
| `monthlySearches` | Monthly volumes, most recent first: 12 months by default, up to 96 (no extra cost) |
| `aiSearchVolume`, `aiMonthlySearches` | Only with **includeAiSearchVolume** (from October 24, 2026): estimated monthly use of the keyword in AI tools, and its monthly history |
| `dataUpdatedAt` | When the underlying data was last refreshed |
| `observedAt` | When this run fetched it |

Missing values are always `null`, never guessed.

### Input

```json
{
  "keywords": ["coffee maker", "espresso machine", "french press"],
  "country": "US",
  "languageCode": "",
  "historyMonths": 12
}
```

- **keywords**: one per line. Max 80 characters and 10 words each. Duplicates are removed for free (case-insensitive).
- **country**: two-letter code of one of 94 countries: the US, Canada, the UK and most of Europe, Latin America, Asia-Pacific, the Middle East and Africa (full list in the input form).
- **languageCode**: optional. Defaults to the country's main language (German for Switzerland, French for Belgium). Regional variants are written like `zh-TW`. A language the data source doesn't offer for that country stops the run with a clear message and no charge.
- **historyMonths**: months of monthly history per keyword, 0 to 96. Default 12.
- **includeAiSearchVolume**: search volume mode only, off by default, available from October 24, 2026 (see below).
- **mode**: `volume` (default) or `ideas` (see below).
- **maxIdeasPerSeed**: ideas mode only, 5 to 1,000. Default 50.

### AI search volume (from October 24, 2026)

Turn on **includeAiSearchVolume** to see how often each keyword is used in AI tools and chat assistants (an estimate from the data source), next to its Google search volume: `aiSearchVolume` (estimated monthly figure) and `aiMonthlySearches` (as many months as **historyMonths**). Useful to decide which topics to cover for AI search (GEO) as well as for Google.

- Billed per keyword with a positive AI search volume (an extra event, see the **Pricing** tab); `null` or `0` is free. Keywords without Google data are not sent.
- Available for all 94 countries in their default language (data source location lists read on 2026-10-12); another language may have no AI figure (then `null`, free, with a warning).
- Before October 24, 2026 the option is accepted but ignored (the run says so and charges nothing for it).
- Needs a paid Apify plan: on the free plan the option is ignored (the run says so).

### Ideas mode

Set `"mode": "ideas"`: each line of **keywords** is a seed (up to 100 seeds per run), and the run returns up to **maxIdeasPerSeed** related keyword ideas per seed, most relevant first, with exactly the same fields as above plus `seedKeyword`.

```json
{ "keywords": ["coffee maker"], "mode": "ideas", "maxIdeasPerSeed": 50, "country": "US" }
```

- Each idea with data is billed like one keyword. An idea found by two seeds is returned and billed once (for the first seed); the seed itself is not returned as an idea.
- A seed with no idea gives one free row with `found: false` and a `note`.
- Ideas come with 12 months of history at most (the data source keeps 12 months for ideas).
- If many seeds in a row return no idea, the run stops early and tells you which were not searched (nothing is charged for them).
- For very large idea lists, [PlainRows Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) is cheaper per idea, and adds filters (volume, difficulty, words) and other idea sources.

### Output example

Real row from a run on 2026-10-07 (US, `historyMonths: 3`; the three `serp…` fields from a check on 2026-10-12):

```json
{
  "keyword": "coffee maker",
  "found": true,
  "country": "US",
  "languageCode": "en",
  "searchVolume": 201000,
  "cpcUsd": 0.79,
  "competition": 1,
  "competitionLevel": "HIGH",
  "lowTopOfPageBidUsd": 0.25,
  "highTopOfPageBidUsd": 1.23,
  "keywordDifficulty": 32,
  "searchIntent": "transactional",
  "trendMonthlyPct": 22,
  "trendQuarterlyPct": 22,
  "trendYearlyPct": 0,
  "serpFeatures": "popular_products, organic, product_considerations, perspectives, people_also_ask, related_searches, images",
  "searchResultsCount": 293,
  "serpUpdatedAt": "2026-07-30T03:52:04.000Z",
  "monthlySearches": [
    { "month": "2026-08", "searchVolume": 165000 },
    { "month": "2026-07", "searchVolume": 135000 },
    { "month": "2026-06", "searchVolume": 135000 }
  ],
  "dataUpdatedAt": "2026-09-15T12:07:43.000Z",
  "observedAt": "2026-10-07T10:29:36.658Z",
  "schemaVersion": "1.0"
}
```

### Pricing

You pay per keyword with data. No subscription, no fee per run. See the **Pricing** tab for the current prices.
Price change on October 24, 2026: new optional AI search volume event, $0.005 (FREE) / $0.004 (BRONZE) / $0.003 (GOLD+) per keyword with a positive AI volume, only when **Include AI search volume** is on. The keyword price does not change.
Keywords without data, duplicates and invalid keywords are never billed. Input mistakes (unsupported country or language, empty list) stop the run with a clear message and cost nothing.
The run never spends more than the maximum cost you set: it stops looking up keywords before reaching it.

**Free Apify plan:** each run looks up the first 20 keywords (ideas mode: the first 2 seeds, 20 ideas each), so you can test the output. A paid Apify plan removes this limit.

### Run summary

Each run also stores a summary in the key-value store (`OUTPUT`): keywords submitted, found, not found, billed, duplicates removed, invalid keywords with the reason, and any keyword skipped because of the free-plan or budget limit (with AI search volume on: `aiSearchVolumesFound` and `aiSearchVolumesBilled`). In ideas mode: `mode`, seeds submitted and searched, seeds without ideas, ideas found and billed, duplicate ideas removed, and seeds skipped (free plan, budget, or too many seeds without ideas).

### Use it from code, automations or AI agents

**API (one call, results returned directly):**

```bash
curl -X POST "https://api.apify.com/v2/acts/plainrows~keyword-search-volume/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords": ["coffee maker", "espresso machine"], "country": "US"}'
```

**n8n, Make, Zapier:** use the Apify integration and pick `plainrows/keyword-search-volume` as the Actor; map the dataset items to your sheet, CRM or database.

**AI agents (MCP):** add `https://mcp.apify.com?tools=plainrows/keyword-search-volume` to Claude, Cursor or any MCP client. The agent gets a typed tool with the input and output schemas of this page and pays per result.

### Limits

- Data comes from Google Ads keyword data via a commercial SEO data provider and is refreshed monthly. Very new or very rare keywords may have no data.
- Search volumes are averages and estimates, not exact counts.
- This tool is not affiliated with Google, Ahrefs or Semrush.

### FAQ

**How do I check the search volume of many keywords at once?**
Paste them in **keywords**, one per line (up to 10,000 per run), pick the country and run. You get one row per keyword with monthly volume, CPC, competition, difficulty, intent and monthly history.

**Is this the same data as Google Keyword Planner?**
It comes from Google Ads keyword data through a commercial SEO data provider, refreshed monthly. You get exact monthly averages instead of Keyword Planner's ranges, without a Google Ads account.

**Is this an Ahrefs or Semrush alternative?**
For keyword metrics, yes: search volume, CPC, competition, keyword difficulty (0-100), intent and monthly history for up to 10,000 keywords per run, without a subscription or an Ahrefs or Semrush account. Difficulty is computed by the data provider on its own 0-100 scale, so it will not match Ahrefs KD or Semrush KD% exactly.

**Can it find new keyword ideas, not only volumes?**
Yes: set **mode** to `ideas`. Each keyword becomes a seed and you get up to 1,000 related ideas per seed with volume, CPC, competition, difficulty, intent and 12-month history, billed per idea with data at the same price as a keyword. Ideas are deduplicated across seeds. For very large idea lists, [PlainRows Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) is cheaper per idea.

**Which countries and languages?**
94 countries, in the country's main language or another one the data source offers there.

**What does it cost for 1,000 keywords?**
See the **Pricing** tab: you pay per keyword with data only, with no subscription and no fee per run. Keywords without data are free.

**Can I use it in Google Sheets, n8n, Make or an AI agent?**
Yes: through the Apify API, the Apify integrations for n8n, Make and Zapier, or the Apify MCP server (see above).

### More PlainRows tools

Same pay-per-result pricing, same clean JSON, built to chain together in n8n, Make, Zapier or AI agents.

- **SEO and keywords:** [Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) · [Google Autocomplete & People Also Ask](https://apify.com/plainrows/google-autocomplete-questions) · [Google Trends Explorer](https://apify.com/plainrows/google-trends-explorer) · [Website Organic Traffic & Top Keywords](https://apify.com/plainrows/domain-seo-overview) · [Bulk Domain Authority Checker](https://apify.com/plainrows/domain-authority-checker) · [Backlink Checker](https://apify.com/plainrows/backlink-checker) · [Broken Link Checker](https://apify.com/plainrows/broken-link-checker) · [AI Search Visibility Tracker (ChatGPT, Gemini, AI Mode)](https://apify.com/plainrows/ai-search-brand-visibility) · [Google Maps Rank Tracker (Geo-Grid Local SEO)](https://apify.com/plainrows/google-maps-rank-tracker)
- **Leads and companies:** [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) · [Website Technology Checker](https://apify.com/plainrows/website-tech-stack) · [ATS Jobs Scraper (Workday, Greenhouse, Lever, Ashby)](https://apify.com/plainrows/ats-job-postings) · [Google Jobs Scraper](https://apify.com/plainrows/google-jobs-scraper) · [Google Ads Scraper (Transparency Center)](https://apify.com/plainrows/google-ads-transparency) · [Company Registry Lookup (SIRENE, LEI, Brreg)](https://apify.com/plainrows/company-registry-lookup) · [Public Tenders Search (EU TED & UK)](https://apify.com/plainrows/public-tenders-search)
- **E-commerce and travel:** [Amazon Product Search Scraper](https://apify.com/plainrows/amazon-product-search) · [Google Shopping Prices Scraper](https://apify.com/plainrows/google-shopping-prices) · [Google Hotels Prices Scraper](https://apify.com/plainrows/google-hotels-prices) · [Tripadvisor Reviews Scraper](https://apify.com/plainrows/tripadvisor-reviews)
- **Content and media:** [Google News Scraper](https://apify.com/plainrows/google-news-scraper) · [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper) · [YouTube Comments Scraper](https://apify.com/plainrows/youtube-comments-scraper) · [Google Images Scraper](https://apify.com/plainrows/google-images-scraper) · [Website Screenshot API](https://apify.com/plainrows/website-screenshot) · [Google Maps Reviews Scraper](https://apify.com/plainrows/google-maps-reviews) · [App Store & Google Play Reviews Scraper](https://apify.com/plainrows/app-reviews-scraper)

**Compared with other APIs:** [Exact keyword search volume without a Google Ads budget](https://nadaho.github.io/plainrows/keyword-planner-exact-search-volume/) · [Search volume and CPC by API](https://nadaho.github.io/plainrows/search-volume-cpc-api-options/) · [Semrush API alternative](https://nadaho.github.io/plainrows/semrush-api-alternative/)

### Support

Found a bug or need a field? Open an issue on this page. Issues are read and answered.

# Actor input Schema

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

One keyword per line, up to 10,000 per run. Max 80 characters and 10 words each. Duplicates (case-insensitive) are removed for free before lookup. In ideas mode, each keyword is a seed (up to 100 per run).

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

"Search volume": metrics for each keyword you enter. "Keyword ideas": each keyword is a seed and the run returns related keyword ideas with the same metrics (plus seedKeyword), billed per idea with data like a keyword.

## `country` (type: `string`):

Country whose Google search data you want (94 countries).

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

Language code, e.g. "en", "fr" or "zh-TW". Leave empty to use the country's main language (for example German for Switzerland, French for Belgium). Only languages offered by the data source for that country work; others stop the run with a clear message and no charge.

## `historyMonths` (type: `integer`):

How many months of monthly search volumes to include per keyword, most recent first. 0 = none. Up to 96 months (data goes back to 2018 for most keywords). No extra cost. In ideas mode the data source returns 12 months at most.

## `includeAiSearchVolume` (type: `boolean`):

Search volume mode only, from October 24, 2026: add aiSearchVolume (estimated monthly use of the keyword in AI tools and chat assistants) and its monthly history to each found keyword. Billed per keyword with a positive AI volume (see the Pricing tab); keywords with no AI figure are free. Off by default.

## `maxIdeasPerSeed` (type: `integer`):

Ideas mode only: most related keyword ideas returned per seed keyword, most relevant first. An idea already returned for another seed is not returned or billed again. Ignored in search volume mode.

## Actor input object example

```json
{
  "keywords": [
    "coffee maker",
    "espresso machine",
    "french press"
  ],
  "mode": "volume",
  "country": "US",
  "historyMonths": 12,
  "includeAiSearchVolume": false,
  "maxIdeasPerSeed": 50
}
```

# Actor output Schema

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

No description

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

No description

# 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": [
        "coffee maker",
        "espresso machine",
        "french press"
    ],
    "mode": "volume",
    "country": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainrows/keyword-search-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": [
        "coffee maker",
        "espresso machine",
        "french press",
    ],
    "mode": "volume",
    "country": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("plainrows/keyword-search-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": [
    "coffee maker",
    "espresso machine",
    "french press"
  ],
  "mode": "volume",
  "country": "US"
}' |
apify call plainrows/keyword-search-volume --silent --output-dataset

```

## MCP server setup

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