Google Ads Transparency Scraper & Competitor Ad Library avatar

Google Ads Transparency Scraper & Competitor Ad Library

Under maintenance

Pricing

Pay per usage

Go to Apify Store
Google Ads Transparency Scraper & Competitor Ad Library

Google Ads Transparency Scraper & Competitor Ad Library

Under maintenance

Scrape Google Ads Transparency Center data to monitor competitor ads, creatives, landing pages, active campaigns and ad changes over time.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Ege Usta

Ege Usta

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Categories

Share

Google Ads Transparency Competitor Intelligence

Scrape the Google Ads Transparency Center and turn competitor advertising into a searchable intelligence feed. Use it for competitor ad research, creative discovery, landing-page monitoring, active campaign tracking and ad change detection.

Turns Google Ads Transparency Center listings into structured competitor intelligence: normalized ad creatives, activity flags, creative clusters, per-advertiser summaries, and change events between runs.

Input

FieldTypeDefaultNotes
advertisersstring[]— (required)Per competitor: a domain (nike.com), a name (Nike), or a Transparency Center advertiser ID (AR…). URLs are accepted and reduced to a domain.
regionstring"anywhere"anywhere or a two-letter ISO country code.
maxAdsPerAdvertiserinteger200Creative cap per advertiser.
maxPagesinteger10Result-page cap (see limitations).
requestTimeoutSecsinteger30Per-request timeout.
concurrencyinteger2Advertisers processed in parallel.
minRequestDelayMsinteger800Client-side rate limit between requests / retries.
maxRetriesinteger2Retries for transient failures (timeout, network-error, http-error). Safety failures are never retried.
maxResponseBytesinteger4000000Byte ceiling per response.
longRunningDaysinteger30Run-duration threshold for the long-running flag.
newAdWindowDaysinteger7First-shown recency for the new flag.
activeWindowDaysinteger14Last-shown recency for the active flag.
resetSnapshotbooleanfalseIgnore the stored snapshot; fresh baseline.

Output

Three item types (see .actor/dataset_schema.json):

  • type: "ad" — normalized creative (format, adCopy, landingPageUrl / landingPageDomain, regions, firstShownAt, lastShownAt, variantCount) plus derived runDurationDays, isActive, isNew, isLongRunning, and a deterministic creativeClusterId (format + landing domain + first 8 normalized copy tokens, FNV-hashed).
  • type: "change"new_ad, stopped_ad, resumed_ad, copy_changed vs. the stored snapshot. The first observation of an advertiser is a baseline (no events). Events are fully sorted for reproducibility.
  • type: "advertiser_summary"totalAds, activeAds, newAds, longRunningAds, formatBreakdown, topLandingDomains, creativeClusters, first/last shown, a deterministic activityScore (0–100), and partial / error when the run for that advertiser was incomplete.

A SUMMARY record with per-advertiser reports, totals, changeCounts and failuresByReason is written to the key-value store.

Resilience

  • Broken or incomplete ad objects are counted (malformedAds) and skipped — they never stop the run.
  • Transient request failures are retried up to maxRetries with the configured delay; each retry is recorded.
  • If every attempt fails, the advertiser's stored snapshot is left untouched and its summary is marked partial with an error — no false "all ads stopped".
  • One failing advertiser never affects the others.
  • No Google account, no CAPTCHA solving, no private endpoints. All fetches go through the shared safeFetch (SSRF-guarded, redirect-capped, byte-limited, timeout cleared in finally).

Known limitations

  • The Transparency Center is a JavaScript application backed by an internal RPC that expects POST with signed tokens. This Actor issues a GET against the public advertiser / search page and parses framed JSON or an embedded state blob. When Google returns an interstitial or an unrecognised layout the parser yields zero ads and a warning, never a crash. maxPages is honoured by the interface but the GET path is effectively single-page; supply advertiser IDs and/or run behind an unblocker for depth. All normalization, clustering, scoring, diffing and resilience logic is fully implemented and fixture-tested.
  • regions, firstShownAt / lastShownAt, format and variantCount are only populated when the payload exposes them.

Commands

npm ci # monorepo root
npm run check -w google-ads-transparency-competitor-intelligence
npm run smoke -w google-ads-transparency-competitor-intelligence # offline
npx apify validate-schema

Deployment

Not deployed here. apify push is intentionally not run — the lead engineer handles deployment.