Google Ads Transparency Scraper
Pricing
from $1.50 / 1,000 ad results
Google Ads Transparency Scraper
Scrape ads from the Google Ads Transparency Center by keyword, domain, advertiser ID or URL. Get headlines, descriptions, images, YouTube links, first/last shown dates and regions for Search, YouTube, Shopping, Maps and Play ads. Filter by country, format, platform and date. No login needed.
Pricing
from $1.50 / 1,000 ad results
Rating
0.0
(0)
Developer
Brisk Pebble
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Extract ad creatives from the Google Ads Transparency Center. Search by keyword, website domain, advertiser ID or Transparency Center URL and get every ad an advertiser runs on Google Search, YouTube, Shopping, Maps and Play: headline, description, images, video links, first/last shown dates, and the regions it ran in.
The Actor calls the same JSON endpoints the Transparency Center web app uses, so it doesn't need a browser. That makes it fast and cheap to run.
What you can do with it
- Competitor research. See what ads, offers and messages a competitor is running right now, and how long each one has been live.
- Creative inspiration. Pull headlines, descriptions, CTAs, images and videos at scale.
- Monitoring. Schedule daily runs with a date filter to catch new ads as they launch.
- Political ad research. Election ads include impression and spend ranges, targeting and per-region data.
- Lead generation. Check which domains advertise on Google at all, and how much.
Input
| Field | Description |
|---|---|
| Search Query | nike (keyword), nike.com (domain), AR16735076323512287233 (advertiser ID) or a URL like https://adstransparency.google.com/advertiser/AR16735076323512287233?region=US. |
| More search queries / URLs | Run many queries in one go. Each one gets its own Max Results budget. |
| Max Results | Maximum ads saved per query (0 = no limit). Default 100. |
| Region | Only ads shown in one country (US, GB, DE, …) or anywhere. |
| Platforms | SEARCH, YOUTUBE, SHOPPING, MAPS, PLAY. |
| Ad format | TEXT, IMAGE, VIDEO. |
| Shown from / until | Only ads shown within this date range. |
| Topic | all or political (political needs a region). |
| Advertisers per keyword | How many matching advertisers a keyword expands to (default 1, best match). |
| Extract ad text, images and videos | Opens each ad's preview to get the copy and media. On by default. |
| Include full ad details | Adds per-country dates and impressions, targeting, topic, payer and all variations. |
How queries are interpreted
| Query | Treated as |
|---|---|
AR + 20 digits | Advertiser ID: all ads of that advertiser. |
nike.com, https://www.nike.com/us | Domain: all ads that point to that domain, from any advertiser. |
| Transparency Center URL | Advertiser, domain or single ad. A region in the URL overrides the Region filter. |
| Anything else | Keyword: matched against advertiser names (the site's search box). Exact name matches win, then the advertisers with the most ads. If no advertiser matches, the first suggested domain is used. |
Example input:
{"searchQuery": "nike.com","searchQueries": ["adidas", "AR16735076323512287233"],"maxResults": 200,"region": "US","platforms": ["YOUTUBE"],"format": "VIDEO","dateFrom": "2026-09-01","extractAdContent": true,"includeAdDetails": false}
Output
One dataset item per ad. Example (trimmed):
{"query": "nike.com","searchType": "domain","region": "US","advertiserId": "AR16735076323512287233","advertiserName": "Nike, Inc.","isAdvertiserVerified": true,"creativeId": "CR12733663556793270273","format": "VIDEO","adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR12733663556793270273?region=US","firstShown": "2026-10-19T15:25:01Z","lastShown": "2026-10-19T17:01:44Z","daysShown": 1,"headline": "Nike® Pegasus Plus 2","description": "Comfort for your fastest miles. The Nike Pegasus Plus 2.","displayUrl": "www.nike.com/","callToAction": "Learn more","landingPageUrl": null,"imageUrl": "https://tpc.googlesyndication.com/simgad/14944213133031273137","imageUrls": ["https://tpc.googlesyndication.com/simgad/14944213133031273137"],"videoId": null,"videoUrl": null,"previewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?...","matchedDomain": null,"scrapedAt": "2026-10-19T18:00:00.000Z"}
With Include full ad details turned on, each item also has servedRegions, regionStats (per-country first/last shown dates, impression ranges and per-platform impressions where Google publishes them), euImpressionsLow/High, topic, targeting, paidBy, containsSyntheticMedia and variations.
The dataset has two views: Overview (thumbnail, advertiser, copy, dates) and Ad copy and media. Export to JSON, CSV, Excel or XML, or read it through the Apify API.
Notes on the data
- Text ads are listed by Google as a rendered screenshot (
imageUrl). With content extraction on, the Actor also reads the ad's renderer to get the real headline and description. Dynamic Search Ads show Google's own placeholder (<dynamically generated based on landing page content>) as the headline. - Impressions and spend are only published for political ads, and for ads shown in the EU (with full details on).
- Counts are approximate. Google itself shows ranges ("~8,000 ads").
- Fields that Google does not provide for an ad are
null, never guessed.
Cost and performance
Each page of 40 ads is one request. Content extraction and full details each add about one request per ad, so turn them off when you only need IDs, dates and formats. Runs default to 1 GB memory and 10 parallel requests.
If you set a maximum cost per run, the Actor stops cleanly once it is reached. You are never charged for results it doesn't save.
Monetization (for the Actor owner)
The Actor works with Apify's pay-per-event setup out of the box:
| Event | Charged when |
|---|---|
apify-actor-start | The run starts (synthetic, charged by the platform). |
apify-default-dataset-item | Each ad is saved to the dataset (synthetic, charged by the SDK on every push). |
Optionally, define a custom event named result instead of the dataset-item event and the Actor charges it per ad. Either way, it reads the charge result on every push and stops as soon as the user's maximum cost per run is reached. Pay-per-result pricing is also supported (ACTOR_MAX_PAID_DATASET_ITEMS).
Blocking and proxies
Google rate-limits by IP. The Actor rotates sessions (each with its own cookies and proxy IP), backs off on HTTP 429/403, CAPTCHA pages and /sorry/ redirects, and retries with a fresh session. Apify Proxy is on by default. If a run logs many blocked requests, switch to Residential proxies or lower Max concurrency. An ad that can't be enriched after all retries is still saved with its basic fields and an errors note.
Local development
npm installnpm test # unit tests + an end-to-end run against a local mock of the endpointsnpm run buildapify run --input='{"searchQuery":"nike.com","maxResults":20}'
Deploy with apify push.
How it works
| Step | Endpoint |
|---|---|
| Keyword → advertisers/domains | POST /anji/_/rpc/SearchService/SearchSuggestions |
| List ads (40 per page, token pagination, filters) | POST /anji/_/rpc/SearchService/SearchCreatives |
| Ad details | POST /anji/_/rpc/LookupService/GetCreativeById |
| Ad copy and media | GET the ad's content.js preview renderer, and decode its overlay= parameter (base64 → gzip → protobuf) |
Bodies are form-encoded f.req=<JSON> with protobuf field numbers as keys. The field numbers and enums in src/constants.ts and src/rpc.ts (format: TEXT=1, IMAGE=2, VIDEO=3; platform: PLAY=1, MAPS=2, SEARCH=3, SHOPPING=4, YOUTUBE=5; dates as YYYYMMDD) come from the protobuf descriptors in the Transparency Center's own frontend bundle.
Legal
This Actor only collects data Google publishes in its public Ads Transparency Center, about advertisers rather than private individuals. You are responsible for using the data in line with Google's terms and the laws that apply to you (for example GDPR). This Actor is not affiliated with or endorsed by Google.