Google Ads Transparency Scraper — Advertiser Ads & Creatives avatar

Google Ads Transparency Scraper — Advertiser Ads & Creatives

Pricing

from $1.00 / 1,000 ad creatives

Go to Apify Store
Google Ads Transparency Scraper — Advertiser Ads & Creatives

Google Ads Transparency Scraper — Advertiser Ads & Creatives

Scrape every ad creative an advertiser runs on Google from the Ads Transparency Center. Resolve by advertiser name, ID, or domain; get image and HTML5 creatives with first/last-shown dates, region filtering, and full pagination — no 100-item cap. Cookieless, no login, no CAPTCHA.

Pricing

from $1.00 / 1,000 ad creatives

Rating

0.0

(0)

Developer

Esteban Ortega

Esteban Ortega

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Scrape every ad creative an advertiser runs on Google straight from the Google Ads Transparency Center (adstransparency.google.com). Give it an advertiser name, an advertiser ID, or a domain, and get back a clean, structured list of that advertiser's image and HTML5 ad creatives — with first-shown / last-shown dates, region filtering, and full pagination (no hidden 100-item cap). Cookieless, no login, no CAPTCHA.

Built for competitive-ad researchers, performance marketers, brand-safety teams, and AI agents that need an advertiser's live ad library without the Google Ads Transparency Center's clunky UI.

What it does

  • Resolves an advertiser three ways. Look up by advertiser name ("Verizon"), by exact advertiser ID (AR11385763688137883649), or by domain ("verizon.com"). No fuzzy guesswork — the mode is explicit, and ambiguous names return disambiguation candidates you can pin.
  • Lists every creative with full token pagination. Most scrapers silently stop at 100 results. This one follows Google's pagination token to the end (or your chosen cap), so you get the whole ad library — deduped by creative ID and guarded against stuck pagination tokens and runaway page loops.
  • Region filtering that actually works. Pass a 2-letter country code (US, GB, CA…; UK/USA are aliased) to see only ads shown in that country. Uses Google's real geo IDs, validated against the live site. An unknown code fails fast with one error record instead of silently scraping the whole world.
  • Optional per-region enrichment. Turn on creative enrichment to add every render variant and per-country last-shown dates for each creative.
  • Optional asset rehosting. Google's simgad image and preview URLs expire fast — enable downloadAssets to persist the actual creative bytes in your run's key-value store.
  • Loud on anomalies, never silently empty. If Google changes its internal payload shape or soft-blocks a request (the #1 reason competing scrapers return nothing), this actor surfaces an explicit error or notice record — including mid-pagination truncation (partial: true on the advertiser summary) — instead of pretending the result is a complete zero. A genuinely dormant advertiser (Google's own counts say 0 recent and 0 lifetime ads) is reported as a clean zero, not a false alarm.
  • Streaming results. Every page of creatives is pushed to the dataset the moment it is scraped, so a timeout or migration late in a long run still leaves everything already fetched in your dataset.

Output fields

Each creative is one dataset item (type: "creative"). Every run also emits one advertiser summary record per advertiser, plus advertiser_candidate / domain_candidate records for disambiguation. At most one error or notice record is emitted per advertiser target (and failures never consume your maxCreativesPerAdvertiser budget). All records share the identical key set, so exports stay rectangular.

Sample creative output item:

{
"type": "creative",
"scraped_at": "2026-07-23T05:10:00+00:00",
"advertiser_id": "AR11385763688137883649",
"advertiser_name": "Verizon Value, Inc",
"creative_id": "CR15308872423592427521",
"format": "image",
"format_enum": 1,
"image_url": "https://tpc.googlesyndication.com/archive/simgad/6369736585639432871",
"preview_url": null,
"first_shown": "2025-09-22T07:00:00+00:00",
"last_shown": "2026-07-23T04:14:25+00:00",
"region": "US",
"regions": [],
"variants": [],
"deep_link": "https://adstransparency.google.com/advertiser/AR11385763688137883649/creative/CR15308872423592427521?region=us",
"asset_kvs_key": null,
"error": null
}

Sample advertiser summary item:

{
"type": "advertiser",
"advertiser_id": "AR11385763688137883649",
"advertiser_name": "Verizon Value, Inc",
"legal_name": "Verizon Value, Inc",
"country": "US",
"verified": true,
"total_creatives": 500,
"recent_ads": 500,
"lifetime_ads": 600,
"partial": false,
"region": "US"
}
  • total_creatives — the number of creatives actually scraped in this run (after your cap / region filter / any truncation).
  • recent_ads / lifetime_adsGoogle's own reported totals for the advertiser (from the search results page, falling back to the suggestion service), so you can tell a capped scrape from a complete one.
  • partialtrue on the advertiser summary when pagination ended abnormally (soft-block, stuck token, page failure) and the creative list may be incomplete; a matching error record explains where it was truncated.
  • formatimage, html5, or unknown (raw enum kept in format_enum).
  • image_url — direct simgad image URL (static image ads).
  • preview_url — Google displayads-formats preview URL (HTML5 / responsive ads).
  • first_shown / last_shown — ISO-8601 UTC, converted from Google's unix timestamps.
  • regions — populated only with enrichCreativeDetail: [{geo_id, country, last_shown}] per country.
  • variants — populated only with enrichCreativeDetail: every render variant of the creative.
  • deep_link — direct link to the creative in the Ads Transparency Center.
  • asset_kvs_key — populated only with downloadAssets: the key-value-store key holding the rehosted bytes.

Input

FieldTypeDescription
advertiserNamestringAdvertiser to resolve by name (e.g. Verizon). Best match is scraped; other matches become advertiser_candidate records. Defaults to Verizon when no target field is provided at all.
advertiserIdstringExact AR… advertiser ID. Most deterministic input; takes priority over name/domain.
domainstringWebsite domain (e.g. verizon.com). Lowest priority.
regionstringOptional 2-letter ISO country code (US, GB, CA…; UK/USA aliased to GB/US) to filter creatives by where they ran. Empty = all regions. Any other unknown code fails fast with one error record — never an accidental all-regions scrape.
maxCreativesPerAdvertiserintegerCap on creatives per advertiser (0 = no cap — full pagination). Bounds cost on very large advertisers.
enrichCreativeDetailbooleanOne extra request per creative to add per-region dates + all variants. Slower; no extra dataset items.
includeAdvertiserDetailbooleanOne request per advertiser for legal name / country / verified. Default on.
downloadAssetsbooleanDownload + rehost each creative's bytes to the key-value store (URLs expire).
requestDelaySecondsnumberPoliteness delay between requests (default 1s). Raise for large or enrichment-heavy crawls.
proxyConfigurationobjectOptional proxies. Works cookieless from datacenter IPs at modest volume.

Use cases

  • Competitive ad intelligence — pull a competitor's entire live creative library and track how it changes week over week.
  • Creative research / swipe files — collect every image and HTML5 ad a brand is running, by country.
  • Brand safety & compliance — audit which ads an advertiser is currently showing in a given region.
  • Ad-tech & agency reporting — feed an advertiser's ad inventory into dashboards with stable, rectangular fields.
  • AI agents — a deterministic "list this advertiser's Google ads" tool with explicit input modes and clean JSON.

FAQ

How do I scrape Google Ads Transparency Center without an API?

Google doesn't offer a public Ads Transparency Center API. This actor talks to the same internal endpoints the website itself uses, cookieless and without a browser, and returns structured JSON — so you don't have to reverse-engineer anything.

How do I find an advertiser's ID?

Search by name or domain and read the advertiser / advertiser_candidate records — each carries the AR… ID. Or copy it from an adstransparency.google.com/advertiser/AR… URL. Pinning the ID is the most reliable way to run repeatedly.

Why do some scrapers return an empty result for a busy advertiser?

Google periodically changes the internal request payload shape. Scrapers that copied an old payload then silently receive {} and report zero ads. This actor mirrors the current live payload exactly and never swallows an unexpected empty response. An empty response is genuinely ambiguous, so the actor classifies it honestly: if Google's own suggestion counts say the advertiser has 0 recent and 0 lifetime ads, the zero is reported as a clean result; otherwise you get one clear error record stating that the advertiser may have no live ads or Google changed the payload / soft-blocked the request. On a region-filtered run an empty first page gets a cautious notice record ("zero ads in this region OR drift — cross-check without the region filter"), and an empty response mid-pagination marks the result partial instead of pretending it is complete.

Can I get all of an advertiser's ads, not just the first 100?

Yes. Leave maxCreativesPerAdvertiser at 0 and the actor follows Google's pagination token to the end.

Why are the image URLs sometimes dead when I open them later?

Google's simgad and preview URLs expire quickly. Enable downloadAssets to rehost the actual bytes into your run's key-value store, and use asset_kvs_key.

Can I filter ads by country?

Yes — set region to a 2-letter ISO code. The actor maps it to Google's geo ID and filters server-side.

Pricing

This actor bills per result (pay-per-event, one charge per dataset item). Each creative, each advertiser summary, and each candidate record is one item. Error/notice records are capped at one per advertiser target, and failed requests never consume your maxCreativesPerAdvertiser budget — the cap counts only real, deduplicated creatives. To control cost on large advertisers, set maxCreativesPerAdvertiser. Enrichment flags (enrichCreativeDetail, includeAdvertiserDetail, downloadAssets) add requests but not extra dataset items.

A note on data source and terms

This actor reads public ad-transparency data that Google itself publishes for accountability. The endpoints are unauthenticated and require no login or terms acceptance. Google's general Terms of Service broadly discourage automated access to its products, so treat large-scale or aggressive use as a business/legal judgment call: keep volume modest, use the built-in delays, and consider residential proxies for heavy crawls. The actor never attempts CAPTCHA or WAF evasion. You are responsible for your own use of the data.