# Keyword Research Tool - Google, YouTube, Amazon Autocomplete (`mochiboo/keyword-research-autocomplete`) Actor

Turn one seed into hundreds of real search phrases. Autocomplete suggestions from Google, YouTube, Google Shopping, Amazon and eBay in one run, expanded with a-z, question words and modifiers, deduplicated per platform and labelled by platform. 8 countries. Suggestions only: no search volumes.

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

## Pricing

from $0.30 / 1,000 results

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 Research Tool - autocomplete keywords from Google, YouTube, Amazon, eBay and Google Shopping

Give it a seed word, get back hundreds of real search phrases from five search boxes at once, one row per phrase, labelled by platform and ready for a spreadsheet.

**Suggestions only, no search volumes.** The phrases come from the autocomplete box of each site. They show what people type, not how often. This actor does not estimate or invent volumes.

- **One seed, five search boxes.** Google Search, YouTube, Google Shopping, Amazon and eBay are asked the same questions in a single run. Every row carries its platform.
- **Expansion is built in.** Alphabet (`seed a` ... `seed z`, `seed 0` ... `seed 9`), question words (`how seed`, `what seed`, ...) and modifiers (`seed for`, `seed vs`, ...) turn one seed into the long-tail list SEO and marketplace sellers usually build by hand. Duplicates are removed per platform.
- **8 countries.** United States, United Kingdom, Germany, France, Canada, Australia, Spain and Italy, including each country's own Amazon and eBay store.

### Pricing

Pay per result, at the rate shown in the pricing panel of this page, plus a very small per-run start fee. You are charged only for the results delivered.

Duplicates are removed before anything is written to the dataset.

### What it did in testing

A run with two seeds (`sourdough`, `running shoes`) on all five platforms in the United States, with the default settings, returned **2,000 keywords in under a minute**: Google 451, YouTube 450, Google Shopping 437, Amazon 431, eBay 231, with no duplicate (platform, keyword) pair and no failed request. A run for `kaffee` on Google, Amazon and eBay in Germany returned 1,000 German keywords, also in under a minute. A single-word seed in the UK, Canada, Australia, France, Spain and Italy returned suggestions from every platform in each of those countries.

### Input

| Field | What it does | Default |
|---|---|---|
| `keywords` | Seed terms, up to 100 per run. Trimmed and lower-cased. | required |
| `platforms` | Any of `google`, `youtube`, `googleShopping`, `amazon`, `ebay`. | Google, YouTube, Amazon |
| `country` | `us`, `uk`, `de`, `fr`, `ca`, `au`, `es`, `it`. | `us` |
| `language` | Language code for Google, YouTube and Google Shopping (`hl`). Empty uses the country's language. Amazon and eBay always use their country store. | empty |
| `expandAlphabet` | Also ask `seed a` ... `seed z`, `seed 0` ... `seed 9` (36 extra queries). | on |
| `expandQuestions` | Also ask `how seed`, `what seed`, `why`, `when`, `where`, `which`, `who`, `can`, `is`, `does` (10 extra queries). | on |
| `expandModifiers` | Also ask `seed for`, `vs`, `with`, `without`, `near`, `best`, `cheap`, `like`, `to`, `and` (10 extra queries). | off |
| `maxKeywordsPerSeed` | Stop collecting for a seed after this many unique keywords, all platforms together (1 to 5000). | 1000 |
| `proxyConfiguration` | Apify Proxy spreads the requests over many IP addresses. | Apify Proxy |

With the defaults every seed becomes 47 queries per platform (57 with modifiers). Every query is sent to every selected platform, four at a time per platform.

### Output

One row per unique (platform, keyword):

```json
{
  "keyword": "sourdough accessories and supplies",
  "platform": "amazon",
  "seed": "sourdough",
  "query": "sourdough a",
  "position": 1,
  "country": "us",
  "language": "en",
  "wordCount": 4,
  "scrapedAt": "2026-10-17T21:45:55.660Z"
}
```

eBay rows also carry the categories eBay attaches to a suggestion (often none):

```json
{
  "keyword": "sourdough starter",
  "platform": "ebay",
  "seed": "sourdough",
  "query": "sourdough",
  "position": 1,
  "country": "us",
  "language": "en",
  "categories": ["Food & Beverages", "Kitchen, Dining & Bar Supplies"],
  "wordCount": 2,
  "scrapedAt": "2026-10-17T21:45:55.660Z"
}
```

| Field | Meaning |
|---|---|
| `keyword` | The suggested phrase. |
| `platform` | `google`, `youtube`, `googleShopping`, `amazon` or `ebay`. |
| `seed` | The seed it was found for. |
| `query` | The exact text typed into the search box (the seed, or the seed with an expansion). |
| `position` | Rank of the phrase in that suggestion list (1 = first). |
| `country`, `language` | Country store and language the phrase was requested with. |
| `categories` | eBay only: category names attached to the suggestion. |
| `wordCount` | Number of words in the phrase. |
| `scrapedAt` | When the row was created (ISO 8601). |

A key-value record named `RUN_SUMMARY` is saved with every run. It says whether the run is `complete`, why it ended (`terminationReason`: `finished`, `max_results`, `charge_limit`, `time_budget`, `blocked` or `request_failed`) and how many rows were written (`rowsPushed`), plus requests sent, failures and retries per platform, rows per platform, duplicates skipped and any platform that was stopped. `complete` is true when the run finished or stopped at your own `maxKeywordsPerSeed`.

### Good to know

- **Deduplication is per platform, across the whole run.** The same phrase on two platforms gives two rows. A phrase that two seeds both produce is written once, for the first seed.
- **The per-seed cap is shared by all platforms.** Queries run in the order seed, alphabet, questions, modifiers, and within each query the platforms contribute in turn. With the default three platforms the cap of 1,000 can end a seed after only a couple of the ten question words (a test with `standing desk` got 2 of the 10). With five platforms selected it was reached at the `y` query for one seed and the `u` query for the other (of 47 queries) in testing, so the question-word queries never ran. Raise `maxKeywordsPerSeed` (up to 5000) if you want the full expansion.
- **eBay's yield varies by seed and country.** In the US and DE tests eBay produced fewer new phrases than the other platforms (231 of the 2,000 rows in the two-seed US test); it varies by seed and country.
- **Google Search suggestions can vary with the location of the requesting IP.** In testing, the same query from two different IP addresses returned a few different phrases and sometimes a different rank order.
- **The expansion words are English.** For a non-English country the question-word and modifier queries (`how kaffee`, `kaffee for`, `kaffee best`) are sent as written and mostly return English or mixed-language phrases; the alphabet queries are not affected.
- **A very large run may stop early.** Shortly before the Apify run timeout the actor stops starting new requests, writes what it has collected, saves `RUN_SUMMARY` with `complete: false` and `terminationReason: time_budget`, and ends normally. Run fewer seeds per run, or raise the run timeout, for very large jobs.
- **If a platform stops answering** (ten requests in a row refused, not JSON, or rate-limited after retries), the actor stops asking that platform for the rest of the run, keeps going with the others, and names it in the final log line and in `RUN_SUMMARY`.
- It uses only the public suggestion endpoints behind each search box: no login, no cookies, no API keys.

### Related searches

keyword research tool, google autocomplete, google suggest, youtube autocomplete, amazon autocomplete, amazon keyword tool, ebay keyword research, long tail keywords, keyword suggestions, seo keywords

# Actor input Schema

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

One or more seed terms, e.g. 'sourdough' or 'running shoes'. Up to 100 seeds per run.

## `platforms` (type: `array`):

Which search boxes to ask. Every seed is sent to every platform you select, and each row is labelled with its platform. Leave empty for Google, YouTube and Amazon.

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

Country edition of Google, and the local Amazon and eBay store, to ask.

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

Leave empty to use the country's default language.

## `expandAlphabet` (type: `boolean`):

Also ask for 'seed a' ... 'seed z' and 'seed 0' ... 'seed 9' (36 extra queries per seed and platform).

## `expandQuestions` (type: `boolean`):

Also ask for 'how seed', 'what seed', 'why seed', 'when seed', 'where seed', 'which seed', 'who seed', 'can seed', 'is seed' and 'does seed' (10 extra queries).

## `expandModifiers` (type: `boolean`):

Also ask for 'seed for', 'seed vs', 'seed with', 'seed without', 'seed near', 'seed best', 'seed cheap', 'seed like', 'seed to' and 'seed and' (10 extra queries).

## `maxKeywordsPerSeed` (type: `integer`):

Stops collecting for a seed once this many unique keywords have been returned, summed over all selected platforms.

## `proxyConfiguration` (type: `object`):

Apify Proxy spreads the requests over many IP addresses. The default is fine.

## Actor input object example

```json
{
  "keywords": [
    "sourdough"
  ],
  "platforms": [
    "google",
    "youtube",
    "amazon"
  ],
  "country": "us",
  "language": "",
  "expandAlphabet": true,
  "expandQuestions": true,
  "expandModifiers": false,
  "maxKeywordsPerSeed": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per keyword suggestion, with the platform it came from, the seed, the query sent and its position.

## `runSummary` (type: `string`):

What the run wrote and how it ended (the RUN_SUMMARY record in the default key-value store).

# 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": [
        "sourdough"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mochiboo/keyword-research-autocomplete").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": ["sourdough"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("mochiboo/keyword-research-autocomplete").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": [
    "sourdough"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call mochiboo/keyword-research-autocomplete --silent --output-dataset

```

## MCP server setup

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

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/j50ZslXsZOYIaymH7/builds/JBLnByBNbFvaaHQ12/openapi.json
