# Google Trends Scraper: Explore, Compare, Trending Now (`nat-labs/google-trends-scraper`) Actor

Google Trends API without a browser: interest over time, by region/city/metro, related & rising queries, compare 5+ terms on one scale, daily data for 5 years, Trending Now with news, change alerts. Same input as apify/google-trends-scraper. Never pay for empty results.

- **URL**: https://apify.com/nat-labs/google-trends-scraper.md
- **Developed by:** [Nat | Data Tools](https://apify.com/nat-labs) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 trend 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: Explore, Compare, Trending Now

Get Google Trends data as clean JSON, CSV or Excel: **interest over time, interest by country / region / city / metro, top and rising related queries, comparisons of any number of terms on one scale, daily data for multi-year ranges, and everything Trending Now** with search volumes and news. No browser, no login, no proxies to set up.

**You never pay for a failed or empty result.** If Google blocks a request or has no data for your term, it costs nothing.

### Why this Google Trends scraper

| | This Actor | Typical Google Trends actors |
|---|---|---|
| Engine | Plain HTTP calls to the same JSON endpoints trends.google.com uses. Fast and light (256 MB). | Headless browser that breaks whenever Google redesigns the page (as on 2 Sep 2026). |
| Failed / blocked runs | Fail within minutes with a clear reason. **Not charged.** | Hang for hours, then "succeed" with 0 results while you pay for compute. |
| Empty results | Terms with no search interest are delivered **free**, flagged `no-interest`. | Charged like any other result. |
| Platform usage | **Included in the price.** No start fee, no compute or proxy bill on top. | Often billed on top (4 GB × run time) or as a per-run start fee. |
| Compare terms | Up to 5 natively, **any number with an anchor term**, all on one 0–100 scale. | 5 at most, or each term scraped separately on its own scale. |
| Long ranges | Optional **daily points for up to 5+ years** (stitched windows). | Weekly or monthly points only. |
| Trending Now | Full list (hundreds to thousands of trends), volume, % increase, start/end, active flag, categories, related searches, **plus news articles for Google's featured trends**. | Top 10 from RSS, or no Trending Now at all. |
| Geos & categories | All 3,681 Google geos (countries, states, US metros), all ~1,100 categories, by code **or name**, many geos per run. | One geo per run, a short category list. |
| Monitoring | **Change alerts**: deliver only new rising/breakout queries, spikes and new trends since the last run. | Re-download everything every time. |
| AI agents | Lenient input: `"us"`, `"Germany"`, `"7d"`, `"12m"` all work. Arrays instead of hidden flags. | Strict enums that reject lowercase codes. |
| Compatibility | Accepts the **same input as apify/google-trends-scraper** and returns the same field names. | — |

### What you can do

- **Keyword research and SEO**: see which queries are rising before your competitors do; find Breakout queries (+5,000% growth).
- **Content and news teams**: watch Trending Now in several countries every hour, with the news stories behind the featured trends.
- **Market and product research**: compare brands, products or features in any number of countries on one scale.
- **Data science and finance**: build daily search-interest series for 5 years for nowcasting and forecasting models.
- **Alerts**: schedule the Actor and get only what changed: new rising queries, spikes above your threshold, new trends.
- **AI agents**: call it from Claude, ChatGPT or Cursor through Apify's AI integrations.
- **Your own stack**: run it from the Apify API, the Python or JavaScript client, Make, Zapier, n8n, Google Sheets, Slack, webhooks or a schedule; export JSON, CSV or Excel.

### Quick start

#### 1. One trend report per term

```json
{
    "searchTerms": ["web scraping", "ai agents"],
    "geos": ["US", "GB", "Germany"],
    "timeRange": "today 12-m"
}
```

→ 6 reports (2 terms × 3 geos), each with interest over time, interest by sub-region, and top + rising related queries.

#### 2. Compare terms on one scale

```json
{ "compareGroups": [["iphone", "pixel", "galaxy"]], "geos": [""] }
```

Comma style works too (same as apify/google-trends-scraper): `"searchTerms": ["iphone, pixel, galaxy"], "isMultiple": true`.

**More than 5 terms:** add `"compareAnchor": "iphone"`. The Actor runs batches of the anchor plus 4 other terms and rescales each batch by the anchor, so all 12, 20 or 50 terms share one scale.

#### 3. Daily data for 5 years

```json
{ "searchTerms": ["bitcoin"], "timeRange": "today 5-y", "dailyResolution": true, "outputFormat": "wide" }
```

#### 4. Trending Now in several countries

```json
{ "trendingGeos": ["US", "GB", "IN"], "trendingHours": "24", "trendingMaxPerGeo": 200, "trendingCategories": [17, 18] }
```

#### 5. Scheduled monitoring (alerts)

```json
{
    "searchTerms": ["your brand", "competitor brand"],
    "geos": ["US"],
    "timeRange": "now 7-d",
    "trendingGeos": ["US"],
    "onlyChanges": true,
    "monitorName": "brand-watch",
    "spikeThreshold": 50
}
```

Schedule it hourly or daily and connect a webhook, Slack or email integration: each run delivers only new rising queries, spikes and new trends.

#### Migrating from apify/google-trends-scraper

Paste your existing input. `searchTerms`, `isMultiple`, `timeRange` (including `""`), `geo`, `category`, `customTimeRange`, `startUrls` and `maxItems` (0 = unlimited) work as before, and the output keeps `inputUrlOrTerm`, `searchTerm`, `interestOverTime_timelineData`, `interestOverTime_averages`, `interestBy`, `interestBySubregion`, `interestByCity`, `interestByMetro`, `relatedQueries_top`, `relatedQueries_rising`, `relatedTopics_top` and `relatedTopics_rising`. `viewedFrom` is accepted but has no effect on Google Trends data. Links from both the classic `/trends/explore` page and the new `/explore` page are supported.

### Output

#### Trend report (`outputFormat: "report"`)

```json
{
    "searchTerm": "coffee",
    "terms": ["coffee"],
    "geo": "US",
    "geoName": "United States",
    "timeRange": "today 12-m",
    "timeRangeResolved": "2025-10-17 2026-10-17",
    "resolution": "WEEK",
    "category": 0,
    "categoryName": "All categories",
    "property": "web",
    "dataStatus": { "timeline": "ok", "regions": "ok", "relatedQueries": "ok", "relatedTopics": "unavailable" },
    "interestOverTime_timelineData": [
        { "time": "1760227200", "formattedTime": "Oct 12 – 18, 2025", "value": [63], "hasData": [true] }
    ],
    "interestOverTime_summary": {
        "term": "coffee", "average": 64.3, "peak": 100, "peakDate": "2025-12-21T00:00:00.000Z",
        "latest": 61, "latestDate": "2026-10-04T00:00:00.000Z",
        "changePercent": -4.2, "spikePercent": -5.1, "direction": "stable"
    },
    "interestBy": [{ "geoCode": "US-WY", "geoName": "Wyoming", "value": [100] }],
    "interestBySubregion": [{ "geoCode": "US-WY", "geoName": "Wyoming", "value": [100] }],
    "relatedQueries_top": [{ "query": "coffee near me", "value": 100, "formattedValue": "100", "rank": 1, "link": "https://trends.google.com/trends/explore?q=coffee+near+me&date=today+12-m&geo=US" }],
    "relatedQueries_rising": [{ "query": "…", "value": 5000, "formattedValue": "Breakout", "isBreakout": true, "rank": 1 }],
    "relatedTopics_top": [],
    "relatedTopics_rising": [],
    "exploreUrl": "https://trends.google.com/trends/explore?q=coffee&date=today+12-m&hl=en-US&geo=US",
    "scrapedAt": "2026-10-17T12:00:00.000Z"
}
```

`dataStatus` tells you, per section, whether the data is `ok`, `empty` (Google had nothing), `no-interest`, `partial`, `failed`, `unavailable` or `not-requested`, so an empty list is never a mystery.

#### Trending Now row

```json
{
    "type": "trending",
    "rank": 1,
    "title": "norte fire",
    "geo": "US",
    "searchVolume": 100000,
    "searchVolumeFormatted": "100K+",
    "increasePercent": 1000,
    "isActive": true,
    "startedAt": "2026-10-17T07:30:00.000Z",
    "endedAt": null,
    "durationHours": 5.5,
    "categories": ["Other"],
    "relatedSearches": ["norte fire", "san clemente fire", "norte fire map"],
    "news": [{ "title": "…", "url": "https://…", "source": "…", "picture": "https://…" }],
    "exploreUrl": "https://trends.google.com/trends/explore?q=norte%20fire&geo=US&date=now%207-d"
}
```

#### Rows and wide formats

`rows`: `{ term, geo, date, formattedTime, value, isPartial, … }`, one row per term per date. `wide`: `{ date, formattedTime, geo, "iphone": 71, "pixel": 12, isPartial }`, one row per date. Both open directly in Excel or Google Sheets.

### Pricing

Pay per event. **Platform usage and proxies are included**: no start fee and no compute bill on top.

| Event | What it is | Price |
|---|---|---|
| Trend report | One term (or comparison of up to 5 terms) in one geo: timeline + regions + related queries | **$2.50 / 1,000** ($0.0025) |
| Extra query | One additional Google query: a daily-stitching window, or an extra anchor batch | $1.00 / 1,000 |
| Monitor check | Monitoring mode: checked, nothing changed, nothing delivered | $1.50 / 1,000 |
| Trending snapshot | **Everything** trending in one country or region (up to thousands of rows, news included) | **$0.005** per country |

Lower rates apply automatically on higher Apify plans (trend reports down to $1.50 / 1,000). **Never charged:** failed or blocked terms, terms with no search interest, Trending Now news, and monitoring runs that find no new trends.

Examples: 100 keywords × 3 countries = 300 reports = **$0.75**. A daily 5-year series for one keyword ≈ $0.0025 + 9 × $0.001 = **$0.0115**. All of today's trends in the US, UK and India (≈1,200 rows) = 3 snapshots = **$0.015**. Hourly Trending Now monitoring of one country for a month ≈ 720 snapshots = at most **$3.60**, less when nothing new appears.

The Actor checks your run's **maximum cost** before each report and stops cleanly when it is reached, so you never pay more than you set.

**Free Apify plan:** up to 10 trend reports and 50 Trending Now rows per run (a limit set by the developer, not by Apify). Any paid plan removes it.

### Good to know

- **Values are relative.** Google scales every request to 0–100, where 100 is the peak of that request. Compare terms only inside one comparison, or with `compareAnchor`.
- **Related topics.** Google sends related topics only to browsers that pass its reCAPTCHA check. This Actor never solves or bypasses CAPTCHAs, so related topics appear only when Google includes them; `dataStatus.relatedTopics` says `unavailable` otherwise. Related **queries** are not affected.
- **Rate limits.** Google throttles heavy use per IP address. The Actor rotates residential IPs, paces itself and retries for you; a term that still fails is listed in the run's `STATISTICS` record with the reason, and isn't charged.
- **Rising queries are Google's own list.** Google sometimes includes broad unrelated searches among rising queries; they are passed through unchanged.
- **Metros (DMA)** exist only for the United States.

### Is it legal to scrape Google Trends?

This Actor reads publicly available, aggregated and anonymous Google Trends statistics, the same data anyone sees on trends.google.com without signing in. It does not log in, does not use accounts, does not solve or bypass CAPTCHAs, respects Google's rate limits by pacing and backing off, and collects no personal data. Check Google's terms for your own use case; for commercial redistribution, consult a lawyer.

### FAQ

**How is this different from pytrends?** pytrends was archived in April 2025 and its Trending Now functions return 404. This Actor is maintained, handles Google's 2025–2026 cookie and rate-limit changes, and runs in the cloud on a schedule.

**How does it compare with SerpApi?** SerpApi bills each data type as a separate search (about $25 per 1,000 at the entry plan), so one full report costs 4–5 searches. Here a full report is one event at $2.50 per 1,000.

**Can I use it from Claude, ChatGPT or Cursor?** Yes, through Apify's AI integrations. The input accepts natural values like `"us"`, `"Germany"`, `"past 7 days"` or `"5y"`.

**Does it work for YouTube, News, Images or Shopping trends?** Yes: set `property` to `youtube`, `news`, `images` or `shopping`.

**What happens when Google changes something?** Each run reports per-section status and fails loudly instead of returning silent empties, so changes are caught and fixed fast. Open an issue in the Issues tab; it's answered within 24 hours.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords or topics to analyse. Each entry becomes one trend report per geo: interest over time, interest by region and related queries. Topic ids like <code>/m/05z1\_</code> work too. With <b>Compare terms in each entry</b> on, write <code>bitcoin, ethereum</code> to compare them on one 0–100 scale.

## `isMultiple` (type: `boolean`):

When on, a comma inside one search-term entry separates up to 5 terms compared on one scale (Google's own limit). Same behaviour as apify/google-trends-scraper.

## `compareGroups` (type: `array`):

Alternative to commas: a list of groups, e.g. <code>\[\["iphone", "pixel", "galaxy"], \["tea", "coffee"]]</code>. Easier for API and AI-agent callers.

## `compareAnchor` (type: `string`):

Put any number of terms on ONE scale. Set a term that appears in your comparison group (for example the most popular one): the Actor queries Google in batches of the anchor + 4 terms and rescales every batch by the anchor. Each extra batch is billed as an <i>extra query</i>.

## `startUrls` (type: `array`):

Paste links from trends.google.com — both the classic <code>/trends/explore?q=…</code> and the new <code>/explore?q=…</code> format. Each link keeps its own geo, date, category and property.

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

One report per term per geo. Country codes (<code>US</code>, <code>de</code>), names (<code>Germany</code>), regions (<code>US-CA</code>, <code>GB-ENG</code>), US metros (<code>US-CA-807</code>), or leave empty for Worldwide. All 3,681 Google Trends geos are supported.

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

Single geo, kept for compatibility with apify/google-trends-scraper. Ignored when <b>Countries / regions</b> is set. Empty = Worldwide.

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

Google's tokens (<code>now 1-H</code>, <code>now 4-H</code>, <code>now 1-d</code>, <code>now 7-d</code>, <code>today 1-m</code>, <code>today 3-m</code>, <code>today 12-m</code>, <code>today 5-y</code>, <code>all</code>) or plain shortcuts like <code>7d</code>, <code>12m</code>, <code>5y</code>. Empty = past 12 months.

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

Overrides Time range. Daily: <code>2024-01-01 2024-06-30</code>. Hourly (max 7 days): <code>2026-10-01T00 2026-10-03T12</code>.

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

Google returns weekly or monthly points for ranges over ~9 months. When on, the Actor fetches overlapping daily windows and stitches them onto one scale — a daily series for 5 years. Each window is billed as an <i>extra query</i> (5 years ≈ 9 windows).

## `category` (type: `string`):

Any of Google's ~1,100 categories, by id (<code>7</code>) or name (<code>Finance</code>, <code>Investing</code>). Empty = All categories.

## `property` (type: `string`):

Which Google search to measure.

## `includeRegions` (type: `boolean`):

Include the regional breakdown. Turn off (with related queries) for a faster timeline-only report.

## `regionResolutions` (type: `array`):

On top of the default breakdown (countries for Worldwide, sub-regions for a country): <code>CITY</code>, <code>DMA</code> (US metros), <code>REGION</code>, <code>COUNTRY</code>. Included in the report price.

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

Google pads region and city lists with places that have too little search volume (value 0, no data). They are dropped by default.

## `includeRelated` (type: `boolean`):

Top and rising related searches, with Breakout flags. Note: Google serves related <i>topics</i> only to browsers that pass reCAPTCHA; this Actor never bypasses CAPTCHAs, so topics are returned only when Google provides them.

## `resolveTopics` (type: `boolean`):

Map each term to Google's topic entity first (e.g. <code>python</code> → <i>Python, programming language</i>), which includes misspellings and translations and avoids ambiguity. The chosen topic is shown in the output.

## `outputFormat` (type: `string`):

<b>report</b>: one nested item per term and geo (same fields as apify/google-trends-scraper). <b>rows</b>: one row per term per date (long format for BI). <b>wide</b>: one row per date, one column per term (paste into Sheets and chart).

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

Get everything trending right now, as on trends.google.com/trending: search volume, % increase, start/end time, active flag, category, related searches and news articles. Countries (<code>US</code>) or regions (<code>US-CA</code>).

## `trendingHours` (type: `string`):

Trends started in the last 4, 24, 48 or 168 hours.

## `trendingMaxPerGeo` (type: `integer`):

Ranked by Google's own order. 0 = all (a week in the US is ~3,000). The price is per country snapshot, so a bigger list costs nothing extra.

## `trendingCategories` (type: `array`):

Only these Trending Now categories, by id: 1 Autos, 2 Beauty & Fashion, 3 Business & Finance, 4 Entertainment, 5 Food & Drink, 6 Games, 7 Health, 8 Hobbies, 9 Jobs & Education, 10 Law & Government, 11 Other, 13 Pets, 14 Politics, 15 Science, 16 Shopping, 17 Sports, 18 Technology, 19 Travel, 20 Climate.

## `trendingActiveOnly` (type: `boolean`):

Skip trends that have already ended; keep only those still trending now.

## `trendingMinVolume` (type: `integer`):

Skip trends below this many searches (Google's lower bound, e.g. 10000 = 10K+).

## `includeNews` (type: `boolean`):

Adds news headlines, links and pictures to the ~10 trends Google features in its official Trending RSS feed. Free.

## `onlyChanges` (type: `boolean`):

For scheduled runs. The first run is the baseline; later runs deliver a report only when a new rising/breakout query appears or interest spikes, and only Trending Now searches not delivered before. Unchanged checks cost a small <i>monitor check</i> instead of a full report.

## `monitorName` (type: `string`):

Separate schedules need separate names so they keep separate memory.

## `spikeThreshold` (type: `integer`):

Latest value vs the average of the period before it. 50 = alert when interest is 50% above normal.

## `maxItems` (type: `integer`):

Stop after this many reports (Trending Now has its own cap). 0 = unlimited. Your run's maximum cost is always respected too: the Actor never starts a report it cannot pay for.

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

How many reports run in parallel, each on its own proxy IP. Higher is faster but trips Google rate limits sooner; 3 is a safe default.

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

Language of names and labels, e.g. <code>en-US</code>, <code>de</code>, <code>ja</code>.

## `timezoneOffsetMinutes` (type: `integer`):

Google's tz parameter: minutes WEST of UTC (New York = 300, Berlin = -60). Affects hourly ranges only. 0 = UTC.

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

Optional. The Actor already rotates Apify residential proxies at no extra cost to you. Override only to use your own proxies.

## Actor input object example

```json
{
  "searchTerms": [
    "web scraping"
  ],
  "isMultiple": false,
  "timeRange": "today 12-m",
  "dailyResolution": false,
  "property": "web",
  "includeRegions": true,
  "includeLowVolumeRegions": false,
  "includeRelated": true,
  "resolveTopics": false,
  "outputFormat": "report",
  "trendingHours": "24",
  "trendingMaxPerGeo": 100,
  "trendingActiveOnly": false,
  "trendingMinVolume": 0,
  "includeNews": true,
  "onlyChanges": false,
  "monitorName": "default",
  "spikeThreshold": 50,
  "maxItems": 1000,
  "maxConcurrency": 3,
  "language": "en-US",
  "timezoneOffsetMinutes": 0
}
```

# Actor output Schema

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

Trend reports and Trending Now searches.

## `statistics` (type: `string`):

Per-run counters, failed terms with reasons, proxy traffic.

# 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 = {
    "searchTerms": [
        "web scraping"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nat-labs/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 = { "searchTerms": ["web scraping"] }

# Run the Actor and wait for it to finish
run = client.actor("nat-labs/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 '{
  "searchTerms": [
    "web scraping"
  ]
}' |
apify call nat-labs/google-trends-scraper --silent --output-dataset

```

## MCP server setup

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