# Google Trends Scraper — Rising & Trending Keywords, Scores (`ntriqpro/google-trends-rising-keywords`) Actor

Google Trends scraper that does not stall: trend score and rising/breakout verdict per keyword, related queries, regions and trending searches. Free plan: 1-keyword preview. Paid plans: up to 100 keyword/region pairs per run. Failed keywords never block the run.

- **URL**: https://apify.com/ntriqpro/google-trends-rising-keywords.md
- **Developed by:** [daehwan kim](https://apify.com/ntriqpro) (community)
- **Categories:** SEO tools, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 — Rising & Trending Keywords, Scores

This Google Trends scraper finishes what other scrapers leave hanging. Every keyword gets its own time budget and a fresh proxy session on each retry, so a slow or blocked keyword becomes one free `failed` row while the rest of the run keeps going. On top of the raw data it adds a trend score, a rising/breakout verdict per keyword, and a one-step expansion of the seed's rising related queries.

Enter a keyword (or a Trends explore link) and get:

- **Interest over time** with a 0–100 `trendScore`, `verdict` (`breakout`, `rising`, `seasonal`, `stable`, `declining`), 3-month and year-over-year growth, momentum, peak and seasonal months.
- **Related queries and related topics** (top and rising), one row each.
- **Interest by region**, one row per region with a value.
- **Rising-keyword expansion:** each rising related query gets its own trend row and verdict, so one input finds the next set of keywords to watch.
- **Trending searches** from country feeds.

Example `keyword-trend` row (values illustrative, `timeline` shortened):

```json
{
  "type": "keyword-trend",
  "keyword": "protein coffee",
  "geo": "US",
  "status": "ok",
  "trendScore": 78,
  "verdict": "rising",
  "growth3mPct": 41,
  "growthYoYPct": 120,
  "isBreakout": false,
  "timeline": [{ "date": "2026-09-27", "value": 84, "isPartial": false }]
}
```

Google Trends values are a relative, sampled 0–100 index, not absolute search volumes.

### FREE preview vs paid plan

| | FREE plan preview | Paid Apify plan |
|---|---|---|
| Keywords per run | 1 (first keyword/region pair) | Up to 100 keyword/region pairs |
| Trend score and verdict | Included | Included |
| Related queries and topics | 3 per list | All (up to about 25 per list) |
| Regions | Top 5 | All regions with a value |
| Rising-keyword expansion | 2 keywords | Up to 100 per seed (default 20) |
| Trending searches | 5 rows, first country | All rows, up to 20 countries |
| Timeline point rows | Optional | Optional |
| End-of-run notice | Shows what was left out, counted from your real results | None needed |

A FREE run ends normally with a `free-plan-preview` row (not charged) and a status message such as `Free preview: you received 1 of 5 keyword(s), 6 of 50 related items, 5 of 51 regions, 2 of 10 expanded keywords (12 breakout keywords locked, e.g. j**** protein coffee). The full result for this keyword is about $0.19 on a paid plan (other requested keywords and trending countries not included).` The locked amounts and the price estimate come from what the run observed on the keyword it processed: the estimate applies the event prices below to those observed counts, and words that are not in your keyword are masked after their first letter. FREE refers to your Apify subscription plan: runs can use your available Apify credits at the event prices below.

This independent Actor is not affiliated with, endorsed by, or an official product of Google. Google and Google Trends are trademarks of Google LLC.

### Quick start

```json
{
  "searchTerms": ["protein coffee"],
  "geos": ["US"],
  "timeRange": "today 5-y",
  "expandRising": true,
  "maxExpandedPerSeed": 20
}
```

Use `startUrls` to paste Trends explore links (`q`, `geo`, `date`, `cat`, `gprop` are read from the link). Use `geos` for several countries (an empty string means worldwide) and `trendingCountries` for the trending feed. Blank and duplicate entries are ignored.

### Row types

Every dataset row has a `type` field.

| `type` | What it is | Billing event |
|---|---|---|
| `keyword-trend` | One keyword, region and range with judgement fields and a `timeline` array. `status` is `ok`, `no-data` (Google has too little data) or `failed` | `keyword-trend` for `ok` and `no-data` |
| `related-query` | One related query, `list` is `top` or `rising`, with `formattedValue` (for example `+250%` or `Breakout`) | `related-keyword` |
| `related-topic` | One related topic with type and Knowledge Graph id | `related-keyword` |
| `region-interest` | One region with its interest value | `region-interest` |
| `timeline-point` | One time point, only when `timelineRows` is on | `timeline-point` |
| `trending-search` | One currently trending search with approximate traffic and news links | `trending-search` |
| `free-plan-preview` | FREE runs only: what was left out | Not charged |
| `run-summary` | Status, counts, failed keywords and reasons, seconds | Not charged |

### Judgement rules

All rules are computed from the timeline Google returns; an unfinished last period (`isPartial`) is ignored.

- **Recent window:** the last 90 days of data. **Prior window:** the 90 days before. When the range covers less than 180 days (for example `today 3-m`, `now 7-d`), the windows are the second and the first half of the covered range. `growth3mPct` is the change of the window means in percent; it is empty when the prior mean is 0 or the range has no earlier half to compare.
- `growthYoYPct` compares the recent window with the same 90 days one year earlier; empty when the range is too short.
- `momentum` is the mean of the last 4 points minus the mean of the 4 before them.
- `peakInterest` and `peakDate` are the highest point of the range.
- `seasonalPeakMonths` lists up to three calendar months whose mean is at least 1.25 times the yearly mean and whose peak repeats in at least two different years, only when the range covers about two years. A single spike is not seasonality.
- `isBreakout` is true when the recent mean is at least 10 and the prior mean is at most 1 or the 3-month growth is at least 300%.
- `verdict`, first match wins: `breakout` if `isBreakout`; `seasonal` if the strongest month is at least 1.6 times the average month and year-over-year change is under 30% (or unknown); `rising` if growth is at least +20%; `declining` if growth is at most -20%; otherwise `stable`.
- `trendScore` = 0.4 × recent level (0–100) + 0.4 × growth score (−50% maps to 0, +200% and above to 100; growth from a prior mean of 0 counts as 100; a missing comparison counts as no growth) + 0.2 × momentum score (−25 maps to 0, +25 to 100), rounded.

### Pricing

Pay per event. Apify adds its automatic start fee (`apify-actor-start`, $0.005 per GB of run memory, minimum one unit).

| Event | Price | When |
|---|---|---|
| `keyword-trend` | $0.01 | One completed keyword lookup, including a no-data answer from Google |
| `related-keyword` | $0.001 | One related query or topic row |
| `region-interest` | $0.0005 | One region row with a value |
| `timeline-point` | $0.0002 | One time point row, only if `timelineRows` is on |
| `trending-search` | $0.002 | One trending search row |

Failed keywords, duplicates, `free-plan-preview` and `run-summary` rows are not charged. A charge happens once per keyword, list item, region or point, even if a run is resumed. When the run spending limit is reached, the run stops looking up new results and ends normally with what it delivered.

The default input (one keyword, US, five years, 20 expanded keywords) delivered 21 keyword trends, 50 related queries and 51 regions in a measured run (122 charged rows, about $0.29 plus the start fee).

Google returned no related topics for the keywords we checked on 2026-09-30, so `related-topic` rows appear only when Google supplies them. The option stays on and you pay nothing for topics that do not exist.

### Reliability

- Each keyword has a time budget (`keywordTimeBudgetSeconds`, default 90). Every retry uses a new proxy session: three retries on your proxy settings (including your own proxy URLs), then one residential attempt. If a proxy cannot be set up, the run continues without it and says so in `notices`. A keyword that still fails is written as a `failed` row with the reason and is not charged.
- Keywords run in parallel (four at a time), so a hung keyword cannot hold up the rest.
- The status message shows how many keywords are done and failed while the run is going.

### Responsibility

You are responsible for your inputs and for lawful use of the results, including compliance with Google's terms for the data you collect. Verify results independently. The data comes from public Google Trends pages; availability can change, and the Actor reports failures instead of hiding them. The Apify Standard Actor Contract applies.

# Actor input Schema

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

Keywords to look up. Blank and duplicate entries are ignored. Each keyword runs once per region in "geos". FREE: only the first keyword is processed.

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

Optional Trends explore links (q, geo, date, cat and gprop are read from the link). A link overrides geos, time range, category and property for its keywords.

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

Country or subregion codes such as US, GB, KR or US-CA. An empty string means worldwide. Each keyword gets one trend row per region. FREE: only the first keyword/region pair runs.

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

today 5-y (default), today 12-m, today 3-m, now 7-d, now 1-d, all, or a custom range like 2024-01-01 2025-01-01.

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

Google Trends category id (0 = all categories, for example 71 = Food & Drink).

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

Where the searches happened.

## `expandRising` (type: `boolean`):

Look up the seed keyword's rising related queries again and give each its own trend row and verdict (source "expanded-from:<seed>"). FREE: at most 2.

## `maxExpandedPerSeed` (type: `integer`):

Upper limit per seed keyword. Each expanded keyword is one keyword-trend charge.

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

One row per region with interest. FREE: top 5 regions.

## `includeRelatedTopics` (type: `boolean`):

Related topics next to related queries. FREE: 3 per list.

## `timelineRows` (type: `boolean`):

Off by default: the timeline is already an array in the keyword-trend row. Turning this on adds one small charge per point.

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

Two-letter country codes for currently trending searches, for example US or KR. Leave empty to skip.

## `keywordTimeBudgetSeconds` (type: `integer`):

A keyword that cannot be fetched inside this time (retries and proxy session changes included) is written as a free failed row and the run continues.

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

Apify Proxy is used with a fresh session per attempt. If lookups keep failing, a residential attempt is made automatically.

## Actor input object example

```json
{
  "searchTerms": [
    "protein coffee"
  ],
  "geos": [
    "US"
  ],
  "timeRange": "today 5-y",
  "category": 0,
  "property": "web",
  "expandRising": true,
  "maxExpandedPerSeed": 10,
  "includeRegions": true,
  "includeRelatedTopics": true,
  "timelineRows": false,
  "trendingCountries": [],
  "keywordTimeBudgetSeconds": 90,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

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

No description

# 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": [
        "protein coffee"
    ],
    "geos": [
        "US"
    ],
    "timeRange": "today 5-y",
    "category": 0,
    "property": "web",
    "expandRising": true,
    "maxExpandedPerSeed": 10,
    "includeRegions": true,
    "includeRelatedTopics": true,
    "timelineRows": false,
    "keywordTimeBudgetSeconds": 90,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ntriqpro/google-trends-rising-keywords").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": ["protein coffee"],
    "geos": ["US"],
    "timeRange": "today 5-y",
    "category": 0,
    "property": "web",
    "expandRising": True,
    "maxExpandedPerSeed": 10,
    "includeRegions": True,
    "includeRelatedTopics": True,
    "timelineRows": False,
    "keywordTimeBudgetSeconds": 90,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("ntriqpro/google-trends-rising-keywords").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": [
    "protein coffee"
  ],
  "geos": [
    "US"
  ],
  "timeRange": "today 5-y",
  "category": 0,
  "property": "web",
  "expandRising": true,
  "maxExpandedPerSeed": 10,
  "includeRegions": true,
  "includeRelatedTopics": true,
  "timelineRows": false,
  "keywordTimeBudgetSeconds": 90,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call ntriqpro/google-trends-rising-keywords --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ntriqpro/google-trends-rising-keywords"
        }
    }
}
```

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/cmo6YXiZa323l45Of/builds/ZPsmaZVrRMOB0nfrq/openapi.json
