# Keyword Research Tool: Ideas + Amazon Reverse ASIN (`vncntlabs/keyword-ideas`) Actor

Keyword research tool: turn one seed into hundreds of keyword ideas (Google suggestions, related searches, A-Z autocomplete, Amazon related) or get the Amazon keywords any ASIN ranks for. Search volume, CPC, difficulty and a USPTO trademark flag. For SEO, Amazon, Etsy and POD sellers.

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

## Pricing

from $2.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 Research Tool: keyword ideas and Amazon reverse ASIN lookup

**A keyword research tool for SEO and marketplace sellers.** Turn one seed keyword into hundreds of keyword ideas with search volume, CPC and difficulty from Google suggestions, related searches, A-Z autocomplete and Amazon related searches, or enter any Amazon ASIN and get the search keywords that product ranks for (reverse ASIN). Every idea can be screened against live USPTO trademarks, so Merch by Amazon, KDP, Etsy and Redbubble sellers can drop risky words before they design.

Built for **Amazon Merch on Demand, KDP, Etsy, Redbubble and print-on-demand sellers**. It also works for any
SEO or content team that needs long-tail keyword research.

### Five ways to find keywords

| Mode (`mode`) | You enter | You get |
|---|---|---|
| `google_suggestions` (default) | seed keyword | Long-tail Google keywords that contain the seed, with volume, CPC, difficulty and intent |
| `google_related` | seed keyword | Google "related searches", 1 to 4 levels deep |
| `amazon_related` | seed keyword | Related searches from Amazon with Amazon search volume (US, EG, SA, AE) |
| `reverse_asin` | ASIN, ISBN-10 or Amazon URL | Amazon keywords the product ranks for, its rank for each, and its title, price, rating and reviews |
| `autocomplete` | seed keyword | What Google suggests as you type: the seed, seed + a..z and/or question words, with volume |

### Why this Actor

- **Reverse ASIN for Merch and KDP.** Enter a best-seller's ASIN and see which searches bring it traffic. For example,
  "Cat What?" shirt B07YHZR726 ranks #11 for "funny cat t shirts" (19,111 Amazon searches a month). "100 Flowers"
  coloring book 1661264107 ranks #2 for "flower coloring books" (18,887).
- **No zero-volume clutter.** Most long-tail keywords have 0 or unknown volume. The default `minSearchVolume: 1`
  removes them before delivery, so you neither see them nor pay for them. Set it to 0 to keep everything.
- **Trademark flag on every idea.** It uses the same engine as our
  [POD & KDP Trademark Checker](https://apify.com/vncntlabs/pod-trademark-checker) and about 4.4 million live US marks.
  "doja cat t shirts" and "sam and cat merchandise" come back **high risk**. Set `excludeTrademarkRisk` to drop risky
  ideas automatically.
- **You only pay for ideas you get.** Seeds with no ideas, failed lookups, duplicates, filtered-out keywords and
  invalid input are never charged.
- **Hard spending cap.** Set `maxTotalChargeUsd` or Apify's "Max cost per run". The run fetches only what fits under
  the cap, then stops cleanly and lists the seeds it did not reach.
- **No duplicates across seeds.** An idea already delivered for an earlier seed is not repeated or charged again.

### Input

```json
{
  "mode": "reverse_asin",
  "seeds": ["B07YHZR726", "https://www.amazon.com/dp/1661264107"],
  "maxResultsPerSeed": 100,
  "minSearchVolume": 1,
  "sortBy": "searchVolume",
  "excludeTrademarkRisk": "high",
  "maxTotalChargeUsd": 2
}
```

| Field | Default | Notes |
|---|---|---|
| `mode` | `google_suggestions` | See the table above. |
| `seeds` | required | Up to 200 seeds per run. In `reverse_asin` mode, use ASINs, ISBN-10s or Amazon product URLs. |
| `maxResultsPerSeed` | 100 | 1 to 1000. |
| `minSearchVolume` | 1 (0 for autocomplete) | Ideas below this monthly volume are dropped and not charged. |
| `sortBy` | `searchVolume` (`relevance` for autocomplete) | `searchVolume`, `relevance` (related depth, the product's Amazon rank, or autocomplete order), `cpc`, `keywordDifficulty`, `alphabetical`. CPC and difficulty are Google-only. |
| `includeWords` / `excludeWords` | none | Whole-word filters, e.g. include `shirt, tee`; exclude `free, printable, svg`. |
| `location` / `language` | United States / market default | Google modes cover about 90 countries. Amazon modes cover US, EG, SA and AE. |
| `depth` | 2 (Google), 3 (Amazon) | Related modes only. |
| `autocompleteExpansion` | `alphabet` | `none` (1 lookup), `alphabet` (27), `questions` (11), `alphabet_and_questions` (37). |
| `autocompleteSearchVolume` | `true` | Adds Google volume, CPC and difficulty to autocomplete ideas. No extra event. |
| `trademarkCheck` | `true` | USPTO trademark screen. |
| `excludeTrademarkRisk` | `none` | `high` or `medium_and_high` drops flagged ideas (not charged). |
| `trademarkClasses` | POD classes | 025, 021, 016, 009, 014, 018, 020, 024, 028. |
| `maxTotalChargeUsd` | none | A hard cap on what this run can charge you. |

### Output

The dataset has one `type: "idea"` row per keyword and one `type: "seed"` summary row per seed. Example idea row
(shortened):

```json
{
  "type": "idea", "keyword": "funny cat t shirts", "seed": "B07YHZR726", "mode": "reverse_asin", "rankInSeed": 1,
  "searchVolume": 19111, "searchVolumeSource": "amazon", "volumeStatus": "ok", "wordCount": 4,
  "asin": "B07YHZR726", "amazonRank": 11,
  "trademarkRisk": "medium", "trademarkFlaggedPhrases": ["cat"],
  "location": "United States", "checkedAt": "2026-10-16T02:10:00Z"
}
```

Google modes also return `monthlySearches`, `trend`, `cpcUsd`, `competition`, `competitionLevel`, top-of-page bids,
`keywordDifficulty` (0 to 100) and `searchIntent`. Autocomplete rows add `autocompleteQuery` and `autocompleteRank`.

`volumeStatus` is `ok` (volume ≥ 1), `zero` (the provider reports 0) or `unknown` (no data).

Each seed row shows `status` (`ok`, `no_results`, `error` or `not_processed`), `ideasAvailable`, `ideasDelivered`,
and `filteredOut` counts (below min volume, excluded words, duplicate of an earlier seed, trademark, beyond max
results). In reverse-ASIN mode it also shows the product's title, price, rating and review count.

Views: **Keyword ideas** and **Seeds summary**. The run summary is in the `OUTPUT` record of the key-value store.

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| `seed-processed` | $0.02 | A seed or ASIN that returned at least one idea (Labs modes) |
| `keyword-idea` | $0.002 | Each idea delivered |
| `autocomplete-query` | $0.004 | Each autocomplete lookup that returned suggestions |

Examples:

- 1 seed × 100 ideas = $0.22.
- 1 ASIN × 40 ideas = $0.10.
- 1 autocomplete seed with A–Z and 100 ideas ≈ $0.31.

### Use from AI agents (MCP)

AI assistants such as Claude, ChatGPT and Cursor can run this Actor through [Apify's MCP server](https://docs.apify.com/platform/integrations/mcp) (`https://mcp.apify.com`). The agent can look up the Actor, read its input schema, run it and read the results. Runs use your own Apify account and are charged at the prices on this page.

- **Actor name:** `vncntlabs/keyword-ideas`
- **Server URL with only this tool:** `https://mcp.apify.com?tools=vncntlabs/keyword-ideas`. The default `https://mcp.apify.com` also works; the agent can then search Apify Store and call the Actor by name.
- **Claude** (desktop app or claude.ai): Settings > Connectors > Add custom connector, paste the server URL, then sign in to Apify.
- **ChatGPT:** turn on Developer mode, then Settings > Apps & Connectors > Create, paste the server URL and choose OAuth.
- **Cursor:** run `/add-plugin apify` in Cursor chat and connect the Apify MCP server under Cursor Settings > Tools & MCPs, or add the server to `mcp.json`:

```json
{ "mcpServers": { "apify": { "url": "https://mcp.apify.com?tools=vncntlabs/keyword-ideas" } } }
```

Example prompt: *"Use the Apify Actor vncntlabs/keyword-ideas to find 100 keyword ideas for "camping mug" with search volume and CPC, sorted by search volume."*

To cap the cost of an agent's run, it can pass `maxTotalChargeUsd` in the run options.

### Tips

- **Merch shirts:** run `reverse_asin` on 3 to 5 best-sellers in your niche with `excludeTrademarkRisk: "high"`.
  Then put the best ideas into our Keyword Search Volume Actor to compare Google and Amazon.
- **KDP:** `amazon_related` with `includeWords: ["book", "journal", "coloring"]` keeps Amazon's broad related
  products (markers, pencils) out of the results.
- **Long-tail hunting:** `reverse_asin` with `minSearchVolume: 0` and `sortBy: "relevance"` shows every keyword the
  product ranks for, best rank first. Many of them have zero measured volume but still convert.

### Notes and limits

- Search volumes are third-party estimates from DataForSEO. Google volume comes from a Google Ads-based database;
  Amazon volume comes from DataForSEO's Amazon keyword data. Google volume does not measure Etsy or Redbubble
  search.
- An ASIN that is new or not ranked in the selected market returns `no_results` and is not charged.
- The trademark screen is automated and is not legal advice. Common words that are also registered marks (for
  example "cat", "canada") are flagged **medium**. Check the TSDR link before you decide.

# Actor input Schema

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

Google suggestions: long-tail keywords that contain your seed. Google related: keywords Google shows as related searches ("people also search"), up to 4 levels deep. Amazon related: related searches from Amazon, for Merch/KDP. Reverse ASIN: the Amazon search keywords a product ranks for (enter ASINs or Amazon URLs). Google autocomplete: what Google suggests as you type the seed, optionally seed + a..z and question words.

## `seeds` (type: `array`):

One seed keyword per item (up to 200). In Reverse ASIN mode, enter ASINs, ISBN-10s or Amazon product URLs. Invalid entries are reported as skipped and never charged.

## `maxResultsPerSeed` (type: `integer`):

Most keyword ideas returned for each seed (1-1000). You pay only for ideas you get.

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

Drop ideas below this volume. Default 1 removes zero-volume long-tail (most reverse-ASIN keywords have 0 or unknown volume). Set 0 to keep every keyword. Autocomplete defaults to 0.

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

Search volume (default) puts the biggest keywords first. Relevance keeps the provider's order: depth for related keywords, the product's Amazon rank for reverse ASIN, suggestion order for autocomplete (autocomplete default). CPC and difficulty are Google-only.

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

Keep only ideas containing at least one of these whole words, e.g. shirt, tee, hoodie.

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

Drop ideas containing any of these whole words, e.g. free, printable, svg, amazon.

## `location` (type: `string`):

Country name, 2-letter code or DataForSEO location code. Amazon modes support United States, Egypt, Saudi Arabia and UAE.

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

Language code, e.g. en, de. Leave empty for the market default.

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

Google/Amazon related modes only. 1 = direct related searches; each level adds the related searches of the previous level (much larger, less on-topic). Default 2 for Google and 3 for Amazon.

## `autocompleteExpansion` (type: `string`):

Autocomplete mode only. Each lookup is one charged autocomplete-query event. None = 1 lookup per seed; A-Z = 27 lookups (seed, seed a ... seed z); questions = 11 (how/what/why/best... + seed); both = 37.

## `autocompleteSearchVolume` (type: `boolean`):

Autocomplete mode only. Look up Google search volume, CPC and difficulty for suggestions (no extra event). Turn off for suggestions only.

## `trademarkCheck` (type: `boolean`):

Screen every idea against live US federal trademarks in print-on-demand classes, using the same engine as our POD & KDP Trademark Checker. Adds high/medium/low risk, matched marks, owners and TSDR links. Automated screening, not legal advice.

## `excludeTrademarkRisk` (type: `string`):

Remove ideas flagged by the trademark check before delivery (they are not charged).

## `trademarkClasses` (type: `array`):

USPTO classes to screen. Empty = POD default (025, 021, 016, 009, 014, 018, 020, 024, 028).

## `ignoreSynonyms` (type: `boolean`):

Google suggestions/related only: drop near-duplicate variants (plurals, word order) that share the same Google volume.

## `trendMonths` (type: `integer`):

Google modes: months used for the trend percentage (0 = off).

## `maxTotalChargeUsd` (type: `string`):

Optional spending limit for this run, on top of Apify's own limit. The run stops cleanly when reached; seeds not reached are listed and never charged.

## Actor input object example

```json
{
  "mode": "google_suggestions",
  "seeds": [
    "funny cat shirt"
  ],
  "maxResultsPerSeed": 100,
  "location": "United States",
  "autocompleteExpansion": "alphabet",
  "autocompleteSearchVolume": true,
  "trademarkCheck": true,
  "excludeTrademarkRisk": "none",
  "ignoreSynonyms": false,
  "trendMonths": 12
}
```

# Actor output Schema

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

type=idea rows (one per keyword idea), type=seed rows (one per seed: status, counts, filters, product info) and type=skipped rows (invalid inputs, not charged).

## `ideas` (type: `string`):

Key columns only.

## `seeds` (type: `string`):

One row per seed.

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

Counts, charges, seeds not reached at the spending limit, warnings.

# 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 = {
    "seeds": [
        "funny cat shirt"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vncntlabs/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 = { "seeds": ["funny cat shirt"] }

# Run the Actor and wait for it to finish
run = client.actor("vncntlabs/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 '{
  "seeds": [
    "funny cat shirt"
  ]
}' |
apify call vncntlabs/keyword-ideas --silent --output-dataset

```

## MCP server setup

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