Google Ads Transparency Advertiser Leads Scraper
Pricing
$1.00 / 1,000 advertiser scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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:
| Field | Fill |
|---|---|
advertiserName, advertiserId, advertiserUrl, matchedKeyword, searchMode | 100% |
country, countryName | 100% |
adCountMin, adCountMax | 100% |
adCountExact — the count is a single number rather than a band | 98.7% |
38 of those advertisers enriched with ad-activity dates:
| Field | Fill | Why |
|---|---|---|
lastAdSeenAt, daysSinceLastAd, firstAdSeenAt | 94.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. |
adHistoryComplete | 100% true on this sample | true 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 |
creativesSampled | 100% | how many ads the dates were computed from |
The fields that do the work
daysSinceLastAdis the qualification field. An advertiser last seen 0 days ago is spending today; one last seen 365 days ago churned a year ago. SetactiveWithinDays: 30and the list only contains businesses currently in market.adCountMin/adCountMaxsize the account. The median advertiser on a trade keyword has run 5 ads;minAds: 20strips the hobbyists,maxAds: 500strips 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.firstAdSeenAtwithadHistoryComplete: truegives real tenure — how long this business has been buying ads.advertiserUrlis 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:
| Domain | Advertisers found | Top advertiser |
|---|---|---|
shopify.com | 2 | Shopify Inc. (39 of 40 sampled ads) |
nike.com | 6 | Nike Retail BV (25), Nike, Inc. (11) |
hubspot.com | 11 | Hubspot, 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
| Input | Effect |
|---|---|
keywords | advertiser-name search terms, one request each |
domains | reverse lookup: website → its advertisers |
countries | ISO-2 filter on the advertiser's verified location. A 1,000-row plumbing sample was 70% US, 13% AU, 7% CA, 5% GB |
minAds / maxAds | account-size band |
activeWithinDays | recency — drops anyone whose last ad predates the window |
enrichWithAdActivity | off = names only, one request per keyword and no dates; on (default) = one extra request per advertiser |
resultsPerKeyword | up to 3,000 per keyword (Google's own ceiling) |
maxItems | total row cap, and therefore your billing cap |
Pricing
Pay per advertiser delivered. No subscription, no charge for a run that finds nothing.
| Event | Price | When it fires |
|---|---|---|
advertiser-scraped | $0.001 | One 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/GetAdvertiserByIdanswers 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 togoogle/gstatic/googlesyndicationhosts. The domain relationship works in reverse only, which is whydomainsis 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.comas 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
adCountExactso 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.comserves norobots.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.