# Changelog of Google Trends Scraper - compare 5+ keywords on one scale (`eszetael_lab/google-trends-scraper`) Actor

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

## Changelog

### 0.2 (2026-07-23) — G4 hardening (3 krytyczne, wyprzedzająco vs live-bugi bluesky)

- **is_ppe detection**: tryb DARMOWY dostarcza normalnie, nie nalicza, nie fail-closuje. Bez tego
  wolny actor po 3 rekordach robił charge_stop → Actor.fail (bug, który bluesky złapał dopiero na żywo).
- **Proxy RESIDENTIAL wpięte**: Google banuje datacenter-IP (429). Kod tylko ostrzegał — teraz
  `proxyConfiguration` (default useApifyProxy+RESIDENTIAL) → TrendsClient(proxy=...). Bez tego actor
  praktycznie nie działał na Apify.
- **requirements**: `apify` unpinned (był `>=2.0,<3.0` = konflikt pydantic default/default_factory,
  który wywalił build bluesky).
- **Panel G4 (8 adwersarzy) — kolejne realne bloki:**
  - `maxItems` był IGNOROWANY (parsowany, nieużyty) → egzekwowany `effective_cap` (koniec niespodzianki PPE).
  - Cichy pusty sukces przy dryfcie API: brak widgetu → `TrendsError` (odpala FAIL-on-zero), nie `{}`.
  - Blokujący event loop: sync httpx + `time.sleep` w async → `asyncio.to_thread` (nie zamraża migracji).
  - Rekordy niosą kontekst (`geo`/`timeframe`/`category`), `timestamp` int + `date` ISO-8601 (AI-ready).
  - README dokumentuje wszystkie 8 pól, proxy spójne ze schematem; wersja 0.1 → 0.2.
- **Panel G4 runda 2 (głębsze warstwy):**
  - **chunkGroup** — >5 słów = osobne skale 0-100 Google; pole mówi, które rekordy są porównywalne (fałszywe wnioski były możliwe z poprawnych danych).
  - Pusta-lista-danych (widget obecny) → `empty_targets` w note (nie cichy „0 records = sukces").
  - **circuit-breaker** — N błędów upstream z rzędu przerywa (rate-limit storm bez proxy nie mieli ~32s×N).
  - onlyNew truncacja z zachowaniem kolejności (drop NAJSTARSZE, nie arbitralne) — dedup nie dryfuje >50k.
  - resume-restore fail-open → flaga+note (double-charge nie znika po cichu); `emitted.add` PO udanym push.
  - `_coerce_int` łapie OverflowError (JSON Infinity); flush_charge flaguje niepotwierdzone naliczenie.
  - dataset view + README + LEGAL: kontekst/rising>100/limit 200 udokumentowane; usunięta nieistniejąca mitygacja.
- Testy 13 → 19.
- **Panel G4 runda 3 (perf/security/red-team czyste; potwierdzona zbieżność):**
  - **onlyNew łapie zmianę wartości** — `_key` zawiera `value`; monitor nie milknie po 1. runie (był
    martwy dla interest_by_region, first-sighting-only dla related — łamał reklamowaną funkcję alertów).
  - **isPartial** — ostatni punkt niedokończonego okna oflagowany (mylnie niska wartość ≠ spadek).
  - geo `hasData` (Google odróżnia 0 od braku danych); backoff z **jitter** (LEGAL mitygacja #2);
    tytuł 59→47 zn.; `skipped_seen` w note (nie-cichy „nothing new").
- Testy 19 → 21.

### 0.1 (2026-07-22)

- First version: interest_over_time, interest_by_region, related_queries.
- Hardened skeleton reused from reference actor (per-item PPE, migration-safe dedup, global cap,
  fail-closed billing, FAIL-on-zero). 13 regression tests.
