Google Trends Scraper (Keyless)
Pricing
from $20.00 / 1,000 keyword trends bundles
Google Trends Scraper (Keyless)
Scrape Google Trends interest-over-time, related queries/topics, and per-region interest for keywords. No API key, no browser, no captcha. Up to 5 keywords compared per call. $0.02 per keyword bundle, charged only for delivered keywords.
Pricing
from $20.00 / 1,000 keyword trends bundles
Rating
0.0
(0)
Developer
subimpact
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
44 minutes ago
Last modified
Categories
Share
Apify Actor that pulls Google Trends data with no API key, no browser, and no captcha solving — plain HTTP against Google's internal trends/api endpoints using the NID-cookie warm-up trick.
What it extracts
Per keyword batch (up to 5 keywords compared in one call):
| Widget | Output rows | Toggle (default) |
|---|---|---|
| Interest over time | type: "timeline" — one row per period, 0-100 interest | includeTimeseries (on) |
| Related queries | type: "relatedQuery" — TOP + RISING lists with rank | includeRelatedQueries (off) |
| Related topics | type: "relatedTopic" — TOP + RISING lists | includeRelatedTopics (off) |
| Interest by region | type: "geo" — region code/name + 0-100 value | includeGeoMap (off) |
Failed batches emit type: "error" rows with the reason instead of silently disappearing.
Input
{"keywords": ["coffee", "iced coffee"],"geo": "US","timeRange": "today 12-m","includeTimeseries": true,"includeRelatedQueries": true}
keywords(required): array of strings (max 5 per comparison batch; more are split into batches)geo: 2-letter country code (US,MY, …) or""/ omit = worldwidetimeRange: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, or"YYYY-MM-DD YYYY-MM-DD"category: Google Trends category id (default 0 = all)property:""web search,images,news,youtube,froogletzOffset: timezone offset in minutes (default 0; e.g. -480 for UTC+8)maxRelatedItems: cap per TOP/RISING list (default 25)delaySeconds: politeness delay between requests (default 1.5)proxyConfiguration: Apify proxy config — pass{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}if datacenter IPs get throttled
Pricing
Pay-per-event: $0.02 per keyword bundle (charged only for keywords whose data was actually delivered; failed batches are not charged). One bundle = interest-over-time + related queries/topics + interest-by-region for one keyword.
How the keyless trick works
GET https://trends.google.com/trends/with a browser UA → harvest theNIDcookie.GET /trends/api/explore?hl=en-US&tz=<tz>&req=<urlencoded compact JSON>→ XSSI-prefix-stripped JSON → pick widgets by id (TIMESERIES,RELATED_QUERIES,RELATED_TOPICS,GEO_MAP) — each carries a token.GET /trends/api/widgetdata/multiline|relatedsearches|comparedgeowith the widget's ownrequestobject (sent verbatim) + token.
429s trigger warm-up + retry (5s / 10s); persistent 429 means the egress IP is throttled — add a proxy or back off.
Gotchas baked in (all verified against the live API 2026-09-25):
- The XSSI prefix is
)]}'followed by a newline in current responses — naive)]}',startswith checks fail. - Send the widget
requestverbatim with%20-encoded spaces. Do not do the extension-stylespace → +substitution before strict encoding: that produces%2B, which Google rejects with 400. GEO_MAPuses the/widgetdata/comparedgeoendpoint (notmultiline).- Timeline rows are dicts in the current format (
value: [n]arrays, not arrays of arrays). - Related
rankedList[0]= TOP,[1]= RISING (listNamefield is absent). RELATED_TOPICSmay come back empty from some egress IPs — treated as no-data, not an error.
Run locally
$apify run --purge
Deploy
$apify push