# Google Trends Scraper | Compare 1,000 Terms, Daily Data (`alexmorain/google-trends-scraper`) Actor

Google Trends data without a browser: interest over time for up to 1,000 terms on one comparable scale, daily points over years, interest by region, top and rising related queries, and Trending now by country with search volumes.

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

## Pricing

from $1.00 / 1,000 term 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

### What does Google Trends Scraper do?

This Actor turns [Google Trends](https://trends.google.com/) into structured data. Give it
search terms and it returns, for each one, **interest over time**, peak and average,
**interest by region** (countries, regions, US metro areas or cities) and **related queries**,
top and rising. Add a country and it also returns everything Google lists in **Trending now**,
with search volumes, growth and related searches.

It reads the same JSON endpoints the Google Trends website calls, over plain HTTP. No browser,
no page loads, no login. 200 search terms take about two minutes. If you are looking for a
Google Trends API, this is the closest thing to one: terms in, JSON out.

Two things it does that most Google Trends scrapers do not:

1. **Values you can compare between terms.** Google scales every request on its own 0 to 100,
   100 being the peak of that request. Read terms one by one and every term peaks at 100, so
   their numbers mean nothing next to each other. This Actor compares up to 5 terms per request
   on one scale, like the Google Trends compare view, and beyond 5 it rescales every group
   through a shared anchor term. 1,000 terms on one scale in one run.
2. **Daily points over years.** Past 269 days, Google only gives weekly or monthly points. Turn
   on daily points and the range is read in 269-day windows, each calibrated on the series of
   the whole range, so you get one comparable value per day for up to 10 years.

### Why use Google Trends Scraper?

Because the numbers are right and the runs finish.

Here is what reading terms one at a time does to the data. Worldwide, past 5 years, weekly
points, measured on October 17, 2026:

| Term | Read alone: peak | Read alone: average | Same scale: peak | Same scale: average |
|---|---|---|---|---|
| python | 100 | 67.1 | 100 | 67.2 |
| java | 100 | 71.5 | 61 | 43.2 |
| javascript | 100 | 58.8 | 29 | 17.5 |
| rust | 100 | 59.1 | 27 | 15.8 |
| golang | 100 | 71.0 | 5 | 3.2 |

Read alone, golang looks more searched than python (71 against 67). On the same scale it is
searched 22 times less. Any dashboard, model or report built on separate requests carries that
error silently. With **Compare terms on one scale** on (the default), you get the right column.

The runs finish because there is no browser to block. The Google Trends web page answers
"429 Too Many Requests" to cloud IPs at the first visit; a browser-based scraper then retries,
waits for page loads that never come, and runs into its timeout. The JSON endpoints this Actor
calls answered 1,500 requests out of 1,500 from Apify datacenter IPs in our tests. When Google
does refuse a request, it is retried on a new proxy session, and if refusals keep coming, new
sessions switch to residential proxy on their own.

Typical uses:

- **SEO and content planning**: seasonality of a topic, rising queries to write about, where
  a keyword is searched the most.
- **Market and brand research**: brands, products or competitors on one comparable scale, over
  years, by country or by US state.
- **Data science and forecasting**: daily series over long ranges, ready for a model, with
  the partial current period flagged instead of looking like a drop.
- **Newsrooms and social media teams**: what is trending right now in each country, with search
  volumes, schedulable every hour.

On Apify you can schedule runs, call the Actor from the [API](https://docs.apify.com/api/v2),
and send results to Google Sheets, Make, Zapier, n8n or a webhook.

### What data can Google Trends Scraper extract?

One row per search term:

| Field | What it holds |
|---|---|
| `searchTerm` | The term, as you gave it |
| `timeline` | Interest over time: `date`, `value`, `isPartial` for the period still in progress |
| `averageInterest`, `peakInterest`, `peakDate`, `latestInterest` | Summary over complete periods |
| `resolution` | MINUTE, HOUR, DAY, WEEK or MONTH |
| `scale`, `comparedWith`, `anchorTerm` | Which terms these values compare with |
| `regions` | Interest by region, `geoCode`, `geoName`, `value` |
| `relatedQueriesTop` | Up to 25 related queries, 100 being the most searched |
| `relatedQueriesRising` | Up to 25 rising queries with their growth (+250%, Breakout) |
| `trendsUrl` | The same view on Google Trends |

One row per trend in Trending now:

| Field | What it holds |
|---|---|
| `term`, `geo`, `rank` | The trending search, its country and its rank by volume |
| `searchVolume`, `searchVolumeLabel` | Approximate searches since it started (200K+) |
| `growthPercent` | Growth of searches, in % |
| `startedAt`, `endedAt`, `isActive` | When it started, and whether it is still trending |
| `categories` | Sports, Entertainment, Politics, Technology... |
| `relatedTerms` | Related searches Google groups under the trend |

### How to scrape Google Trends

1. Open the Actor's **Input** tab.
2. Type your keywords in **Search terms**, one per line.
3. Pick a **Location** (empty for worldwide, `US`, `FR`, `US-CA`...) and a **Time range**.
4. Optional: turn on **Daily points on long ranges**, pick a **Category** or a **Search type**
   (web, YouTube, news, images, Google Shopping).
5. For what is trending now, add country codes in **Trending now > Countries**.
6. Click **Start**, then open the **Output** tab or download the dataset.

### How much does it cost to scrape Google Trends?

You pay per result, nothing for compute or proxies:

| Event | Free plan | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Search term report (per 1,000) | $2.50 | $2.00 | $1.50 | $1.00 |
| Trend in Trending now (per 1,000) | $1.00 | $0.80 | $0.60 | $0.40 |
| Run start | $0.002 | $0.002 | $0.002 | $0.002 |

A comparison of 5 brands over 5 years costs $0.0145 on the Free plan. The 650 trends of a
day in the US cost $0.65. Daily points, regions and related queries are included in the term
price. **A term Google has no data for is returned free**, with `hasData: false`.

Set a maximum charge per run in the run options and the Actor stops there.

### Input

See the Input tab for every option. The ones that need a word:

- **Compare terms on one scale** (on by default). Off, each term gets its own 0 to 100 scale:
  useful only to look at each term's shape, never to compare terms.
- **Anchor term**, used with more than 5 terms. Every request group includes it and is rescaled
  through it, then the whole set is brought back to 100 at the highest point. Pick a term with
  steady, mid-to-high volume. Google rounds values to whole numbers inside each request, so a
  term much smaller than the biggest term of its group comes out as 0 or 1: keep terms of a
  similar size together, or compare small terms in a separate run.
- **Location** takes Google Trends codes: a country (`DE`), a region (`US-TX`, `GB-SCT`) or a
  US metro area (`US-NY-501`).
- **Category** takes the `cat=` number of a Google Trends link, 0 for all categories.

Example:

```json
{
    "searchTerms": ["nike", "adidas", "puma"],
    "geo": "US",
    "timeRange": "past-5-years",
    "dailyResolution": true,
    "trendingCountries": ["US"],
    "trendingTimeWindow": "24"
}
```

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. The Output
tab has two views: Search terms and Trending now. A search term row, shortened:

```json
{
    "searchTerm": "Gemini",
    "comparedWith": ["ChatGPT", "Perplexity"],
    "scale": "shared",
    "geo": "worldwide",
    "timeRange": "past-12-months",
    "resolution": "WEEK",
    "averageInterest": 43.92,
    "peakInterest": 55,
    "peakDate": "2026-06-07",
    "latestInterest": 54,
    "timeline": [
        {"date": "2026-10-11", "value": 54, "isPartial": false},
        {"date": "2026-10-18", "value": 40, "isPartial": true}
    ],
    "regions": [{"geoCode": "MG", "geoName": "Madagascar", "value": 100}],
    "relatedQueriesTop": [{"query": "gemini ai", "value": 100}],
    "relatedQueriesRising": [{"query": "gemini omni", "growthPercent": 1250, "formattedGrowth": "+1,250%"}],
    "trendsUrl": "https://trends.google.com/trends/explore?date=today+12-m&q=ChatGPT%2CGemini%2CPerplexity&hl=en-US"
}
```

A trend row:

```json
{
    "rank": 1,
    "term": "wnba finals",
    "geo": "US",
    "searchVolume": 2000000,
    "searchVolumeLabel": "2M+",
    "growthPercent": 1000,
    "startedAt": "2026-10-17T04:20:00Z",
    "isActive": true,
    "categories": ["Sports"],
    "relatedTerms": ["dream vs valkyries", "wnba finals schedule"]
}
```

### Tips

- The last point of a rolling range (past 12 months, past 7 days) is the period in progress.
  It is flagged `isPartial: true` and left out of averages and peaks. Drop it before charting.
- Google returns slightly different samples for the same request a few hours apart: expect
  a point or two of noise on small terms. That is Google's sampling, not the scraper.
- For hourly monitoring of a few terms, schedule a run with **Past 7 days** or **Past day**.
- Keep **Parallel requests** at 5. Higher goes faster until Google starts refusing.

### FAQ

#### Does it return related topics?

No. Google returns an empty related topics list to every non-browser client, and the request
is signed, so it cannot be worked around without a browser. Related queries, top and rising,
are complete.

#### Can I compare more than 5 terms?

Yes, up to 1,000 per run, through the anchor term (see Input). The values of all terms are on
one scale, 100 being the highest point of the whole set.

#### Why are my numbers different from the Google Trends website?

Check three things: the same location, the same time range, and the same set of compared terms.
A value only means something relative to the terms it was compared with.

#### Is it legal to scrape Google Trends?

Our Actors are ethical and do not extract any private user data, such as email addresses,
gender, or location. They only extract what the user has chosen to share publicly. We therefore
believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you
should be aware that your results could contain personal data. Personal data is protected by
the GDPR in the European Union and by other regulations around the world. You should not scrape
personal data unless you have a legitimate reason to do so. If you're unsure whether your
reason is legitimate, consult your lawyers. Google Trends data is aggregated and anonymous.

#### Something is wrong or missing

Open an issue in the Issues tab: it gets answered and fixed. For programmatic access, see the
API tab.

# Actor input Schema

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

Keywords or phrases, one per line. A Google Knowledge Graph topic ID such as <code>/m/05p0rrx</code> (Bitcoin, the topic) also works. Duplicates are removed, case insensitive.

## `compareTerms` (type: `boolean`):

On: all terms share one 0-100 scale, so a 50 for one term means half the searches of a 100 for another. Off: each term is read on its own, its own peak is 100, and values do <b>not</b> compare between terms.

## `anchorTerm` (type: `string`):

Google compares at most 5 terms per request. With more, every request includes this term and the results are rescaled through it, then the whole set is brought back to 100 at its highest point. Pick a term with steady, mid-to-high search volume. Empty: the first search term.

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

Empty for worldwide, or a Google Trends location code: a country (<code>US</code>, <code>FR</code>, <code>DE</code>), a region (<code>US-CA</code>, <code>GB-ENG</code>, <code>FR-J</code>) or a US metro area (<code>US-NY-501</code>).

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

Google picks the point spacing from the range: by the minute up to 4 hours, by the hour up to 7 days, by the day up to 269 days, by the week up to 5 years, by the month beyond. Turn on <b>Daily points</b> to get one point per day on long ranges.

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

First day of a custom range, from 2004-01-01. Used only when Time range is Custom dates.

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

Last day of a custom range. Used only when Time range is Custom dates.

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

Past 269 days, Google only gives weekly or monthly points. On: the range is read in 269-day windows and each window is calibrated on the weekly or monthly series of the whole range, so you get one comparable point per day, up to 10 years. Costs no extra event, takes a few more seconds per term.

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

Narrow the searches to a Google Trends category, by its number: 0 all categories, 3 Arts and Entertainment, 5 Computers and Electronics, 7 Finance, 8 Games, 12 Business and Industrial, 16 News, 18 Shopping, 20 Sports, 45 Health, 47 Autos and Vehicles, 67 Travel, 71 Food and Drink, 958 Jobs and Education. The number is the <code>cat=</code> value of a Google Trends link.

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

Which Google search the interest comes from.

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

Language of region names, such as <code>en-US</code>, <code>fr</code>, <code>de</code>, <code>es</code>. It does not filter the searches; Location does.

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

Where each term is searched the most, 100 being the region with the highest share of searches.

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

Auto: countries for a worldwide search, regions inside a country. Metro areas (DMA) need a US location. Cities work best inside a region such as <code>US-CA</code>.

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

Top related queries (up to 25, 100 being the most searched) and rising ones (growth in %, or Breakout above 5000%).

## `trendingCountries` (type: `array`):

Country codes (<code>US</code>, <code>GB</code>, <code>FR</code>, <code>IN</code>...). For each country you get every trend Google lists right now in Trending now: often several hundred over 24 hours.

## `trendingTimeWindow` (type: `string`):

Trends started in this window.

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

Keep only trends in these categories. Empty: all categories.

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

Skip trends Google marks as ended.

## `maxTrendsPerCountry` (type: `integer`):

Keep the N trends with the highest search volume in each country. 0 keeps them all.

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

How many requests run at once, each on its own proxy session. 5 is a good balance between speed and Google's rate limits.

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

Apify datacenter proxy works for Google Trends. If Google keeps refusing it, new sessions switch to residential proxy automatically when your account has access.

## Actor input object example

```json
{
  "searchTerms": [
    "ChatGPT",
    "Gemini",
    "Perplexity"
  ],
  "compareTerms": true,
  "geo": "",
  "timeRange": "past-12-months",
  "dailyResolution": false,
  "category": 0,
  "searchType": "web",
  "language": "en-US",
  "includeRegions": true,
  "regionResolution": "auto",
  "includeRelatedQueries": true,
  "trendingTimeWindow": "24",
  "trendingActiveOnly": false,
  "maxTrendsPerCountry": 0,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Search term reports and Trending now rows.

# 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": [
        "ChatGPT",
        "Gemini",
        "Perplexity"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexmorain/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": [
        "ChatGPT",
        "Gemini",
        "Perplexity",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("alexmorain/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": [
    "ChatGPT",
    "Gemini",
    "Perplexity"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call alexmorain/google-trends-scraper --silent --output-dataset

```

## MCP server setup

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