Google Trends Scraper avatar

Google Trends Scraper

Pricing

from $0.70 / 1,000 results

Go to Apify Store
Google Trends Scraper

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.

Pricing

from $0.70 / 1,000 results

Rating

0.0

(0)

Developer

Crikit

Crikit

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

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

FieldTypeDefaultNotes
keywordsarrayRequired. Search terms, one per line.
geostringUSUS, GB, DE; US-CA for state level; empty for worldwide.
timeframestringtoday 12-mnow 1-H, now 4-H, now 1-d, now 7-d, today 1-m, today 3-m, today 12-m, today 5-y, all.
customTimeRangestring2024-01-01 2024-12-31. Overrides timeframe.
dataTypesarrayinterest over time, by subregion, related queriesDrop the ones you do not need to cut runtime and cost.
maxItemsinteger1000Hard cap on rows written across all keywords.
compareKeywordsbooleanfalseChart all keywords together, normalised against each other (max 5), like adding comparison terms on the site.
categoryinteger0Google's numeric category id. 0 = all.
propertystring"" (web)images, news, youtube, froogle.
proxyConfigurationobjectApify ProxyDatacenter 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.

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 compareKeywords on, values are normalised across the set, so the terms are directly comparable but no longer on their own 0–100 scale.