Google Ads Transparency Scraper - Ad Text, No Login avatar

Google Ads Transparency Scraper - Ad Text, No Login

Pricing

from $1.00 / 1,000 ads

Go to Apify Store
Google Ads Transparency Scraper - Ad Text, No Login

Google Ads Transparency Scraper - Ad Text, No Login

Get Google ads by advertiser name, AR ID or domain from the Ads Transparency Center: ad text, image and YouTube links, first/last shown dates, per-country reach and impressions. Region, format and date filters. No login.

Pricing

from $1.00 / 1,000 ads

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Google Ads Transparency Scraper gets the ads that a brand or website runs on Google. Add a domain, an advertiser name or an advertiser ID (AR…), and the Actor returns one row per ad from the public Google Ads Transparency Center: ad text, image or YouTube link, first and last shown dates, countries and impression ranges.

No Google login, cookies or API key. The prefilled run (20 ads for apify.com) usually takes about 30–70 seconds and costs about $0.028 ($0.004 start + 20 ads, from $0.024 on paid plans).

Google Ads Transparency Scraper: add brands or domains, get each Google ad with its text, dates, regions and impressions

Table of contents

What it does

The Google Ads Transparency Center shows the ads that verified advertisers run on Google: search (text) ads, image and display ads, and YouTube video ads. This Actor reads the same public pages for you and saves each ad as a clean dataset row.

For every ad you get:

  • Who: advertiser name, advertiser ID (AR…), domain.
  • What: format (text, image, video), headline, description, display URL, call-to-action, image URL, YouTube link.
  • When: first shown, last shown, days shown, as reported by Google.
  • Where and how much: countries where the ad ran, with dates and impression ranges per country, plus a total impression range.
  • Links: the public Transparency Center page of the ad and the Google preview URL.

Filters: region (one country or anywhere), format, and a date range.

Good fit

  • See which ads a competitor runs on Google right now, and when Google first showed them.
  • Collect ad copy (headlines and descriptions) of a brand for PPC research.
  • Check in which countries a brand advertises and how big the reach is.
  • Save image ads and YouTube ads of a brand for creative research.

Not a fit / limits

  • The Actor shows what Google publishes in the Transparency Center. It does not show clicks, spend, keywords or targeting.
  • Impressions are ranges from Google (for example 1,000–2,000), not exact numbers. Google does not show them for every ad.
  • Some text ads exist only as a picture. For them headline and description are null, and imageUrl has the picture.
  • Up to 500 ads per advertiser or domain, and about 600–800 ads per run in total. For more, split the job across several runs.
  • The Actor does not solve CAPTCHAs. If Google blocks all requests, the run stops with a clear error.

Quick start

  1. Open the Input tab.
  2. Keep the prefilled domain apify.com in Domains, or add your own domain, for example shopify.com.
  3. Keep Max ads per advertiser or domain at 20 and Region at anywhere.
  4. Click Start.
  5. Open the Output tab. The Ads view shows advertiser, format, dates, impressions and ad text.

Expected result: about 20 ad rows for the domain, each with status complete.

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExampleRecommendation
domainsDomainsarray of stringsone of domains / advertisersprefill ["apify.com"]domain or URLads of every advertiser that links to the domain["shopify.com"]best way to find a brand
advertisersAdvertisers (name or ID)array of stringsone of domains / advertisersemptyname, AR… ID or advertiser page URLads of one advertiser account["AR04545223091738902529"]use the AR… ID for an exact account
regionRegionstringnoanywhereanywhere or a 2-letter country codeonly ads shown in this countryUS, DEkeep anywhere for all countries
formatAd formatstringnoallall, text, image, videoonly this ad formattextuse for copy or creative research
dateFromShown fromstringnoemptyYYYY-MM-DD, from 2018-01-01only ads shown on or after this date2026-09-01for a time window
dateToShown untilstringnoempty (today)YYYY-MM-DD, not before dateFromonly ads shown on or before this date2026-09-30leave empty for today
maxAdsMax ads per advertiser or domainintegerno201–500max ad rows for each domain or advertiser100each ad row is charged
includeDetailsPer-country reach and impressionsbooleannotruetrue, falseadds regions and impression rangestruekeep on; it is in the price
includeAdTextAd text and YouTube linkbooleannotruetrue, falsereads headline, description, image and YouTube link from the ad previewtruekeep on; it is in the price
proxyConfigurationProxyobjectnoApify Proxy (datacenter)Apify Proxy settingshow requests reach Google{"useApifyProxy": true}keep the default

Notes:

  • Add at least one domain or advertiser. You can mix both, up to 20 inputs in total.
  • Duplicates are merged: apify.com and https://www.apify.com/ count as one input.
  • An advertiser name must match whole words of an advertiser in the Transparency Center. If several advertisers match, the Actor takes the best match and writes a warning in the run summary. If nothing matches, you get a free not_found row that lists the closest names with their AR… IDs.
  • With the default proxy, the Actor switches to Apify residential proxy by itself when Google blocks the datacenter proxy. If you choose your own proxy group or URLs, this switch is off.

Interacting settings

WhenInput AInput BEffective behaviorExampleCost/result effect
Filter by country and dateregiondateFrom / dateToonly ads shown in this country in this windowFR, September 2026fewer rows, fewer charges
Only text adsformat = textincludeAdText = trueheadline and description for each text ad that has themshopify.comsome text ads have only an image
Faster light runincludeDetails = falseincludeAdText = falseno regions, no headline/description/YouTube link (image and creative links stay)—same price per row

Input examples

Ads of a website

{
"domains": ["apify.com"],
"region": "anywhere",
"maxAds": 20
}

Expected behavior: finds all advertisers that link to apify.com and returns up to 20 ads. Expected output: rows with advertiserName, format, headline, firstShown, regions. Limit or cost note: 20 ad rows + start = about $0.028.

Image ads of one advertiser in France, one month

{
"advertisers": ["AR04545223091738902529"],
"region": "FR",
"format": "image",
"dateFrom": "2026-09-01",
"dateTo": "2026-09-30",
"maxAds": 50
}

Expected behavior: returns only image ads of this account shown in France in September 2026. Expected output: rows with imageUrl, callToAction, firstShown, lastShown. Limit or cost note: if the advertiser had no such ads, you get one free not_found row.

Output

Each ad is one row in the default dataset. Each input without ads gives one free not_found row, so you always see what happened to every input.

Output example

Input: {"domains": ["apify.com"], "maxAds": 20}. One row, regions trimmed to two countries:

{
"status": "complete",
"statusReason": null,
"errorCode": null,
"input": "apify.com",
"inputType": "domain",
"advertiserId": "AR04545223091738902529",
"advertiserName": "Apify Technologies s.r.o.",
"advertiserCountry": null,
"domain": "apify.com",
"creativeId": "CR12249652250414153729",
"format": "text",
"firstShown": "2026-07-02T13:54:49.000Z",
"lastShown": "2026-10-14T10:26:38.000Z",
"daysShown": 105,
"regions": [
{ "code": "IE", "name": "Ireland", "criteriaId": 2372, "firstShown": "2026-07-03", "lastShown": "2026-10-13", "impressionsMin": 0, "impressionsMax": 1000 },
{ "code": "IL", "name": "Israel", "criteriaId": 2376, "firstShown": null, "lastShown": "2026-10-14", "impressionsMin": null, "impressionsMax": null }
],
"impressionsMin": 1000,
"impressionsMax": 2000,
"variations": 1,
"headline": "Apify for your AI - Largest marketplace for AI",
"description": "Connect Claude, ChatGPT, or Cursor to Apify Store via MCP and put tools to work today.",
"displayUrl": "www.apify.com/",
"callToAction": null,
"text": "Apify for your AI - Largest marketplace for AI — Connect Claude, ChatGPT, or Cursor to Apify Store via MCP and put tools to work today.",
"imageUrl": null,
"videoUrl": null,
"adUrl": "https://adstransparency.google.com/advertiser/AR04545223091738902529/creative/CR12249652250414153729?region=anywhere",
"regionFilter": "anywhere",
"sourceUrl": "https://adstransparency.google.com/?region=anywhere&domain=apify.com",
"fetchedAt": "2026-10-14T11:15:51.596Z"
}

creativeUrl is left out here because it is long. In this row Google shows no dates or impressions for Israel, so those values are null.

How much you get depends on the ad. In our test runs, 9 of 20 apify.com ads had a headline (the rest were text ads shown only as a picture), and 18 of 20 shopify.com image ads had an imageUrl.

Output fields

FieldMeaningTypeCan be empty?Example / enumSource / notes
statusrow resultstringnocomplete, partial, not_found, erroronly complete and partial are charged
statusReasonwhy a row is partial, not_found or errorstringyes, null when completeThe Transparency Center shows no ads for ...plain English
errorCodemachine code of an error rowstringyesSOURCE_BLOCKED, DEADLINE_REACHEDnull if no error
inputyour input as givenstringnoapify.com
inputTypehow the input was readstringnodomain, advertiserId, advertiserName
advertiserIdGoogle advertiser IDstringyesAR04545223091738902529
advertiserNameadvertiser name in the Transparency CenterstringyesApify Technologies s.r.o.
advertiserCountryadvertiser country, 2-letter codestringyesnulloften null: Google shows it only for some advertisers
domaindomain the ad links tostringyesapify.comwhen Google shows it
creativeIdGoogle ad IDstringyesCR12249652250414153729
formatad formatstringyestext, image, video
firstShownfirst time the ad was shownstring (ISO time)yes2026-07-02T13:54:49.000Z
lastShownlast time the ad was shownstring (ISO time)yes2026-10-14T10:26:38.000Z
daysShowndays shown, as reported by Googleintegeryes105
regionscountries where the ad ranarrayyes[{"code": "IE", ...}]code, name, criteriaId, firstShown, lastShown, impressionsMin, impressionsMax
impressionsMinlower end of the total impression rangeintegeryes1000Google range, not exact
impressionsMaxupper end of the total impression rangeintegeryes2000
variationsnumber of ad variationsintegeryes1
headlinetext ad headlinestringyesApify for your AI - Largest marketplace for AIfrom the ad preview
descriptiontext ad descriptionstringyesConnect Claude, ChatGPT, or Cursor ...from the ad preview
displayUrldisplay URL of a text adstringyeswww.apify.com/
callToActionbutton text of a display adstringyesSign Upwhen Google shows it
textheadline and description in one stringstringyesnull when the ad has no text
imageUrlimage of the adstringyeshttps://tpc.googlesyndication.com/archive/simgad/...image, display and image-only text ads
videoUrlYouTube link of a video adstringyeshttps://www.youtube.com/watch?v=...
creativeUrlGoogle preview URL of the adstringyes
adUrlpublic Transparency Center page of the adstringyeshttps://adstransparency.google.com/advertiser/AR.../creative/CR...
regionFilterregion filter of this runstringnoanywhere
sourceUrlTransparency Center page for your inputstringyes
fetchedAtwhen the Actor read the rowstring (ISO time)no2026-10-14T11:15:51.596Z

null means Google does not show this value for the ad. The Actor never writes 0 or an empty string instead of a missing value. Impression ranges can start at 0 because Google shows "less than 1,000" as 0–1,000.

Output entities and surfaces

SituationDataset/API/KVS/live viewResult shapeUser action
Normal adDataset, Ads viewone row, status = completeopen, export or use the fields
Some details missingDatasetrow with status = partial and statusReasondata is still useful; missing fields are null
No ads for an inputDatasetone free row, status = not_foundcheck the domain, name, region or dates
Google blocked the run or time ran outDataset + key-value store RUN_SUMMARYfree error rows for inputs not done, summary with status and stopReasonrun again later, or split the inputs

The key-value store record RUN_SUMMARY has the run status (COMPLETE, PARTIAL, NO_RESULTS, CAPPED, ERROR, INVALID_INPUT, CANCELLED), counts for each input, and warnings.

Pricing

Pricing unit

This Actor uses pay-per-event pricing:

EventWhenFREEBRONZESILVERGOLD and higher
Actor startonce per run (per GB of memory; default 256 MB = 1 event)$0.004$0.004$0.004$0.004
Adeach complete or partial ad row$0.0012$0.0011$0.00105$0.001

Ad text, images, YouTube links, countries and impressions are all included in the ad price. not_found and error rows are free. A run with no ads costs only the start event ($0.004). You pay no separate platform usage.

You can set a maximum cost for a run in Apify. When the Actor reaches it, it stops cleanly, keeps the rows it already saved, and the run summary shows CAPPED with CHARGE_LIMIT.

Cost examples

ScenarioInput scopeAd rowsStartAds (FREE plan)Stop/cap behavior
Small1 domain, maxAds 1010$0.004$0.012about 30–70 seconds
Prefill1 domain, maxAds 2020$0.004$0.024about 30–70 seconds
Medium3 domains, maxAds 100300$0.004$0.36about 1–2 minutes
Large5 domains, maxAds 200up to ~800$0.004up to ~$0.96stops after about 4.5 minutes of work with the rows it has
1,000 ads2 runs, 500 ads each1,000$0.008$1.20 (GOLD: $1.00)split into 2 runs
Nothing found20 domains with no ads, or a filter with no match0$0.004$020 free not_found rows

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Competitor ad monitoringdomainsone row per adheadline, firstShown, lastShown, daysShownschedule + Google Sheets
PPC copy researchdomains or advertisers, format = texttext adheadline, description, displayUrlexport CSV
Market and country checkadvertisers + regionad with regionsregions, impressionsMin, impressionsMaxBI tool via API
Creative libraryformat = image or videoimage or video adimageUrl, videoUrl, callToActiondownload images

Scheduling and monitoring

  • Create an Apify schedule that runs the same input every day or week.
  • Each run returns the ads Google shows at that time. Compare runs by creativeId to find new ads, or sort by firstShown.
  • lastShown tells you if an ad is still running.
  • The Actor does not keep state between runs; each run is a full snapshot and each ad row is charged again.

API, export and integrations

  • API: start the Actor with the Apify API and read the dataset items as JSON.
  • Export: download the dataset as JSON, CSV, Excel or XML from the Output tab.
  • Webhooks / no-code: use Apify integrations (Make, Zapier, Google Sheets, webhooks) to send new rows to your tools.

Use with AI agents (MCP)

  • MCP server URL with only this Actor: https://mcp.apify.com?tools=cliqtomedia/google-ads-transparency-scraper
  • Smallest useful input:
{ "domains": ["apify.com"], "maxAds": 20 }
  • Key output fields: advertiserName (who runs the ad), format (text, image or video), headline and description (ad copy), firstShown / lastShown (when it ran), regions (countries with impression ranges).
  • Typical run: 20 ads in about 30–70 seconds for about $0.028. Limits: up to 20 inputs and 500 ads per input; about 600–800 ads per run.

Limits and partial results

  • Up to 20 domains and advertisers per run, up to 500 ads for each.
  • One run works for about 4.5 minutes and collects about 600–800 ads in total in our tests. If it has more to do, it stops with the ads it has and the summary shows CAPPED with DEADLINE. Split big jobs into several runs.
  • A larger run timeout does not make one run collect more.
  • A row with status partial is still charged: the ad is there, but some details (for example text or countries) could not be read. statusReason says what is missing.
  • Inputs that were not done when the run stopped get free error rows.

Troubleshooting

I get a not_found row for my advertiser name

Symptom: status is not_found and statusReason lists "Closest" names. Likely reason: the name does not match whole words of an advertiser in the Transparency Center. Check: look at the closest names and their AR… IDs in statusReason. Action: put the right AR… ID in Advertisers, or use the website domain in Domains.

I get not_found for a domain that runs ads

Symptom: status is not_found with "The Transparency Center shows no ads for ...". Likely reason: there are no ads for this region, format or date range. For example, a brand may show no text ads in one country. Check: open the sourceUrl link in your browser. Action: set Region to anywhere, Ad format to all, or remove the dates.

The run stopped with SOURCE_BLOCKED

Symptom: the run summary shows ERROR or PARTIAL with SOURCE_BLOCKED, and inputs that were not done have free error rows. Likely reason: Google showed a CAPTCHA to all proxy IPs. The Actor does not solve CAPTCHAs. Check: did you set your own proxy? Then the automatic switch to residential proxy is off. Action: keep the default proxy and run again later.

I asked for 500 ads but got fewer

Symptom: the summary shows CAPPED with DEADLINE, or the advertiser simply has fewer ads. Likely reason: one run works for about 4.5 minutes; many inputs with large maxAds do not fit. Action: run fewer inputs per run.

FAQ

Do I need a Google account or an API key?

No. The Actor reads the public Ads Transparency Center pages. No login, cookies or API key.

Why are headline and description empty for some text ads?

Google stores some text ads only as a picture. Then the text is only in the image, headline and description are null, and imageUrl has the picture.

Are impressions exact?

No. Google shows ranges, for example 1,000–2,000. The Actor returns the lower and upper end. Google does not show impressions for every ad or country; then the values are null.

How fresh is the data?

Every run reads the Transparency Center live. lastShown tells you when Google last showed the ad.

Which name match does the Actor use?

For a name, it looks for an advertiser whose name has the same whole words (exact name first). It never guesses a different company. For an exact account, use the AR… ID from the advertiser page URL.

Support

For a bug, a question or a feature request, open an issue in the Issues tab of this Actor. Include the run ID, your input (domains or advertisers) and the statusReason or error text. Never send tokens, cookies or billing data.