Google Ads Transparency Scraper - Ad Copy & Creatives avatar

Google Ads Transparency Scraper - Ad Copy & Creatives

Pricing

from $1.10 / 1,000 ad scrapeds

Go to Apify Store
Google Ads Transparency Scraper - Ad Copy & Creatives

Google Ads Transparency Scraper - Ad Copy & Creatives

[💵 $1.40 / 1K · no start fee] Scrape Google Ads Transparency Center: ad headlines and descriptions, destination URLs, images, YouTube video URLs, verified advertiser identity, dates and formats. Search, YouTube, Shopping, Maps and Play. Many competitors per run.

Pricing

from $1.10 / 1,000 ad scrapeds

Rating

0.0

(0)

Developer

WebData Labs

WebData Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Scrape the Google Ads Transparency Center by domain, keyword or advertiser ID and get the ads your competitors are running, including the ad copy.

Track which Google ads your competitors are running across Search, YouTube, Shopping, Maps and Play, without paying $200 a month for SpyFu or SEMrush.

Google publishes every ad it serves, who paid for it, where it ran and for how long. Most scrapers of this data hand you an image URL and an ID and stop there, which is useless if what you actually wanted was the headline your competitor is bidding on. This Actor returns the ad copy, the destination, the verified advertiser behind the ad, and the creative assets, as one clean row per ad.

✅ What you get / ❌ What this isn't

✅ You get❌ Not this
Headline and description text of text ads, extracted from Google's own ad renderNot an ID-and-image dump you still have to click through
Verified advertiser identity: legal name, disclosure country, verification statusNot just the display name printed on the ad
Bulk input: keywords, domains and advertiser IDs mixed in one runNot one run per competitor
Filters echoed on every row (region, platform, creativeFormat)Not an unlabelled pile you cannot segment after merging runs
videoUrl for video ads, resolved to the actual YouTube videoNot a preview shell link
A cost table that matches the configured price, to the centNot a README quoting a price the billing does not use
Drop-in field names for anyone migrating off another Transparency scraperNot a rename that breaks your existing sheet
Source-side filtering, so you only pay for ads that matchNot client-side filtering after you have been billed

🔎 Why use this Actor

  • Ad copy, not just creative IDs. For text ads the Actor opens Google's own ad render and pulls out headline, description, adText and destinationUrl. This is the single field marketers actually want and the one the popular alternative does not return at all.
  • Advertiser identity resolved once, cached, cheap. advertiserLegalName, advertiserLocation, advertiserDomain and advertiserVerified come from Google's advertiser record, looked up once per advertiser no matter how many of their ads you pull.
  • Bulk from the first run. queries takes a list. Fifty competitors, a mix of domains, brand keywords and advertiser IDs, is one run and one dataset.
  • Auto-detected input types. nike.com is treated as a domain, AR16735076323512287233 as an advertiser ID, running shoes as a keyword resolved through Google's own advertiser suggestions, and a pasted Transparency Center URL as whatever it points at.
  • Filters applied by Google, not by us. Country, platform, format and date range are sent with the query, so filtered-out ads are never fetched and never billed.
  • Runs on 256 MB. No browser, no Puppeteer. The Actor talks to the Transparency Center's own JSON endpoints, so compute cost stays near zero and results stream into the dataset as they are found.
  • Per-advertiser caps. maxResultsPerAdvertiser stops one heavy spender from eating a budget meant to cover twenty competitors.

👥 Who it's for

Performance marketers, SEO and PPC agencies, competitive-intelligence analysts and founders sizing up a market.

  • Pull every headline a competitor is bidding on before writing your own ad copy.
  • Watch a competitor's creative rotation week over week on a schedule.
  • Find who is advertising against your brand terms, and which legal entity is paying.
  • Build a swipe file of image and video creatives for a whole category.
  • Qualify leads by "is this company actively spending on Google Ads right now".

🔍 Ready-made research tasks

Each of these is a saved configuration you can open, adapt and run:

⚙️ How to track a competitor's Google ads

  1. Put the competitor's domain, brand name or Google advertiser ID into Keywords, domains or advertiser IDs. Add as many as you want to track.
  2. Set Country to the market you care about, for example US, GB or DE. Leave it empty for worldwide.
  3. Optionally narrow by Google platform (Search, YouTube, Shopping, Maps, Play) and Creative format (text, image, video).
  4. Optionally set Shown from / Shown until to study a season or a launch window.
  5. Set Max ads. Start at 20 to see what is there, then raise it or set 0 for unlimited.
  6. Click Start. Rows appear in the dataset while the run is still going. Export as JSON, CSV, Excel or XML from the Storage tab.

Watch a competitor every week

Save the run as a Task, schedule it weekly, and point a webhook or a Google Sheets integration at the dataset. Because every row carries firstShown, lastShown and approxDaysShown, comparing two weeks tells you exactly which creatives were retired and which are new.

📥 Input

{
"queries": ["nike.com", "adidas.com", "running shoes", "AR16735076323512287233"],
"region": "US",
"platform": "any",
"creativeFormat": "any",
"dateFrom": "2026-01-01",
"dateTo": "2026-07-27",
"maxResults": 200,
"maxResultsPerAdvertiser": 50,
"includeCreativeAssets": true,
"includeAdvertiserDetails": true
}
  • queries - list of domains, brand keywords, Google advertiser IDs or Transparency Center URLs. Type is detected per item. Aliases accepted so you can paste another scraper's input as-is: searchQuery, searchQueries, domains, domain, advertiserId, advertiserIds, keywords, startUrls.
  • region - two-letter country code, for example US, GB, DE, BR, IN. 190+ countries. Empty means worldwide. Country names are accepted for the major markets.
  • platform - any, search, youtube, shopping, maps, play.
  • creativeFormat - any, text, image, video. Text ads are the ones carrying headline and description copy.
  • dateFrom, dateTo - YYYY-MM-DD. Returns ads that were running inside the window. Google's archive starts in 2018.
  • maxResults - total rows across all queries. 0 means unlimited. Default 20.
  • maxResultsPerAdvertiser - optional cap per advertiser. 0 means no cap.
  • includeCreativeAssets - default on. Fetches each creative's render to extract ad copy, full-resolution images and video URLs. Turning it off makes runs faster and drops headline, description, destinationUrl and videoUrl.
  • includeAdvertiserDetails - default on. Adds the advertiser's legal name, country and verification status. Billed once per advertiser, not per ad.
  • proxyConfiguration - advanced. Google throttles repeat callers by IP, so residential proxies are the default and the Actor rotates the session on every retry.

📤 Output

advertiserNameadFormatheadlinedescriptiondestinationUrlfirstShownlastShownregion
Hubspot, Inc.textTop CRM Solution - Next-Generation CRMClose more deals with our top CRM. Track opportunities and nurture prospects.https://www.hubspot.com/products/crm2026-06-162026-07-27US
Nike, Inc.textShop Nike Back To SchoolUse promo code DAYONE to get an extra 25% off on select styles.https://nike.com2026-05-112026-07-27US
nordvpn s.a.video2026-07-232026-07-27US

Every row also carries: advertiserId, creativeId, approxDaysShown, adUrl (the ad's public page on Google), imageUrl, previewUrl, videoUrl and videoId for video creatives, assetUrls with every image variation of the creative, adText (headline and description joined), advertiserDomain, advertiserLegalName, advertiserLocation, advertiserVerified, servedCountries (every country the creative actually ran in), the echoed region / platform / creativeFormat, the searchQuery and searchType that produced the row, and scrapedAt.

The first ten fields use the same names as the widely used alternative Transparency scraper, so switching over does not break an existing sheet, dashboard or downstream script.

💵 How much does it cost?

Pay per event, no start fee, no monthly rent. You are charged for what you receive:

EventWhat triggers itFREEBRONZESILVERGOLDPLATINUMDIAMOND
ad-scrapedone ad creative written to the dataset$0.0014$0.0013$0.0012$0.0011$0.0010$0.0008
advertiser-resolvedone advertiser identity lookup, once per advertiser per run$0.0014$0.0013$0.0012$0.0011$0.0010$0.0008

On the FREE tier that is $1.40 per 1,000 ads. Realistic runs:

JobAdsAdvertisersCost on FREE
Look at one competitor501$0.07
Track 10 competitors, 100 ads each1,00010$1.41
Full pull of one big advertiser5,0001$7.00
Category sweep, 50 brands10,00050$14.07

Platform compute is on top and is small: the Actor runs at 256 MB with no browser. Filters are applied by Google before results are returned, so an ad that does not match your country, platform, format or date range is never fetched and never billed.

SpyFu and SEMrush start around $39 and $139 a month for the plans that show competitor ad copy. A weekly 1,000-ad pull on ten competitors costs about $6 a month here.

🤖 Use with AI agents via MCP

The Actor is callable from any MCP client through Apify's MCP server, so an agent can research competitor ads on its own.

Claude Code

$claude mcp add apify --env APIFY_TOKEN=your_apify_token -- npx -y @apify/actors-mcp-server --actors webdata_labs/google-ads-transparency-scraper

Cursor (~/.cursor/mcp.json) or any client that reads the standard MCP config:

{
"mcpServers": {
"apify": {
"command": "npx",
"args": ["-y", "@apify/actors-mcp-server", "--actors", "webdata_labs/google-ads-transparency-scraper"],
"env": { "APIFY_TOKEN": "your_apify_token" }
}
}
}

Prompts that work well:

  • "Pull the last 100 Google Search ads for hubspot.com in the US and list every distinct headline."
  • "Compare the ad copy nike.com and adidas.com are running in Germany this month."
  • "Which advertisers are running YouTube video ads for the keyword 'project management software'?"

🔁 Use this Actor in n8n

  1. Add the Apify node to your workflow and connect your Apify API token.
  2. Choose Run an Actor, then pick webdata_labs/google-ads-transparency-scraper.
  3. Paste the input JSON above, or map queries from an earlier node such as a list of accounts from your CRM.
  4. Add Get Dataset Items after it to pull the rows into the workflow.
  5. Route the rows wherever they belong: a Google Sheet, a Slack alert when a competitor launches new copy, or a database.

The same pattern works in Make, Zapier and plain webhooks, and the Actor can be called directly over the Apify API.

🔁 Run it on the Apify platform

Schedule the Actor daily or weekly, call it from the API, or trigger it from Make, Zapier or n8n. Datasets export to JSON, CSV, Excel, XML and RSS, and webhooks can fire the moment a run finishes. Results stream into the dataset while the run is still going, so a long pull is usable before it ends.

⚠️ Limits and caveats

  • Not every creative has text. Google's archive stores many ads only as a rendered image, including ads it labels text. When there is no text render, headline, description and destinationUrl come back empty and you still get the image. Coverage depends on the advertiser: on a verification run against a large retail brand 33 of 50 ads carried readable copy, while some B2B advertisers publish almost everything as static images and return far less. Filter for rows where headline is set if copy is all you need.
  • Dynamic search ads have no fixed headline. Google generates their headline from the landing page at serve time and publishes the placeholder text <dynamically generated based on landing page content> instead. That literal string is what you get, because that is what Google shows. The description on those ads is real.
  • destinationUrl is the ad's display URL, which is what Google publishes. The full final landing URL with tracking parameters is not part of the public archive.
  • Keyword search is advertiser discovery, not full-text ad search. A keyword is resolved through Google's own advertiser and domain suggestions, then every matching advertiser's ads are pulled. Google does not expose a public search across ad body text.
  • Google throttles by IP. The Actor paces requests and rotates proxy sessions on every retry. Very large unlimited runs are slower for this reason, not because of the parsing.
  • Impression and spend ranges are political-ads-only in Google's data, so they are not part of the standard output.
  • Coverage varies by country. Google's transparency obligations differ by market, so an advertiser can have thousands of ads in the EU and far fewer elsewhere.

Complete ad intelligence across Google, Meta, LinkedIn and TikTok:

❓ FAQ

Is it legal to scrape Google Ads Transparency Center? The Transparency Center is a public archive Google built specifically for public accountability: it exists so anyone can see who is advertising, what they said and where it ran. This Actor reads that public data. There is no login, no paywall and no personal data involved. You remain responsible for how you use the output, and for complying with Google's terms and with the laws that apply to you. Do not use it for spam or harassment.

Do I get the actual ad text? Yes, wherever Google stores a text render of the ad. Set creativeFormat to text and keep includeCreativeAssets on. Creatives that exist only as an image in Google's archive have no text to return, and the Actor says so with empty fields rather than guessing.

Am I charged for ads that get filtered out? No. Country, platform, format and date filters are sent to Google with the query. Non-matching ads are never returned and never billed.

Can I track many competitors in one run? Yes. queries is a list and mixes domains, keywords and advertiser IDs. Use maxResultsPerAdvertiser to spread the budget evenly.

Where do I find a Google advertiser ID? Open the advertiser's page on adstransparency.google.com and copy the AR... value from the URL, or just paste the whole URL into queries. Every output row also carries advertiserId.

Do I need a proxy? Apify Residential proxy is the default and is what makes larger runs reliable. Google rate-limits by IP.

Which countries are supported? 190+, by ISO code. region also accepts the names of major markets, for example Germany or United Kingdom.

📝 Changelog

0.1 - First release. Bulk queries with type auto-detection, ad copy extraction for text ads, advertiser identity resolution, video URL resolution, source-side country, platform, format and date filters, filters echoed on every row, three dataset views.

🛠️ Support

Something wrong or missing? Open an issue on the Actor's Issues tab with the run URL, the input you used and what you expected. Bugs get fixed fast.

⭐ Rate this Actor

If it saved you an afternoon, please leave a rating on the Reviews tab. Reviews are the only signal that tells other buyers this works, and they decide what gets built next. If something is broken, open an issue first so it can be fixed, rather than leaving a low rating on a problem that takes an hour to solve.