Google Ads Transparency Center Scraper & Tracker
Pricing
from $0.34 / 1,000 baseline ad results
Google Ads Transparency Center Scraper & Tracker
Scrape Google Ads Transparency Center creatives, advertisers and dates. Track competitor Google ads and detect new, updated and safely ended ads.
Pricing
from $0.34 / 1,000 baseline ad results
Rating
0.0
(0)
Developer
Luka
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Use this Google Ads Transparency scraper to collect current ads from the Google Ads Transparency Center, or reuse the same search as a change feed for competitor monitoring. For a one-time Google Ads scraper run, enter a brand, domain, advertiser ID, or Transparency Center URL and receive normalized advertiser identity, creative format, dates, media and copy when Google exposes them, destination candidates, and explicit coverage status.
For the easiest first run, choose Baseline, keep the prefilled nike.com target and 15-ad limit, then click Start.

🚀 Start in 60 seconds
- Keep Baseline — current ads.
- Enter a brand, domain,
AR…advertiser ID, or Transparency Center URL. - Keep 15 ads per target for a small first test.
- Click Start and open the Dataset when the run finishes.
{"productLevel": "BASELINE","searchTargets": ["nike.com"],"region": "ANYWHERE","adFormat": "ALL","maxAdsPerTarget": 15}
One run accepts at most 25 targets. The Console starts with a buyer-friendly 15-result prefill. Increase the result limit only when you need a larger export.
🎯 Choose the right workflow
| Workflow | Use it when | First run | Later run with the same scope | Result billing |
|---|---|---|---|---|
| Baseline | You need the ads visible now | Returns current matching ads | Returns a fresh current snapshot | One baseline_ad_result per delivered row |
| Changes | You want alerts or repeat monitoring | Creates state and returns current ads as NEW | Returns only NEW, UPDATED, and safely proven ENDED ads | One detected_change per delivered change |
You do not need to run Baseline before Changes. The first successful Changes run creates its own comparison state and returns the current ads as billable NEW rows.
On later runs, unchanged observations are not delivered and do not create a result charge. If nothing changed, the Dataset can be empty; the run-start event still applies.
For meaningful comparisons, repeat the same:
- brand, domain, advertiser ID, or Transparency Center URL;
regionandadFormatfilters;maxAdsPerTargetvalue.
Run the same monitoring scope sequentially. Changing any of these values creates a different comparison, and overlapping runs of the same scope should be avoided.
📦 What you get
Each row is a normalized Google ad record. Optional fields appear only when the source exposes them for that creative format.
| Field group | Examples | Availability |
|---|---|---|
| Ad identity | creativeId, advertiserId, advertiserName, sourceAdUrl | Core identity fields |
| Format and dates | format, firstShownAt, lastShownAt | When published by Google |
| Creative media | imageUrls, primaryMediaUrl, previewUrl | Depends on creative format |
| Structured copy | headlines, descriptions | Only when Google exposes machine-readable copy |
| Destination evidence | displayDomain, landingPageCandidateUrl | Candidate only; not a verified final landing page |
| Search context | region, searchTarget, coverageStatus | Explains the query and collection boundary |
| Monitoring | changeStatus, changedFields, observedAt | Changes workflow |
Representative Baseline row:
{"creativeId": "CR02992220324038180865","advertiserId": "AR18378488041124659201","advertiserName": "Nike Retail BV","displayDomain": "nike.com","format": "IMAGE","headlines": ["Nike Official"],"imageUrls": ["https://tpc.googlesyndication.com/archive/example"],"region": "ANYWHERE","searchTarget": "nike.com","coverageStatus": "COMPLETE","sourceAdUrl": "https://adstransparency.google.com/advertiser/AR…/creative/CR…","observedAt": "2026-08-20T21:16:14.254Z"}
The Dataset includes focused views for quick review:
- Buyer overview — the most useful identity, creative, date, destination, change, and coverage fields;
- Detected changes — monitoring events only;
- Creative research — media, copy, dates, and destination candidates;
- All buyer fields — complete normalized export for API, CSV, or downstream analysis.
Google does not expose structured copy, a direct media URL, or a destination candidate for every ad format. Missing values remain absent instead of being guessed. landingPageCandidateUrl is the destination observed in the creative data; it is not presented as a verified final advertiser landing page.
🎛️ Input guide
| Input | What it controls | Practical advice |
|---|---|---|
productLevel | Current snapshot or actionable repeat changes | Start with Baseline; use Changes for scheduled monitoring |
searchTargets | Brands, domains, AR… IDs, and Transparency URLs | One target per line, maximum 25 |
maxAdsPerTarget | Result ceiling for each target | Console prefill is 15; reaching it produces CAPPED coverage |
region | Where ads were shown | Use ANYWHERE for the broadest view; keep it stable in Changes |
adFormat | Any, text, image, or video ads | Leave ALL unless format is part of your question |
maxDeliveryEvents | Whole-run billed-row guard | Applies across all targets combined and stops delivery at the limit |
timeoutSeconds | Whole-run time limit | Stops safely with PARTIAL coverage if the selected time limit is reached |
For a low-cost first run, keep maxAdsPerTarget at 15. Increase it for representative or large exports.
💰 Pricing
This Actor uses Pay per event. The current active price is:
Baseline total = $0.01 run start + delivered rows × baseline result priceChanges total = $0.01 run start + delivered NEW/UPDATED/ENDED rows × detected-change price
| Apify plan | Baseline per 1,000 rows | Detected changes per 1,000 rows |
|---|---|---|
| Free | $0.400 | $0.800 |
| Bronze | $0.380 | $0.760 |
| Silver | $0.360 | $0.720 |
| Gold, Platinum, Diamond | $0.340 | $0.680 |
Examples on the Free plan:
| Example run | Calculation | Event charge |
|---|---|---|
| 15 Baseline rows | $0.01 + 15 × $0.0004 | $0.0160 |
| 100 Baseline rows | $0.01 + 100 × $0.0004 | $0.0500 |
| First Changes run with 100 current ads | $0.01 + 100 × $0.0008 | $0.0900 |
| Repeat Changes run with no changes | $0.01 + 0 result rows | $0.0100 |
| 1,000 detected changes across multiple targets | $0.01 + 1,000 × $0.0008 | $0.8100 |
Coverage summaries, unchanged observations, warnings, and state operations are not separate result events. Copy and media fields do not add a separate enrichment fee.
The examples show event charges at the listed rates. Your Apify account still applies its own platform billing rules shown at run time.
✅ Coverage you can trust
The Actor reports why a target stopped instead of presenting every short result as complete.
| Status | Meaning |
|---|---|
COMPLETE | The source was exhausted within the selected limits |
CAPPED | maxAdsPerTarget was reached before source exhaustion |
PARTIAL | A selected limit or recoverable source problem prevented complete collection |
EMPTY | No matching ad was found and the target summary records whether source exhaustion was proven |
ENDED is conservative. It is emitted only when the previous comparison state and the current scan provide complete-enough evidence. A CAPPED or PARTIAL run cannot convert a missing ad into ENDED.
If collection cannot meet that contract, the run reports the limitation or fails closed instead of silently claiming complete coverage.
🔌 API and automation
Use the same stable input keys from the Console through the Apify API:
const run = await client.actor('luminar/google-ads-transparency-intelligence').call({productLevel: 'CHANGES',searchTargets: ['nike.com'],region: 'ANYWHERE',adFormat: 'ALL',maxAdsPerTarget: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
After one successful manual run, save the input as your own private Apify Task and add a Schedule. Webhooks, Make, Zapier, n8n, or your own code can alert only on delivered NEW, UPDATED, or ENDED rows.
For Facebook and Instagram campaign research, use the companion Meta Ads Library Scraper + Tracker.
❓ FAQ and support
Do I need to run Baseline before Changes?
No. The first Changes run establishes state and returns current ads as NEW. Repeat the same scope to receive only actionable changes.
Why did a successful Changes run return an empty Dataset?
On repeat runs, unchanged observations are intentionally not delivered. An empty Dataset can therefore mean the monitored scope was collected successfully and nothing changed; check the run summary and target coverage.
Why are copy, media, or destination fields missing on some ads?
Google exposes different machine-readable fields by creative format. Values that are not present in the source remain absent rather than being inferred.
Is landingPageCandidateUrl the verified final landing page?
No. It is an observed destination candidate. Shopping, comparison-service, and intermediary URLs can appear there, so the Actor does not label it as a verified final advertiser page.
Can I schedule competitor monitoring?
Yes. First confirm the input manually, then save it as a private Task and attach an Apify Schedule. Keep the monitoring scope unchanged between runs.
Do I need to provide a Google account or cookies?
No account credentials are requested in the input. Never paste passwords, cookies, API tokens, or other private credentials into a target field.
How do I report a problem?
Open the Actor's Issues or Support tab and include the run ID, sanitized input, expected result, and the target coverage status. Do not post API tokens or private credentials.