Google Trends Scraper (Keyless) avatar

Google Trends Scraper (Keyless)

Pricing

from $20.00 / 1,000 keyword trends bundles

Go to Apify Store
Google Trends Scraper (Keyless)

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

subimpact

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

44 minutes ago

Last modified

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):

WidgetOutput rowsToggle (default)
Interest over timetype: "timeline" — one row per period, 0-100 interestincludeTimeseries (on)
Related queriestype: "relatedQuery" — TOP + RISING lists with rankincludeRelatedQueries (off)
Related topicstype: "relatedTopic" — TOP + RISING listsincludeRelatedTopics (off)
Interest by regiontype: "geo" — region code/name + 0-100 valueincludeGeoMap (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 = worldwide
  • timeRange: 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, froogle
  • tzOffset: 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

  1. GET https://trends.google.com/trends/ with a browser UA → harvest the NID cookie.
  2. 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.
  3. GET /trends/api/widgetdata/multiline|relatedsearches|comparedgeo with the widget's own request object (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 request verbatim with %20-encoded spaces. Do not do the extension-style space → + substitution before strict encoding: that produces %2B, which Google rejects with 400.
  • GEO_MAP uses the /widgetdata/comparedgeo endpoint (not multiline).
  • Timeline rows are dicts in the current format (value: [n] arrays, not arrays of arrays).
  • Related rankedList[0] = TOP, [1] = RISING (listName field is absent).
  • RELATED_TOPICS may come back empty from some egress IPs — treated as no-data, not an error.

Run locally

$apify run --purge

Deploy

$apify push