Google Ads Transparency Scraper - Ad Spy API avatar

Google Ads Transparency Scraper - Ad Spy API

Pricing

from $0.57 / 1,000 google ad results

Go to Apify Store
Google Ads Transparency Scraper - Ad Spy API

Google Ads Transparency Scraper - Ad Spy API

Scrape the Google Ads Transparency Center by domain, advertiser name or ID and see the ads a brand runs. Each row has the format, first and last shown dates, how many days it served, the landing domain and a preview link. Per-country impressions are optional. $0.60 per 1,000 ads.

Pricing

from $0.57 / 1,000 google ad results

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

3

Monthly active users

2 days ago

Last modified

Share

Give it a landing domain, an advertiser name or ID, and get one row per Google ad creative: the format, when Google first and last saw it serving, on how many days it served, and a link that opens the ad itself. Ads Transparency Center links work as pasted too.

What it cannot give you, said up front: money. Google does not publish spend or budget anywhere in this archive. Impressions, where they exist at all, arrive as wide bands like "up to 1,000", per country, and only when you ask for them.

InputAdvertiser domains, names, IDs, or Ads Transparency links
OutputOne row per ad creative, or one per advertiser
Ceiling20,000 rows per run
Account neededNone, and no Google API key
Price$0.60 per 1,000 ads, flat on every plan. The free plan's $5 a month covers about 8,300

๐Ÿ” What Google Ads Transparency Scraper does

The Ads Transparency Center is the public archive Google publishes of the ads running through its network. This reads it.

Four ways in. A domain catches every advertiser account pointing at it, which is the easiest start. A name is resolved to an advertiser ID first. An ID pins you to one entity. A link from the site works as pasted.

Two shapes of row. By default you get creatives. Switch listAdvertisersOnly on with a name and you get the matching advertisers instead, with their IDs, verified country and a rough ad-count band, which is how you find the right entity before spending anything.

Narrow it, or add to it. region, adFormat and platform (Search, YouTube, Shopping, Maps or Play) cut the list down. includeRegionStats adds the per-country breakdown, and includeAdvertiserDetails the advertiser's verified legal name and country.

Creatives shared between two of your targets are deduplicated, so you are not billed twice for the same ad.

๐Ÿ“‹ What data you get from each Google ad

What you getField
The advertiser and the creative's idsadvertiserId, advertiserName, creativeId
Text, image or video, as Google files itadFormat
When Google first and last saw it serve, and on how many daysfirstShownAt, lastShownAt, regionsShownCount
The landing page's domain, when Google shows itlandingDomain
A picture of the ad, or the renderer Google's site embedspreviewImageUrl, previewIframeUrl
Links back into the Ads Transparency CentercreativeUrl, advertiserUrl
Which of your targets found it, the region asked and its positionqueriedBy, region, position
Per country, with region stats on: impression band, first and last date, and where it showedregionStats
With details on: the advertiser's verified legal name and countryadvertiserLegalName, advertiserCountry
On advertiser rows: verified country and a band for how many ads they runadvertiserCountry, adCountLower, adCountUpper

โ–ถ๏ธ How to scrape Google Ads Transparency

  1. Open Google Ads Transparency Scraper and click Try for free.
  2. Put a landing domain into Advertiser domains, replacing the example.
  3. Set Region to a country code if you want one market, and Max results to what you actually need.
  4. Turn on Include per-region impressions only if you need the country breakdown, then click Start.
  5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

Run it with everything empty and you get one labelled sample row, not charged.

๐Ÿ’ฐ How much does it cost to scrape Google Ads Transparency?

$0.60 per 1,000 ads, which is $0.0006 a row. The same rate on every Apify plan, no volume tiers. On the free plan, the $5 Apify gives you each month covers about 8,300 ads.

An advertiser row costs the same as a creative row. maxItems caps the total, so it also caps what a run can bill.

Not charged: the sample row, every diagnostic row, a target that turns out to have no ads, and creatives deduplicated across two of your targets.

๐Ÿ“ฅ What you give it

Fill in at least one of the first four.

{
"advertiserDomains": ["nike.com"],
"region": "US",
"adFormat": "any",
"maxItems": 100
}
FieldDefaultWhat it is
advertiserDomainsnone, the box starts at nike.comLanding-page domains. Catches every advertiser account pointing there.
advertiserNamesnoneNames as Google verified them, like Nike, Inc.. Resolved to an ID, then scraped.
advertiserIdsnoneIDs like AR16735076323512287233, readable off any Ads Transparency link.
startUrlsnoneAdvertiser or creative permalinks pasted from the site.
regionanywhereTwo-letter country code, or anywhere. It changes the result set, not just the labels.
adFormatanyany, IMAGE, TEXT or VIDEO.
platformanyany, SEARCH, YOUTUBE, SHOPPING, MAPS or PLAY. Only ads Google showed there, and Google does the narrowing. One platform per search. Not with listAdvertisersOnly.
maxItems100Total rows across every target, up to 20,000. It is also the most a run can bill you.
listAdvertisersOnlyoffWith names filled in, return the advertisers instead of their creatives.
includeRegionStatsoffPer-country impression bands and surface split. One extra request per ad.
includeAdvertiserDetailsoffThe advertiser's verified legal name and country, looked up once each.
proxyConfigurationleave it emptyOptional. Your own servers in proxyUrls are used exactly as given and take priority.
egressModeautoAdvanced. Leave this on Auto. The other options keep every request on one network. If a run stops with a RATE_LIMITED row, wait a few minutes and run it again.

๐Ÿ“ค What you get back

A real creative row from a run on 3 October 2026. It is a Search text ad, and like nearly every text ad it comes as a picture:

{
"ok": true,
"resultType": "creative",
"advertiserId": "AR05288677867637440513",
"advertiserName": "Superhuman Platform Inc.",
"creativeId": "CR07610500010618126337",
"adFormat": "TEXT",
"firstShownAt": "2023-04-26T07:03:16.364Z",
"lastShownAt": "2026-10-03T05:10:47.599Z",
"regionsShownCount": 1256,
"landingDomain": "grammarly.com",
"previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/6694177353682601740",
"previewIframeUrl": null,
"previewText": null,
"creativeUrl": "https://adstransparency.google.com/advertiser/AR05288677867637440513/creative/CR07610500010618126337?region=anywhere",
"advertiserUrl": "https://adstransparency.google.com/advertiser/AR05288677867637440513?region=anywhere",
"queriedBy": "domain:grammarly.com",
"region": "anywhere",
"position": 1,
"scrapedAt": "2026-10-03T05:34:18.535Z"
}
FieldHow to read it
firstShownAt, lastShownAtWhen Google first and last observed the creative serving. A lastShownAt from the last day or two means it is live now.
adFormatTEXT, IMAGE or VIDEO, as Google files the ad. A Search ad like the one above is TEXT.
regionsShownCountHow many days Google saw the ad serve. Despite the name it counts days, not regions or countries: the ad above served on 1,256 days.
previewImageUrlA direct archive address of a picture of the ad. Nearly every text ad carries it, and so do many image ads.
previewIframeUrlThe renderer Google's own site embeds. Video ads carry this instead, and so do some image ads and the odd text ad.
previewTextExpect null. It only fills when Google sends an ad as plain words, and none of the text ads we checked came that way: Google sends a text ad as a picture of it, or now and then as the renderer link.
landingDomainThe landing page's domain when Google exposes it, and null when it does not.
regionStatsWith includeRegionStats on: regionCode, regionName, impressionsLower, impressionsUpper, firstShownDate, lastShownDate and surfaces per country.

๐Ÿงพ Reading the output

RowHow to spot itCharged
An ad or an advertiserok: true, with a resultTypeyes
The sample row_sample presentno
A diagnostic_diagnostic present, with an error codeno
CodeWhat it means
NO_ADSThat target has no ads in that region. The row suggests trying region: "anywhere".
NO_ADVERTISER_MATCHNo verified advertiser matches that name. Try the domain instead.
NO_ADVERTISER_NAMESlistAdvertisersOnly is on but no names were given.
BAD_REGIONThat region code is not one Google recognises. The run stops here.
BAD_DOMAIN, BAD_ADVERTISER_ID, BAD_URLOne of your inputs is not in a usable shape.
RATE_LIMITEDGoogle throttled the run. Re-run it.
API_ERROR, HTTP_ERROR, BAD_BODYGoogle answered, but not with usable data.
NETWORKGoogle was unreachable or the response never finished.

The Overview table shows previewImageUrl, which text ads and many image ads carry, so video ads and some image ads look like they have no preview there. Read previewIframeUrl in the JSON for those.

๐Ÿ’ก What people use it for

  • Seeing what a competitor is putting money behind this week, and which creatives they keep.
  • Judging what works for them: an ad that has been serving for two years is an ad that pays.
  • Finding a company's other advertising entities, since one domain often sits under several verified advertisers per market.
  • Mapping which countries a campaign actually ran in, with includeRegionStats.

From a brand name to its ads on Google and Meta, in three runs:

  1. Put the brand into advertiserNames with listAdvertisersOnly on, and pick the right advertiserId from the list.
  2. Run that ID in advertiserIds with includeRegionStats on, to see each creative and where it ran.
  3. Put the same brand into Meta Ad Library Scraper's searchTerms for its Facebook and Instagram ads.

๐Ÿšง What it does not do

  • No spend, no budgets. Google does not publish them. Impressions are wide bands and plenty of ads carry none at all.
  • No targeting criteria for political ads. Election ads show extra data in the site's own interface; the rows here carry the same fields as any other ad.
  • No ad copy as text, not even on text ads. Google keeps nearly every text ad as a picture of it, so the headline and description are in the picture at previewImageUrl, not in a field you can search. Video and rich media come as the renderer link, not a transcript.
  • regionsShownCount counts days, not places. Use includeRegionStats when you need the countries.
  • A creative permalink is found by scanning that advertiser's first maxItems creatives, so a creative further down their list comes back as NO_ADS even though it exists. Raise maxItems, or query the advertiser instead.
  • adFormat filters after reading, so asking for a rare format on a big advertiser takes a while. It does not cost more, because you pay for rows that come back.
  • One platform per search. Google narrows by a single platform at a time, so YouTube and Maps together take two runs.
  • It cannot find an advertiser who has never advertised on Google. An empty answer is a real answer, and it is not charged.

๐Ÿงญ Which Google or ad library scraper do you need?

If you wantUse
The web results page for a keyword: organic, ads, People Also AskGoogle Search Results Scraper
What a search box suggests as people typeKeyword Autocomplete Scraper
Interest in a keyword over time and by regionGoogle Trends Scraper
News articles with the publisher's real linkGoogle News Scraper
Image results and the pages they sit onGoogle Images Scraper
The ads a brand runs on GoogleThis one
Facebook and Instagram ads by keyword or PageMeta Ad Library Scraper
LinkedIn ads, naming the company in the ad and the one payingLinkedIn Ads Scraper

โ“ Questions people ask

Do I need a Google account or an API key?

No. The archive is public and there is nothing to sign in to.

How do I find an advertiser ID?

Put the company name in advertiserNames and turn on listAdvertisersOnly. You get every matching advertiser with its ID and rough ad count.

Why do several advertisers come back for one domain?

Large companies run separate accounts per market or per legal entity, and Google verifies each one. A domain catches all of them; an ID pins you to one.

Can I filter by country?

Yes. region changes the result set, not just the labels, so the same advertiser returns very different counts for US and GB.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/google-ads-transparency-scraper. Either way the run happens on your Apify account at the same price.

The archive is published deliberately, for public inspection. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

๐Ÿ†˜ If something breaks

Open the Issues tab on the actor page. Send the domain or advertiser ID, the region and the run ID. The error code on the diagnostic row usually names the problem on its own.