# Changelog of Google Events Scraper (`searchapi/google-events-scraper`) Actor

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

## Changelog

### \[3.2.0] - 2026-10-25

- Fixed a real extraction gap: the Actor read the retired events vertical and old card selectors, so it reported an empty result while the current Events pack was rendering on the main Google Search page.
- Added the `GOOGLE_SERP` plain-HTTP transport, which returns the server-rendered SERP (with the Events pack); the Playwright browser transport is now only a fallback when `GOOGLE_SERP` is not configured.
- Added `src/extractors/events-pack.js` for the current pack markup (`div.XRVJtc.bnmjfe.aKByQb[role="listitem"]` wrapping `[data-ssid="event_viewer_entrypoint"]`), scoped to the module headed *Events* so a sibling carousel can never be read as events.
- Added `src/serp-http.js` for the plain-HTTP forward, redirect following, decompression, and bounded retries with a fresh proxy session.
- Fixed a crash when a page had no Events heading (`Cannot read properties of null`), and a misclassification that reported ordinary web SERPs as a JavaScript bootstrap stub because the `enablejs` retry marker appears on healthy pages too.
- A challenge verdict now requires zero parsed event cards; `no_results` and `stub` are reported distinctly.
- `retrievalMethod` is now `google_events_serp_html` and `sourceType` `google-events-serp-html` for the HTTP transport, and records keep the canonical HTTPS `searchUrl` rather than the plain-HTTP wire URL.
- `buildSearchAttempts` no longer repeats the event keyword (`events in New York events`) and reports the correct mode for `web`-only searches.
- `INPUT.json` and the input schema now default to `{ "useApifyProxy": true, "apifyProxyGroups": ["GOOGLE_SERP"] }`.
- Removed the unused `classifyEventsSnapshot` helper and the stale `CARD_SELECTOR`.
- Added an offline fixture captured from the live SERP plus regression tests for the pack parser, page classification, and search attempts (`node --test` 15/15).

### \[Unreleased]

- Retargeted the events search URL: Google retired the dedicated events vertical, so `ibp=htl;events` now answers with "Oops, your browser, device, and/or location is not yet supported." and its `htichips` date chips are gone. The Actor now requests the events block on the main Google Search page and applies the date window through the query text.
- `auto` mode now also falls back to the web Events pack when the events route reports that unsupported page, instead of failing closed.
- Added the current Google events card classes (`.dEuIWb`, `.Gkoz3`, `.ov85De`) as extraction fallbacks.
- Added offline coverage for CAPTCHA precedence and kept blocked, valid-empty, unsupported, and unknown pages distinct. A CAPTCHA appearing during event loading now remains `TARGET_BLOCKED` before extraction.

### \[3.1.0] - 2026-09-22

- Removed the public debug input and debug-only logging path.
- Added market, page, result type, source type, data source, and synchronized scrape metadata to normalized records and the dataset schema.
- Updated the runtime pins and schema validation after checking the current Chrome Events surface. No sample dataset was added because the target was unsupported in the Actor session and empty in headed Chrome.

### \[3.0.0] - 2026-08-28

#### Changed

- Replaced the manual Playwright lifecycle with Crawlee sessions, consistent fingerprints, bounded retries, and country-aligned Residential proxy configuration.
- Added deduplicated single/multiple-query modes, date filters, load-cycle controls, concurrency, and configurable timeouts.
- Rebuilt extraction around current Google Events cards with optional same-page Event JSON-LD enrichment.
- Added stable event IDs, global deduplication, a typed 69-field dataset contract, and recursive empty-value removal.
- Added `auto`, dedicated Events-route, and current web Events-pack search modes so a retired or empty vertical can fall back to Google's live search interface.
- Distinguished valid empty searches, unsupported browser/location responses, CAPTCHA responses, HTTP blocking, and selector drift.
- Terminal 403/429 failures now set an explicit `TARGET_BLOCKED` Actor status even when Crawlee rejects the response before the request handler runs.
- Aligned Apify, Crawlee, Playwright, and Docker dependency versions.
- Kept Crawlee's LinkeDOM peer (`cheerio`) as an explicit production dependency so the Docker image starts under `npm ci --omit=dev`.

#### Removed

- Removed Yahoo indexed-page discovery because it could combine an unrelated search snippet with a different event's JSON-LD.
- Removed the custom credential-reading proxy helper and HTTP downgrade behavior.
- Removed fabricated `false` values for `isFree`, `isOnline`, and `isAllDay` when Google did not expose evidence.

### \[2.0.0] - 2026-06-12

- Expanded the original event schema and added local validation assets.

### \[1.0.0] - 2025-05-20

- Initial release.
