# Keyword Ideas Generator: Long-Tail Keywords, Volume & KD (`spokentext/keyword-ideas`) Actor

Turn seed keywords into hundreds of keyword ideas with Google search volume, CPC, competition, keyword difficulty and search intent. Long-tail variations or related topics, sorted by volume, in 92 countries. Pay per idea, no subscription.

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

## Pricing

from $6.00 / 1,000 keyword ideas

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 Ideas Generator: Long-Tail Keywords, Volume & KD

Turn a seed keyword into a list of **keyword ideas with Google search volume, CPC, competition, keyword difficulty and search intent**, sorted by how often people search for them.

- **Distinct ideas, not duplicates.** Google reports one figure for a whole family of close variants ("running shoes nike", "nike shoes for running"...). You get one clean keyword per family, with its variants listed beside it, instead of paying for the same idea ten times.
- **Two kinds of ideas:** long-tail keywords that contain your seed, or related keywords on the same topic.
- **Filter before you pay:** minimum search volume and maximum difficulty.
- **Google Ads data**, refreshed every month, for **92 countries**.
- **Pay per idea.** No subscription, no Google Ads account, no API key.

### How to use

1. Type one or more **seed keywords**, such as `running shoes`.
2. Choose the **kind of ideas** and how many you want per search.
3. Pick the **country**, and set a minimum search volume or a maximum difficulty if you want to narrow the list.
4. Click **Start**. When the run finishes, open the **Output** tab and download the ideas as JSON, CSV or Excel.

Live results need a paid Apify plan. On the free plan, the Actor returns clearly labelled sample rows so you can see the exact output format.

### Output

One dataset item per idea, most searched first:

```json
{
    "keyword": "trail running shoes",
    "seed": "running shoes",
    "country": "US",
    "language": "en",
    "searchVolume": 165000,
    "cpc": 1.07,
    "competition": 1,
    "competitionLevel": "HIGH",
    "lowTopOfPageBid": 0.31,
    "highTopOfPageBid": 1.7,
    "keywordDifficulty": 3,
    "searchIntent": "transactional",
    "trend": { "monthly": 0, "quarterly": 0, "yearly": -63 },
    "closeVariants": ["trailing running shoes", "running or trail shoes", "running trails shoes"],
    "dataUpdatedAt": "2026-09-14"
}
```

| Field | Meaning |
|---|---|
| `searchVolume` | Average monthly Google searches in the chosen country |
| `keywordDifficulty` | How hard it is to rank in the top 10 organic results, from 0 (easy) to 100 (very hard) |
| `cpc` | Average cost per click in Google Ads, in US dollars |
| `competition`, `competitionLevel` | How many advertisers bid on the keyword: 0 to 1, and LOW, MEDIUM or HIGH |
| `searchIntent` | informational, navigational, commercial or transactional |
| `trend` | Change in search volume, in percent, over the last month, quarter and year |
| `closeVariants` | Up to 5 other wordings that Google counts as the same keyword |
| `seed` | The seed keyword this idea came from |

Set **Months of history** above 0 to add the monthly search volumes for each idea.

### The two kinds of ideas

| Kind | What you get | Example for the seed "running shoes" |
|---|---|---|
| **Long-tail** (default) | Keywords that contain your seed. One search per seed keyword. | trail running shoes, best running shoes, brooks running shoes women |
| **Related** | Keywords on the same topic, with or without your seed. One search for all your seeds together. | jogging sneakers, marathon trainers |

### Pricing

- **$0.006 per keyword idea** returned.
- **$0.03 per search.** Long-tail mode runs one search per seed keyword; Related mode runs one search in total.
- Nothing is charged for a search that fails.

| Run | Cost |
|---|---|
| 1 seed, 20 ideas | $0.15 |
| 1 seed, 100 ideas | $0.63 |
| 5 seeds, 100 ideas each | $3.15 |

Set the run's maximum charge to cap spending: the Actor stops before exceeding it.

### Use cases

- Find long-tail keywords with real demand and low difficulty for new content.
- Build topic clusters around a product or a category.
- Expand a Google Ads keyword list, with CPC and bid ranges for budgeting.
- Feed keyword research into Make, Zapier, n8n or your own code.

### FAQ

#### How do I find long-tail keywords for my topic?

Enter your topic as a seed keyword and keep the default **Long-tail** kind. Set **Maximum keyword difficulty** to around 30 to keep only the ideas that are realistic to rank for.

#### How do I find low-competition keywords?

Set **Maximum keyword difficulty** (for organic ranking) and sort the results by `searchVolume`. For Google Ads, look at `competitionLevel` and the bid range.

#### Why do I get fewer ideas than other tools for the same seed?

Other tools often list every wording as a separate result, each with the same numbers. This Actor merges those into one idea and lists the other wordings in `closeVariants`, so every row you pay for is a different keyword.

#### Where does the data come from?

From Google Ads, the same source as Google Keyword Planner, supplied through the data provider DataForSEO and refreshed once a month. Each row shows when its data was last updated.

#### How many ideas can I get?

Up to 1,000 per search and 20 seed keywords per run. Narrow seeds can have fewer ideas than you ask for; you only pay for what is returned.

#### Does it work on the free Apify plan?

The free plan returns sample rows only. Every live search is bought from a paid data source, so live data is available on paid Apify plans.

#### Can I use it from my own code, Make, Zapier or n8n?

Yes. Call it through the Apify API (see below), or connect it with Apify's integrations for Make, Zapier and n8n.

#### What happens to my seed keywords?

They are sent to the data provider (DataForSEO) to be looked up. Results are stored only in your own Apify account.

### Limits

- Country-level data only, with no city or region breakdown.
- Google search only. YouTube, Amazon and Bing ideas are not included.
- Ideas come from keywords people already search for. Brand-new topics with no search history return little or nothing.
- No questions-only or "people also ask" mode yet.

### Related

To check the search volume of keywords you already have, use [Keyword Search Volume](https://apify.com/spokentext/keyword-search-volume).

### Run it from the API

```bash
curl -X POST "https://api.apify.com/v2/acts/spokentext~keyword-ideas/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "seedKeywords": ["running shoes"], "maxResults": 50, "maxKeywordDifficulty": 30 }'
```

# Actor input Schema

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

The topics to find keyword ideas for, one per line. Up to 20 per run.

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

Long-tail runs one search per seed keyword. Related runs a single search across all your seeds together.

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

How many ideas to return for each search, most searched first. In long-tail mode this applies to each seed keyword.

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

The country whose Google searches you want figures for.

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

Two-letter language code (en, fr, de, es...). Leave empty to use the country's main language.

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

Leave out ideas searched fewer times than this per month.

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

Leave out ideas harder to rank for than this score, from 0 (easy) to 100 (very hard). Empty means no limit.

## `monthsOfHistory` (type: `integer`):

How many past months of search volume to include for each idea. 0 keeps the results compact.

## Actor input object example

```json
{
  "seedKeywords": [
    "running shoes"
  ],
  "mode": "longTail",
  "maxResults": 100,
  "country": "US",
  "minSearchVolume": 10,
  "monthsOfHistory": 0
}
```

# Actor output Schema

## `ideas` (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": [
        "running shoes"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("spokentext/keyword-ideas").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": ["running shoes"] }

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

```

## MCP server setup

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

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/14cGJZpw8GokiqEHD/builds/bbDc4Uqa2pgUPidVJ/openapi.json
