Google Trends API — interest over time, region, related queries
Pricing
from $8.00 / 1,000 keyword × widget results
Google Trends API — interest over time, region, related queries
Google Trends data as JSON: interest over time, interest by region, related queries/topics for any keyword, plus trending searches per country. HTTP-only, correct multi-keyword semantics, no infinite retries. Pay per keyword×widget.
Google Trends as clean JSON — interest over time, interest by region, related queries/topics, and trending-now searches for any keyword and country. HTTP-only (no browser), pay only for data that actually comes back, and built specifically to fix the reliability problems that plague the existing Google Trends scrapers on the Store. Point it at one or more keywords, pick which of the four data types you want, and get structured dataset items back in seconds — ready for the API, a schedule, an integration, or an MCP-connected agent.
Sample output
One dataset item per keyword × widget (plus one item per trending search). Interest-over-time for bitcoin
(US, last 12 months):
{"keyword": "bitcoin","widget": "interest_over_time","geo": "US","timeframe": "today 12-m","category": 0,"gprop": "","compare": false,"compared_with": null,"scale": "own_0_100","average": null,"data": [{ "time": "2025-09-07T00:00:00.000Z", "formatted_time": "Sep 7 – 13, 2025", "value": 22, "is_partial": false },{ "time": "2025-09-14T00:00:00.000Z", "formatted_time": "Sep 14 – 20, 2025", "value": 25, "is_partial": false }],"error": null,"fetched_at": "2026-09-13T19:44:29.364Z","source_url": "https://trends.google.com/trends/explore?q=bitcoin&date=today+12-m&geo=US&cat=0&gprop="}
A trending_now item (no keyword needed — just pick a country):
{"widget": "trending_now","keyword": null,"geo": "US","title": "cardinals vs chargers","traffic": "20000+","published_at": "2026-09-13T19:30:00.000Z","news": [{ "title": "Where to watch Cardinals vs Chargers", "url": "https://sports.yahoo.com/...", "source": "Yahoo Sports" }],"fetched_at": "2026-09-13T19:44:23.709Z","source_url": "https://trends.google.com/trending/rss?geo=US"}
Both examples above are real output from a live run of this Actor (see Why this Actor for the numbers behind that claim). You can download any run's dataset as JSON, CSV, Excel, or HTML from the Storage tab or the API.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
keywords | array of strings | — | Search terms, e.g. "bitcoin", or a Trends topic id like /m/05p0rrx. Required unless you only want trending_now. |
widgets | array | interest_over_time, interest_by_region, related_queries, related_topics | Which data types to fetch. One dataset item (and one charge) per keyword × widget; trending_now charges per trend instead. |
geo | string | "" (worldwide) | ISO country code (US, GB, DE) or region (US-CA). |
timeframe | string | "today 12-m" | Trends syntax: now 1-H, now 7-d, today 1-m, today 5-y, all, or a custom "2024-01-01 2024-12-31" range. |
category | integer | 0 | Google Trends category id (0 = all). |
gprop | string | "" | Search vertical: web, images, news, youtube, froogle (Shopping). |
compare | boolean | false | See Compare vs. separate below — this is the setting the official scraper gets wrong. |
resolution | string | auto | COUNTRY / REGION / CITY / DMA for interest_by_region. |
hl | string | "en-US" | UI language for labels and related-query text. |
trending_geo | string | "US" | Country for the trending_now widget. |
maxAttemptsPerKeyword | integer | 3 | How many fresh sessions to retry per keyword before giving up on the widgets still missing (partial results are always kept — see Reliability). |
proxyConfiguration | object | Apify residential proxy | Google throttles by IP. Residential proxy with one session per keyword is the reliable setting; without one, the Actor runs direct with pacing and backoff — slower, and it works less often, but it still works. |
Compare vs. separate (the bug we fixed)
Turn compare on to fetch up to 5 keywords in a single request, sharing one 0–100 scale — exactly like the
"Compare" view on trends.google.com. Numbers become comparable across keywords, and interest_by_region
switches to each keyword's share of the combined interest (scale: "share_of_compared_pct").
Leave compare off (default) and every keyword gets its own request, each independently normalised to
its own peak = 100 (scale: "own_0_100"). This is the correct default for "how has interest in X changed
over time" — mixing it up with compare mode is exactly the open issue on the official actor titled "MCP tool
interface isn't passing the isMultiple flag correctly". We expose the distinction explicitly in every item's
scale and compare fields so you never have to guess which mode produced a number.
Pricing
Pay per event, in USD (Bronze/Silver/Gold plans get automatic discounts):
| Event | Price | When it's charged |
|---|---|---|
| Actor start | $0.005 | Once per run. |
| Keyword × widget result | $0.01 (primary) | Once per keyword × widget that returned data. Widgets with no data (e.g. an empty related_topics list) are not charged. |
| Trending search | $0.001 | Once per trending item returned by trending_now. |
Worked examples:
- 1 keyword, all 4 widgets (interest over time + by region + related queries + related topics): 4 × $0.01 + $0.005 start ≈ $0.045.
- 1 keyword,
interest_over_timeonly, plustrending_nowfor a country (the default input — a ~5-second run): 1 × $0.01 + 10 × $0.001 + $0.005 start ≈ $0.025 for 11 items. - 5 keywords compared (
compare: true, all widgets):interest_over_timeandinterest_by_regionare shared across the 5 keywords (2 charges total),related_queriesis per-keyword (5 charges);related_topicsisn't offered in compare mode by Google, so it falls back to one extra request per keyword if you ask for it. Roughly 5–10 charges depending on which widgets you pick, always cheaper per keyword than fetching each one as a separate run.
The minimum spend guard (minimalMaxTotalChargeUsd) is $0.05 — well within reach of an agent calling this
tool with a small budget.
Why this Actor instead of the official Google Trends Scraper
The official apify/google-trends-scraper has 12,979 users but a ~28% failure rate over the last 30 days
and 68 issue reports, with recurring titles like "Runs with infinite loop and no result", "keep failing",
and "MCP tool interface isn't passing the isMultiple flag correctly". This Actor was built specifically to
fix those three problems:
- No infinite loops. Every keyword's fetch is bounded — a fixed number of session attempts
(
maxAttemptsPerKeyword), each with its own bounded backoff. If Google keeps throttling a widget, the run gives up on that widget only, keeps every result it already has, and moves on. A run either finishes or fails fast; it never hangs. - Correct multi-keyword semantics. The
compareflag (above) is explicit and documented, and every output item states which scale it's on. No silent mixing of "own 0–100" and "shared 0–100" values. Related-topics data (which Google blanks out entirely for logged-out sessions) is reported as an honest empty result with an explanation, not a silent failure. - HTTP-only, cheap, and fast. No headless browser — a warm session, Google's own internal JSON endpoints, and ~800 ms pacing between calls. A typical single-keyword run finishes in seconds, not minutes.
Not affiliated with Google. Google Trends is a Google Inc. trademark; data returned is the same aggregate, non-personal search-interest data shown publicly at trends.google.com.
Use cases
- SEO & content planning — find rising queries and topics around a subject before you write about it.
- Market & brand research — track interest in a product, competitor, or industry over time and by region.
- Trading/crypto signal research — correlate search interest with price action (see the sample output above).
- News & culture monitoring — pull the daily
trending_nowfeed for any country into a dashboard or bot. - Agents & automations — flat input, small default budget, and typed dataset fields make this a natural MCP tool for "what's trending" or "how has interest in X changed" questions.
How to use
- Open the Input tab and fill in
keywords(or skip them and just turn ontrending_now). - Pick which
widgetsyou want, ageo/timeframe, and leaveproxyConfigurationon Apify's residential proxy for the most reliable runs (recommended; the Actor also works without a proxy, just less consistently at scale). - Click Start. Dataset items appear as they're fetched — trending-now items first (fastest), then one set per keyword.
- Export the dataset as JSON/CSV/Excel, or pull it via the API for automations and schedules.
Output fields
| Field | Description |
|---|---|
keyword | Search term (null for trending_now items). |
widget | interest_over_time | interest_by_region | related_queries | related_topics | trending_now. |
geo, timeframe, category, gprop | The request parameters that produced this item. |
resolution | COUNTRY/REGION/CITY/DMA (interest by region only). |
compare, compared_with, scale | See Compare vs. separate. |
data | The payload: time series points, region rows, or related-query/topic rows — shape depends on widget. |
title, traffic, published_at, news | trending_now only. |
error | Set (and not charged) when this widget couldn't be fetched, with a human-readable reason. |
fetched_at, source_url | When it was fetched, and the matching trends.google.com page. |
Limitations, legal, and support
Google does not offer an official Trends API; this Actor talks to the same internal JSON endpoints the
trends.google.com website uses, the same way the official Apify Trends actor and many open-source tools
(e.g. the archived pytrends library) do. related_topics is genuinely empty for logged-out sessions — that's
Google's behavior, not a bug here. At high volume, use the built-in residential proxy option for consistent
results; Google throttles aggressively per IP. Data returned is aggregate, non-personal search-interest data,
publicly viewable on trends.google.com for anyone.
Found a bug or want a feature? Use the Issues tab on this Actor's page — we aim to respond within a few days.