# Changelog of Google Trends Scraper (fast, no browser) (`zovo-one/google-trends-scraper-fast`) Actor

- **URL**: https://apify.com/zovo-one/google-trends-scraper-fast/changelog.md
- **Full Actor documentation**: https://apify.com/zovo-one/google-trends-scraper-fast.md

## Changelog

### 0.4.1 (2026-11-05, fix round 4)

- 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.
- Pay-per-event events `comparison` and `result-row`.
