# Google Trends Scraper (`herus13/google-trends-scraper`) Actor

Extract Google Trends data without an API key: search interest over time, interest by region, top and rising related queries, and today's trending searches by country. Every row carries keyword, date, value and geo. Export JSON, CSV or Excel.

- **URL**: https://apify.com/herus13/google-trends-scraper.md
- **Developed by:** [herus13](https://apify.com/herus13) (community)
- **Categories:** Developer tools, SEO tools, Other
- **Features:** Limited permissions
- **Stats:** 4 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 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.

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

The Google Trends Scraper extracts Google Trends data without an API key: search interest over time, interest by region, top and rising related queries, and today's trending searches for a country. Pick one of the four per run and export to JSON, CSV or Excel.

### What you get

One row per data point, in a single flat shape for the whole run.

```json
{
  "data_type": "interest_over_time",
  "keyword": "bitcoin",
  "date": "2026-06-14",
  "value": 62,
  "geo": "",
  "timeframe": "today 12-m",
  "scraped_at": "2026-07-17T09:12:44.118203+00:00",
  "_meta": {"author": "https://apify.com/herus13", "status": "ok", "message": null}
}
```

`_meta` is run metadata, not scraped data. If the run fails or stops early, a row with only `_meta` (status `failed` or `stopped`, the reason in `message`) explains why; those rows are never charged.

The other three modes fill the same row differently: `interest_by_region` carries `geo_name` and `geo_code` beside the `value`; `related_queries` carries `rank_type` (`top` or `rising`) and the related `query`; `trending_now` carries the topic `title` and its `search_volume`.

### What it costs

| Event | Price |
|---|---|
| Actor Start (`apify-actor-start`) | $0.001 |
| result (`trend-result`) | $0.005 |

A result is one delivered keyword result set — an interest-over-time series, an interest-by-region breakdown or a related-queries set for one keyword — or one country's trending feed. A 12-month daily timeline is therefore a single result, not 365 of them. One keyword costs about $0.006 all in, five keywords about $0.026. The residential proxy the run needs is included in the price.

### Input

| Field | Type | Required | Default | What it does |
|---|---|---|---|---|
| `data_type` | string | no | `"interest_over_time"` | What the run returns; pick one, so every row in the dataset has the same shape. interest_over_time gives the 0 to 100 search-interest index per date for each keyword. interest_by_region gives that index per country or region. related_queries gives the top and rising searches people also run. trending_now gives today's trending searches for one country and needs no keyword. Default interest_over_time. |
| `keywords` | array | no | — | 1 to 5 search terms; several terms are compared against each other, which is Google Trends' own limit. Needed for interest_over_time, interest_by_region and related_queries. Leave empty for trending_now, which reads a whole country rather than a term. |
| `geo` | string | no | — | Two-letter country code to scope the numbers to, for example US, GB or VN. Leave empty for worldwide figures. Must be set when data_type is trending_now, which is always about one country. |
| `timeframe` | string | no | `"today 12-m"` | How far back search interest is measured. Default `today 12-m`. Choose `now 1-H`, `now 4-H`, `now 1-d` or `now 7-d` for the past hour, four hours, day or week; `today 1-m`, `today 3-m`, `today 12-m` or `today 5-y` for the past 30 days, 90 days, 12 months or five years; or `all` for 2004 to today. Used by interest_over_time, interest_by_region and related_queries, and ignored by trending_now. |
| `category` | string | no | `"0"` | Restrict the numbers to one Google Trends category, which settles ambiguous terms: apple under Finance is the stock, under Food is the fruit. Default 0, every category. Codes: 3 Arts, 47 Autos, 44 Beauty, 22 Books, 12 Business, 5 Computers, 7 Finance, 71 Food, 8 Games, 45 Health, 65 Hobbies, 11 Home, 13 Internet, 958 Jobs, 19 Law, 16 News, 299 Online Communities, 14 People, 66 Pets, 29 Real Estate, 533 Reference, 174 Science, 18 Shopping, 20 Sports, 67 Travel. |
| `hl` | string | no | `"en-US"` | Language the region names and trending titles come back in, as a language tag such as en-US, de-DE or vi-VN. Default en-US. |
| `tz` | integer | no | `-420` | Timezone offset in minutes that dates are reported against, for example -420 for US Pacific daylight time or 0 for UTC. Default -420. |
| `max_records` | integer | no | — | Ceiling on the number of rows a single run writes, at least 1. Leave empty for no ceiling. Worth setting for interest_by_region and trending_now, where one request can return hundreds of rows. |
| `proxyUrls` | array | no | — | Leave empty and the run uses a residential proxy that is included in the price of the run. To route through your own account instead, add one gateway URL per entry, for example http://user:pass@host:port. Works with any provider that issues URLs. When set, the run uses these first and switches to the included proxy if they stop working, so a broken proxy never fails the run. |

### How to run it

1. Open the actor on Apify Console and click **Try for free**.
2. Choose **What to scrape** — one mode per run — and enter up to five **Keywords**. For **Trending now** enter a country code in **Geo** instead; no keyword is needed.
3. Run it. Rows stream into the dataset while the run is still going; export them as JSON, CSV or Excel, or read them from the Apify API.

```json
{
  "data_type": "interest_over_time",
  "keywords": ["bitcoin", "ethereum"],
  "geo": "US",
  "timeframe": "today 12-m",
  "category": "7"
}
```

Minimal input:

```json
{
  "keywords": ["bitcoin"]
}
```

Today's trending searches in the US take no keyword at all: `{"data_type": "trending_now", "geo": "US"}`.

Available as the MCP tool `herus13--google-trends-scraper` on mcp.apify.com and through the Apify API; send the same JSON.

### Why this scraper

- **Four datasets, one actor.** Interest over time, interest by region, related queries and trending now. One mode per run, so the dataset you export always has a single clean schema instead of a union of four.
- **No API key, no account.** Google publishes no official Trends API. This actor returns the same public figures the Trends site shows, ready to join to your own data.
- **Rising, not just top.** Related queries separate what is already big from what is growing fast, which is the half of the answer keyword tools usually leave out.
- **Category disambiguation.** Scope a term to Finance, Food or any of 25 other categories, so `apple` means the stock or the fruit, whichever you meant.
- **Clean values.** Every row is validated before it is written; malformed entries are dropped rather than exported with empty fields.

### Use cases

- **Content planning against rising demand** — write against the rising related queries rather than the top ones and you publish before a term gets competitive, not after.
- **Cross-country brand benchmarking** — interest by region shows where a brand actually has search demand, which regularly contradicts where a team assumes it does. Useful before a market-entry budget is committed.
- **Trend-monitoring dashboards** — run a fixed keyword set on a schedule and put the demand signal next to your own sales and traffic numbers.
- **Catching a country-level trend as it breaks** — trending now returns what a country is searching right this minute, the input for newsroom and social teams that have to move within hours.
- **Seasonality planning** — a five-year window on a keyword shows the annual peaks, which is when to buy stock or book media.

### FAQ

**Do I need a proxy?** A residential proxy is included in the price of the run. To use your own, paste gateway URLs into **Your own proxy URLs**.

**What happens if my input is wrong?** The run stops before it scrapes anything, so no results are charged. Its status and log name each field that is wrong and say what to change — fix the input and run again.

**Is this the official Google Trends API?** No — Google publishes no official public Trends API. This actor returns the same public, aggregated figures the Trends site itself displays.

**Why are values 0 to 100 rather than search counts?** That is how Google Trends reports interest: a relative index scaled to the highest point in the window and region you asked for, where 100 is the peak. Google does not publish absolute search volumes.

**How many keywords can I compare at once?** Up to five per run, which is Google Trends' own comparison limit for interest over time, interest by region and related queries.

**Can I get more than one mode in a single run?** No, and deliberately: one mode per run keeps every dataset a single clean schema. Run the actor again with a different mode for the next one.

**Is this legal?** The actor collects publicly available, aggregated search-interest figures and no personal data at all. You remain responsible for complying with Google's terms and with the law that applies to you.

### Related actors

- **[Google Maps Business & Contact Scraper](https://apify.com/herus13/google-maps-scraper)** — businesses from Google Maps with emails, phones, ratings and social links.
- **[Indeed Job Scraper](https://apify.com/herus13/indeed-scraper)** — cross-reference job-market demand against the keywords trending here.
- **[Google Play App Search & Reviews Scraper](https://apify.com/herus13/google-play-reviews-scraper)** — pair app search interest with real app reviews.
- **[levels.fyi Salary Scraper](https://apify.com/herus13/levels-fyi-salary-scraper)** — compensation data for the roles and companies a trend points at.

# Actor input Schema

## `data_type` (type: `string`):

What the run returns; pick one, so every row in the dataset has the same shape. interest_over_time gives the 0 to 100 search-interest index per date for each keyword. interest_by_region gives that index per country or region. related_queries gives the top and rising searches people also run. trending_now gives today's trending searches for one country and needs no keyword. Default interest_over_time.

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

1 to 5 search terms; several terms are compared against each other, which is Google Trends' own limit. Needed for interest_over_time, interest_by_region and related_queries. Leave empty for trending_now, which reads a whole country rather than a term.

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

Two-letter country code to scope the numbers to, for example US, GB or VN. Leave empty for worldwide figures. Must be set when data_type is trending_now, which is always about one country.

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

How far back search interest is measured. Default `today 12-m`. Choose `now 1-H`, `now 4-H`, `now 1-d` or `now 7-d` for the past hour, four hours, day or week; `today 1-m`, `today 3-m`, `today 12-m` or `today 5-y` for the past 30 days, 90 days, 12 months or five years; or `all` for 2004 to today. Used by interest_over_time, interest_by_region and related_queries, and ignored by trending_now.

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

Restrict the numbers to one Google Trends category, which settles ambiguous terms: apple under Finance is the stock, under Food is the fruit. Default 0, every category. Codes: 3 Arts, 47 Autos, 44 Beauty, 22 Books, 12 Business, 5 Computers, 7 Finance, 71 Food, 8 Games, 45 Health, 65 Hobbies, 11 Home, 13 Internet, 958 Jobs, 19 Law, 16 News, 299 Online Communities, 14 People, 66 Pets, 29 Real Estate, 533 Reference, 174 Science, 18 Shopping, 20 Sports, 67 Travel.

## `hl` (type: `string`):

Language the region names and trending titles come back in, as a language tag such as en-US, de-DE or vi-VN. Default en-US.

## `tz` (type: `integer`):

Timezone offset in minutes that dates are reported against, for example -420 for US Pacific daylight time or 0 for UTC. Default -420.

## `max_records` (type: `integer`):

Ceiling on the number of rows a single run writes, at least 1. Leave empty for no ceiling. Worth setting for interest_by_region and trending_now, where one request can return hundreds of rows.

## `proxyUrls` (type: `array`):

Leave empty and the run uses a residential proxy that is included in the price of the run. To route through your own account instead, add one gateway URL per entry, for example http://user:pass@host:port. Works with any provider that issues URLs. When set, the run uses these first and switches to the included proxy if they stop working, so a broken proxy never fails the run.

## Actor input object example

```json
{
  "data_type": "interest_over_time",
  "keywords": [
    "bitcoin"
  ],
  "geo": "",
  "timeframe": "today 12-m",
  "category": "0",
  "hl": "en-US",
  "tz": -420
}
```

# Actor output Schema

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

Interest-over-time, interest-by-region, related-queries, or trending-now rows for the requested data_type. Every row also carries `_meta`: run metadata, not scraped data.

# 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": [
        "bitcoin"
    ],
    "geo": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("herus13/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": ["bitcoin"],
    "geo": "",
}

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

```

## MCP server setup

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