Google Ads Transparency Advertiser Leads Scraper avatar

Google Ads Transparency Advertiser Leads Scraper

Pricing

$1.00 / 1,000 advertiser scrapeds

Go to Apify Store
Google Ads Transparency Advertiser Leads Scraper

Google Ads Transparency Advertiser Leads Scraper

Build a lead list of businesses buying Google ads. Search the Ads Transparency Center by trade or brand keyword and get one row per advertiser: name, advertiser ID, verified country, how many ads they run, and when their ads were last seen. Or go in reverse - give a website, get its advertisers.

Pricing

$1.00 / 1,000 advertiser scrapeds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Turn the Google Ads Transparency Center into a lead list of businesses that are actively buying Google ads. Search by trade or brand keyword, get one row per advertiser — name, advertiser ID, verified country, how many ads they have run, and when their ads were last seen.

Or run it backwards: hand it a website and get the advertisers whose ads point at it.

Why this one

Every other Ads Transparency actor on the Store returns ad creatives — one row per banner, with previews and formats. That is a creative-research product. This is a prospecting product: it collapses to the advertiser, so the row you get is a company you can sell to, not an image you have to de-duplicate.

The Transparency Center is the only public register that tells you a business is paying Google right now. For anyone selling to advertisers — agencies, PPC freelancers, landing-page and CRO tools, call-tracking, martech — that is a pre-qualified buying signal: they already have a budget and they already spend it on ads.

Measured 2026-09-02: five trade keywords (plumbing, roofing, dental, law firm, landscaping) returned 1,000 distinct advertisers, and 100% of them parsed with a name, advertiser ID, country and ad count. A single keyword can return up to 3,000 advertisers in one request.

Quick start

{
"keywords": ["plumbing", "roofing", "hvac"],
"countries": ["US"],
"minAds": 20, // skip one-off and hobby advertisers
"activeWithinDays": 30, // only businesses still running ads
"resultsPerKeyword": 500,
"maxItems": 1000
}

Reverse lookup — who is buying ads for a competitor's site:

{ "domains": ["shopify.com", "hubspot.com"] }

Output

One row per advertiser, 19 fields.

{
"advertiserName": "Dental Hub",
"advertiserId": "AR03454010070923214849",
"country": "IN",
"countryName": "India",
"adCountMin": 6,
"adCountMax": 6,
"adCountExact": true,
"lastAdSeenAt": "2026-09-01T17:29:08.000Z",
"daysSinceLastAd": 0,
"firstAdSeenAt": "2025-10-17T07:00:00.000Z",
"adHistoryComplete": true,
"creativesSampled": 6,
"advertiserUrl": "https://adstransparency.google.com/advertiser/AR03454010070923214849?region=IN",
"searchMode": "keyword",
"matchedKeyword": "dental",
"matchedDomain": null,
"domainCreativesMatched": null,
"domainCreativesSampled": null,
"scrapedAt": "2026-09-02T04:25:04.360Z"
}

Measured field fill

Parser validated offline against captured live bytes on 2026-09-02.

1,000 advertisers across 5 keywords:

FieldFill
advertiserName, advertiserId, advertiserUrl, matchedKeyword, searchMode100%
country, countryName100%
adCountMin, adCountMax100%
adCountExact — the count is a single number rather than a band98.7%

38 of those advertisers enriched with ad-activity dates:

FieldFillWhy
lastAdSeenAt, daysSinceLastAd, firstAdSeenAt94.7%2 of the 38 (5.3%) are listed in the directory but expose no retrievable creative. Their dates come back null rather than invented.
adHistoryComplete100% true on this sampletrue means the whole ad history fitted in one page, so firstAdSeenAt is genuinely their first ad rather than the oldest of the most recent 100
creativesSampled100%how many ads the dates were computed from

The fields that do the work

  • daysSinceLastAd is the qualification field. An advertiser last seen 0 days ago is spending today; one last seen 365 days ago churned a year ago. Set activeWithinDays: 30 and the list only contains businesses currently in market.
  • adCountMin / adCountMax size the account. The median advertiser on a trade keyword has run 5 ads; minAds: 20 strips the hobbyists, maxAds: 500 strips the national brands. Below roughly 1,000 ads Google reports an exact number (98.7% of our sample); above that it reports a band such as 9,000–10,000.
  • firstAdSeenAt with adHistoryComplete: true gives real tenure — how long this business has been buying ads.
  • advertiserUrl is Google's own page for that advertiser, region-pinned to their verified country, so every row is one click from the source.

Two search modes

Keyword mode matches the advertiser's registered name, not what they sell. plumbing returns KS Plumbing, Plumbing MD, Buzz Plumbing. This is a feature for trade prospecting — small service businesses put the trade in the company name — but it means dentist and dental return different lists. Search several variants and let the actor de-duplicate by advertiser ID.

Domain mode goes the other way: it samples the ads pointing at a website and reports who is running them. Measured 2026-09-02 over 40 sampled ads per domain:

DomainAdvertisers foundTop advertiser
shopify.com2Shopify Inc. (39 of 40 sampled ads)
nike.com6Nike Retail BV (25), Nike, Inc. (11)
hubspot.com11Hubspot, Inc. (28), plus 10 affiliates and resellers

That third column is the interesting one: hubspot.com shows 11 distinct advertisers, i.e. the affiliates and resellers bidding on someone else's brand.

Google's domain response carries no country, so in domain mode the actor recovers it with one extra name lookup per advertiser, matched back by advertiser ID and never by name — two companies can register the same advertiser name, and a guessed country would be worse than a blank one. Measured on a live run of shopify.com + hubspot.com: 15 advertisers, country resolved on 15 of 15, 23 seconds.

Filters

InputEffect
keywordsadvertiser-name search terms, one request each
domainsreverse lookup: website → its advertisers
countriesISO-2 filter on the advertiser's verified location. A 1,000-row plumbing sample was 70% US, 13% AU, 7% CA, 5% GB
minAds / maxAdsaccount-size band
activeWithinDaysrecency — drops anyone whose last ad predates the window
enrichWithAdActivityoff = names only, one request per keyword and no dates; on (default) = one extra request per advertiser
resultsPerKeywordup to 3,000 per keyword (Google's own ceiling)
maxItemstotal row cap, and therefore your billing cap

Pricing

Pay per advertiser delivered. No subscription, no charge for a run that finds nothing.

EventPriceWhen it fires
advertiser-scraped$0.001One per advertiser pushed to the dataset

That is $1 per 1,000 advertisers — cheaper per row than every Ads Transparency actor on the Store at time of writing (the next cheapest charges $1.50/1,000, and the nearest advertiser-level event charges $3.00/1,000).

Rows are billed through Apify's gated pushData, so at a spend cap the run stops cleanly and you are never charged for rows you did not receive. Rows dropped by activeWithinDays are filtered before delivery and are not billed.

Worked examples: 10 trade keywords × 500 advertisers, US-only and active in the last 30 days ≈ 1,200 rows ≈ $1.20. A one-off competitor sweep of 50 domains ≈ $0.30. A live run measured 2026-09-02 — 2 keywords, US-only, 20+ ads, active in 30 days — delivered 43 advertisers in 30 seconds and billed exactly 43.

Notes and honest limits

  • The advertiser's website is not available. Google does not expose it from an advertiser ID, and this actor does not guess one. Measured: LookupService/GetAdvertiserById answers HTTP 200 with a zero-byte body; the creatives endpoint carries no destination or display URL; and fetching a rendered creative preview (313 KB) yielded links only to google/gstatic/googlesyndication hosts. The domain relationship works in reverse only, which is why domains is an input mode rather than an output column. If you need websites, run this actor for the advertiser list and match the names against a company database.
  • No emails, phones or people. This is a company-level register: business name, country, ad volume, ad dates. Contact data is not in the source and is not fabricated here.
  • Keyword search is name-matching, not semantic. nike.com as a keyword matches NIKETA'S COMPANY S.R.L. Use domain mode for domains.
  • Ad counts above ~1,000 are bands, not exact numbers — Google itself reports them that way (e.g. 9,000–10,000). Both ends ship, plus adCountExact so you know which you have.
  • Google rate-limits by IP. A flagged address gets a reCAPTCHA "unusual traffic" page instead of data — an unproxied IP hit exactly that during development, while every Apify Proxy session returned results. Apify Proxy is therefore ON by default. Blocked requests are counted and named in the run's status message; they are never silently reported as "no advertisers found". If you push very hard, supply your own residential proxy.
  • The endpoint returns one undocumented boolean on ~0.7% of rows (7 of 1,000 sampled). Its meaning could not be established from the data, so it is deliberately not shipped under a guessed label rather than being passed off as a "verified" flag.
  • Ad creatives are a different actor. Nothing here emits an individual ad, preview or format — this is the advertiser directory. Dates are computed from the creative feed in aggregate only.
  • adstransparency.google.com serves no robots.txt (HTTP 404, checked 2026-09-02). The data is Google's own public advertiser-transparency disclosure, published without a login. The actor makes one request per keyword and one per advertiser, at low concurrency.
  • Verify anything you act on. Rows are a snapshot at scrapedAt; advertiser identities are as Google records them, and a business may trade under a different name than the one on its ad account.