# Google Trends Scraper & Keyword Ideas: Interest, Trending (`oswaldocarabano/google-trends-keyword-ideas-scraper`) Actor

Google Trends at scale: one rich row per keyword with interest over time, average and peak, regions, US metros, top and rising related queries, plus full Trending Now and autocomplete keyword ideas. Compare 25+ terms. Rows without data are never charged. No login.

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

## Pricing

from $0.80 / 1,000 keyword trend rows

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 & Keyword Ideas

Extract **Google Trends** data at scale: **one rich row per keyword** with interest over time, average, peak and its date, interest by country or region, US metro areas (DMA), top and rising related queries, plus the **full Trending Now list** of any country and **autocomplete keyword ideas**. Compare more than 5 terms on one scale. **Keywords without data are delivered free** — you only pay for rows with data.

No login, no browser, no cookies of yours. Works for any country, time range, category and Google property (web, images, news, YouTube, Shopping).

### What you get

| Output type | One row per | Main fields |
|---|---|---|
| `keyword-trend` | keyword | `timeline` (0-100 per date), `average`, `peak`, `peakDate`, `latestValue`, `regions`, `dmas`, `cities`, `relatedTop`, `relatedRising`, `hasData` |
| `comparison-set` | comparison (up to 25 terms) | `averages` and `timeline.values` on one shared scale, `regionShares`, `relatedTopByTerm`, `relatedRisingByTerm`, `anchor`, `normalizedBy` |
| `trending-item` | trending search | `title`, `volume` and `volumeLabel` ("2M+"), `growthPct`, `startedAt`, `endedAt`, `isActive`, `relatedQueries`, `categoryIds`, `articleCount` |
| `keyword-idea` | unique autocomplete idea | `idea`, `seed`, `query`, `modifier`, `modifierType`, `position`, `containsSeed`, `language`, `country` |
| `ideas-then-trends` | idea of each seed | a full `keyword-trend` row for each autocomplete idea, with `seed` and `idea` |

One row type per run, so every export (JSON, CSV, Excel) has clean, consistent columns. Every field is always present (null when empty).

### Why this Actor

Competitors: public stats, pricing and output schema read through the Apify API on 13 Oct 2026 (no third-party Actor was run, and none publishes a sample of its data, so for them we show the most their own output schema allows). This Actor: 50 private test runs on Apify, 13–14 Oct 2026.

| | **This Actor** | Most-used Google Trends Actor | Typical alternatives |
|---|---|---|---|
| Runs that succeed | **50 of 50** test runs (5 output types, 14 countries and worldwide, 10 time ranges, 5 search types, invalid inputs) | **56.6 %** of 22,991 runs in 30 days (4,965 timed out) | 92.8–99.5 % |
| Data per keyword | **1 row**: series + average + peak + regions + metros + top & rising queries (median 53 points, 51 regions, 25 top and 15 rising queries; n = 518 rows) | 1 item, no output schema | ~150 thin rows per keyword (one per point, region or query) |
| Filled fields per row | **21.9** on average (518 keyword rows); 16.8 per trending row (4,357); 12.0 per idea row (2,630) | not declared | at most 12 per trend row and 13 per trending row by their own schema; 9 per autocomplete row |
| Charged = rows with data | **7,518 of 7,518** in 50 runs, 0 duplicates | every row, with or without data | every row |
| Price for a keyword **with** data | **$0.0028** | $0.003 | $0.005 per thin row, or $0.002 + $0.025 per run |
| Price for a keyword **without** data | **$0** | $0.003 | charged |
| Start fee | $0.00001 (platform minimum) | none | up to $0.025–$0.09 per run |
| Keywords per run | up to 500 | many | often 1 |
| Compare more than 5 terms (Google's limit is 5) | **yes, merged through a shared anchor** | not in its input | not in their input |
| Full Trending Now | **yes, every item** (487 in US / 24 h; 3,172 in US / 7 days) | no | some |
| Autocomplete ideas + trends in one run | **yes** | no | no |
| Output schema (Output tab) | **yes** | no | rarely |

**Measured in testing (13 Oct 2026):** 320 keywords across 10 locations, 6 time ranges, 4 search types and 3 categories → **98.4 % complete rows**; the rest had their time series and regions but not their related queries, and were delivered **without charge**. From inside Apify with 8 keywords in parallel: **33–58 complete keywords per minute**, and after an automatic retry when Google throttled, 100 % of keywords recovered on the primary connection and 91.7 % on the backup one (24 keywords each).

### How much data to expect

Google Trends is relative (0-100) and some combinations simply have little data. Measured fill rates on 315 complete rows (13 Oct 2026):

| Rows (n) | Has data | Regions | Top queries | Rising queries |
|---|---|---|---|---|
| Past 12 months, any search type (53) | 98.1 % | 100 % | 98.1 % | 96.2 % |
| Web search, any range (159) | 97.5 % | 98.7 % | 96.2 % | 92.5 % |
| YouTube search (53) | 98.1 % | 100 % | 94.3 % | 94.3 % |
| Image search (52) | 88.5 % | 82.7 % | 71.2 % | 67.3 % |
| News search (51) | 76.5 % | 62.7 % | 35.3 % | 29.4 % |
| Past day, `now 1-d` (53) | 83.0 % | 73.6 % | 52.8 % | 45.3 % |

Rows with `hasData: false` are still delivered (so you know the term was checked) and are **never charged**. US metro areas: 209 of 210 with data for a popular term. Cities: Google returns city data for few terms (27 of 216 rows had at least one city), so `includeCities` is off by default.

### Input examples

**Trend of several keywords in the US** (this is the prefilled example):

```json
{
  "outputType": "keyword-trend",
  "keywords": ["seo", "web scraping", "chatgpt"],
  "geo": "US",
  "timeRange": "today 12-m"
}
```

**Compare 7 AI assistants on one scale** (first term is the anchor):

```json
{
  "outputType": "comparison-set",
  "keywords": ["chatgpt", "gemini", "perplexity", "copilot", "deepseek", "grok", "meta ai"],
  "geo": "US",
  "timeRange": "today 3-m"
}
```

**Everything trending in Mexico and Spain in the past 24 hours:**

```json
{ "outputType": "trending-item", "trendingGeos": ["MX", "ES"], "trendingHours": "24" }
```

**Keyword ideas, then the trend of the 10 best ideas of each seed:**

```json
{ "outputType": "ideas-then-trends", "seeds": ["crm software"], "maxIdeasPerSeed": 10, "geo": "US" }
```

An empty input returns the worldwide trend of "seo" for the past 12 months in a few seconds.

### Output example (`keyword-trend`, shortened)

```json
{
  "outputType": "keyword-trend",
  "keyword": "seo",
  "geo": "US",
  "timeRange": "today 12-m",
  "hasData": true,
  "points": 53,
  "average": 57.9,
  "peak": 100,
  "peakDate": "2026-07-05",
  "latestValue": 32,
  "timeline": [{ "date": "2025-10-12", "time": 1760227200, "value": 38, "isPartial": false }],
  "regionResolution": "REGION",
  "regions": [{ "geoCode": "US-WY", "geoName": "Wyoming", "value": 100, "hasData": true }],
  "dmas": [{ "geoCode": "759", "geoName": "Cheyenne WY-Scottsbluff NE", "value": 100 }],
  "relatedTop": [{ "query": "seo company", "value": 100, "formattedValue": "100" }],
  "relatedRising": [{ "query": "regalseo", "value": 36700, "formattedValue": "Breakout", "isBreakout": true }],
  "sampled": true,
  "error": null
}
```

### Pricing

Pay per event — you pay for rows with data, never for empty, partial or failed rows.

| Event | Price (free plan) | Gold plan |
|---|---|---|
| Keyword trend row (`keyword-trend`, also each idea in `ideas-then-trends`) | **$0.0028** ($2.80 per 1,000) | $0.0008 |
| Comparison batch (`comparison-set`, per batch of up to 5 terms) | $0.004 | $0.002 |
| Trending search row (`trending-item`) | $0.0005 | $0.0002 |
| Keyword idea row (`keyword-idea`) | $0.0003 | $0.0001 |
| Actor start | $0.00001 | $0.00001 |

`maxItems` is a hard cap on charged rows, and the run stops cleanly when your maximum cost per run is reached. Duplicates are removed within a run and never charged twice.

### Good to know

- **Google Trends samples searches.** A value can differ by a few points between two runs (measured: up to 3 points out of 100). Values within one row are consistent.
- **Related topics are not included.** Google returns them empty to every automated client; this Actor does not pretend otherwise.
- **Trending articles:** you get how many news articles Google links to each trend (`articleCount`), not their titles or URLs.
- **No absolute search volumes.** Trends is relative; the trending list gives volume buckets ("200K+"), exactly as Google shows them.
- **When Google throttles,** the Actor switches connection, retries later and, if a row still cannot be fetched, delivers an error row that explains why — never charged. All error rows are also listed in the `ERRORS` record of the run.
- **Invalid input** (an unknown country code, a bad date range) ends the run in green with an error row that says what to fix, and nothing is charged.

### FAQ

**Can I use topics instead of search terms?** Yes: put a Knowledge Graph id such as `/m/019qb_` in `keywords`.

**Which time ranges are supported?** Past hour, 4 hours, day, 7 days, 30 days, 90 days, 12 months, 5 years, since 2004, or custom dates (`customTimeRange: "2025-01-01 2025-06-30"`).

**How do I filter trending searches by category?** Put Google Trends category ids in `trendingCategories`. Google's own trending list ignores the category, so the Actor filters it for you, and filtered-out items are not charged.

**Why are some keywords marked `partial`?** Their time series arrived but an optional block (regions or related queries) did not after every retry. Partial rows are delivered free.

# Actor input Schema

## `outputType` (type: `string`):

One row type per run. <b>keyword-trend</b>: one rich row per keyword. <b>comparison-set</b>: your terms on one shared scale (more than 5 are merged through the first term as anchor). <b>trending-item</b>: every trending search of a country. <b>keyword-idea</b>: autocomplete ideas for seed terms. <b>ideas-then-trends</b>: ideas for each seed, then the trend row of each idea.

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

Search terms for keyword-trend and comparison-set. A Knowledge Graph topic id such as /m/019qb\_ also works. Up to 500 per run (25 for a comparison).

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

Two-letter country code (US, GB, DE), a subregion (US-CA) or empty for worldwide.

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

Period of the series. Choose "custom" to set exact dates below.

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

Only with time range "custom": start and end date separated by a space, e.g. 2025-01-01 2025-06-30 (from 2004-01-01).

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

Google Trends category id to narrow the search (0 = all categories; e.g. 13 = Computers & Electronics, 71 = Food & Drink).

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

Which Google search the interest comes from.

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

Countries (worldwide) or regions (country) with their relative interest.

## `includeDmas` (type: `boolean`):

Only when the location is US: every metro area with data. One extra request per keyword.

## `includeCities` (type: `boolean`):

Cities with data and their coordinates. Google returns city data for few terms (measured: 27 of 216 rows had at least one city), so it is off by default. One extra request per keyword.

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

Top and rising related queries with their values (rising ones include Breakout).

## `seeds` (type: `array`):

For keyword-idea and ideas-then-trends: the terms to expand with autocomplete. Up to 20 per run.

## `ideasMode` (type: `string`):

seed: the seed alone (10 ideas). alphabet: seed + a-z and 0-9. questions: question words and prepositions in the chosen language. all: both (usually 350-500 unique ideas per seed).

## `ideaLanguages` (type: `array`):

Two-letter language codes. Question words are available for en, es, pt, de, fr and it; other languages get the alphabet expansion. ideas-then-trends uses the first language.

## `ideaCountry` (type: `string`):

Optional two-letter country for autocomplete. Empty = the usual country of each language (en: us, es: es, pt: br, de: de, fr: fr, it: it).

## `onlyContainingSeed` (type: `boolean`):

Drops unrelated suggestions such as seo -> seoul. Plurals of the seed are kept.

## `maxIdeasPerSeed` (type: `integer`):

Only for ideas-then-trends: how many ideas of each seed get a trend row.

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

For trending-item: two-letter country codes. One request per country returns every trending search of the window (hundreds to thousands).

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

Trending searches started in the past 4, 24, 48 hours or 7 days.

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

Optional list of Google Trends category ids; only trending searches in at least one of them are delivered (and charged). Empty = all.

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

Hard cap on rows with data (the ones you pay for). Rows without data and error rows do not count.

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

Keywords fetched at the same time. Measured on Apify with 8 in parallel: 33-58 complete keywords per minute. Lower values are slower and not more reliable; rate limits are handled automatically.

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

Apify Proxy is used as the secondary route. Leave the default unless you know you need another group.

## Actor input object example

```json
{
  "outputType": "keyword-trend",
  "keywords": [
    "seo",
    "web scraping",
    "chatgpt",
    "bitcoin",
    "pizza",
    "yoga",
    "vpn",
    "crm",
    "solar panels",
    "electric car"
  ],
  "geo": "US",
  "timeRange": "today 12-m",
  "customTimeRange": "",
  "category": 0,
  "property": "web",
  "includeRegions": true,
  "includeDmas": true,
  "includeCities": false,
  "includeRelated": true,
  "seeds": [
    "seo"
  ],
  "ideasMode": "all",
  "ideaLanguages": [
    "en"
  ],
  "ideaCountry": "",
  "onlyContainingSeed": true,
  "maxIdeasPerSeed": 10,
  "trendingGeos": [
    "US"
  ],
  "trendingHours": "24",
  "trendingCategories": [],
  "maxItems": 1000,
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All rows of this run in the default dataset.

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

Every row that could not be fetched, with the reason. Always written, empty when nothing failed.

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

Counts of delivered, charged, empty and failed rows for this run.

# 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 = {
    "outputType": "keyword-trend",
    "keywords": [
        "seo",
        "web scraping",
        "chatgpt",
        "bitcoin",
        "pizza",
        "yoga",
        "vpn",
        "crm",
        "solar panels",
        "electric car"
    ],
    "geo": "US",
    "timeRange": "today 12-m",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("oswaldocarabano/google-trends-keyword-ideas-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 = {
    "outputType": "keyword-trend",
    "keywords": [
        "seo",
        "web scraping",
        "chatgpt",
        "bitcoin",
        "pizza",
        "yoga",
        "vpn",
        "crm",
        "solar panels",
        "electric car",
    ],
    "geo": "US",
    "timeRange": "today 12-m",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("oswaldocarabano/google-trends-keyword-ideas-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 '{
  "outputType": "keyword-trend",
  "keywords": [
    "seo",
    "web scraping",
    "chatgpt",
    "bitcoin",
    "pizza",
    "yoga",
    "vpn",
    "crm",
    "solar panels",
    "electric car"
  ],
  "geo": "US",
  "timeRange": "today 12-m",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call oswaldocarabano/google-trends-keyword-ideas-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,oswaldocarabano/google-trends-keyword-ideas-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/M6gWNYuT2Gkq7hc6a/builds/rzdOaGzARKhoKQG2W/openapi.json
