Google Trends Scraper
Pricing
from $0.70 / 1,000 results
Google Trends Scraper
Fast Google Trends scraper. Get interest over time, interest by subregion, and top and rising related queries and topics for any keyword, in any country, over any time range. Reads Google's own widget JSON API directly, no headless browser and no API key. Flat CSV-ready output.
Get Google Trends data for any keyword — interest over time, interest by subregion, and top and rising related queries — in any country, over any time range.
Reads Google's own widget JSON API directly. No headless browser, no API key, no login. A keyword over 12 months returns in about 3 seconds.
Why this one
The established Google Trends actors drive a real browser, which is why they are
slow and why their runs fail as often as they do. This one is plain HTTP against
the same JSON endpoints the Trends frontend calls, and it handles the one thing
that actually breaks Google Trends scraping: Google 429s any IP that has not
first been issued an NID cookie. This actor bootstraps that cookie per proxy
session and rotates sessions when Google pushes back, which is why cheap
datacenter proxies are enough — residential is not required and does not help.
Output is flat. One row per data point, every row tagged with a dataType,
so the CSV export opens in a spreadsheet and pivots without unpacking nested
JSON first.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
keywords | array | — | Required. Search terms, one per line. |
geo | string | US | US, GB, DE; US-CA for state level; empty for worldwide. |
timeframe | string | today 12-m | now 1-H, now 4-H, now 1-d, now 7-d, today 1-m, today 3-m, today 12-m, today 5-y, all. |
customTimeRange | string | — | 2024-01-01 2024-12-31. Overrides timeframe. |
dataTypes | array | interest over time, by subregion, related queries | Drop the ones you do not need to cut runtime and cost. |
maxItems | integer | 1000 | Hard cap on rows written across all keywords. |
compareKeywords | boolean | false | Chart all keywords together, normalised against each other (max 5), like adding comparison terms on the site. |
category | integer | 0 | Google's numeric category id. 0 = all. |
property | string | "" (web) | images, news, youtube, froogle. |
proxyConfiguration | object | Apify Proxy | Datacenter is sufficient. |
{"keywords": ["air fryer", "pickleball"],"geo": "US","timeframe": "today 12-m","maxItems": 500}
Output
Every row carries dataType, keyword, geo, timeframe, category,
property and scrapedAt, plus the fields for its type.
interestOverTime — one row per time bucket.
{"dataType": "interestOverTime","keyword": "air fryer","geo": "US","timeframe": "today 12-m","date": "2025-08-03T00:00:00Z","formattedTime": "Aug 3 – 9, 2025","value": 59,"hasData": true,"isPartial": false}
isPartial marks the final bucket of a live range — it is still filling, and
charting it as a crash is the classic Google Trends misread.
interestBySubregion — one row per region (51 for the US: 50 states + DC).
{"dataType": "interestBySubregion","keyword": "air fryer","regionCode": "US-WY","regionName": "Wyoming","value": 100,"formattedValue": "100"}
relatedQueries — one row per related query, metric is TOP or RISING.
{"dataType": "relatedQueries","keyword": "air fryer","metric": "RISING","rank": 1,"query": "best air fryer 2026","value": 12400,"formattedValue": "Breakout","isBreakout": true,"link": "https://trends.google.com/trends/explore?q=best+air+fryer+2026&date=today+12-m&geo=US"}
isBreakout is set for terms Google labels Breakout — growth too large to
put a number on. These are the terms worth acting on.
Roughly 150 rows per keyword at geo=US, today 12-m, with the three
default data types on.
A note on related topics
Google currently serves an empty related-topics widget. Verified against
broad search terms and against resolved entity ids (/m/05p0rrx), on both
residential and datacenter IPs — HTTP 200 with an empty list every time. It is a
gap on Google's side, not a scraping failure.
The option is still there in case Google restores it, but it is off by default and the run logs say so plainly rather than leaving you to wonder. Related queries are unaffected and work fine.
Empty results
A search that legitimately charts nothing writes a single explanatory row with
dataType: "noResults" rather than an empty dataset. Terms below Google's volume
threshold are not charted at all — broaden the keyword, lengthen the timeframe,
or set geo to empty for worldwide.
Invalid input (maxItems: 0, a malformed customTimeRange, an unsupported
property) fails the run loudly instead of finishing "successfully" with nothing
in the dataset.
Notes
- Google rate-limits per IP. Leave Apify Proxy on for anything past a smoke test.
- Values are Google's own 0–100 relative index, not absolute search volume — that is how Google Trends works, and no scraper can change it.
- With
compareKeywordson, values are normalised across the set, so the terms are directly comparable but no longer on their own 0–100 scale.