# Keyword Research Tool: Keyword Ideas, Volume & Difficulty (`plainrows/keyword-ideas-generator`) Actor

Turn seed keywords into up to 1,000 keyword ideas each: long-tail suggestions, Google related searches or same-topic ideas, with search volume, CPC, keyword difficulty, intent and 12-month trend. 94 countries. Pay per idea returned plus a small fee per seed.

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

## Pricing

from $2.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 Research Tool: Keyword Ideas, Volume & Difficulty

Turn a seed keyword into **up to 1,000 keyword ideas** with **search volume, CPC, keyword difficulty, search intent and 12 months of trend** for each one. Pick the source: **long-tail keyword suggestions**, **Google "related searches"** or **same-topic keyword ideas**, in 94 countries.

A keyword research tool without a subscription: results in seconds from a commercial SEO data API, no browser, no Google Ads account. **You pay per idea returned**; ideas removed by your filters and near-duplicate variants are never billed.

### Typical uses

- **Content plans and topic clusters**: hundreds of long-tail questions and phrases around a topic, sorted by volume or by difficulty.
- **Low-competition keywords**: keep ideas under a difficulty of 30 with at least 100 searches a month.
- **PPC research**: CPC and top-of-page bid range for every idea, per country.
- **Product and market research**: see how people search for a product category with the `ideas` source.
- **Automations and AI agents**: feed n8n, Make, Zapier, Google Sheets or an MCP client with clean JSON rows.

### Three idea sources

| `mode` | What it returns | Example for `coffee maker` |
|---|---|---|
| `suggestions` (default) | Long-tail phrases that **contain your seed** | `best drip coffee maker`, `what is the best coffee maker` |
| `related` | Google's **"related searches"**, followed 1 to 4 levels deep (`depth`) | `coffee maker with grinder`, `k-cup coffee maker`, `keurig coffee` |
| `ideas` | Keywords from the **same topic or product category**, even without the seed words | `espresso machine`, `coffee grinder`, `cold brew coffee maker` |

### What you get for each idea

| Field | Description |
|---|---|
| `keyword` | The keyword idea |
| `seed`, `mode`, `rank` | The seed that produced it, the source, and its position in the list for that seed |
| `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`, `secondaryIntents` | informational, navigational, commercial or transactional |
| `trendMonthlyPct`, `trendQuarterlyPct`, `trendYearlyPct` | Change in search volume, in percent |
| `serpFeatures`, `searchResultsCount`, `serpUpdatedAt` | Google result types on the idea'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` | Last 12 months, most recent first: `[{"month": "2026-08", "searchVolume": 18100}]` |
| `wordsCount`, `relatedDepth` | Number of words; for `related`, the level where the idea was found |
| `dataUpdatedAt`, `observedAt` | When the data was last refreshed, and when this run fetched it |

Field names are the same as in our [Keyword Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) Actor, so you can mix both datasets. Missing values are always `null`, never guessed. Each idea appears once per run, under the first seed that found it; the seed itself is not returned as an idea.

### Input

```json
{
  "seedKeywords": ["coffee maker", "espresso machine"],
  "mode": "suggestions",
  "country": "US",
  "maxIdeasPerSeed": 200,
  "sortBy": "volume",
  "minSearchVolume": 100,
  "maxKeywordDifficulty": 40,
  "includeWords": ["best", "how to"],
  "excludeWords": ["keurig"]
}
```

- **seedKeywords**: up to 100 per run, max 80 characters and 10 words each. Duplicates are removed (case-insensitive).
- **mode**: `suggestions`, `related` (with **depth** 1 to 4, default 2) or `ideas`.
- **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** is optional and defaults to the country's main language (German for Switzerland, French for Belgium).
- **maxIdeasPerSeed**: 10 to 1,000 (default 100).
- **sortBy**: `volume` (highest first), `difficulty` (easiest first), `cpc` (highest first) or `relevance` (`ideas` source only). It also decides which ideas you get when a seed has more than your maximum.
- **Filters**, applied at the source so filtered-out ideas are never billed: `minSearchVolume`, `maxSearchVolume`, `maxKeywordDifficulty`, `includeWords` (keep ideas containing at least one), `excludeWords` (drop ideas containing any). Words match parts of words (`cheap` also keeps `cheapest`). At most 8 filters in total.
- **includeSimilarKeywords**: off by default, so misspellings and reordered variants of the same search are left out.

### Output example

Real row from a run on 2026-10-07 (seed `standing desk`, `mode: "ideas"`, US, `sortBy: "difficulty"`, `minSearchVolume: 1000`, `maxKeywordDifficulty: 30`, `excludeWords: ["ikea"]`):

```json
{
  "keyword": "corner desk",
  "seed": "standing desk",
  "mode": "ideas",
  "found": true,
  "rank": 1,
  "searchVolume": 49500,
  "cpcUsd": 1.34,
  "competition": 1,
  "competitionLevel": "HIGH",
  "lowTopOfPageBidUsd": 0.36,
  "highTopOfPageBidUsd": 2.34,
  "keywordDifficulty": 0,
  "searchIntent": "transactional",
  "secondaryIntents": [],
  "trendMonthlyPct": 22,
  "trendQuarterlyPct": 49,
  "trendYearlyPct": 0,
  "monthlySearches": [
    {
      "month": "2026-08",
      "searchVolume": 60500
    },
    {
      "month": "2026-07",
      "searchVolume": 49500
    },
    {
      "month": "2026-06",
      "searchVolume": 40500
    },
    {
      "month": "2026-05",
      "searchVolume": 40500
    },
    {
      "month": "2026-04",
      "searchVolume": 40500
    },
    {
      "month": "2026-03",
      "searchVolume": 49500
    },
    {
      "month": "2026-02",
      "searchVolume": 40500
    },
    {
      "month": "2026-01",
      "searchVolume": 60500
    },
    {
      "month": "2025-12",
      "searchVolume": 49500
    },
    {
      "month": "2025-11",
      "searchVolume": 60500
    },
    {
      "month": "2025-10",
      "searchVolume": 49500
    },
    {
      "month": "2025-09",
      "searchVolume": 49500
    }
  ],
  "wordsCount": 2,
  "relatedDepth": null,
  "country": "US",
  "languageCode": "en",
  "dataUpdatedAt": "2026-09-14T08:32:45.000Z",
  "observedAt": "2026-10-07T13:16:54.324Z",
  "schemaVersion": "1.0"
}
```

### Pricing

Pay per use, no subscription, no monthly fee. See the **Pricing** tab for current prices. Two events:

- **Keyword idea**: one per idea returned, with all its metrics (volume, CPC, difficulty, intent and 12-month history are all included, no add-on). Cheaper on higher Apify plans.
- **Seed keyword searched**: a flat $0.01 per seed until October 25, 2026, then $0.016. The data source charges a fixed fee for every search, even one that finds nothing, so this small fee is charged once per seed that was searched. It is not charged when the request is rejected (for example an unsupported language) or when the data source is down.

Example: 1,000 ideas from one seed cost $4.01 on the free Apify plan and $2.01 on GOLD, metrics included ($4.016 and $2.016 from October 25, 2026). The two most used keyword-volume Actors on the Apify Store charge $0.008 to $0.012 per keyword with metrics, i.e. $8 to $12 per 1,000 (checked October 2026).

Ideas removed by your filters, duplicates across seeds, near-duplicate variants and input mistakes cost nothing. A seed with no idea gives a free `found: false` row with the reason. An idea that comes back without its search volume data at all (the data source changed its format) is neither delivered nor charged, and neither is the fee of a seed where no idea was readable; an idea the source simply has no volume for is delivered with `null` metrics. The run never spends more than the maximum cost you set: when the budget is short, it returns fewer ideas or skips seeds, and says so in the run summary.

**Free Apify plan:** each run handles up to 2 seeds and 20 ideas per seed, so you can check the output. A paid Apify plan removes these limits.

### 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-ideas-generator/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"seedKeywords": ["coffee maker"], "mode": "suggestions", "maxIdeasPerSeed": 100, "maxKeywordDifficulty": 30}'
```

**n8n, Make, Zapier:** use the Apify integration, pick `plainrows/keyword-ideas-generator`, and send the dataset items to Google Sheets, Airtable, Notion or your database.

**AI agents (MCP):** add `https://mcp.apify.com?tools=plainrows/keyword-ideas-generator` to Claude, Cursor or any MCP client. The agent gets a typed tool and pays per result.

**Already have your keyword list?** Use [Keyword Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) to get the same metrics for up to 10,000 known keywords per run.

### What this is not

- **Not live Google Autocomplete.** Ideas come from a keyword database (its refresh date is in `dataUpdatedAt`), so searches that appeared in the last few weeks may be missing.
- Search volumes are Google Ads estimates (rounded buckets such as 1,300 or 1,600), not exact counts. Close variants of a search can share the same volume.
- No SERP results, rankings or backlinks per idea.
- Not affiliated with Google.

### Run summary

Each run stores a summary in the key-value store (`OUTPUT`): seeds run, seeds with no idea, ideas billed, seeds charged, ideas skipped as duplicates, ideas dropped because the data source changed its format (`ideasWithChangedFormat`), duplicate and invalid seeds, and anything skipped because of the free-plan or budget limit.

### FAQ

**How do I find long-tail keywords for a topic?**
Enter a seed keyword, pick `suggestions` (long-tail phrases containing the seed), `related` (Google's related searches) or `ideas` (same topic), and run: up to 1,000 ideas per seed with volume, CPC, difficulty and intent.

**Can I keep only easy, high-volume keywords?**
Yes: set **minSearchVolume**, **maxKeywordDifficulty**, **includeWords** or **excludeWords**. Filters apply at the source, so filtered-out ideas are never billed.

**Is this Google Autocomplete?**
No. Ideas come from a keyword database refreshed regularly (see `dataUpdatedAt`). For live autocomplete and People Also Ask questions, use [Google Autocomplete & People Also Ask](https://apify.com/plainrows/google-autocomplete-questions).

**Which countries?**
94 countries (full list in the input form).

**Do I need a Semrush or Ahrefs account?**
No: you pay per idea returned, with no subscription.

### 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 Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) · [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/)

### Support

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

# Actor input Schema

## `seedKeywords` (type: `array`):

One topic per line, e.g. "coffee maker" or "crm for small business". Each seed is expanded into its own list of ideas. Up to 100 seeds per run, max 80 characters and 10 words each.

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

Suggestions = phrases that contain your seed ("best coffee maker with grinder"). Related = Google's "related searches", followed a few levels deep. Ideas = keywords from the same product or topic category, even without the seed words.

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

Country whose Google search volumes and CPC you want.

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

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

10 to 1,000. Each idea returned is billed; see Pricing. An idea already returned for an earlier seed is not repeated.

## `depth` (type: `integer`):

How many levels of Google related searches to follow: 1 = up to about 8 ideas, 2 = about 70, 3 = about 580, 4 = about 4,700. Deeper levels drift further from the seed. Used only with the Related source.

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

Also decides which ideas you get when a seed has more than your maximum.

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

Keep ideas with at least this many monthly searches. Leave empty for no limit.

## `maxSearchVolume` (type: `integer`):

Keep ideas with at most this many monthly searches, e.g. to find long-tail keywords.

## `maxKeywordDifficulty` (type: `integer`):

0 (easy) to 100 (hard). For example 30 to keep keywords that are easier to rank for.

## `includeWords` (type: `array`):

Keep only ideas containing at least one of these words or phrases, e.g. "best", "how to". Matching is on parts of words: "cheap" also keeps "cheapest".

## `excludeWords` (type: `array`):

Drop ideas containing any of these words, e.g. competitor brands. At most 8 filters in total (each word counts as one, and each volume or difficulty limit as one).

## `includeSimilarKeywords` (type: `boolean`):

Off (recommended): close variants of the same search, such as misspellings or reordered words, are left out so you are not billed for near-duplicates.

## Actor input object example

```json
{
  "seedKeywords": [
    "coffee maker"
  ],
  "mode": "suggestions",
  "country": "US",
  "maxIdeasPerSeed": 100,
  "depth": 2,
  "sortBy": "volume",
  "includeSimilarKeywords": false
}
```

# 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 = {
    "seedKeywords": [
        "coffee maker"
    ],
    "mode": "suggestions",
    "country": "US",
    "maxIdeasPerSeed": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainrows/keyword-ideas-generator").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 = {
    "seedKeywords": ["coffee maker"],
    "mode": "suggestions",
    "country": "US",
    "maxIdeasPerSeed": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("plainrows/keyword-ideas-generator").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 '{
  "seedKeywords": [
    "coffee maker"
  ],
  "mode": "suggestions",
  "country": "US",
  "maxIdeasPerSeed": 100
}' |
apify call plainrows/keyword-ideas-generator --silent --output-dataset

```

## MCP server setup

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

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/px7HgWASrs49uBTS0/builds/6AtLTXhCXY1KgjOm1/openapi.json
