# Changelog of Google Ads Transparency Center Scraper: Google Ads Archive (`danthedataman/google-ads-archive`) Actor

- **URL**: https://apify.com/danthedataman/google-ads-archive/changelog.md
- **Full Actor documentation**: https://apify.com/danthedataman/google-ads-archive.md

## Changelog

### 0.3

- The add-on write still follows `charged_count` on the charge result. A
  positive count writes the summary; zero with `event_charge_limit_reached`
  skips the write and records `rotationSummarySkipped` on `ERRORS`. Zero
  without that flag records `rotationSummaryUnknown` as "charged\_count was
  0 and event\_charge\_limit\_reached was not reported". The last billed unit
  is written even when `event_charge_limit_reached` is true. When
  `charged_count` is unavailable, the write falls back to the limit flag
  and a skip is recorded as `rotationSummaryUnknown` with "charged\_count
  was unavailable on the charge result".
- README input-table rows for `includeRotationSummary` and
  `activeWithinDays` name all six partial `stopReason` values the walk can
  set (`maxAdsPerAdvertiser`, `maxItems`, `maxRunSeconds`, `duplicatePage`,
  `repeatedToken`, `emptyPage`), matching the output table. The `ERRORS`
  key list names `rotationSummaryUnknown`.

### 0.2

- README cost section names the automatic, memory-scaled Actor Start event and
  the opt-in add-on; it no longer claims that result rows are the only charge.
- Declares the `ERRORS` and `ROTATION_SUMMARY` key-value records and exposes
  results, errors, and the rotation summary through an output schema.
- Adds optional `includeRotationSummary` (default off) and `activeWithinDays`
  (default 7). When the add-on is on, one per-advertiser creative-rotation
  summary is written to `ROTATION_SUMMARY` and charged as
  `advertiser-rotation-summary` once per summarized advertiser that has at
  least one collected row carrying both first- and last-shown timestamps,
  honouring the user's spending limit. Coverage is `complete` only when
  Google returned no further page; `duplicatePage` and `repeatedToken` are
  recorded as partial stop reasons. A charging failure is recorded on
  `ERRORS` and does not drop already-pushed ad rows or fail the run.
- A `ROTATION_SUMMARY` write failure after a successful charge is recorded on
  `ERRORS` as `rotationSummaryWrite` and does not drop already-pushed ad rows
  or fail the run.
- The add-on write follows `charged_count` on the charge result: a positive
  count writes the summary; zero skips the write and records
  `rotationSummarySkipped` on `ERRORS`. The last billed unit is written even
  when `event_charge_limit_reached` is true.
- An empty page that still carries a next token stops with `emptyPage` and
  `coverage: partial`; a missing token remains the natural end.

### 0.1

First release.

- Reads one advertiser's creatives from the Google Ads Transparency Center over
  plain HTTP, with no browser.
- Accepts advertiser names (resolved against Google's own advertiser directory,
  with the alternatives logged) or exact `AR...` advertiser ids.
- Emits Google's own creative format (`text` / `image` / `video`, read from the
  format code it returns), the creative image and its pixel dimensions, the
  preview URL where Google serves one, first- and last-shown dates plus their
  raw epoch stamps, and a link to the ad on Google.
- Region-aware: `US`, `GB`, `DE`, `IN`, `CA`, `AU` and `JP` by two-letter code,
  every other country by Google's numeric region code. An unmapped two-letter
  code, and a numeric code outside the 2001-2999 band, are both refused up
  front — the endpoint answers an unrecognised region with an empty result
  rather than an error, so a typo would otherwise look like "no ads".
- The same advertiser reached by more than one input string is collected once,
  so a duplicated list is not billed twice.
- Proactive proxy rotation before Google throttles an identity, with backoff and
  rotation on `429`.
