Google Ads Transparency Scraper: Ads, Dates, Regions
Pricing
from $1.19 / 1,000 ad delivereds
Google Ads Transparency Scraper: Ads, Dates, Regions
Google Ads Transparency Center ads of any domain, brand or advertiser: headline, description, image & YouTube links, first/last shown, regions. No API key, no login. MCP-ready for Claude, Cursor, ChatGPT and AI agents. Pay per result, errors and empty results are free. $1.40 per 1,000 ads.
Pricing
from $1.19 / 1,000 ad delivereds
Rating
0.0
(0)
Developer
ABM
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share
Google Ads Transparency Scraper & API
$1.40 per 1,000 ads ($0.0014 per ad). Pay per result, no monthly rental, no start fee. Errors, blocked requests, duplicates and empty results are free.
Export every Google ad a competitor runs from the Google Ads Transparency Center: Search (text), Display (image) and YouTube (video) ads. Search by domain, advertiser name / keyword, advertiser ID or a pasted Transparency Center URL. Filter by region, format and date range. Each ad is one clean JSON row with its headline, description, display URL, image link, YouTube video link, first/last shown dates, days running, a ready-to-use Markdown card for LLMs and, optionally, the regions where it ran and all its variations.
- No API key, no login, no Google account. Google publishes no official API for the Ads Transparency Center: this actor works as that API.
- No browser: it calls the same public JSON endpoints as the website, so it's fast and cheap.
- MCP-ready: AI agents (Claude, Cursor, ChatGPT...) can call it as a tool and get structured JSON back.
- Built for monitoring:
onlyNewreturns only ads that appeared since your last scheduled run.
How much does it cost?
| Event | Price |
|---|---|
| Ad delivered (one dataset row) | $0.0014 |
Examples:
- 100 ads of one competitor = $0.14
- 1,000 ads = $1.40
- 10,000 ads = $14.00
What is free: runs that find no ads, ads that can't be fetched, rows with no content, duplicates (the same ad found by a domain and an advertiser search is charged once) and ads skipped by onlyNew. Regions and variations (Include ad details) cost nothing extra. Set Maximum cost per run in the run options: the actor stops cleanly when it is reached. The Apify datacenter proxy that comes with every plan is enough in normal conditions.
Input example
{"domains": ["nike.com"],"searchTerms": ["Decathlon"],"advertiserIds": ["AR14188379519798214657"],"startUrls": ["https://adstransparency.google.com/?region=FR&domain=adidas.com"],"region": "US","adFormat": "all","startDate": "30 days","maxAdsPerQuery": 100,"includeDetails": false,"extractAdContent": true,"downloadImages": false,"onlyNew": false}
You need only one of domains, searchTerms, advertiserIds or startUrls. You can mix them: the same ad is never returned (or charged) twice in a run.
| Input | What it does |
|---|---|
domains | Every ad pointing to a website, from all accounts of the brand |
searchTerms | Brand / company name matched to Transparency Center advertisers (maxAdvertisersPerSearchTerm) |
advertiserIds | One verified advertiser account (AR...) |
startUrls | Advertiser, single ad or ?domain= URLs from the Transparency Center |
region | Only ads shown in this country (anywhere = all) |
adFormat | all, text, image or video |
startDate / endDate | Only ads shown in this period (YYYY-MM-DD or 30 days) |
maxAdsPerQuery | Max ads per domain / advertiser (0 = all) |
includeDetails | Adds regions with dates and all variations (same price) |
downloadImages | Saves image ads to your key-value store with a permanent link |
onlyNew | Only ads not delivered by your previous runs (for schedules) |
Output example
{"creativeId": "CR10449491775734153217","advertiserId": "AR14188379519798214657","advertiserName": "Nike, Inc.","advertiserCountry": null,"adFormat": "text","headline": "Nike Running Shoes | Free Delivery & Returns","description": "Shop the latest Nike running shoes. Members get free delivery.","displayUrl": "nike.com","textAssets": {"headline": "Nike Running Shoes | Free Delivery & Returns", "description": "Shop the latest Nike running shoes. Members get free delivery.", "visurl": "nike.com"},"imageUrl": null,"width": null,"height": null,"videoId": null,"videoUrl": null,"videoThumbnailUrl": null,"previewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?...","firstShown": "2025-06-02T00:00:00Z","lastShown": "2025-10-12T00:00:00Z","daysShown": 133,"targetDomain": "nike.com","regions": null,"variationCount": null,"variations": null,"imageFileUrl": null,"adUrl": "https://adstransparency.google.com/advertiser/AR14188379519798214657/creative/CR10449491775734153217?region=anywhere","searchType": "domain","searchValue": "nike.com","searchRegion": "anywhere","scrapedAt": "2025-10-14T09:12:44Z","markdown": "### Nike, Inc. - text ad CR10449491775734153217\n- Shown: 2025-06-02 to 2025-10-12 (133 days)\n- Domain: nike.com\n- Headline: Nike Running Shoes | Free Delivery & Returns\n- Description: Shop the latest Nike running shoes. Members get free delivery.\n- Display URL: nike.com\n- Transparency Center: https://adstransparency.google.com/advertiser/..."}
(Values are illustrative.) Fields that don't apply (e.g. videoUrl on a text ad) are null, and every row has the same keys. With Include ad details, regions looks like [{"regionCode": "FR", "regionName": "France", "firstShown": "...", "lastShown": "..."}]. Export as JSON, CSV, Excel or HTML, or read the dataset through the API.
Use with AI agents (MCP)
Add the actor to any MCP client (Claude Desktop, Claude Code, Cursor, ChatGPT connectors...) through the Apify MCP server:
https://mcp.apify.com/?actors=<username>/google-ads-transparency
Then ask, for example: "List the video ads nike.com ran in France in the last 30 days and summarize their messages." The markdown field gives the model a compact card per ad (advertiser, format, dates, headline, description, links), ready for prompts or a RAG index.
Integrations
- API: start a run and read the dataset in one HTTP call (
run-sync-get-dataset-items), or use the Python / JavaScript clients. - Make, Zapier, n8n: use the Apify app / node to run the actor and pass each ad to the next step.
- Google Sheets: export the dataset as CSV, or use the Apify integration to append new ads automatically.
- Schedules + webhooks: run daily with
onlyNew: trueand send the new ads to Slack or email.
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("<username>/google-ads-transparency").call(run_input={"domains": ["nike.com"], "region": "US", "maxAdsPerQuery": 50,})for ad in client.dataset(run["defaultDatasetId"]).iterate_items():print(ad["adFormat"], ad["headline"] or ad["imageUrl"] or ad["videoUrl"])
Use cases
- Competitor ad monitoring: see every ad a competitor runs on Google Search, Display and YouTube and how long each one has been running. Long-running ads are usually the winners.
- New-ad alerts: schedule with
onlyNewand get only the ads launched since the last run, at $0.0014 each. - Ad copy research: collect real headlines and descriptions in your niche to brief copywriters or feed an AI model.
- Creative inspiration: pull image and video ads with direct links and sizes, and save images to your storage for mood boards.
- Market entry checks: filter by country to see who advertises in a market and since when.
- Lead generation for agencies: find brands that advertise on Google (so they have an active budget) and see what they run.
- Compliance and brand protection: spot ads pointing to your domain from accounts that aren't yours.
FAQ
Is there an official Google Ads Transparency API? No. Google publishes the Transparency Center as a website only. This actor reads the same public data and returns it as JSON, with no API key and no quota.
Domain or advertiser: which should I use? A domain returns every ad pointing to that site, from all of the brand's accounts (several countries, agencies, resellers). An advertiser ID returns only that verified account's ads, including ads for other domains. A brand name is matched to the closest advertiser account(s). For brands with one account per country, raise Advertisers per search term.
How does onlyNew work?
The actor remembers which ads it delivered for each domain / advertiser + region, in your named key-value store google-ads-transparency-state. The next run skips those ads, and skipped ads are free. The first run returns everything. Delete the store to start over.
Why is the headline empty on some ads?
Image and video ads usually carry their text inside the image or video, so only text ads have headline and description. A few text ads use a format that can't be decoded; their previewUrl still shows the ad.
Does the date filter use exact dates?
An ad is kept if it was shown at some point in your range (lastShown ≥ start and firstShown ≤ end). Google keeps roughly the last year of history for most advertisers.
Does the region filter work? Yes. The region is sent to Google the same way the website does it. With Include ad details, each ad also lists the exact countries where it ran.
How many ads can I get? As many as the Transparency Center shows. For very large advertisers, the Transparency Center may stop paginating around 1,000 ads per query. To go further, split by region or format.
Do I need a proxy? No. The default Apify datacenter proxy is included in your plan. If Google rate-limits those IPs, the actor retries with new IPs. If you allow it, it then finishes through the residential proxy (only the small JSON calls, never images).
Is it legal? The Ads Transparency Center is a public Google service built so anyone can see who advertises. This actor reads only that public data, without login. You are responsible for how you use the data.
Limits
- Ads disappear from the Transparency Center when Google removes them, and history is usually about one year.
- Google does not publish impressions or spend for commercial ads (only for political ads in some regions), so they are not in the output.
- Video ads come with the YouTube link, not a video file.
- Very large queries (tens of thousands of ads) take time, because calls to Google are paced to avoid blocks.
- Google can change its internal format at any time. The actor reads fields defensively, keeps delivering what it can, and never charges for empty rows.