Google Ads Transparency Scraper – Advertiser Ads
Pricing
from $0.50 / 1,000 ad returneds
Google Ads Transparency Scraper – Advertiser Ads
Scrape Google's Ads Transparency Center: every ad an advertiser or domain runs, with format, first and last shown dates, days shown, image or preview, a link to the ad and Google's ad count. Look up by name, domain or advertiser ID; filter by country, format and date. No login. Unofficial.
Pricing
from $0.50 / 1,000 ad returneds
Rating
0.0
(0)
Developer
Simple Actor
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Scrape Google's Ads Transparency Center as structured data. Give it a website, an advertiser or a link from the Center, and every ad Google shows for it comes back as a row: the ad's format, when it was first and last shown, how many days it has run, a picture of the ad or its preview, the advertiser behind it and where they are based, and a link to the ad's own page — newest-shown first.
Built for competitor research, ad monitoring, agency pitches and brand safety: see what a competitor is running right now, what they launched this month, and which countries each ad reached.
No login, no API key, no browser, no account of yours involved. A hundred ads arrive in one request.
$0.50 per 1,000 ads — $0.05 for a typical 100-ad lookup. Apify platform usage included, nothing else to pay. A line that cannot be looked up is never charged.
Unofficial. Not affiliated with, endorsed by, or sponsored by Google.
Features
- Look up anything you have — a website (
nike.com, or any link to it), an advertiser ID (AR16735076323512287233), an advertiser name (Nike), or a link copied from the Transparency Center. - A website finds every advertiser behind it — a brand's own accounts, its
regional entities and its agencies.
nike.comreturns ads from 30-odd advertisers. - Google's own count on every row —
googleAdCountMin/googleAdCountMaxsay how many ads Google holds for the lookup, so you can see how complete your pull is before asking for all of them. - Country filter, or anywhere — ads shown in one country, or in any.
- Format filter — text, image or video ads only.
- Date windows that work —
shownSincefor what is running now,firstShownSincefor what was launched recently. Both are applied exactly on each ad's own dates. - Where each ad ran — optional per-ad list of every country it was shown in, with the last date it ran there, and its number of variations.
- The advertiser's country on every ad row, not only in a separate lookup.
- Runs stay green. A line that cannot be looked up becomes an error row, so one bad line never costs the rest of the job.
Input
{"targets": ["nike.com", "AR16735076323512287233", "Nike"], // one per line"maxAds": 100, // ads per line, newest-shown first (up to 50,000)"region": "anywhere", // a two-letter country code, or anywhere"adFormat": "any", // any | text | image | video"shownSince": "30 days", // optional: only ads shown in this window"firstShownSince": "", // optional: only ads first shown in this window"includeAdDetails": false // add the countries each ad ran in}
| Field | Type | Default | What it does |
|---|---|---|---|
targets | array | — | Websites (or links to them), advertiser IDs, advertiser names, or Transparency Center links, one per line. |
maxAds | integer | 100 | Ads per line, up to 50,000. A hundred arrive per request. |
region | string | anywhere | Two-letter country code (US, GB, DE…), or anywhere. |
adFormat | string | any | text, image or video. |
shownSince | string | — | Only ads shown on or after this date: 2026-08-01, or a window like 30 days. |
firstShownSince | string | — | Only ads first shown on or after this date — new ads. |
includeAdDetails | boolean | false | Add each country the ad ran in, with its last date there, and its variation count. One extra request per ad. |
Website, advertiser or name?
- A website (
nike.com) is the widest net and the right choice for a brand: it finds every advertiser whose ads point at that site, agencies included. - An advertiser ID (
AR…, from an advertiser's page in the Center) is exact: one account's ads. - A name (
Nike) is looked up among Google's suggestions, and the matching advertiser with the most ads is used —Nikemeans Nike, Inc., not the one-ad account called "Nike". Every row names the advertiser, so you can see which one was used. - A pasted link keeps its own country, because it is the view you were looking at.
How many ads
Ads come a hundred per request, newest-shown first, and every row carries
Google's own count for the lookup. Big brands hold thousands; maxAds decides
how far to read. shownSince stops reading as soon as older ads begin, so
"what are they running this month" is fast even for a brand with 10,000 ads.
firstShownSince cannot stop early: a new ad can sit below thousands of
long-running ones that were also shown today. With it, maxAds is how far down
the list new ads are looked for, so set it high — only the ads kept are
charged. Without either filter, every ad up to maxAds is returned and
charged, so for new ads use firstShownSince rather than reading everything
and filtering afterwards.
Output
One item per ad, in the run's dataset:
{"type": "ad","position": 1,"adId": "CR03243835622955155457","advertiserId": "AR16735076323512287233","advertiserName": "Nike, Inc.","advertiserCountry": "US","format": "text","firstShown": "2022-11-30T14:48:56.165Z","lastShown": "2026-09-11T00:28:36.454Z","daysShown": 1371,"imageUrl": "https://tpc.googlesyndication.com/archive/simgad/5268894407758702852","imageWidth": 348,"imageHeight": 275,"previewUrl": null,"adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR03243835622955155457?region=anywhere","domain": null,"regions": null,"variations": null,"googleAdCountMin": 7000,"googleAdCountMax": 8000,"target": "AR16735076323512287233","targetType": "advertiser","region": "anywhere","retrievedAt": "2026-09-11T08:00:00.000Z"}
| Field | What it is |
|---|---|
adId, advertiserId | Google's IDs for the ad and the advertiser — stable, for deduplicating across runs. |
advertiserName, advertiserCountry | Who runs the ad, and the country they are based in. |
format | text, image or video. |
firstShown, lastShown, daysShown | When Google first and last showed the ad, and for how many days. lastShown is today for an ad still running. |
imageUrl, imageWidth, imageHeight | A picture of the ad as Google archived it — how Google keeps nearly every text ad. |
previewUrl | Google's preview script that renders the ad, for video ads and ads without a picture. |
adUrl | The ad's page in the Transparency Center. |
domain | On a website lookup, the site Google files the ad under. |
regions, variations | With includeAdDetails: each country the ad ran in with its last date there, and how many variations it has. |
googleAdCountMin, googleAdCountMax | Google's own count of ads for this lookup, as the range it states. |
position | The ad's place in Google's newest-shown-first order. With a date filter, skipped ads leave gaps. |
target, targetType, region | The line it answered, how that line was read, and the country it was limited to. |
A line that could not be looked up is its own row with type: "error", an
error code (bad_input, not_found, read_failed or parse_failed) and an
errorDescription. The run itself stays green either way, and its status
message says how many lines could not be looked up — so if you run on a
schedule, check for type: "error" rows rather than trusting the run status.
The one thing that fails a run is the Actor itself being broken. An error it
did not expect on a line is a row too, with error: "parse_failed", and the
other lines carry on. Only when every line in a run ends that way does the
run fail, with the reason in its status message and in each row.
An empty dataset means every line was looked up and Google shows no ads for
it. An advertiser ID that does not exist comes back as a not_found row, not
as silence.
How to use
From Apify Console
- Open the Actor and click Try for free / Start.
- Put one website, advertiser ID or name per line into Advertisers or websites. For a brand, the website finds the most.
- Set Ads per advertiser or website. Every row shows Google's own count, so a first run of 100 tells you how many there are.
- Optionally narrow by Country, Format, or a date window.
- Click Start, then open the Dataset tab — the Ads view shows a picture of each — and export as JSON, CSV or Excel.
From the API
curl -s "https://api.apify.com/v2/acts/simple.actor~google-ads-transparency/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"targets": ["nike.com"], "shownSince": "30 days", "maxAds": 200}'
Monitoring a competitor's new ads with the JavaScript client:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('simple.actor/google-ads-transparency').call({targets: ['competitor.com'],firstShownSince: '7 days',maxAds: 500,});const { items } = await client.dataset(run.defaultDatasetId).listItems();// Deduplicate across scheduled runs on `adId`, which is stable.
From Claude
Claude can run this Actor for you through Apify's MCP server. This connector URL gives it this Actor, Google Maps Leads, Website Contacts and LinkedIn Jobs, and nothing else:
https://mcp.apify.com/?tools=simple.actor/google-maps-leads,simple.actor/website-contacts,simple.actor/google-ads-transparency,simple.actor/linkedin-jobs
On claude.ai or the desktop app, go to Customize → Connectors → + Add → Add
custom connector, paste the URL and sign in to Apify; in Claude Code, run
claude mcp add --transport http lead-tools "<url>", then /mcp to sign in.
Runs are charged to your Apify account at the prices below.
A tested prompt:
Compare the Google ads that hoka.com, brooksrunning.com and allbirds.com started in the last 30 days. Fetch only those new ads: set the tool's firstShownSince to "30 days" and maxAds to 5000 so none are missed. For each site, give Google's total ad count, the number of new ads, and how the new ones split by format. When you read the results, ask only for the fields you need.
Name the filter in the prompt. This one returned the 399 new ads for $0.20.
Asked the same question in plainer words, Claude read every ad up to 5,000 a
site — 10,751 of them, $5.38 — and only then counted the new ones. The
maxAds of 5,000 is there for depth, as How many ads
explains. The
full guide
has both runs and what to check in Claude's commentary.
Use cases
- Competitor research — everything a rival is running, by format and country, with how long each ad has lasted.
- New-ad monitoring — a weekly run with
firstShownSincecatches every ad a competitor launches. - Agency pitches and audits — pull a prospect's full ad history before the meeting.
- Brand safety — find advertisers running ads that point at your domain.
- Market mapping — which advertisers and agencies are active in a category, and where.
Pricing
Simple pay-per-result pricing — no subscription and no start fee.
| Event | Price |
|---|---|
| Ad returned | $0.0005 |
| Ad details added (countries it ran in, variations) | $0.0005 |
What that comes to:
- A lookup at the default depth, 100 ads: $0.05.
- 1,000 ads: $0.50 — or $1.00 with details on.
- A big brand's whole list, around 8,000 ads: about $4.
Error rows are never charged, and a lookup Google has no ads for costs nothing.
Limits worth knowing
- Most text ads are pictures. Google archives text ads as an image of the
ad, so their words come as a picture (
imageUrl), not as text. - No platform filter. The Center does not reliably filter by Search, YouTube, Shopping or Maps, so it is not offered.
- Political ads are not covered. They live in a separate part of the Center.
- Google's count is a range ("8,000–9,000"), as the Center itself shows it.
FAQ
Is scraping the Google Ads Transparency Center legal? The Center is a public transparency tool Google publishes so anyone can see who is advertising and what. This Actor reads the same data the Center's own page loads. Check the platform's terms and your own use before relying on it.
Do I need a Google account, cookies or an API key? No. There is no login, no cookie and no key.
Why did a name give me a different advertiser than I expected? A name is matched among Google's suggestions and the matching advertiser with the most ads is used. Every row names the advertiser; for an exact account, use its advertiser ID from the Center, and for a whole brand, its website.
How do I know a lookup failed if the run stays green?
Check for rows with type: "error" — that is the failure channel by design, so
one bad line never costs the rest of the job. The run's status message also
counts how many lines could not be looked up.
Data comes from Google's Ads Transparency Center and is subject to Google's terms. Unofficial, and not affiliated with Google.