Google Trends without a browser. Get interest over time, interest by region and related queries for many comparisons of up to 5 terms, in any geo, timeframe, category and property (web, news, images, YouTube, Shopping). Tidy rows, ready for CSV, BI and AI agents.
A search-term line longer than 1,000 characters and a Google Trends URL longer than 8,192 characters are now rejected (a line is an input error, and a URL fails on its own). Before, a line of about 240 KB of duplicate terms crashed the run with a RangeError, and long lines or URLs were copied into every warning and OUTPUT entry. Warnings, errors and OUTPUT now quote at most about 120 characters of the user's text.
The 50-geo limit counts different geos (51 copies of "US" are 1 geo). Category ids must be plain digits ("0x47" and "1e2" are rejected), and a numeric timeframe gets a clear message.
A Retry-After header can make a wait longer, never shorter than the backoff. Before, Retry-After: 0 fired all retries within a second.
Null entries in Google's region, related or time-series lists are skipped instead of failing that output. A comparison that reaches the run's time limit before its first request is reported skipped, not failed. defaultMemoryMbytes is 256 MB.
The docs say platform usage is included in the event price (Apify's pay-per-event default). The "under 2 CPU-seconds" claim is gone, and README and LISTING state that 3 of 5 local runs of the default input ended without data on HTTP 429.
0.4.0 (2026-11-05, fix round 3)
The circuit breaker stops the run after 3 comparisons in a row get no data because every retry failed with HTTP 429, 403, 408, 5xx (also Apify Proxy 59x), a network error or a timeout. Before, only HTTP 429 counted, so a run where every request got 403/5xx/timeouts ground through every comparison. The stop message names the causes. A comparison skips its remaining outputs after any request fails on every retry with one of these errors (before, only after HTTP 429).
Data that was already fetched is charged and saved when another comparison stops the run (circuit breaker or time limit), also with maxConcurrency 2-3. Only an abort, or the maximum cost per run, keeps fetched data from being saved (stopped).
The quick NID-cookie retry happens at most once per request. With a proxy it used to happen after every other 429 (each 429 rotates to a new session), which halved the documented backoff ladder.
More than 500 Google Trends URLs are rejected before parsing, and invalid URLs count toward the 500-comparison cap. Before, invalid URLs were unbounded and all listed in OUTPUT. property/gprop values such as constructor are rejected.
The docs now say top related queries can also contain unrelated generic entries (6 of 50 in one run), so filter top and rising rows on mentionsTerm. They also give the run time with HTTP 429 (about 80 s for the default input).
0.3.0 (2026-11-05, fix round 2)
When a widget request fails with HTTP 429 on every retry, the rest of that comparison is skipped (no more requests). A rate-limited comparison now takes about one minute, not up to 6 minutes. Skipped outputs are listed in OUTPUT and count toward the 3-in-a-row circuit breaker.
Google Trends URLs with different date ranges per term (date=A,B) are rejected on their own with a clear reason. Google serves them from the multirange endpoint, which isn't supported.
Input caps are enforced while the input is read, so an input above 500 comparisons fails at once with a clear error (before, a 1.4 MB input ran out of memory). Duplicate comparisons give one counted warning, and warnings are capped at 50 in the log and OUTPUT.
mentionsTerm needs every word of the term with 3+ letters (any order). Short terms such as AI or c++ must appear as a whole phrase.
The title is now "Google Trends Scraper (fast, no browser)". We removed "reliable" until a platform run proves it.
0.2.0 (2026-11-05, fix round 1)
Pricing is now one event, term-result, at $0.001 per search term per comparison with data (all outputs included). Rows are free. comparison and result-row are removed.
Related queries are split into relatedQueriesTop (default on) and relatedQueriesRising (default off, because it's mostly filler for automated requests). relatedQueries is still read as relatedQueriesTop.
In Google Trends URLs, the same term may appear with different geos or dates (q=coffee,coffee&geo=US,GB). A URL that can't be read now fails only itself (listed in OUTPUT), not the run. Unknown country codes (ISO 3166-1 alpha-2 + XK) are rejected before any request, and language accepts region numbers such as es-419.
mentionsTerm is a whole-word match (plus plural s/es), with a substring match for scripts without spaces. A single-term time series of only zeros gives no rows, and zeros in multi-term comparisons are kept.
The pool stops starting comparisons after a stop, and status messages are throttled to one per 5 s.
The docs now cover backoff waits, view limits (columns only), run time guidance and unsupported URL formats. The Store description no longer advertises related topics.
0.1.0 (2026-11-05)
First version.
Outputs are interest over time, interest by region (with comparison share), related queries (top + rising) and optional related topics.
Inputs are comparisons of up to 5 terms (one per line), geos (country/subregion/metro/worldwide), preset and custom timeframes, category (top-level select or any id), property (web, news, images, YouTube, Shopping), Google Trends URLs and language.
HTTP 429 handling with an NID-cookie retry, proxy session rotation, exponential backoff with Retry-After, a circuit breaker after 3 rate-limited comparisons in a row, a run deadline guard, and per-output partial results.
Tidy dataset rows with views, an OUTPUT run report, and optional raw Google responses in the key-value store.