Google Ads Transparency Center Scraper & API - Competitor Ads
Pricing
$0.50 / 1,000 results
Google Ads Transparency Center Scraper & API - Competitor Ads
Google Ads Transparency Center scraper for competitor ads. Input: domains, advertiser names or IDs. One result = one ad: advertiser, format (text/image/video), first/last shown, days shown, creative image or preview, ad link. Optional regions, variants, EU impressions. $0.50 per 1,000 ads.
Pricing
$0.50 / 1,000 results
Rating
0.0
(0)
Developer
Giovanni Rich
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Share
This Google Ads Transparency scraper is a Google Ads Transparency Center scraper and unofficial Google ad library API: give it website domains, advertiser names or advertiser IDs and get every ad those companies run on Google Search, YouTube, Shopping, Maps and Play as clean JSON, CSV or Excel. One row per ad: advertiser name and ID, format (text, image, video), first and last shown dates, days shown, the ad creative image or preview URL, and a link to the ad in the Transparency Center. Turn on details to add every creative variant, the countries each ad ran in with dates, the ad topic and EU impression ranges.
It calls the same data endpoints the Transparency Center website uses, over plain HTTP with no headless browser: 100 ads per request, about 5,000 ads in 30 seconds. Use it for competitor ad research, ad spy and creative swipe files, lead generation (which companies are actively buying Google ads), agency prospecting, brand monitoring and feeding AI agents with live ad data.
What you get
One dataset item per ad, newest last-shown date first:
- Advertiser:
advertiserId,advertiserName,domain(for domain queries),advertiserUrl. - Ad:
creativeId,format(text,imageorvideo),adUrl(the ad's page in the Transparency Center). - Run dates:
firstShown,lastShown(ISO timestamps) anddaysShown(the number of days Google counts the ad as shown). - Creative:
imageUrlwithimageWidth/imageHeightwhen Google serves the ad as an image (most text and image ads), otherwisepreviewUrl, Google's embeddable preview script for the ad (most video and shopping ads). - Context:
position,query,queryType,regionFilter,scrapedAt.
With Include details each ad also has:
variantsandvariantsCount: every version of the creative (image or preview URL, size).regions,regionCountriesandregionsCount: each country the ad was shown in, withlastShownand, where Google publishes it,firstShown.euImpressionsMin/euImpressionsMaxand per-countryimpressionsMin/impressionsMaxwith a per-platform split. Google publishes impressions for EU countries only.topic(for example "Apparel & Accessories") when Google assigns one.
A RUN_SUMMARY record in the key-value store lists per-query counts, the total number of ads Google reports for each advertiser or domain, which advertiser ID a typed name resolved to, and why each query stopped.
Sample output
From a real cloud run (allbirds.com, all regions):
| advertiserName | creativeId | format | firstShown | lastShown | daysShown |
|---|---|---|---|---|---|
| Allbirds Inc | CR02410131008503414785 | text | 2026-04-07 | 2026-10-10 | 163 |
| Allbirds Inc | CR04508276176740941825 | video | 2025-06-02 | 2026-10-10 | 441 |
| Allbirds Inc | CR10908757559317889025 | text | 2025-03-12 | 2026-10-10 | 534 |
Use cases
- Competitor ad research: pull every active ad for a list of competitor domains and see which creatives they keep running longest (
daysShown). - Lead generation for agencies: check a list of prospect domains and keep the ones that are running Google ads right now (
lastShownin the last few days) and how many. - Creative swipe file: collect image and video ads for a niche, with links back to the source.
- Market entry: use details to see which countries a brand advertises in and when it started in each.
- Monitoring: schedule a daily run with a date range and get only what is new.
Pricing
$0.50 per 1,000 ads (pay per result; failed requests are never charged). Same price with or without details, and queries with no ads cost nothing. The most-used Google Ads Transparency scrapers on the Store charge $1.50-$2.00 per 1,000 ads.
| You scrape | You pay |
|---|---|
| 100 ads | $0.05 |
| 1,000 ads | $0.50 |
| 10,000 ads | $5.00 |
| 100,000 ads | $50.00 |
No start fee. The Apify free plan's $5 monthly credit covers about 10,000 ads. The prefilled input (allbirds.com, 20 ads) finishes in about 5 seconds and costs $0.01.
Why this one
- Domain, name or ID in, ads out: no need to look up advertiser IDs first;
allbirds.comorNike, Inc.works. - Creative URLs on every row: image or preview link, format, first and last shown dates and days running.
- Details for the same price: every variant, the countries each ad ran in with dates, ad topic and EU impression ranges.
- Filters: region, format (text, image, video), platform (Search, YouTube, Shopping, Maps, Play) and date range.
FAQ
Is it legal? The Ads Transparency Center is public information Google publishes so anyone can see who is advertising. This actor collects business advertising data, not private personal data, and does not log in. You are responsible for how you use the results. This is not legal advice.
Is this an official Google API? Does it need a login? No. Google has no public API for the Ads Transparency Center. This actor reads the same public data the website shows to any visitor, with no login, cookies or API key.
How fast is it and how many ads can I pull?
100 ads per request, about 5,000 ads in 30 seconds. There is no fixed cap: raise maxAdsPerQuery. In testing, five advertisers x 1,000 ads finished in 32 seconds with no failed requests. Details mode adds one request per ad and runs slower.
Which proxy should I use? The default (Apify Proxy, datacenter) worked on every cloud test. Switch to residential only if a run reports blocks.
Can I schedule it or use it via API?
Yes: Apify Schedules (use dateFrom to get only new ads), the REST API and JavaScript / Python clients, Make, Zapier, n8n, webhooks, or the Apify MCP server for AI agents.
How do I find a competitor's ads?
Enter their website domain. That returns ads from every advertiser account pointing at that domain, which is usually what you want. Use the advertiser name or ID when one company runs several brands. Set dateFrom to today or yesterday to see only the ads running right now.
Can I get the ad headline and landing page?
Not as text. Google only publishes the rendered creative. Use imageUrl (you can run OCR or a vision model on it) or open adUrl.
How to use
- Paste one company per line into Domains, advertiser names or advertiser IDs: a domain (
allbirds.com), an advertiser name (Nike, Inc.), an advertiser ID (AR16735076323512287233) or an Ads Transparency Center URL. Domains are the most reliable: they return ads from every advertiser account that links to that site. - Optionally narrow by Region (two-letter country), Ad format, Google platform and a date range, and set Max ads per query (default 100). Tick Include details for regions, variants and EU impressions.
- Click Start. Download the results as JSON, CSV, Excel or HTML from the Output tab, or pull them through the Apify API, Make, Zapier, n8n or an MCP client.
Input example
{"queries": ["allbirds.com", "Nike, Inc.", "AR01371945870127267841"],"region": "US","format": "all","platform": "all","dateFrom": "2026-09-01","maxAdsPerQuery": 500,"includeDetails": false}
| Field | Type | Default | What it does |
|---|---|---|---|
queries | array of strings | ["allbirds.com"] | Domains, advertiser names, advertiser IDs (AR...) or Ads Transparency Center URLs, one per line. |
region | string | anywhere | Two-letter country code: only ads shown in that country. |
format | string | all | text, image or video. |
platform | string | all | search, youtube, shopping, maps or play. |
dateFrom, dateTo | string | empty | YYYY-MM-DD. Only ads shown inside the range. |
maxAdsPerQuery | integer | 100 | Max ads saved per line. |
includeDetails | boolean | false | Adds variants, regions, topic and EU impressions (one extra request per ad). |
maxAdvertisersPerName | integer | 1 | For name lines: how many matching advertiser accounts to include. |
Output example
Real row from a cloud run (allbirds.com, all regions):
{"position": 1,"query": "allbirds.com","queryType": "domain","advertiserId": "AR01371945870127267841","advertiserName": "Allbirds Inc","creativeId": "CR02410131008503414785","format": "text","domain": "allbirds.com","firstShown": "2026-04-07T15:44:46.000Z","lastShown": "2026-10-10T16:50:18.000Z","daysShown": 163,"imageUrl": "https://tpc.googlesyndication.com/archive/simgad/14549710068258611529","imageWidth": 348,"imageHeight": 503,"previewUrl": null,"regionFilter": "anywhere","adUrl": "https://adstransparency.google.com/advertiser/AR01371945870127267841/creative/CR02410131008503414785?region=anywhere","advertiserUrl": "https://adstransparency.google.com/advertiser/AR01371945870127267841?region=anywhere","scrapedAt": "2026-10-10T17:18:19.423Z"}
The extra fields from a real Include details run (same advertiser, lists shortened):
{"creativeId": "CR10908757559317889025","format": "text","firstShown": "2025-03-12T19:33:40.000Z","lastShown": "2026-10-10T00:53:48.000Z","daysShown": 534,"topic": null,"variantsCount": 2,"variants": [{ "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/18199488945461523136", "previewUrl": null, "width": 348, "height": 321 },{ "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/8468202034987102549", "previewUrl": null, "width": 348, "height": 174 }],"regionsCount": 5,"regionCountries": ["US", "HR", "MX", "IS", "SI"],"regions": [{ "country": "US", "regionCode": 2840, "firstShown": null, "lastShown": "2026-10-09", "impressionsMin": null, "impressionsMax": null, "platforms": [] },{ "country": "HR", "regionCode": 2191, "firstShown": "2025-04-17", "lastShown": "2026-08-31", "impressionsMin": null, "impressionsMax": 1000, "platforms": [{ "platform": "search", "impressionsMin": null, "impressionsMax": 1000 }] }],"euImpressionsMin": 0,"euImpressionsMax": 3000}
API example
Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("rel8ble/google-ads-transparency-scraper").call(run_input={"queries": ["allbirds.com", "Nike, Inc."], "region": "US", "maxAdsPerQuery": 100})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["advertiserName"], item["format"], item["firstShown"], item["lastShown"], item["adUrl"])
One HTTP call that runs the actor and returns the rows (curl):
curl -X POST "https://api.apify.com/v2/acts/rel8ble~google-ads-transparency-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"queries": ["allbirds.com", "Nike, Inc."], "region": "US", "maxAdsPerQuery": 100}'
Integrations
- API: start runs and read datasets over the Apify REST API or the JavaScript / Python clients.
- MCP / AI agents: call it from Claude, ChatGPT or any MCP client through the Apify MCP server; inputs and outputs are documented field by field.
- No-code: Make, Zapier, n8n, Google Sheets, Airtable, Slack, webhooks.
- Scheduling: run daily or weekly in Apify Schedules with
dateFromto track new competitor ads.
Limits (read before large runs)
- The ad's text is not a separate field. Google serves text ads to the Transparency Center as rendered images (
imageUrl); video and shopping ads come as a preview script (previewUrl) that draws the ad in a browser. There is no headline, description or landing-page field in Google's data. - Google reports the total number of ads as a range (for example 800-900); it is in the run summary.
- Impressions exist for EU countries only, and only as ranges. Google does not publish spend or clicks for commercial ads.
- An advertiser name can belong to several accounts. Check
resolvedAdvertisersin the run summary, or use the domain or the advertiser ID to be exact. - Ads Google removed for policy reasons are not returned.
How it works (for developers)
Each query is classified as a domain, an advertiser ID, an Ads Transparency URL or a name. Names go through the site's suggestion endpoint and the best match is taken (exact name first, then the account with the most ads). Ads are listed with SearchService/SearchCreatives, 100 per request, following the page token until maxAdsPerQuery; region, format, platform and dates are sent as server-side filters. With details on, each ad gets one LookupService/GetCreativeById call. Requests go over HTTP/1.1 with session rotation; rate-limit and captcha answers retire the session and retry on a new IP. Region codes are Google geo criterion IDs (2000 + the ISO numeric country code) and are mapped back to two-letter countries.