# Google Trends Scraper & API: Interest, Regions, Trending Now (`quarra/google-trends-scraper`) Actor

Scrape Google Trends: interest over time for one term or any number on one scale, by region, related queries and the full Trending now list with news. Daily data over years. Free summary row per term; errors not charged.

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

## Pricing

from $0.30 / 1,000 results

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** returns **interest over time** (a 0-100 curve per term, with a free summary row), **interest by
region**, **related queries** (top, rising, Breakout) and the **Trending now** list of any country or region (often 100
to 500 trends with volume, growth, and on request up to 10 news articles on each of the first 25), for Web Search, YouTube, News, Images and Google
Shopping, any location, any range since 2004. Results are clean JSON for a database, a spreadsheet or an AI agent, at
**$1.20 per 1,000 results on the Free plan (down to $0.30)** and **$0.002 per Trending now list**, plus $0.025 per run.
Compare 1 to 5 terms on one scale, or any number on a calibrated scale that stays comparable from one run to the next.

Every term gets a free summary row (latest value, peak, change, trend), and every input that fails gets a free
`error` row: nothing is dropped silently, and nothing that fails is charged.

### What you get

- **Stable numbers**: Google serves different versions of its data to different connections. The Actor asks each
  request several times independently and keeps the version most answers carry; every row carries `sampleAgreement`.
- **Many terms on one scale**: compare in batches linked through a pivot term, or use the calibrated scale for any
  number of terms (up to 500), comparable month after month.
- **Daily data over years**: a daily series benchmarked to Google's weekly and monthly curves, so it does not drift.
- **The full Trending now list**: often 100 to 500 trends for a country, with search volume, growth, categories and
  on request, up to 10 news articles on each of the first 25 trends. Scheduled runs can return only the new trends.
- **Plain-language inputs**: `"United States"`, `"past 12 months"`, `"Q1 2024"`, `"google shopping"`; unknown or
  ambiguous values get a clear message with suggestions before any request is made.

### How to use Google Trends Scraper

1. Add one or more search terms, or set `mode` to `trendingNow` and add locations.
2. Set a location (`geo`) and a period (`timeRange`, or `startDate` and `endDate`).
3. Choose the data you need: interest over time, by region, related queries.
4. For many terms on one scale, set `comparisonMode` to `calibrated`; for daily points over long ranges, turn on
   `dailyResolution`.
5. Run, then export JSON, CSV or Excel, or call it from the API, Make, Zapier, n8n or an AI agent through MCP.

### Input examples

Three terms compared over 5 years in the United States:

```json
{
  "searchTerms": ["coffee", "tea", "matcha"],
  "geo": "US",
  "timeRange": "past 5 years"
}
```

Kitchen appliances on one calibrated scale, comparable with next month's run over the same dates:

```json
{
  "searchTerms": ["air fryer", "rice cooker", "stand mixer", "espresso machine", "slow cooker", "toaster oven"],
  "comparisonMode": "calibrated",
  "geo": "United States",
  "startDate": "2025-01-01",
  "endDate": "2025-12-31"
}
```

Trending now in California and Japan, sports only, 3 news articles per trend, new trends only (for a schedule):

```json
{
  "mode": "trendingNow",
  "trendingLocations": ["US-CA", "JP"],
  "trendingCategory": "Sports",
  "trendingArticles": 3,
  "trendingOnlyNew": true
}
```

### Output example

Example rows (October 6, 2026), with some fields left out: coffee in the United States over the past 12 months, and
one trend of the US Trending now list. Arrays are shortened: the curve has 53 points, the list 409 trends.

```json
[
  {
    "dataType": "summary",
    "term": "coffee",
    "geo": "US",
    "timeRange": "today 12-m",
    "latestValue": 71,
    "latestDate": "2026-09-27T00:00:00Z",
    "average": 76.9423,
    "peakValue": 100,
    "peakDate": "2026-04-12T00:00:00Z",
    "changePercent": 8.4,
    "trend": "stable",
    "isSpiking": false,
    "sampleAgreement": "4/4"
  },
  {
    "dataType": "interestOverTime",
    "term": "coffee",
    "geo": "US",
    "timeRange": "today 12-m",
    "sampleAgreement": "4/4",
    "timeline": [
      { "date": "2025-10-05T00:00:00Z", "value": 62, "isPartial": false },
      { "date": "2025-10-12T00:00:00Z", "value": 60, "isPartial": false },
      { "date": "2025-10-19T00:00:00Z", "value": 64, "isPartial": false }
    ]
  },
  {
    "dataType": "trendingNow",
    "geo": "US",
    "trendCount": 409,
    "trends": [
      {
        "rank": 3,
        "query": "world space week 2026",
        "searchVolume": 200000,
        "increasePercent": 1000,
        "categories": ["Science", "Business and Finance"],
        "articles": [
          {
            "title": "Celebrate humanity's 'Rocket Revolution' with World Space Week 2026",
            "source": "Space",
            "publishedAt": "2026-10-05T17:00:00Z"
          }
        ]
      }
    ]
  }
]
```

Need one row per point, as in a spreadsheet? The Flat table link in the Output tab (or
`unwind=timeline,regions,queries,trends&clean=true` on the dataset URL) turns every point, place, query and trend into
its own row, at no extra cost.

### What we measured

Measured on Apify and on Google Trends in October 2026.

- **Google's versions**: for `coffee` (United States, past 12 months), asked 43 times from different US connections
  within three minutes, 34 answers matched; the other 9 were variants up to **9 points off** on some weeks. A scraper
  that asks once returns a minority version about one run in five.
- **Calibrated scale**: coffee and tea placed on the calibrated scale kept their direct ratio within 0.1%.
- **Daily series**: in replay tests with 15% sampling noise per day, chained windows alone drifted by 7.3% over 5 years;
  benchmarked to Google's weekly curve, by 1.1%.
- **Speed**: one term over 12 months in 3.6 to 6.9 seconds, vote included; the US Trending now list with news in 3.9
  to 5.7 seconds; 100 terms with curve and regional map in 74 to 128 seconds.

### Compared with other Google Trends scrapers

Features as described in each Actor's README and prices from its Store page on October 9, 2026. Other scrapers update
often, so these figures are dated.

| | This Actor | Most used of the top search results | Lowest-priced alternative we tested |
|---|---|---|---|
| Interest over time, by region | yes | yes | yes |
| Related queries | yes | yes | not described |
| Trending now list | yes, full list with news articles | in a separate Actor | daily trending searches by country |
| Any number of terms on one scale | yes (pivot or calibrated) | not described | not described |
| Daily points over years | yes, benchmarked | not described | not described |
| Answer voted across independent samples | yes | not described | not described |
| Curve + regional map of one term, Free plan | $0.0274 | billed per result, $3.00 / 1,000 | $0.027 (at its prices from October 10, 2026) |

At the Store rates in effect on October 10, 2026, a curve or a map costs 20% more here than with the lowest-priced
alternative we tested, on every plan: each term is measured several times, which keeps numbers stable between runs. If you only need curves,
a curve alone costs less here, since that alternative bills a curve and its map as one row.

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

A start fee per run and a price per result. Summary, missing and error rows are free, and anything that fails or
comes back empty is not charged.

| | Free | Starter (Bronze) | Scale (Silver) | Business (Gold) and above |
|---|---|---|---|---|
| Run start (at the default memory) | $0.025 | $0.025 | $0.025 | $0.025 |
| Per 1,000 results (curve, regional map, related queries) | $1.20 | $0.60 | $0.45 | $0.30 |
| Per Trending now list (one location, all its trends, news included) | $0.002 | $0.001 | $0.00075 | $0.0005 |
| Per calibrated term | $0.01 | $0.01 | $0.009 | $0.008 |
| Per 1,000 premium connection results (see below) | $0.30 | $0.30 | $0.40 | $0.55 |

If Google refuses the standard connection, the affected results are charged one extra premium connection result each
($0.30 per 1,000 on Free and Starter, $0.40 on Scale, $0.55 on Business and above), on top of their own price. Only
the results that actually had to be fetched over the premium connection are charged; for a daily curve, that is the time
windows fetched over it. With `sampleAggregation` set to `mean` and 4 or 5 samples per time window (`maxSampleIps`, 5 by
default), this extra is counted twice per result; with fewer samples, once. It is not charged when the standard connection works, on small runs, for Trending now lists or calibrated terms, or when you use
your own proxy. The run status says how many results were charged.

What typical runs cost on the Free plan:

| Run | Price |
|---|---|
| 1 term, curve only | $0.0262 |
| 1 term, curve + regions + related queries | $0.0286 |
| 5 terms compared, curve only | $0.031 |
| 10 terms on the calibrated scale | $0.125 |
| Daily curve over 5 years | $0.0382 |
| Trending now for one location (about 400 trends), with or without news | $0.027 |
| 100 terms, curve + regions | $0.265 |

Platform costs and the repeated sampling are included; only the premium connection extra above can add to the price. You can cap spending with Max results and with the maximum cost
per run; the Actor stops cleanly at the cap and keeps what it collected.

### Use cases

- **SEO and content planning**: rising queries, keyword comparisons, seasonal timing from daily curves.
- **Product and market research**: dozens of product names ranked on one calibrated scale, month after month.
- **Regional demand**: the same term across countries or states on one scale.
- **Finance and economics**: daily search series over years for nowcasting, consistent with Google's weekly data.
- **E-commerce**: Google Shopping interest for a product before a launch or a sale.
- **Newsrooms and alerts**: what is trending in a country or a state right now, only new items on a schedule.
- **AI agents and automations**: plain-language inputs, one summary row per term, typed fields that stay put.

### Limits

- Google Trends values are relative (0-100 or a percentage of a reference term), not search counts. The Trending now
  list gives Google's search volume buckets.
- News articles come for the first 25 trends of each Trending now list.

### FAQ

#### Is there an official Google Trends API?

Google announced an official Trends API in July 2025 as an alpha open to a limited group of developers, by
application. pytrends, a widely used Python
library, was archived in April 2025. This Actor gives you Google Trends data through the Apify API
today, from Python, JavaScript or any HTTP client, with no key from Google.

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

The Actor collects public data that anyone can see on trends.google.com without logging in, and does not log in. The
data is aggregated search interest, not tied to individual users; related queries and trends can still contain names. How you use the
data, and compliance with Google's terms and the laws that apply to you, remain your responsibility.

#### Why do I sometimes see different numbers on trends.google.com?

Google shows each visitor the version its connection gets. Open the page from another network and you may see
another curve. The Actor returns the version most answers carry, and `sampleAgreement` tells you how clear that was.

#### Can I compare more terms than the Explore page allows?

Yes. Keep `compare`: the Actor measures them in batches linked through the strongest term, so values match a direct
Google comparison. Or use `calibrated` for any number of terms, comparable from one run to the next.

#### Why did my run fail?

Only when something failed on our side or Google's. An input problem (an unknown location, a date in the future, a
term without search volume) does not fail the run: it gets a free `error` or `missing` row, and you pay only the
start. So the success rate on this page measures our reliability, not typos.

#### Found a problem or need a feature?

Open an issue in the Issues tab; we reply within two business days.

### More data tools from Quarra

| Actor | What it does |
|---|---|
| [Reddit Scraper](https://apify.com/quarra/reddit-scraper) | Posts, complete comment trees, search and users; threads as Markdown for LLMs |
| [Threads Scraper](https://apify.com/quarra/threads-scraper) | Full post history with view counts, replies, profiles and keyword search on Threads |

# Actor input Schema

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

"explore" works like the Explore page of Google Trends for your search terms. "trendingNow" returns the full Trending now list of one or more countries or regions (no search terms needed).

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

One term per line, up to 500; a comma also separates terms (not between digits, nor inside quotes). Google Trends syntax works and each term keeps its name: "air fryer" typed with its quotes = exact phrase, coffee + tea = OR (coffee OR tea is sent that way), coffee -starbucks = without starbucks; a lone + is OR too (c++ measures c, said in googleReadAs). Over 5 terms: linked batches, or comparisonMode "calibrated". Topic IDs (/m/02vqfm) work. Ignored in Trending now mode.

## `dataTypes` (type: `array`):

Any of interestOverTime, interestByRegion, relatedQueries. Each term x data type is one paid result. Every curve also gets a free summary row (trend, peak, year-over-year change, spike flag). Related topics are not available (see README).

## `comparisonMode` (type: `string`):

compare = Google comparison (1-5 terms; more in batches linked through the strongest term). separate = each term alone. calibrated = fixed scale per location and range (G-TAB anchor bank), any number of terms, comparable from run to run. compareLocations = one term in 2-5 places (geo "US; GB; CA") on one scale. comparePeriods = one term over 2-5 equal-length periods on one scale.

## `pivotTerm` (type: `string`):

Optional, only for compare with more than 5 terms. By default the batches of 5 are linked through the strongest term measured so far (exact links), and small terms are measured again next to a closer term. A term given here is put in the first batch; it is returned only if it is in your list.

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

Empty = worldwide. A code (US, GB, US-CA, US-CA-807 metro) or a name in any language ("United States", "California", "日本", "Georgia, US"). Several locations: separate with ";" (US; GB; JP): each is fetched separately, or on one scale with comparisonMode compareLocations.

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

A Google range (today 12-m) or plain text: "past 12 months", "5y", "2024", "2019-2021", "Q1 2024", "YTD", "since 2020", "Jan 2024 - Jun 2024", "2024-01-01 2024-06-30", "all". For daily points over more than 9 months, turn on dailyResolution.

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

From 2004-01-01. Setting a start date switches the time range to custom dates.

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

Defaults to today.

## `periods` (type: `array`):

For comparisonMode comparePeriods: 2 to 5 periods of about the same length, e.g. "2024" and "2025", or "2025-01-01 2025-06-30" and "2026-01-01 2026-06-30". Each term is returned once per period, all on one scale.

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

Daily points past ~9 months: overlapping 8-month windows, benchmarked to Google's weekly (and monthly) curve so they do not drift (Eichenauer et al. 2022). Several compared terms share one scale. One result per Google window with data: 12 months = 3, 5 years = 11 per term.

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

0 = all categories. Examples: 3 Arts & Entertainment, 7 Finance, 12 Business & Industrial, 18 Shopping, 20 Sports, 31 Programming, 44 Beauty & Fitness, 45 Health, 47 Autos & Vehicles, 71 Food & Drink, 174 Science. Every ID is checked against Google's list before the run.

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

Where the searches happened: web, images, news, youtube or shopping ("Google Shopping", "YouTube search" also work).

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

Level of the places in interest by region: auto (countries for worldwide, regions for a country), COUNTRY, REGION, CITY or DMA (US metro areas).

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

Also return places with little search volume (Google hides them by default).

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

Language of labels (region names, date labels, trending list): a code (en-US, fr, de, ja, pt-BR...) or a language name (French, français, 日本語). Does not filter the data.

## `trendingLocations` (type: `array`):

Codes or names in any language: US, GB, JP, "Germany", "日本", or a region such as US-CA or "Bavaria". One paid result per location: the whole list (often 100 to 500 trends), news included. Defaults to US ("geo" is used if this is empty).

## `trendingHours` (type: `integer`):

Time window of Trending now, in hours: 4, 24, 48 or 168 (7 days), as on the Google Trends page.

## `trendingCategory` (type: `string`):

Keep only the trends of one Google category, by ID or name ("Sports", "Technology"). Empty = all.

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

Skip trends Google marks as ended.

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

0 = the whole list. Does not change the price (one result per location).

## `trendingArticles` (type: `integer`):

Add up to this many news articles (title, source, URL, date, image) to each of the first 25 trends of each list. 0 = none. No extra charge.

## `trendingOnlyNew` (type: `boolean`):

Return only trends this Actor has not returned before for the same location, for scheduled runs and alerts. The memory is kept in a named key-value store of your own account (quarra-google-trends-memory). A location with nothing new is free.

## `trendingMemoryName` (type: `string`):

Separate memories for separate schedules, e.g. "newsroom" and "seo-alerts" (lowercase letters, digits, dashes).

## `stableSampling` (type: `boolean`):

Google serves slightly different samples of the same data (about 7 samples in 10 show the same version, others up to 8 points off). With this on, each request is fetched several times independently and the version most of the samples show is returned, so identical runs return the same version of the data. No extra charge. Rows carry sampleAgreement, e.g. "5/5".

## `sampleAggregation` (type: `string`):

majority = the version seen by most samples, exact Google integers. mean = the curve is the average of 5 samples, with valueStdError per point: less sampling noise, the estimator researchers use. Maps and related queries always use the majority. If a run has to move to the premium connection, mean counts 2 premium connection extras per result (see the pricing).

## `maxSampleIps` (type: `integer`):

Upper bound on the samples taken for one request when the first ones do not show a clear majority (3 to 5 usually suffice). At most 9 are used (values up to 15 are accepted and lowered to 9); with sampleAggregation mean, 5.

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

Maximum number of paid results (default 1,000: raise it for big runs). One curve, map or query list per term, one calibrated term, one Google window of a long daily curve, one Trending now list per location. Points, places, queries, trends and summary, missing and error rows are free. A Trending now list is never cut.

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

Connection. Keep the default (automatic). Costs are included in the price.

## Actor input object example

```json
{
  "mode": "explore",
  "searchTerms": [
    "coffee"
  ],
  "dataTypes": [
    "interestOverTime"
  ],
  "comparisonMode": "compare",
  "geo": "US",
  "timeRange": "today 12-m",
  "dailyResolution": false,
  "category": 0,
  "property": "web",
  "regionResolution": "auto",
  "includeLowVolumeRegions": false,
  "language": "en-US",
  "trendingLocations": [
    "US"
  ],
  "trendingHours": 24,
  "trendingCategory": "",
  "trendingActiveOnly": false,
  "maxTrendsPerCountry": 0,
  "trendingArticles": 0,
  "trendingOnlyNew": false,
  "trendingMemoryName": "default",
  "stableSampling": true,
  "sampleAggregation": "majority",
  "maxSampleIps": 9,
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every row of the run; dataType says what each row is (interestOverTime, interestByRegion, relatedQueries or relatedQuery, trendingNow, summary, missing, error).

## `flatTable` (type: `string`):

The same rows with the compact arrays unwound: one row per point, place, query or trend, ready for a spreadsheet (add \&format=csv).

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

Only the free summary rows, one per curve (a JSON array): latest value, average, peak and its date, change over the range, year-over-year change, trend (rising, falling, stable), spike flag. Read this first. Also in the run's "summary" dataset.

## `errors` (type: `string`):

Only the free error rows (one per input that failed: errorCode, message, retryable) and missing rows (data Google does not have, with the reason), as a JSON array; empty when everything came back. Also in the run's "errors" dataset.

## `runSummary` (type: `string`):

Counts, results charged per event, failures with reasons, sample agreement statistics, time budget in milliseconds.

# 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": [
        "coffee"
    ],
    "geo": "US",
    "trendingLocations": [
        "US"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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