# Keyword Search Volume: Google + Amazon + Trademark Check (`vncntlabs/keyword-search-volume`) Actor

Bulk monthly search volume for Google and Amazon, with CPC, competition, 12-month trend, keyword difficulty and intent, plus a USPTO trademark-risk flag per keyword. Built for print-on-demand, Amazon Merch, KDP and Etsy sellers.

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

## Pricing

from $3.00 / 1,000 google search volumes

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 Search Volume: Google + Amazon, with a trademark-risk flag

Get **monthly search volume for Google and Amazon** for up to 50,000 keywords per run, plus **CPC, competition,
a 12-month trend, keyword difficulty and search intent**. Every keyword is also screened against
**live USPTO trademarks**, so you can see which keywords are worth targeting and which could get your listing
taken down.

Built for **print-on-demand, Amazon Merch on Demand, KDP, Etsy and Shopify sellers**, and it works for any SEO or
content team that needs bulk keyword volumes.

### Why this Actor

- **Google and Amazon in one run.** You see what people search on Google and what shoppers search on Amazon, side by
  side.
- **Trademark flag on every keyword.** 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
  federal marks. "harry potter mug" and "hakuna matata shirt" come back **high risk**, with the mark, owner and a
  USPTO TSDR link.
- **You only pay for results.** Keywords with no data, failed lookups, invalid input and duplicates are never
  charged.
- **Hard spending cap.** Set `maxTotalChargeUsd`, or Apify's "Max cost per run". The run looks up only as many
  keywords as fit within the cap, then stops cleanly.
- **Fast.** 700 keywords take about one second to look up. The trademark screen adds about 30 ms per keyword.

### Input

```json
{
  "keywords": ["funny cat shirt", "teacher appreciation gift", "hakuna matata shirt", "axolotl plush"],
  "sources": ["google", "amazon"],
  "location": "United States",
  "language": "en",
  "trademarkCheck": true,
  "maxTotalChargeUsd": 5
}
```

| Field | Default | Notes |
|---|---|---|
| `keywords` | required | Up to 50,000 per run. Case and extra spaces are ignored, and duplicates are looked up once. Each keyword can be at most 80 characters and 10 words. Characters that Google rejects (`, ! ? % * : ; "` and similar) and emoji are reported as skipped. |
| `sources` | every source available for the market | `google`, `amazon`, or both. |
| `location` | United States | A country name, a 2-letter code or a DataForSEO location code. Google data covers about 90 countries. Amazon covers US, UK, CA, AU, DE, FR, IT, ES, NL, AT, IN, MX, SG, AE, SA and EG. |
| `language` | English, or the market's main language | A language code or name. |
| `trademarkCheck` | `true` | Screens each keyword against live USPTO marks. |
| `trademarkClasses` | POD classes | 025 clothing, 021 mugs, 016 paper, stickers and books, 009 phone cases, 014 jewelry, 018 bags, 020 decor, 024 textiles, 028 toys. A product word in the keyword ("shirt", "mug") narrows the check to that product's class. |
| `trendMonths` | 12 | Months of Google history to include (0–48). |
| `maxTotalChargeUsd` | none | A hard cap on what this run can charge you. |

### Output

One dataset row per keyword. Example (shortened):

```json
{
  "keyword": "hakuna matata shirt",
  "googleSearchVolume": 590,
  "googleMonthlySearches": [{"month": "2026-08", "searchVolume": 480}, {"month": "2026-07", "searchVolume": 590}],
  "googleTrend": {"monthOverMonthPct": -19, "quarterOverQuarterPct": 0, "yearOverYearPct": -19},
  "cpcUsd": 0.62,
  "competition": 1,
  "competitionLevel": "HIGH",
  "keywordDifficulty": 0,
  "searchIntent": "transactional",
  "googleDataSource": "dataforseo_labs_google",
  "googleDataUpdatedAt": "2026-09-13 00:16:38 +00:00",
  "googleStatus": "ok",
  "amazonSearchVolume": 299,
  "amazonStatus": "ok",
  "trademarkRisk": "high",
  "trademarkFlaggedPhrases": ["hakuna matata"],
  "trademarkFlags": [{"phrase": "hakuna matata", "risk": "high",
    "marks": [{"mark": "HAKUNA MATATA", "serialNumber": "74558335", "registrationNumber": "2700605",
               "owner": "Disney Enterprises, Inc.", "classes": ["025"], "tsdrUrl": "https://tsdr.uspto.gov/#caseNumber=74558335&caseType=SERIAL_NO&searchType=statusSearch"}]}],
  "trademarkIndexDataThrough": "2026-09-30",
  "location": "United States",
  "language": "en",
  "checkedAt": "2026-10-16T00:43:46Z"
}
```

- **Status values** (`googleStatus` and `amazonStatus`):
  - `ok`: data was returned, and that field is charged.
  - `no_data`: the provider has no measurable volume for the keyword. Not charged.
  - `error`: the lookup failed. Not charged; retry later.
- **Trademark risk**: `high` means an exact live word mark in your product's class. `medium` means a stylized
  mark, a variant, or a common word that a brand owner holds many marks for. `none` means no live mark was found
  in the checked classes. The full scoring rules are in the
  [Trademark Checker README](https://apify.com/vncntlabs/pod-trademark-checker).
- **Skipped rows** (`type: "skipped"`) list invalid or duplicate inputs with a `skipReason`. They are never charged.
- **Run summary**: the key-value store record `OUTPUT` has counts, the amount charged, keywords not reached because
  of your cap, and any warnings.

### Pricing (pay per event)

| Event | Price | When it's charged |
|---|---|---|
| Keyword batch | $0.05 | Once per data request that returned results: up to 700 keywords for Google, 1,000 for Amazon |
| Google volume | $0.003 | Per keyword that has a Google search volume |
| Amazon volume | $0.004 | Per keyword that has an Amazon search volume |
| Trademark check | $0.001 | Per keyword screened against USPTO |

Example: 1,000 keywords with Google, Amazon and the trademark check cost about **$8.20**
(3 batches + 1,000 × $0.008).

**Apify free plan:** up to 20 keywords per run.

### Where the data comes from

- **Search volume** comes from [DataForSEO](https://dataforseo.com), a commercial SEO data provider.
  - **Google** figures come from DataForSEO's keyword database. It is built from Google Ads (Keyword Planner) data
    and refreshed about monthly; `googleDataUpdatedAt` shows when each keyword was last refreshed.
  - **Amazon** figures are DataForSEO's estimate of monthly Amazon searches. Amazon does not publish search volume,
    so every tool's Amazon numbers are modeled.
  - Google publishes each month's figures with a delay, so in mid-October the newest month is usually August.
  - Volumes are rounded, monthly-average estimates, the same kind of numbers Keyword Planner shows. Use them to
    compare keywords, not as exact counts. Google groups close variants, so two similar keywords can show the same
    volume.
- **Trademarks** come from USPTO trademark records: about 4.4 million live US federal marks. They are loaded from a
  public mirror of the USPTO's official bulk data files, and each row shows the date the data runs through
  (`trademarkIndexDataThrough`).

> ⚠️ **Trademark results are not legal advice.** They are automated screening against live US federal marks only.
> They do not cover state or common-law marks, other countries, copyrights or images. **No flag does not mean a
> keyword is safe to use.** For decisions that matter, talk to a trademark attorney.

### FAQ

**Why do some keywords have no Google volume?** Very rare or brand-new phrases are not in the keyword database, and
Google doesn't report volume for every phrase. Those rows are `no_data` and not charged.

**Why did a keyword I typed come back slightly different?** Keywords are lowercased and their spaces are tidied.
Your original spelling is kept in `inputKeyword`.

**Can I run it on a schedule or call it from an AI agent?** Yes. Use Apify schedules, the API, or MCP.
Outputs are plain JSON, so they work in Google Sheets, Make, Zapier and n8n.

**Does the trademark flag make the run slower?** Slightly: about 30 ms per keyword. Turn it off with
`trademarkCheck: false` if you only want volumes.

Made by [VNCNT Labs](https://vncntlabs.com).

# Actor input Schema

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

Keywords to look up, one per item (up to 50,000 per run). Case and extra spaces are ignored and duplicates are looked up once. Max 80 characters and 10 words each; characters Google rejects (, ! ? % \* : ; " etc.) and emoji are reported as skipped and never charged.

## `sources` (type: `array`):

Where to get search volume. Leave empty to use every source available for your market. Amazon volume is available for US, UK, CA, AU, DE, FR, IT, ES, NL, AT, IN, MX, SG, AE, SA and EG.

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

Country name, 2-letter code or DataForSEO location code, e.g. 'United States', 'GB', 'DE', 2840.

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

Language code or name (e.g. 'en', 'de'). Leave empty for English where available, otherwise the market's main language.

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

Screen every keyword against live US federal trademarks in print-on-demand product 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.

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

USPTO classes to screen. Empty = POD default (025 clothing, 021 mugs, 016 paper/stickers/books, 009 phone cases, 014 jewelry, 018 bags, 020 decor, 024 textiles, 028 toys). The product word in the keyword (shirt, mug, sticker...) narrows the classes automatically.

## `maxTotalChargeUsd` (type: `number`):

Optional hard cap. The run looks up only as many keywords as fit, and stops cleanly. Apify's own 'Max cost per run' setting is also respected.

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

How many months of Google monthly search volume to include per keyword (newest first).

## Actor input object example

```json
{
  "keywords": [
    "funny cat shirt",
    "teacher gift",
    "coloring book for adults",
    "hakuna matata shirt",
    "pickleball shirt"
  ],
  "location": "United States",
  "trademarkCheck": true,
  "trendMonths": 12
}
```

# Actor output Schema

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

One row per keyword: Google and Amazon volume, CPC, competition, trend, trademark risk. Invalid or duplicate inputs appear as type=skipped rows (not charged).

## `overview` (type: `string`):

Key columns only.

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

Counts, charges, keywords 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 = {
    "keywords": [
        "funny cat shirt",
        "teacher gift",
        "coloring book for adults",
        "hakuna matata shirt",
        "pickleball shirt"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vncntlabs/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": [
        "funny cat shirt",
        "teacher gift",
        "coloring book for adults",
        "hakuna matata shirt",
        "pickleball shirt",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("vncntlabs/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": [
    "funny cat shirt",
    "teacher gift",
    "coloring book for adults",
    "hakuna matata shirt",
    "pickleball shirt"
  ]
}' |
apify call vncntlabs/keyword-search-volume --silent --output-dataset

```

## MCP server setup

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