Google Ads Transparency Scraper
Scrape Google Ads Transparency Center by domain, advertiser name or ID. Get ad creatives, formats, first and last shown dates. $0.60 per 1,000 ads.
Ad Intelligence & Competitor Research
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
advertiserDomains,advertiserNames,advertiserIds(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0006 per Google ad result = $0.6 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Google ad result | One real row returned from Google Ads Transparency Center — an ad creative, or an advertiser when you use "List advertisers only". Sample rows, empty results and errors are never charged. | $0.0006 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-08, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
advertiserDomains | Landing-page domains to look up, for example nike.com. This is the easiest way in: you get every Google ad whose landing page sits on that domain, across all advertiser accounts. | array |
advertiserNames | Advertiser names as they appear in Google's verification records, for example "Nike, Inc.". Each name is resolved to its advertiser ID and then scraped. Turn on "List advertisers only" to get the matching advertisers instead of their ads. | array |
advertiserIds | Google advertiser IDs such as AR16735076323512287233. You can read one off any adstransparency.google.com URL. | array |
startUrls | Paste advertiser or creative permalinks, e.g. https://adstransparency.google.com/advertiser/AR16735076323512287233?region=US | array |
region | Two-letter country code to restrict the ads to (US, GB, DE, BR, IN ...), or "anywhere" for every country. Regional filtering changes both the result set and the ad counts Google reports. | string |
adFormat | Keep only one creative format. | string |
platform | Only ads Google showed on this platform. Google does the narrowing itself, so you only pay for matching ads. It takes one platform per search, so for two platforms run it twice. It does not work with "List advertisers only". | string |
maxItems | Stop after this many rows in total, across every target. Only real rows count. | integer |
listAdvertisersOnly | With "Advertiser names" filled in, return the matching advertisers (ID, name, verified country, ad-count band) instead of their creatives. Useful when you need to find an advertiser ID first. | boolean |
includeRegionStats | Fetch each creative's full country breakdown: impression band, first/last shown date and surface split (Search, YouTube, Maps, Shopping, Play) per country. Adds one request per ad. | boolean |
includeAdvertiserDetails | Look up the advertiser's verified legal name and country once per advertiser. | boolean |
egressMode | Advanced. Leave on "auto" unless a run is repeatedly refused, then try another option. | string |
What you get
A structured dataset — each result includes fields like:
advertiserNameadvertiserIdcreativeIdadFormatfirstShownAtlastShownAtregionsShownCountlandingDomainpreviewImageUrlcreativeUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Ad Intelligence & Competitor Research
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Meta Ad Library Scraper
Scrape Facebook and Instagram Ad Library ads by keyword, Page ID or URL. Get ad copy, creatives, dates and platforms. No login. $0.34 per 1,000 ads.
TikTok Trending Hashtags
Get TikTok Creative Center hashtag rankings by country: rank, posts, views, popularity curve and top creators. Three at a time. No login needed.
SaaS Competitor Monitor: Pricing, Changelog & Positioning
Track a competitor's SaaS pricing, changelog and positioning on a schedule. You get only what changed, sent to Slack. $0.01 per page checked.
G2 Reviews Scraper
Scrape G2 software reviews at $1.70 per 1,000: rating, title, full text, reviewer, date and URL. Works on any product. No G2 account or API key.
Google Trends Scraper
Get Google Trends data with no API key. Interest over time, interest by region or city, top and rising queries. $0.06 per 1,000 rows.
Yandex Search Engine Scraper (SERP API)
Scrape Yandex search results by keyword or URL. Get rank, title, URL, domain, snippet, ads and SERP features. Pick the region. $3.40 per 1,000.
Where this tool sits
- Categories
- Ad Intelligence & Competitor Research
- Platforms
Google Ads Transparency Scraper: the ads a brand is running, by domain or advertiser
Give it a landing domain like nike.com, an advertiser name, an advertiser ID or a link from the Ads Transparency Center, and get one row per 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.
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.
| Input | Advertiser domains, names, IDs, or Ads Transparency links |
| Output | One row per ad creative, or one per advertiser |
| Ceiling | 20,000 rows per run |
| Account needed | None, and no Google API key |
| Price | $0.60 per 1,000 ads, flat on every plan |
📣 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.
Two optional extras. includeRegionStats adds the per-country breakdown: impression band, first and last shown dates, and the split across Search, YouTube, Maps, Shopping and Play. includeAdvertiserDetails adds 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 you give it
Fill in at least one of the first four.
{
"advertiserDomains": ["nike.com"],
"region": "US",
"adFormat": "any",
"maxItems": 100
}
| Field | Default | What it is |
|---|---|---|
advertiserDomains | box starts at nike.com | Landing-page domains. Catches every advertiser account pointing there. |
advertiserNames | none | Names as Google verified them, like Nike, Inc.. Resolved to an ID, then scraped. |
advertiserIds | none | IDs like AR16735076323512287233, readable off any Ads Transparency link. |
startUrls | none | Advertiser or creative permalinks pasted from the site. |
region | anywhere | Two-letter country code, or anywhere. It changes the result set, not just the labels. |
adFormat | any | any, IMAGE, TEXT or VIDEO. |
platform | any | any, SEARCH, YOUTUBE, SHOPPING, MAPS or PLAY. Only ads Google showed there, and Google does the narrowing. One platform per search. Not with listAdvertisersOnly. |
maxItems | 100 | Total rows across every target, up to 20,000. It is also the most a run can bill you. |
listAdvertisersOnly | off | With names filled in, return the advertisers instead of their creatives. |
includeRegionStats | off | Per-country impression bands and surface split. One extra request per ad. |
includeAdvertiserDetails | off | The advertiser's verified legal name and country, looked up once each. |
proxyConfiguration | leave it empty | Optional. Your own servers in proxyUrls are used exactly as given and take priority. |
egressMode | auto | Advanced. Leave it on auto unless a run is repeatedly refused. |
Run it with everything empty and you get one labelled sample row so you can see the shape. That row is not charged.
📤 What you get back
A real creative row from a recent run:
{
"ok": true,
"resultType": "creative",
"advertiserId": "AR16735076323512287233",
"advertiserName": "Nike, Inc.",
"creativeId": "CR02873317349904089089",
"adFormat": "TEXT",
"firstShownAt": "2023-11-16T23:33:36.273Z",
"lastShownAt": "2026-09-14T05:20:11.033Z",
"regionsShownCount": 900,
"landingDomain": null,
"previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/17697651794169304493",
"previewIframeUrl": null,
"previewText": null,
"creativeUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR02873317349904089089?region=anywhere",
"advertiserUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233?region=anywhere",
"queriedBy": "advertiser:AR16735076323512287233",
"region": "US",
"position": 1,
"scrapedAt": "2026-09-14T05:43:17.330Z"
}
| Field | What it is |
|---|---|
firstShownAt, lastShownAt | When Google first and last observed the creative serving. A lastShownAt from the last day or two means it is live now. |
adFormat | TEXT, IMAGE or VIDEO, as Google files the ad. A Search ad like the one above is TEXT. |
regionsShownCount | How many days Google saw the ad serve. Despite the name it counts days, not regions or countries: the ad above served on 900 days. |
previewImageUrl | A direct archive address of a picture of the ad. Text ads usually carry it, and so does the odd image ad. |
previewIframeUrl | The renderer Google's own site embeds. Video ads and most image ads carry this instead, and some text ads too. |
previewText | Expect 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. |
landingDomain | The landing page's domain when Google exposes it, and null when it does not, as above. |
creativeUrl, advertiserUrl | Links straight back into the Ads Transparency Center. |
regionStats | With includeRegionStats on: regionCode, regionName, impressionsLower, impressionsUpper, firstShownDate, lastShownDate and surfaces per country. |
| Advertiser rows | resultType: "advertiser", with advertiserId, advertiserName, advertiserCountry, adCountLower and adCountUpper. |
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| An ad or an advertiser | ok: true, with a resultType | yes |
| The sample row | _sample present | no |
| A diagnostic | _diagnostic present, with an error code | no |
| Code | What it means |
|---|---|
NO_ADS | That target has no ads in that region. The row suggests trying region: "anywhere". |
NO_ADVERTISER_MATCH | No verified advertiser matches that name. Try the domain instead. |
NO_ADVERTISER_NAMES | listAdvertisersOnly is on but no names were given. |
BAD_REGION | That region code is not one Google recognises. The run stops here. |
BAD_DOMAIN, BAD_ADVERTISER_ID, BAD_URL | One of your inputs is not in a usable shape. |
RATE_LIMITED | Google throttled the run. Re-run it. |
API_ERROR, HTTP_ERROR, BAD_BODY | Google answered, but not with usable data. |
NETWORK | Google was unreachable or the response never finished. |
The Overview table shows previewImageUrl, which text ads usually carry, so video ads and most image ads look like they have no preview there. Read previewIframeUrl in the JSON for those.
▶️ How to run it
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.
💰 How much does it cost?
$0.60 per 1,000 ads, which is $0.0006 a row. The same rate on every Apify plan, no volume tiers.
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 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.
🚧 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.
regionsShownCountcounts days, not places. It is how many days the ad served. Use
includeRegionStats when you need the countries.
- A creative permalink is found by scanning that advertiser's first
maxItemscreatives, so a
creative further down their list comes back as NO_ADS even though it exists. Raise maxItems, or query the advertiser instead.
adFormatfilters 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 scraper do you need?
| If you want | Use |
|---|---|
| The ads a brand is running | This one |
| The ads showing above a keyword's web results | Google Search Results Scraper |
| Image tiles and their source pages | Google Images Scraper |
| News coverage of a brand | Google News Scraper |
| A company's physical locations and reviews | Google Maps 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.
How fast is it? A 1,000-row run came back in about a minute when it was measured in August 2026. includeRegionStats adds a request per ad, so it slows things down noticeably.
Is scraping this legal? The Ads Transparency Center is published deliberately, for public inspection. Apify's write-up on scraping and the law 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.