Google Ads Transparency Scraper · Creatives & Impression Ranges
Pricing
from $2.10 / 1,000 creative scrapeds
Google Ads Transparency Scraper · Creatives & Impression Ranges
Scrape Google Ads Transparency Center by brand, domain, advertiser ID or URL. Export Search copy, images, YouTube IDs, plus who paid, impression ranges and platforms when Google publishes them
Pricing
from $2.10 / 1,000 creative scrapeds
Rating
0.0
(0)
Developer
Corentin Robert
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
What does Google Ads Transparency Scraper do?
This Actor scrapes the public Google Ads Transparency Center and exports one row per creative. Paste a brand name, domain, advertiser ID (AR…), or a Transparency URL.
Two audiences, one run:
- Creative / swipe file — Search headlines, images, YouTube IDs, first / last shown.
- Media buyer / adtech — legal entity (
paidForBy), impression ranges, countries, Search vs Display — when Google publishes them.
It is a Google Ads Transparency API alternative — Google does not offer an official API for this data. It does not read Google Ads Manager. You will not get spend, CPC, CTR, or private keywords.
Why scrape the Google Ads Transparency Center?
Marketers use the Transparency Center to see which ads a competitor is running on Google Search, YouTube, and Display. Doing that by hand does not scale. Same job on Meta: Facebook Ads Library Scraper.
- Compare creative strategy across brands
- Pull Search headlines into a teardown spreadsheet
- Collect YouTube ad IDs for a swipe file
- See who paid and how many impressions Google discloses (ranges, not Ads Manager stats)
- Monitor when creatives first and last appeared
On Apify you can schedule runs, download JSON / CSV / Excel, and call the Actor from the API or integrations (Sheets, Make, n8n).
What data can Google Ads Transparency Scraper extract?
| Field | Description |
|---|---|
headline, description | Search ad copy when Google publishes the TEXT bundle |
displayUrl, businessName | Visible URL and business name on TEXT ads |
imageUrl, imageUrls | Creative image(s) (PNG/JPEG archive) |
youtubeVideoId, thumbnailUrl | YouTube ID and thumbnail when the VIDEO preview exposes them (~half of video ads) |
format | TEXT, IMAGE, VIDEO, or UNKNOWN |
firstShownAt, lastShownAt | Run dates (ISO UTC) |
advertiserName, advertiserId, advertiserUrl, creativeUrl | Advertiser identity and Transparency links |
paidForBy | Legal entity Google shows as paying for the ad |
impressionsAvailable | true when Google published an impression range |
impressionsLower, impressionsUpper | Public impression range (not Ads Manager). Lower may be null (UI “< N”) |
impressionsByRegion, platformNames | Country split and surfaces (Search / Display / Maps, inferred) |
targeting | Include/exclude flags for the targeting methods Google discloses |
Not extracted (and not invented): spend, budget, CPC, CTR, conversions, Ads Manager keywords, emails. Impression counts and targeting method flags are public Transparency fields — they stay null when Google does not publish them for that creative.
How to scrape competitor Google ads
- Open this Actor in Apify Console.
- In Query, paste a brand (
Qonto), a domain (qonto.com), an advertiser ID (AR…), or a Transparency Center URL. - Keep Region on Anywhere unless you only care about one country.
- Leave Max ads at 20 for a first run, then raise it.
- Keep Include who paid & impression ranges on unless you only want a swipe file.
- Click Start. Download the dataset as JSON, CSV, or Excel. Use the Creatives — Media buyer view for impression columns.
See the Input tab for the visible options (Residential proxy is automatic — not in the form).
How much will it cost to scrape Google ads?
This Actor uses pay-per-event pricing. You only pay per creative written to the dataset. Compute and Residential proxy are included — there is no Actor-start fee. Paid Apify plans get a lower price per creative.
| Apify plan | Per creative | Per 1,000 |
|---|---|---|
| Free | $0.003 | $3.00 |
| Bronze | $0.0027 | $2.70 |
| Silver | $0.0024 | $2.40 |
| Gold | $0.0021 | $2.10 |
| Platinum | $0.0018 | $1.80 |
| Diamond | $0.0015 | $1.50 |
| Run (Free plan) | Approx. cost |
|---|---|
| Default (20 ads) | $0.06 |
| 100 ads | $0.30 |
| 1,000 ads | $3.00 |
Set Max ads and, on Apify, a max total charge so a run cannot exceed your budget. A row with empty headline / youtubeVideoId / impressions still counts — Google did not publish those fields; the creative was still scraped.
Default memory is 512 MB (HTTP only, no browser).
Input
Visible Console fields:
| Field | Default | Notes |
|---|---|---|
query | Qonto | Name, domain, AR…, or Transparency URL |
region | anywhere | ?region= on a pasted URL overrides this |
adFormats | All | Text / Image / Video |
dateRange | Any time | Filter on last-shown date (client-side) |
maxAdvertisers | 3 | Name/domain search only |
maxAds | 20 | Global cap for the run (0 = unlimited) |
enrichMediaBuyerData | true | Include who paid & impression ranges. Off = swipe file only. |
platforms | All | Optional Search / Display / Maps filter (forces the lookup above) |
Residential Apify Proxy is always on (hidden). A creative ID (CR…) alone is not enough — paste the full Transparency creative URL. Ads Manager URLs (ads.google.com) are rejected.
Example:
{"query": "Qonto","region": "anywhere","maxAds": 20}
Output
You can download the dataset in JSON, HTML, CSV, or Excel.
{"advertiserName": "Qonto SA","advertiserId": "AR05318151651209510913","creativeId": "CR01362885945854001153","format": "TEXT","headline": "Qonto, le compte pro en ligne","description": "Gérez toutes vos dépenses pro et optimisez votre trésorerie.","displayUrl": "www.qonto.com","imageUrl": "https://tpc.googlesyndication.com/archive/simgad/…","youtubeVideoId": null,"paidForBy": "OLINDA SAS","impressionsAvailable": true,"impressionsLower": null,"impressionsUpper": 1000,"platformNames": "SEARCH, DISPLAY","firstShownAt": "2025-05-15T13:36:30.000Z","lastShownAt": "2026-07-28T13:02:38.000Z","region": "anywhere","creativeUrl": "https://adstransparency.google.com/advertiser/AR05318151651209510913/creative/CR01362885945854001153?region=anywhere"}
Console views: Creatives — Overview, Creatives — Copy & media (swipe file), Creatives — Media buyer (who paid / impressions).
Related Actors
These Actors cover the same job or the next step in the workflow. Apify’s automatic recommendations stay inside one category — this list is the rest of the toolkit.
| Actor | Use it when |
|---|---|
| Instagram Sponsored Feed Scraper | Sponsored posts in the Instagram feed |
| Facebook Ads Library Scraper · Meta Page Ads, Creatives & Reach | Meta Ads Library — page ads, creatives and reach |
| Facebook Page Scraper · Extract Email, Phone & Website | Email, phone and website from a Facebook Page |
| Shopify App Store Developer Contacts · Emails & Address | Shopify App Store partner emails — unique publishers, not per app |
| SW Website Rankings Scraper | Rank the website / domain after you have the URL |
| Google Maps search — place details & contacts | Google Maps places, details and contacts |
| French Companies · Search & SIREN Enrich | French companies: search and SIREN enrich |
FAQ, disclaimers, and support
Why is Residential proxy always on?
The Transparency Center returns a Google captcha (sorry) on datacenter or bare IPs. The Actor always uses Apify Proxy group RESIDENTIAL (hidden in Console). The run fails immediately if that proxy cannot start.
Why is the headline empty on some TEXT ads?
Google sometimes publishes Search ads as a screenshot (simgad) without the HTML text bundle. Those rows stay TEXT with imageUrl set and headline null. That is expected — not a failed scrape.
Why are some YouTube IDs empty?
Google does not always embed a YouTube ID in the public VIDEO preview. Empty youtubeVideoId is expected for a large share of video ads — not a failed scrape.
Do I pay for rows with empty headlines or YouTube IDs?
Yes. Pricing is per creative scraped, not per filled field. Empty copy / video IDs / impressions mean Google did not publish them on the Transparency Center — not that the scrape failed.
Why are impressions empty on some rows?
Google only publishes impression ranges for some creatives and regions (often EU Transparency / DSA). impressionsAvailable: false is expected — not a failed scrape. Spend and exact impression counts from Ads Manager are never available here.
Can I export unique advertisers instead of every ad?
Yes. Set What to export to Unique advertisers. You get one row per AR… with paidForBy when Google publishes it. There is no advertiser sitemap — start from a brand, domain, or advertiser ID, like a targeted run of Apify Creator Scraper rather than a full dump.
How are Search / Display / Maps assigned?
Surface names are inferred from Transparency GetCreativeById ids (3 = Search, 5 = Display, 4 = Maps) using Qonto dumps. The numeric platforms[].id is always kept. Treat labels as best-effort.
Why can a name match several advertisers?
Search uses Google’s autocomplete. The Actor takes the first Max advertisers suggestions in Google’s order. It does not guess which “Qonto” is the one you meant. Use an AR… ID or Transparency URL for a precise advertiser.
Does region filtering always match the website?
The Actor sends the known geo id for the selected country. Google sometimes ignores geo on the creatives list. Each row still has a region label. Do not treat it as a 100% server-side guarantee.
Our Actors are ethical and do not extract private user data such as personal emails. They only extract what Google has chosen to publish on the Ads Transparency Center (creatives, public impression ranges, and country splits). We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you are unsure whether your reason is legitimate, consult your lawyers.
Use the Issues tab for bugs and feature requests. Use the API tab to run the Actor programmatically.