How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
apify.comin Domains. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
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.
- 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.
Good for
- 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 good fit
- 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
headlineanddescriptionarenull, andimageUrlhas 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.
Who uses it
PPC managers
Collect competitor headlines and descriptions for new ad ideas.
Creative teams
Save image and YouTube ads of a brand in one list.
Market researchers
Check in which countries a brand advertises and how much.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.004 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Ad | $0.0012 (from $0.001 on paid Apify plans) | Charged for each ad row saved to the dataset (complete or partial), with ad text, image/YouTube link, dates and per-country reach included. Not-found and error rows are free. |
Examples
- One ad: about $0.0052.
- 1,000 ads: about $1.40 (50 runs of up to 20).
- Every day 100 ads, for 30 days: about $4.20 a month (5 runs a day).
- 20 ads once a week (4 runs a month): about $0.11 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 3,500 ads.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Can I see how much a competitor spends?
No. Google does not publish spend, clicks, keywords or targeting. You get impression ranges where Google shows them.
Why is the text empty for some ads?
Google stores some text ads only as a picture. Then you get the image link instead.
How many brands can I check at once?
Up to 20 domains and advertisers per run, with up to 500 ads each.
Do I need a Google Ads account?
No. The tool reads the public Transparency Center without login or an API key.
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.
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.
Details
Step by step on Apify
- Open the Input tab.
- Keep the prefilled domain
apify.comin Domains, or add your own domain, for exampleshopify.com. - Keep Max ads per advertiser or domain at
20and Region atanywhere. - Click Start.
- Open the Output tab. The Ads view shows advertiser, format, dates, impressions and ad text.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Competitor ad monitoring | domains | one row per ad | headline, firstShown, lastShown, daysShown | schedule + Google Sheets |
| PPC copy research | domains or advertisers, format = text | text ad | headline, description, displayUrl | export CSV |
| Market and country check | advertisers + region | ad with regions | regions, impressionsMin, impressionsMax | BI tool via API |
| Creative library | format = image or video | image or video ad | imageUrl, videoUrl, callToAction | download images |
Tips for better results
- Use a domain when you do not know the exact advertiser name.
- Filter by format to get only text, image or video ads.
- Split big jobs into several runs; one run collects about 600 to 800 ads.
Limits and good to know
- 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
CAPPEDwithDEADLINE. Split big jobs into several runs - A larger run timeout does not make one run collect more
- A row with
statuspartialis still charged: the ad is there, but some details (for example text or countries) could not be read.statusReasonsays what is missing - Inputs that were not done when the run stopped get free
errorrows
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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"
}Use it from code
Actor ID: cliqtomedia/google-ads-transparency-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/google-ads-transparency-scraper").call(run_input={
"domains": [
"apify.com"
],
"region": "anywhere"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~google-ads-transparency-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domains": ["apify.com"], "region": "anywhere"}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/google-ads-transparency-scraper")
result = tool.invoke({"run_input": {"domains": ["apify.com"], "region": "anywhere"}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (30)
| Field | Type | Meaning |
|---|---|---|
status | string | Row result: complete, partial (some details missing), not_found (no ads for this input) or error. Only complete and partial rows are charged. |
statusReason | string | Plain-English reason for partial, not_found or error rows; null when complete. |
errorCode | string | Machine code for error rows, e.g. SOURCE_BLOCKED, RATE_LIMITED, DEADLINE_REACHED; null otherwise. |
input | string | Your input value as given (advertiser name, AR… ID or domain). |
inputType | string | How the input was read: advertiserId, advertiserName or domain. |
advertiserId | string | Google advertiser ID (AR…). |
advertiserName | string | Verified advertiser name as shown in the Ads Transparency Center. |
advertiserCountry | string | Advertiser country (two-letter code) when Google shows it. |
domain | string | Domain the ad points to, when Google shows it. |
creativeId | string | Google creative (ad) ID (CR…). |
format | string | Ad format: text, image or video. |
firstShown | string | When the ad was first shown (ISO timestamp, from Google). |
lastShown | string | When the ad was last shown (ISO timestamp, from Google). |
daysShown | integer | Days shown, as reported by Google. |
regions | array | Countries where the ad ran: code, name, criteriaId, firstShown, lastShown, impressionsMin, impressionsMax. null when details are off or unavailable. |
impressionsMin | integer | Lower bound of total impressions Google reports (range, not an exact count). |
impressionsMax | integer | Upper bound of total impressions Google reports. |
variations | integer | Number of ad variations Google shows for this creative. |
headline | string | Text ad headline from the Google ad preview. |
description | string | Text ad description from the Google ad preview. |
displayUrl | string | Display URL shown in the text ad. |
callToAction | string | Call-to-action button text of display ads (e.g. Sign Up), when Google shows it. |
text | string | Headline and description joined into one string; null when Google has no text for the ad (for example text ads shown only as an image). |
imageUrl | string | Image URL of the ad: image ads, display ads (main image) and text ads Google renders as an image. |
videoUrl | string | YouTube link of a video ad. |
creativeUrl | string | Google preview URL of the creative. |
adUrl | string | Public Ads Transparency Center page of this ad. |
regionFilter | string | Region filter used for this row: anywhere or a country code. |
sourceUrl | string | Ads Transparency Center page for your input. |
fetchedAt | string | When the Actor read this row (ISO timestamp). |
Input settings (10)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Domains | domains | array | ["apify.com"] |
| Advertisers (name or ID) | advertisers | array | |
| Region | region | string | "anywhere" |
| Ad format | format | string | "all" |
| Shown from | dateFrom | string | |
| Shown until | dateTo | string | |
| Max ads per advertiser or domain | maxAds | integer | 20 |
| Per-country reach and impressions | includeDetails | boolean | true |
| Ad text and YouTube link | includeAdText | boolean | true |
| Proxy | proxyConfiguration | object | {"useApifyProxy": true} |
Use cases with this tool
Each guide shows all the steps and the other tools.