# Changelog of Meta Ad Library Scraper — Ad Search & Export (`devilscrapes/meta-ad-library-scraper`) Actor

- **URL**: https://apify.com/devilscrapes/meta-ad-library-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/devilscrapes/meta-ad-library-scraper.md

## Changelog

### 0.1.1 — 2026-09-12

- **Fixed a cloud-only pagination failure found by cloud QA on build 0.0.1**
  (run `W3a9kgSKXbMf7X2fS`): the Actor SUCCEEDED with exit code 0 after
  delivering only page 1 (30 ads) of an 8-page request. Root cause,
  confirmed live: Meta's `/api/graphql/` pagination endpoint applies a much
  stricter per-IP rate limit than the public search page — a datacenter-tier
  proxy gets an HTTP 200 carrying a GraphQL error envelope
  (`{"errors":[{"message":"Rate limit exceeded","code":1675004}]}`) on the
  very first pagination request, which the old code silently downgraded to
  a "partial success" warning.
- Proxy default changed to `apifyProxyGroups: ["RESIDENTIAL"]` — confirmed
  live this clears the rate limit (60 pages / 581 unique ads, zero blocks).
  **This changes the Actor's cost profile** (residential proxy bandwidth is
  billed higher than datacenter); flagged here for the pricing owner to
  factor in before publish, not decided unilaterally in this change.
- A run that asks for `maxPages > 1` and can't get past page 1 due to this
  class of failure now raises (non-zero exit), while still pushing/charging
  for whatever real ads it already collected on page 1. A genuine end of
  results (`has_next_page: false`) is unaffected and still reports success.
- New `MetaPaginationError` distinguishes "pagination never got off the
  ground" (loud failure) from "pagination worked, then hit a late rate
  limit" (legitimate partial success, unchanged behavior).
- The actual GraphQL error body is now logged in full on any unparseable
  pagination response, instead of a generic "unexpected shape" warning.

### 0.1.0 — 2026-09-12

- Initial build. Searches Meta's public Ad Library by query or advertiser
  Page ID via a challenge-replay unblock (`curl_cffi`, `chrome131`, no
  login/token/App Review) and full GraphQL pagination
  (`AdLibrarySearchPaginationQuery`, `doc_id=24922295957467452`) —
  live-verified to 60 pages / 581 unique ads on one query before this
  release shipped.
- PPE pricing: `actor-start` $0.20 + `ad-result` $0.003 (~$3.20/1K ads),
  matching `google-ads-transparency`'s price point.
