# Google Trends Scraper: Unlimited Keywords & Breakouts (`kuezi/google-trends-scraper`) Actor

Google Trends API alternative: interest over time, by region and city, related & rising queries, breakout detection, momentum and seasonality stats, compare more than 5 keywords on one scale, plus Trending Now for any country.

- **URL**: https://apify.com/kuezi/google-trends-scraper.md
- **Developed by:** [Ishema Hugues](https://apify.com/kuezi) (community)
- **Categories:** SEO tools, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 keyword reports

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 Scraper: unlimited keywords, breakouts & momentum

Get **Google Trends data as clean JSON, CSV or Excel**, with the analysis already done.
Supported data: interest over time, interest by country / state / city / metro, top and rising related queries, **Breakout** detection, and the daily **Trending Now** feed for 100+ countries.
No Python, no pytrends rate-limit errors, no 5-keyword limit.

### Why this Google Trends scraper?

| | This Actor | Typical Trends scrapers |
|---|---|---|
| Compare **more than 5 keywords** on one scale | ✅ Chained anchor batches, rescaled to one 0–100 axis | ❌ Google's 5-term limit |
| Momentum, YoY, seasonality computed for you | ✅ `recentChangePct`, `trendChangePct`, `yearOverYearChangePct`, `peakMonth`, `direction` | ❌ Raw numbers only |
| Breakout queries (+5000%) pulled out | ✅ `breakoutQueries` list per keyword | ❌ Buried in nested arrays |
| Share of search & ranking | ✅ `shareOfSearchPct`, `rankInComparison` | ❌ |
| Failed or empty keywords | ✅ **Not charged** | Charged |
| Spreadsheet export | ✅ `TIMELINE_WIDE.csv`: date × keyword table | ❌ |
| Rate limits (HTTP 429) | ✅ Automatic IP + session rotation with backoff | Runs fail |

### What you can do with it

- **SEO & content:** find rising queries and breakouts before competitors write about them, and plan content around `peakMonth`.
- **Product & e-commerce research:** check whether a niche is growing (`trendChangePct`, `yearOverYearChangePct`) before you build or stock it. Covers web, YouTube, Google Shopping, News and Image search.
- **Brand tracking & share of search:** compare your brand with 20 competitors on one scale and schedule the run weekly.
- **Market & investment research:** track interest in products, tickers and technologies across countries and cities.
- **Newsrooms & social media:** pull Trending Now for many countries at once, with traffic estimates and the linked news stories.
- **AI agents & automations:** call it from Make, Zapier, n8n, the Apify API or Apify's MCP server, and get one structured record per keyword.

### Input

Two modes:

**1. Keyword interest**: one record per keyword.

```json
{
  "keywords": ["notion", "obsidian", "evernote"],
  "geo": "US",
  "timeRange": "today 5-y",
  "compareKeywords": false,
  "includeInterestByRegion": true,
  "regionResolution": "AUTO",
  "includeRelatedQueries": true
}
```

- `compareKeywords: false`: each keyword gets its own 0–100 scale. Use this to judge each keyword's own trend.
- `compareKeywords: true`: all keywords share one scale, as when you compare terms in Google Trends. Use this to rank them. Any number of keywords works.
- `geo`: `US`, `GB`, `DE`, `US-CA`, `GB-SCT`… Leave it empty for worldwide.
- `timeRange`: past hour, 4 hours, day, 7 days, 30 days, 90 days, 12 months, 5 years, or 2004–present. Use `customTimeRange` (`2024-01-01 2024-12-31`) for exact dates.
- `searchType`: web, images, news, Google Shopping (`froogle`), YouTube.
- `category`: a Google Trends category ID (0 = all).
- `regionResolution`: countries, sub-regions, cities, or US metro areas (DMA).

**2. Trending now**: the daily trending searches per country.

```json
{ "mode": "trendingNow", "trendingGeos": ["US", "GB", "IN", "NG", "DE"] }
```

### Output

One record per keyword. Summary values below are from a real run on 2 Oct 2026; the arrays are shortened:

```json
{
  "keyword": "notion",
  "status": "ok",
  "geo": "US",
  "timeRange": "today 5-y",
  "scale": "self",
  "average": 52.57,
  "latestValue": 47,
  "peakDate": "2026-03-15T00:00:00.000Z",
  "recentChangePct": -15.5,
  "trendChangePct": 66.6,
  "direction": "rising",
  "yearOverYearChangePct": 18.3,
  "peakMonth": "August",
  "seasonalityStrength": 0.34,
  "topRegion": "District of Columbia",
  "breakoutQueries": ["notion ai workspace", "the days notion remix", "notion ai"],
  "topRisingQuery": "notion ai workspace",
  "trendsUrl": "https://trends.google.com/trends/explore?date=today+5-y&q=notion&geo=US",
  "interestOverTime": [
    { "date": "2026-09-20T00:00:00.000Z", "formattedTime": "Sep 20 – 26, 2026", "value": 47, "isPartial": false },
    "…"
  ],
  "interestByRegion": [
    { "geoCode": "US-DC", "geoName": "District of Columbia", "value": 100 },
    "…"
  ],
  "relatedQueries": {
    "top": [{ "query": "notion ai", "value": 100, "formattedValue": "100", "isBreakout": false, "link": "…" }],
    "rising": [{ "query": "notion ai workspace", "formattedValue": "Breakout", "isBreakout": true, "link": "…" }]
  },
  "scrapedAt": "2026-10-02T…"
}
```

With `compareKeywords: true`, each record also includes `shareOfSearchPct`, `rankInComparison`, and `scale: "shared"`.

Real example: comparing 8 AI assistants worldwide over the past 12 months (8 keywords, beyond Google's limit of 5) gave this ranking: chatgpt 53.6% share of search, gemini 28.5%, claude 8.8%, copilot 2.9%, grok 2.2%, deepseek 2.0%, perplexity 1.5%, mistral 0.5%.

The key-value store also contains:

- `TIMELINE_WIDE.csv`: one row per date, one column per keyword. Paste it straight into Sheets or Excel.
- `FAILED`: keywords or countries that failed after all retries. You are not charged for them.

#### What the analysis fields mean

| Field | Meaning |
|---|---|
| `average` | Mean interest over the range. The partial current period is excluded. |
| `recentChangePct` | Last ~1/12 of the range vs the window before it (≈ the last 4 weeks vs the previous 4 on a 12-month chart) |
| `trendChangePct` | Change across the whole range according to a linear trend line |
| `direction` | `rising` (> +15%), `falling` (< −15%) or `stable`, based on `trendChangePct` |
| `yearOverYearChangePct` | Last 365 days vs the previous 365 days (needs ≥ 2 years, e.g. "Past 5 years") |
| `peakMonth`, `seasonalityStrength` | Strongest calendar month, and how strong the seasonal swing is relative to the average |
| `breakoutQueries` | Rising related queries Google marks "Breakout" (+5000% or more) |
| `zeroShare` | Share of periods with 0 interest. A high value means low search volume. |

### Pricing

The current price is on the **Pricing** tab. Keywords with no Google data, and anything that fails after retries, are never charged. To cap your spend, set *Max cost per run* in the run options.

### FAQ

**Is scraping Google Trends legal?** This Actor only reads aggregated, anonymous statistics that Google publishes openly on trends.google.com. It collects no personal data and needs no login. As always, check the rules that apply to your use case.

**Why are values 0–100 and not search volumes?** Google Trends only publishes relative interest: 100 is the peak for the selected terms, place and time. To compare terms, turn on `compareKeywords`.

**How does it compare more than 5 keywords?** Google allows 5 terms per comparison, so the Actor runs batches that share an "anchor" term (the largest term seen so far), rescales every batch onto the same axis, and renormalizes so the global maximum is 100. Terms below ~1% of the leader keep a precision of about ±1 point.

**Related topics are empty?** Google often withholds related *topics* from automated access. Related *queries* (top, rising, breakouts) are returned normally.

**My keyword shows `status: "noData"`.** Google has too little search volume for that term, place and time. Try a wider region or a longer time range. You are not charged for it.

**Can I schedule it?** Yes. Use Apify Schedules, for example every Monday, to track momentum and catch new breakouts over time.

***

*Independent tool, not affiliated with or endorsed by Google. Google Trends is a trademark of Google LLC.*

# Actor input Schema

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

Keyword interest (time series, regions, related queries) or the daily Trending Now feed for one or more countries.

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

Search terms or Google topic IDs (e.g. /m/0dl567). No limit - turn on 'Compare on one scale' to rank them against each other.

## `compareKeywords` (type: `boolean`):

Off: each keyword gets its own 0-100 scale. On: all keywords share one scale (like comparing them in Google Trends), with share of search and ranking. Works with MORE than Google's 5-term limit by chaining batches through an anchor term.

## `geo` (type: `string`):

Country or region code: US, GB, DE, IN, RW, US-CA, GB-ENG... Leave empty for worldwide.

## `timeRange` (type: `string`):

Period to analyse. Hourly data for ranges up to 7 days, daily up to ~9 months, weekly up to 5 years, monthly for 2004-present.

## `customTimeRange` (type: `string`):

Format: 2024-01-01 2024-12-31

## `searchType` (type: `string`):

Which Google property the interest comes from: web, images, news, Google Shopping or YouTube.

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

Google Trends category (0 = all categories). Examples: 71 Food & Drink, 958 Jobs, 18 Shopping, 7 Finance, 174 Computers & Electronics.

## `includeInterestOverTime` (type: `boolean`):

Full time series per keyword (also exported as TIMELINE\_WIDE.csv in the key-value store).

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

Where the keyword is most popular, with a 0-100 score per region.

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

Granularity of the region breakdown. Automatic = countries for worldwide, sub-regions for a single country. Cities and metros work best for large countries.

## `includeLowVolumeRegions` (type: `boolean`):

Also return regions where Google has too little data (value 0).

## `maxRegions` (type: `integer`):

Keep only the top N regions per keyword (sorted by interest).

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

Top and rising related searches. Rising queries marked "Breakout" grew more than 5000%.

## `includeRelatedTopics` (type: `boolean`):

Top and rising related topics (entities). Google often withholds topics from automated access; when it does, this field is empty. Off by default to save time.

## `trendingGeos` (type: `array`):

Only used in 'Trending now' mode. Country codes, e.g. US, GB, IN, NG, KE, ZA, DE, BR. A few countries have no Trending feed on Google; they are reported in FAILED and not charged.

## `maxTrendingPerGeo` (type: `integer`):

Limit the number of trending searches saved per country. 0 keeps everything in the feed.

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

Language for region and topic names, e.g. en-US, de-DE, fr-FR.

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

Keywords processed in parallel. Higher is faster but more likely to hit Google rate limits (we retry automatically).

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

Google rate-limits datacenter IPs. Residential is the reliable default.

## Actor input object example

```json
{
  "mode": "interest",
  "keywords": [
    "notion",
    "obsidian",
    "evernote"
  ],
  "compareKeywords": false,
  "geo": "",
  "timeRange": "today 12-m",
  "searchType": "web",
  "category": 0,
  "includeInterestOverTime": true,
  "includeInterestByRegion": true,
  "regionResolution": "AUTO",
  "includeLowVolumeRegions": false,
  "maxRegions": 250,
  "includeRelatedQueries": true,
  "includeRelatedTopics": false,
  "trendingGeos": [
    "US"
  ],
  "maxTrendingPerGeo": 0,
  "language": "en-US",
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One row per keyword with the analysis: average, latest value, recent change %, trend change %, year-over-year %, direction, peak, peak month, top region, breakout queries, share of search and rank.

## `trendingNow` (type: `string`):

Trending searches per country (Trending now mode) with approximate search volume and linked news.

## `fullResults` (type: `string`):

Complete records including the interest-over-time series, interest by region and related queries.

## `timelineCsv` (type: `string`):

Spreadsheet-friendly table: one row per date, one column per keyword.

## `failed` (type: `string`):

Items that failed after all retries (never charged). Only present when something failed.

# 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": [
        "notion",
        "obsidian",
        "evernote"
    ],
    "trendingGeos": [
        "US"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kuezi/google-trends-scraper").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": [
        "notion",
        "obsidian",
        "evernote",
    ],
    "trendingGeos": ["US"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("kuezi/google-trends-scraper").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": [
    "notion",
    "obsidian",
    "evernote"
  ],
  "trendingGeos": [
    "US"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call kuezi/google-trends-scraper --silent --output-dataset

```

## MCP server setup

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

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/ia18caLMDnzNqjKUq/builds/L4Bc2OETpOhF0uHGR/openapi.json
