# Google Trends Bulk Keyword Comparison - 500 Keywords, 1 Scale (`headply/google-trends-bulk-keyword-comparison`) Actor

Compare more than 5 keywords in Google Trends. Normalizes up to 500 keywords onto a single 0-100 scale, so search interest is directly comparable across the whole list. Rank keywords by Google Trends popularity in bulk.

- **URL**: https://apify.com/headply/google-trends-bulk-keyword-comparison.md
- **Developed by:** [Mayowa Ogedengbe](https://apify.com/headply) (community)
- **Categories:** SEO tools, Marketing, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 keyword series

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

## Google Trends Bulk Keyword Comparison

Compare **up to 500 keywords on Google Trends** and get every one on **the same 0 to 100 scale**. Google only compares five keywords at a time and rescales each comparison, so numbers from separate comparisons can't be ranked against each other. This Actor links comparisons through shared keywords, so your whole list comes back as if Google had compared it in one chart. No login, no API key.

Use it to rank a product catalogue by search demand, size markets, pick content topics, or compare brands, competitors and features side by side.

#### Sample output (real run: 10 drinks, US, past 12 months, one shared scale)

| Keyword | Average interest | Peak | Peak week |
|---|---|---|---|
| coffee | 76.5 | 100 | 2026-04-12 |
| tea | 36.6 | 45 | 2026-04-05 |
| espresso | 9.6 | 14.8 | 2026-04-12 |
| matcha | 6.2 | 8.6 | 2026-04-12 |
| energy drink | 3.7 | 7.9 | 2026-04-12 |
| chai | 3.0 | 4.2 | 2026-08-23 |
| cold brew | 2.0 | 3.4 | 2026-06-21 |
| kombucha | 1.1 | 1.6 | 2026-06-21 |

Google Trends only compares 5 terms at a time and rescales every request to 0-100. This Actor chains overlapping batches so **every keyword sits on the same scale** (validated within 0-1.7% of Google's own numbers), and the full time series comes with each row.

#### Why this one

| | This Actor | pytrends / DIY | Typical Store alternative |
|---|---|---|---|
| Keywords compared on one scale | **Hundreds** | 5 | 5 |
| Daily data for multi-year ranges | Yes, stitched and calibrated | Weekly or monthly only | Rarely |
| Rate limits (429) | Handled with session rotation | Breaks | Some fail 1 run in 4 |
| Price | **$3 / 1,000 keyword series** | Free, your time | $2 to $25 / 1,000, often plus start fees |

**What it costs:** 100 keywords with their time series = about $0.50.

### What this Actor does

- Takes **any list of keywords or topics** (up to 500) and returns them on **one shared scale**, where 100 is the single highest point of any keyword in the run.
- Orders keywords by size and links each Google comparison through a **shared pivot keyword**, so even keywords hundreds of times smaller than the leader keep their detail.
- Returns **average, peak, peak date, latest value and change %** for every keyword, plus the full time series.
- Works for **any location** (country, state, US metro) and **any time range**, with optional **daily data over long ranges**.
- Optionally adds **interest by region** and **related and rising queries** for every keyword.

### How accurate is it?

We checked it against Google itself. Eighteen keywords were compared together, then pairs that had landed in *different* Google comparisons were compared directly on Google Trends:

| Pair | Google, compared directly | This Actor | Difference |
| --- | --- | --- | --- |
| chatgpt / yoga | 5.27 | 5.27 | 0.0% |
| netflix / pilates | 7.82 | 7.81 | 0.1% |
| coffee / sourdough | 9.23 | 9.26 | 0.4% |
| airbnb / padel | 21.67 | 21.76 | 0.4% |
| bitcoin / kombucha | 14.70 | 14.52 | 1.2% |
| tesla / notion | 11.66 | 11.86 | 1.7% |

A 94-keyword run spanning a 1,300-fold range of search volume, from "amazon" to "evernote", finished in about a minute. 93 of the 94 keywords were marked high precision.

### What data do you get?

| Field | Description |
| --- | --- |
| keyword, keywordTitle | The keyword, and the readable name for topic IDs |
| geo, timeframe, startDate, endDate, resolution | What was measured |
| average, peak, peakDate, latest, changePct | Headline numbers on the shared scale |
| timeline | Date and value for every point |
| scale.precision | high, medium or low; low means the keyword is tiny next to the largest one |
| interestByRegion | Optional: interest per region |
| relatedQueries | Optional: top and rising related searches |

### How to compare keywords on Google Trends in bulk

1. Paste your **keywords**, one per line.
2. Add a **location** (for example `US`), or leave it empty for worldwide.
3. Pick a **time range**, and turn on **daily data** for long ranges if you need it.
4. Run it, sort by `average` to rank your list, and export to CSV or Excel.

#### Example input

```json
{
  "keywords": ["coffee", "tea", "matcha", "kombucha", "yerba mate", "cold brew", "chai", "espresso", "oat milk", "energy drink"],
  "geos": ["US"],
  "timeframe": "today 12-m"
}
```

### How much does it cost?

You pay per keyword, plus a small charge per keyword for putting more than five on one scale. Region breakdowns, related queries and daily history are optional extras. Current prices, with discounts on higher Apify plans, are on the pricing tab.

### FAQ

**Why not just compare five at a time on Google Trends?** Each comparison is scaled so its own top keyword is 100, so a 40 in one chart and a 40 in another usually mean different things. This Actor removes that problem.

**Why do values differ from what I see on Google Trends?** They're relative to the biggest keyword in *your whole list*. Ratios between keywords match Google; the absolute level depends on the list.

**What does low precision mean?** Google rounds to whole numbers, so a keyword over about 100 times smaller than the largest in the run carries less detail. Run small keywords in their own list for finer resolution.

### Related Actors

- [Google Trends Scraper](https://apify.com/headply/google-trends-scraper): the all-in-one version, including Trending Now.
- [Google Trends Trending Now Scraper](https://apify.com/headply/google-trends-trending-now): what people are searching right now, with volume.

### Use it as an API

Run it from your own code and get the results back in one call. Replace `YOUR_TOKEN` with your [Apify API token](https://console.apify.com/settings/integrations).

```bash
curl -X POST "https://api.apify.com/v2/acts/headply~google-trends-bulk-keyword-comparison/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords": ["coffee", "tea", "matcha", "kombucha", "yerba mate", "cold brew", "chai", "espresso", "oat milk", "energy drink"], "geos": ["US"], "timeframe": "today 12-m"}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run_input = {'keywords': ['coffee',
              'tea',
              'matcha',
              'kombucha',
              'yerba mate',
              'cold brew',
              'chai',
              'espresso',
              'oat milk',
              'energy drink'],
 'geos': ['US'],
 'timeframe': 'today 12-m'}
run = client.actor("headply/google-trends-bulk-keyword-comparison").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

It also works from Make, Zapier, n8n, Google Sheets and as a tool for AI agents through the [Apify MCP server](https://mcp.apify.com/?tools=headply/google-trends-bulk-keyword-comparison).

### More data tools from the same developer

- [Threads Scraper & API](https://apify.com/headply/threads-scraper): posts, reply trees, profiles and keyword search from Threads
- [Yelp Scraper & API](https://apify.com/headply/yelp-scraper): every business in a city with phones, websites and all reviews
- [TikTok & YouTube Transcript API](https://apify.com/headply/tiktok-youtube-transcript-scraper): video to text, even without captions
- [Google Trends Scraper & API](https://apify.com/headply/google-trends-scraper): hundreds of keywords on one scale, daily history
- [Airbnb & Vrbo Scraper](https://apify.com/headply/airbnb-vrbo-scraper): listings, calendars, occupancy and revenue
- [Jumia Scraper & API](https://apify.com/headply/jumia-price-intelligence): prices and sellers across 8 African countries

# Changelog

This Actor's version history is a separate document: https://apify.com/headply/google-trends-bulk-keyword-comparison/changelog.md

# Actor input Schema

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

One search term per line, up to 500. They are all returned on one comparable scale. Topic IDs such as <b>/m/07bsy</b> also work.

## `geos` (type: `array`):

Country or region codes, one per line: <b>US</b>, <b>GB</b>, <b>US-CA</b> (California), <b>US-NY-501</b> (New York metro). Leave empty for worldwide. Each location is a separate set of results.

## `timeframe` (type: `string`):

The period to cover. Pick <b>Custom</b> to set exact dates below.

## `startDate` (type: `string`):

First day of a custom range, from 2004-01-01.

## `endDate` (type: `string`):

Last day of a custom range. Leave empty for today.

## `dailyResolution` (type: `boolean`):

Google only gives daily points for ranges up to about nine months, then switches to weekly or monthly. Turn this on to get one daily point per day over any range, even 2004 to today. Each window is calibrated against the full-range series so the levels stay consistent across years.

## `includeInterestByRegion` (type: `boolean`):

Add each keyword's interest per country, state, metro or city.

## `regionResolution` (type: `string`):

The level for interest by region. <b>Auto</b> uses countries for worldwide and states or provinces for a country. Metro areas are available for the US.

## `includeRelatedQueries` (type: `boolean`):

Add the top related searches and the fastest-rising ones (including Breakouts) for each keyword.

## `includeTimeline` (type: `boolean`):

Turn off if you only need the summary numbers (average, peak, latest, change).

## `category` (type: `integer`):

Google Trends category ID to narrow the meaning of a keyword, for example <b>71</b> for Food & Drink or <b>12</b> for Business & Industrial. 0 means all categories.

## `searchProperty` (type: `string`):

Which Google search to measure.

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

Interface language for names of regions and topics, for example en-US or de-DE.

## `maxConcurrency` (type: `integer`):

How many Google sessions run at once. Higher is faster for large keyword lists; each session uses its own IP.

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

Google throttles Trends per IP. Residential proxies give the most reliable results.

## Actor input object example

```json
{
  "keywords": [
    "coffee",
    "tea",
    "matcha",
    "kombucha",
    "yerba mate",
    "cold brew",
    "chai",
    "espresso",
    "oat milk",
    "energy drink"
  ],
  "geos": [
    "US"
  ],
  "timeframe": "today 12-m",
  "dailyResolution": false,
  "includeInterestByRegion": false,
  "regionResolution": "auto",
  "includeRelatedQueries": false,
  "includeTimeline": true,
  "category": 0,
  "searchProperty": "web",
  "language": "en-US",
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One item per keyword and location, or per trending search.

# 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": [
        "coffee",
        "tea",
        "matcha",
        "kombucha",
        "yerba mate",
        "cold brew",
        "chai",
        "espresso",
        "oat milk",
        "energy drink"
    ],
    "geos": [
        "US"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("headply/google-trends-bulk-keyword-comparison").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": [
        "coffee",
        "tea",
        "matcha",
        "kombucha",
        "yerba mate",
        "cold brew",
        "chai",
        "espresso",
        "oat milk",
        "energy drink",
    ],
    "geos": ["US"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("headply/google-trends-bulk-keyword-comparison").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": [
    "coffee",
    "tea",
    "matcha",
    "kombucha",
    "yerba mate",
    "cold brew",
    "chai",
    "espresso",
    "oat milk",
    "energy drink"
  ],
  "geos": [
    "US"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call headply/google-trends-bulk-keyword-comparison --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,headply/google-trends-bulk-keyword-comparison"
        }
    }
}
```

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/XWYszDaPOuWXzZBNY/builds/n0liXog47ZNDYyejP/openapi.json
