Google Ads Transparency Scraper
Pricing
from $0.60 / 1,000 ads
Google Ads Transparency Scraper
Google Ads Transparency Scraper extracts ad creatives from Google's Ad Transparency Center. Search by advertiser domain, advertiser ID, or name, filter by region and date range, and retrieve creative details including text, images, video previews, and show/hide dates.
Pricing
from $0.60 / 1,000 ads
Rating
0.0
(0)
Developer
Murat Uzun
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Features
Share
What does Google Ads Transparency Scraper do?
Google Ads Transparency Scraper lists the ads an advertiser runs on Google, straight from the public Google Ads Transparency Center. Give it a domain (nike.com), an advertiser ID (AR…) or an exact advertiser name. For each ad you get the creative ID, the advertiser, Google's format label (text, image or video), first and last shown day, the number of days shown, the rendered ad image, Google's preview link and a link to the ad in the Transparency Center.
Who it is for: marketers and agencies watching competitors' Google ads, sales teams checking whether a prospect advertises, and analysts tracking ad activity by country and period. Price: $1.00 per 1,000 ads on the Free plan ($0.80 Bronze, $0.70 Silver, $0.60 Gold and above), plus one $0.00005 Actor start event. Filtered-out, failed and empty results are never charged.
Filters are applied by Google, not after the fact. Country, date window and format are sent to Google with the search, so you get (and pay for) only matching ads, and the Actor pages through Google's results 100 at a time, up to 10,000 ads per advertiser.
Keep the creatives, not just links. With Save ad images every rendered ad image is downloaded into your run's storage under its creative ID, with size, SHA-256 and pixel dimensions on the row, at no extra charge. With a monitor store name, scheduled runs deliver and charge only ads you have not received before, so tracking a competitor costs only what is new.
How to use it
- Open the Input tab and enter one or more advertisers separated by
;or new lines: domains (nike.com), Transparency Center IDs (AR16735076323512287233) or exact advertiser names (Nike, Inc.). - Optionally pick a Region (2-letter country code), a date window and an Ad format.
- Set Max ads per advertiser and click Start. Each ad becomes one dataset row; a run summary is saved as
OUTPUT.
Example input
{"advertisers": "nike.com; AR16735076323512287233","region": "US","dateFrom": "2026-11-01","dateTo": "2026-11-13","format": "video","maxAds": 200}
Input options
| Field | Description |
|---|---|
advertisers | Domains, AR… advertiser IDs or exact advertiser names, separated by ; or new lines. A URL such as https://www.Booking.com/ is reduced to booking.com. Empty input runs the demo advertiser nike.com. |
region | 2-letter country code (US, GB, DE, TR, …; 250 codes). Empty = all regions. |
dateFrom, dateTo | Keep ads shown at any time inside this window (YYYY-MM-DD). |
format | all, text, image or video, as labelled by the Transparency Center. |
maxAds | Most ads per advertiser, 1–10,000 (default 40). |
downloadImages | Save each rendered ad image in the run's key-value store (default off). |
monitorStoreName | Name of a store that remembers delivered ads per advertiser and filter set; later runs deliver only new ads. |
domain, advertiser | Single-value aliases of advertisers. |
Names are looked up in Google's own advertiser suggestions (the Transparency Center search box) and only advertisers whose name matches exactly, ignoring case and punctuation, are scraped. If none matches, the run lists Google's suggestions with their AR… IDs in OUTPUT and charges nothing. For brands, the domain is usually the best key.
Output
One row per ad:
{"creativeId": "CR13013582080305528833","advertiserId": "AR06365026152670560257","advertiserName": "WPP MEDIA MANAGEMENT","domain": "nike.com","format": "video","firstShown": "2024-05-15","lastShown": "2026-09-28","daysShown": 854,"regionCount": null,"videoUrl": null,"imageUrl": null,"previewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?client=ads-integrity-transparency&…","transparencyUrl": "https://adstransparency.google.com/advertiser/AR06365026152670560257/creative/CR13013582080305528833","searchedFor": "nike.com","scrapedAt": "2026-11-13T21:00:00.000Z"}
formatuses Google's own label. Text ads are archived by Google as a rendered image, so they usually have animageUrltoo.regionCountandvideoUrlare retained for backward compatibility and are alwaysnull: this response provides neither a verified region count nor a direct video URL. Field 13 remainsdaysShown; the preview script remainspreviewUrl.daysShownis the number of days Google reports the ad was shown.previewUrlis Google's preview script for the creative (mostly text and video ads); opentransparencyUrlto view the ad.
With downloadImages the row also has imageKey, imageStoredUrl, imageBytes, imageSha256, imageWidth, imageHeight and imageError (NO_IMAGE when Google has no rendered image, e.g. most video ads; IMAGE_HTTP_ERROR, IMAGE_NOT_IMAGE, IMAGE_TOO_LARGE over 5 MB, IMAGE_NETWORK). A failed image never drops the ad row. With monitorStoreName, delivered rows carry newSinceLastRun: true.
In a live run on 13 Nov 2026 (nike.com, region US, 150 ads over 2 pages) every row had all then-reported fields except imageUrl (136 of 150) and previewUrl (14 of 150), which Google provides only for some creatives.
The OUTPUT record summarises the run: outcome (COMPLETE, PARTIAL, EMPTY or FAILED) with one reason code, ads delivered, advertisersRequested, advertisersWithAds, incompleteAdvertisers with incompleteByReason (for example {"BUDGET": 2} or {"RATE_LIMITED": 1}), failedAdvertisers (stopped by an error or the time limit, details in ERRORS) and notFoundAdvertisers, all counted per advertiser input line. The terminal status message repeats the same counts and reason. It also lists the filters and, for every advertiser, the query type (domain, id, name), pages read, Google's approximate total, why it stopped and, for names, the resolved advertiser IDs or Google's suggestions.
Errors, empty results and run outcomes
Each advertiser's stoppedReason says why it stopped: MAX_ADS, LAST_PAGE (Google has no more ads), BUDGET (your maximum charge per run), DEADLINE (run time limit), NOT_FOUND (name without an exact match), ERROR or PAGE_LIMIT (Google repeated a page token or 500 pages were read). Problems are saved in the ERRORS record with an errorCode:
| Code | Where | Meaning | What to do |
|---|---|---|---|
INVALID_INPUT | run fails | Unknown country code, a date that is not YYYY-MM-DD, a reversed window, an unknown format or maxAds out of range | Fix the field named in the message; nothing was charged |
NO_ADS_FOUND | zeroResultReason | Google lists no ads for this advertiser with these filters | Widen the filters or check the domain |
NO_NEW_ADS | zeroResultReason | Monitor run: every ad Google listed was delivered in an earlier run (alreadySeenAds) | Nothing; schedule the next run |
MONITOR_SAVE_FAILED | advertiser errorCode, OUTPUT reason for this failure | The monitor store could not be updated; the advertiser is incomplete. With delivered ads, OUTPUT is PARTIAL and the terminal explicitly reports the failure | Ads already delivered remain charged and may be delivered and charged again on the next run because the monitor history was not saved. Check the store failure before retrying |
ADVERTISER_NOT_FOUND | zeroResultReason | No advertiser has exactly this name | Use an AR… ID from the suggestions in OUTPUT, or the domain |
RATE_LIMITED | advertiser errorCode | Google answered HTTP 429/403 after three retries (5 s, 15 s, 30 s) | Run again later or with fewer advertisers per run |
HTTP_ERROR | advertiser errorCode | Google rejected the request or failed (HTTP 4xx/5xx) | Run again later; open an Issue if it repeats |
BAD_RESPONSE | advertiser errorCode | Google answered with something that is not search data | Run again later |
NETWORK | advertiser errorCode | The request did not complete | Run again later |
DEADLINE | zeroResultReason / advertiser | The run time limit came first; delivered ads are kept | Raise the timeout or lower maxAds |
When no advertiser delivered an ad because every one failed, the run is marked Failed with the error code; a run where Google simply has no matching ads succeeds and says NO_ADS_FOUND.
Pricing and cost example
You pay per ad delivered: $1.00 per 1,000 on Free, $0.80 Bronze, $0.70 Silver, $0.60 Gold and above, plus one $0.00005 start event per run. Example: 3 competitors × 200 ads = 600 ads = $0.60 on Free ($0.36 on Gold). Set Maximum cost per run in the run options; the Actor stops before it and reports BUDGET.
How it compares
Rival cells are what each Actor documents on its public Store page, price list and input schema, read on 12–13 Nov 2026 (scrapesage, solidcode, s-r); we did not run them. "Not documented" means we found no mention, not that the feature is missing. The free alternative is Google's own Transparency Center website.
| Per 1,000 ads, same unit (one ad = one result) | This Actor | scrapesage | solidcode | s-r | Transparency Center website (free) |
|---|---|---|---|---|---|
| Price, Free plan | $1.00 | $2.00 | $1.50 | $2.00 | $0, manual browsing only |
| Price, Gold plan | $0.60 | $2.00 | $0.80 | $2.00 | $0 |
| Country filter | Yes, sent to Google | Yes (region) | Yes (region) | Yes (region) | Yes |
| Date window | Yes, sent to Google | Yes (startDate) | Yes (dateFrom) | Yes (start_date, last shown) | Yes |
| Format filter | Yes, sent to Google | Yes (adFormat) | Not documented | Yes (format) | Yes |
| Platform filter (Search, YouTube, …) | Not yet | Yes (platforms) | Yes (platform) | Yes (platform) | Yes |
| More than 100 ads per advertiser | Yes, up to 10,000 | maxAdsPerSearch; paging not documented | Yes, "up to 50,000" | Yes, up to 1,000 (ads_count) | Scroll in the browser |
| Ad image files saved in your storage (size, SHA-256, width, height) | Yes (downloadImages) | Not documented; image URL (imageUrl) | Not documented; image URLs (imageUrl, previewUrl) | Not documented; image URL (image_url) | Save each image by hand |
| Deliver and charge only ads not received in earlier runs | Yes (monitorStoreName) | Yes (onlyNewAds) | Not documented | Not documented | No |
| Ad text (headline, description) | No; rendered image + preview link | Yes (includeAdText) | Not documented | Yes (ad_text) | Visible on screen |
| Export / API | Dataset JSON, CSV, Excel, API | Yes | Yes | Yes | No export |
Run it from code
JavaScript (npm i apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('webdatatools/google-ads-transparency-scraper').call({advertisers: 'nike.com; adidas.com',region: 'US',maxAds: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.length, items[0]);
Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("webdatatools/google-ads-transparency-scraper").call(run_input={"advertisers": "nike.com", "region": "GB", "format": "image", "maxAds": 100})for ad in client.dataset(run["defaultDatasetId"]).iterate_items():print(ad["format"], ad["lastShown"], ad["transparencyUrl"])
CLI:
$apify call webdatatools/google-ads-transparency-scraper --input '{"advertisers": "nike.com", "region": "US", "maxAds": 50}'
Using it with AI agents and MCP
Add the Actor to the Apify MCP server (https://mcp.apify.com/?actors=webdatatools/google-ads-transparency-scraper) and ask your agent things like "List Nike's video ads shown in the US this month" or "Does example.com advertise on Google in Germany?". The agent receives the same rows and the OUTPUT summary, including the stop reason for every advertiser.
FAQ
Does it need a Google account or API key? No. It reads the public Transparency Center.
Why did a name return nothing? Names must match an advertiser exactly. Check the suggestions in OUTPUT and rerun with the AR… ID, or use the domain.
Why do text ads have an image? Google archives text ads as a rendered image; format still says text.
How do I track a competitor every week? Schedule the Actor with the same monitorStoreName and filters. The first run delivers up to maxAds ads and remembers them (use a high maxAds for a full baseline); each later run returns only ads not delivered before and says NO_NEW_ADS when there are none. Changing the region, dates or format starts a separate baseline.
Where are the saved images? In the run's key-value store, one record per creative ID; imageStoredUrl on each row points to the file. Identical creatives share the same imageSha256.
Can I get ads from years ago? Google decides what the date filter returns. In our 13 Nov 2026 check, a January 2024 window returned no ads for nike.com in the US while recent windows did.
What changed in this version? Format labels now match the Transparency Center (earlier versions mislabelled text, image and video), the region and date filters are applied by Google (before, the region was ignored and a date made Google reject the search), results page past 100. regionCount (field 13 is days shown, not regions) is now always null and kept only for compatibility — read daysShown; videoUrl (it held Google's preview script) is always null — read previewUrl.
Data and reliability limits
- Google rate-limits bursts of requests from one IP address (HTTP 429). The Actor waits 5, 15 and 30 seconds before giving up on an advertiser with
RATE_LIMITED; very large runs may need to be split. - Domains are matched by Google exactly; the Actor lower-cases them because Google returned nothing for
Booking.combut results forbooking.com(13 Nov 2026). - Google reports only an approximate, rounded total per search (
approxTotal, e.g. 50,000 fornike.comworldwide and 8,000 for the US on 13 Nov 2026). - Field meanings come from Google's internal Transparency Center API and were checked against the Transparency Center pages on 13 Nov 2026; Google can change them without notice.
Support and feedback
Found a wrong field or a missing ad? Open an Issue on this Actor's page with the run ID; we read every one. If the Actor saves you time, a short review on the Store helps other buyers find it.