Google Ads Transparency Center API — Advertisers & Ads avatar

Google Ads Transparency Center API — Advertisers & Ads

Pricing

from $1.20 / 1,000 ad creatives

Go to Apify Store
Google Ads Transparency Center API — Advertisers & Ads

Google Ads Transparency Center API — Advertisers & Ads

Google's Ads Transparency Center as rows: give brand names, AR ids or domains and get each verified advertiser's profile and its ads — format, first and last shown, days shown, preview link, regions and variations. People advertising under their own name are excluded. No browser, no login, no key.

Pricing

from $1.20 / 1,000 ad creatives

Rating

0.0

(0)

Developer

Insight Solutions

Insight Solutions

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Security

Limited permissions

Share

Every ad a brand runs on Google, as rows. Give this Actor brand names, advertiser ids or domains and get back each verified advertiser's profile — name, verified country, the Ads Transparency Center's own ad-count range, the formats and dates of its ads, its DUNS number — and one row per ad: format (text, image or video), first and last shown, the Center's days-shown count, the preview link or snapshot image, the ad's page in the Center, and optionally every country it was shown in. JSON, CSV or Excel.

The data is Google's own Ads Transparency Center, the public register of ads by verified advertisers. This Actor asks the Center's own JSON interface for it — the same requests the Center's web page makes — so there is no browser, no login and no API key, and a 1,000-ad advertiser takes about six seconds.

People are excluded by design. The Center also verifies individuals who advertise under their own name; they never appear in a row. $2.00 per 1,000 ads and $5.00 per 1,000 advertiser profiles on the FREE tier.

Try it in 30 seconds

This is the Store prefill; paste it and run:

{ "advertisers": ["Nike", "Allbirds", "Duolingo", "Notion"], "region": "US", "maxAdsPerAdvertiser": 100 }

Four brand names, each resolved to its verified advertiser (Nike → Nike, Inc., the advertiser with 9,000–10,000 ads, not the one-ad advertiser that is literally called "Nike"), then the 100 most recently shown ads of each in the US: 4 profile rows and up to 400 ad rows from 16 requests, in seconds. On the test suite's fixtures it returns exactly 4 profiles and 400 ads for $0.821.

Ads of one format, for an advertiser id and a domain, shown since September:

{
"advertisers": ["AR16735076323512287233", "allbirds.com"],
"region": "US",
"formats": ["video"],
"maxAdsPerAdvertiser": 200,
"sinceDate": "2026-09-01"
}

Where an ad ran, every variation of it, and the advertiser's DUNS number:

{ "advertisers": ["Nike"], "region": "anywhere", "maxAdsPerAdvertiser": 50, "includeRegions": true, "includeDuns": true }

From code — client.actor("insight.solutions/google-ads-transparency-api").call(run_input={"advertisers": ["Nike"]}) with apify-client, or POST https://api.apify.com/v2/acts/insight.solutions~google-ads-transparency-api/run-sync-get-dataset-items.

What comes back

An ad row — a real Nike text ad from the captures in our test suite (null columns cut):

{
"rowType": "ad",
"input": "Nike",
"resolvedBy": "suggestion",
"advertiserId": "AR16735076323512287233",
"advertiserName": "Nike, Inc.",
"creativeId": "CR03708909800050917377",
"format": "text",
"firstShown": "2022-11-30",
"lastShown": "2026-11-03",
"daysShown": 1377,
"snapshotImageUrl": "https://tpc.googlesyndication.com/archive/simgad/3393474210464605364",
"adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR03708909800050917377?region=US",
"region": "US"
}

An image or video ad carries previewUrl instead — the Center's own signed preview link, exactly as the Center returns it (https://displayads-formats.googleusercontent.com/ads/preview/content.js?client=ads-integrity-transparency&…&sig=…). With includeRegions each ad also gets "regions": ["US", "CA"], "variationCount": 3 and "variationPreviews": [ … ].

After an advertiser's ads, its advertiser row:

{
"rowType": "advertiser",
"input": "Nike",
"resolvedBy": "suggestion",
"advertiserId": "AR16735076323512287233",
"name": "Nike, Inc.",
"region": "US",
"queryRegion": "US",
"adCountMin": 9000,
"adCountMax": 10000,
"adsReturned": 100,
"byFormat": { "text": 38, "image": 42, "video": 20 },
"firstSeen": "2021-10-25",
"lastSeen": "2026-11-03",
"activeDays": 1836,
"dunsNumber": "50957364",
"transparencyUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233?region=US"
}

adCountMin/adCountMax are the Center's own range for the advertiser's whole library; adsReturned, byFormat, firstSeen, lastSeen and activeDays describe the ads this run returned. Each run ends with a free summary row (advertisersResolved, adsByFormat, requests), and anything that could not be returned — a name with no verified advertiser, an individual, a tie, a rate limit — is a free diagnostic row (errorType, error) instead of a charge.

Use cases

  • Competitor ad libraries — every live and past ad of the brands you compete with, by format, with first and last shown dates and a link to each one in the Center: what they run, how long a creative survives, when a new campaign starts.
  • Agency pitch research — before a pitch, the prospect's whole Google ad footprint: how many ads, which formats, how recent, which countries (includeRegions).
  • Creative benchmarking — long-running ads (daysShown) are the ones that work; sort a category's ads by it and read the winners.
  • Launch and campaign monitoring — schedule it with sinceDate and get only what each brand started showing since the last run.
  • Lead lists of brands that advertise — an advertiser with thousands of ads on Google has a paid-media budget; name, region, adCountMax and dunsNumber across a category is that list, company-level only.
  • Brand-safety and impersonation checks — search your own domain and see which verified advertisers run ads that point at it.

To see which brands sponsor YouTube channels, podcasts and newsletters rather than buy Google ads, use our Sponsor & Advertiser Finder — same company-level rows, from creators' published sponsor reads.

How it compares

  • No browser — seconds, not minutes. Tools that drive a headless browser through the Center's web page pay for its page loads and scripts on every ad. This Actor sends the Center's own JSON requests: about 200 ms and 26 KB per 40 ads.
  • Individuals filtered out. The Center verifies people as well as companies, and a brand-name search returns both. Here, anyone advertising under their own name is skipped before a single one of their ads is read.
  • Names, ids and domains. A brand name is resolved to the right verified advertiser (exact name first, then the largest ad library); an AR id is read directly; a domain goes through the Center's domain filter.
  • Billed per ad, not per run or per minute. Failures, people, ties and rate limits are free rows.
  • Google's links, untouched. Preview and snapshot links are copied exactly as the Center returns them; nothing is re-signed, rebuilt or proxied.

Where the data comes from

Everything comes from Google's Ads Transparency Center (adstransparency.google.com), the register Google launched in 2023 of ads shown by verified advertisers across its surfaces — Search, YouTube, Display, Maps, Shopping and Play. Its records go back further than its launch: the oldest ad in our test captures was first shown in October 2021.

What the Center publishes, and this Actor returns: the advertiser's verified name and country, an approximate ad count, each ad's format, the dates it was first and last shown, the Center's count of days shown, the countries it was shown in, its variations and a preview.

What the Center does not publish for these ads, and this Actor therefore does not return: no spend, no impressions, no clicks, no landing-page analytics, and no targeting (the Center publishes audience details only for some ads shown in the EU, and this Actor does not read them). Political-ad reports are a separate part of the Center that this Actor does not read.

The Center's interface is called exactly as its own page calls it: the same POST requests to adstransparency.google.com/anji/_/rpc/…, from Apify's datacenter proxy. The Actor never sends cookies and never fetches the preview scripts themselves.

How advertisers are resolved

You typeWhat happensresolvedBy
A brand name — Nike, Allbirds, NotionThe Center's advertiser search (40 suggestions), then the ranking belowsuggestion
An AR id — AR16735076323512287233 — or a Center advertiser linkRead directly. The name comes from its ads; the country and ad-count range from its own search entryid
A domain — nike.com, https://www.allbirds.com/The Center's domain filter: the ads that point at the domain, grouped by advertiserdomain

The advertiser search matches loosely — "Nike" returns Nikeson AB, Nikea GmbH and people whose names happen to contain Nike — so the candidates are ranked, best first:

  1. The name matches. Equal once legal forms and punctuation are dropped (Nike, Inc., NIKE SRL and Nike S.r.l. all equal Nike), or starting with the name as whole words (Notion Labs, Inc. for Notion). Anything looser is not a match.
  2. The largest ad library — the Center's ad-count range, highest first.
  3. The same verified country as region (no preference for anywhere).

maxAdvertisersPerName of them are taken (1 by default). When the next one ties with the last one taken on all three — two IRM Insurance advertisers with one ad each, say — the best is still returned and a free ambiguous row lists every tied AR id with its country and ad-count range, so you can pass the id you mean.

Individuals. An advertiser whose name has no organisation marker — no legal form (Inc, LLC, GmbH, SRL, AB, Pty…), no business word (Group, Agency, Studio, Shop, Media, Labs, Insurance, Clinic…), no &, no digit — and has the shape of a person's name (two to four parts: one to three words in any script plus initials) is treated as a person. It gets no profile row and no ad rows; one free individual-advertiser-skipped row carries its AR id and verified country and nothing else. Over-filtering is the accepted cost: a brand whose verified name is just two plain words is skipped too — check the diagnostic rows. A single-word name is treated as a business.

Input reference

FieldTypeDefaultWhat it does
advertisersstring[]prefill: 4 brandsBrand names, AR ids (or Center advertiser links) and domains, one per line. At most 200 entries per run; duplicates are read once. Required.
regionstringUSTwo-letter country code (UK is read as GB), or anywhere.
formatsstring[][] (all)Any of text, image, video. With two formats, each gets half the per-advertiser limit and a format that runs out passes its share on.
maxAdsPerAdvertiserinteger200 (prefill 100)1–5,000 ads per advertiser (per domain, for a domain entry). 40 per request.
maxAdvertisersPerNameinteger11–10 matching advertisers per brand name, best first.
includeRegionsbooleanfalseOne extra lookup per ad: regions, variationCount, variationPreviews. Doubles the requests, not the price.
includeDunsbooleanfalsedunsNumber on advertiser rows, from the Center's advertiser-to-DUNS list, read once per run.
sinceDatestring—2026-09-01: only ads last shown on or after it.
untilDatestring—2026-10-31: only ads first shown on or before it.
maxConcurrencyinteger4Requests in flight at once (1–10).
maxRunSecsinteger24030–3,600. Rows already returned are kept — and billed — when it runs out.
proxyConfigurationobject{ "useApifyProxy": true }Apify datacenter proxy by default.

A region that is not a country, a format that does not exist, a date that is not a date, an untilDate before sinceDate, or an empty list fails the run before a single request, with a free row saying what was wrong. One unreadable entry among good ones is a free invalid-input row and the rest are read.

Output reference

Every row has the same columns, null where a column does not apply, so the dataset exports as one table. rowType is ad, advertiser, summary or diagnostic. The dataset has three views: Ads, Advertisers and Could not return.

On every row: ok, rowType, input (your entry as typed — null if the entry itself reads as a person's name), errorType, error, scrapedAt.

Ad rows (paid): advertiserId, advertiserName, creativeId, format, firstShown, lastShown (UTC days), daysShown, previewUrl, snapshotImageUrl, adUrl, region (the region you queried), resolvedBy, and with includeRegions: regions[] (ISO-2), variationCount, variationPreviews[].

Advertiser rows (paid, after the advertiser's ads): advertiserId, name, region (the advertiser's verified country), queryRegion, adCountMin, adCountMax, adsReturned, byFormat{text,image,video}, firstSeen, lastSeen, activeDays, dunsNumber, transparencyUrl, resolvedBy.

Summary row (free, last): entries, advertisersResolved, adsByFormat, requests, diagnostics, diagnosticTypes.

Diagnostic rows (free):

errorTypeMeaning
invalid-inputAn entry that is too long; a region, format or date that is not valid (the run then fails).
advertiser-not-foundNo verified advertiser matches the name; an AR id or domain with no ads in the region, formats and dates asked for.
individual-advertiser-skippedThe match is a person advertising under their own name. Carries advertiserId and region only.
ambiguousSeveral advertisers match equally well; the best is returned and candidates lists the ids.
rate-limitedThe Center answered 429 or a web page instead of data, three times (two retries, fresh session each time).
timeoutThe run's time budget ran out. Rows already returned are kept.
rpc-errorThe Center refused a request or answered without the data this Actor reads; also a per-ad lookup that failed.
internalThis Actor's own error. The run is then FAILED.

Pricing

EventWhat it isFREEBRONZESILVERGOLD
actor-startOnce per run, only after the run has returned a paid row$0.001$0.001$0.001$0.001
adOne ad creative$0.002$0.002$0.0016$0.0012
advertiserOne verified advertiser's profile$0.005$0.005$0.004$0.003

$2.00 per 1,000 ads, plus $5.00 per 1,000 advertiser profiles.

RunCost
The prefill as the offline test suite runs it — 4 profiles, 400 ads$0.821
One advertiser, 1,000 ads$2.006
The same with includeRegions$2.006 — twice the requests, same price
12 brands × 200 image and video ads≈ $4.86
1,000 ads at GOLD$1.20 + profiles
Ten names that match no verified advertiser$0.00, SUCCEEDED

Charging is charge-after-push: rows are in your dataset before the event is recorded. An advertiser's profile is pushed after its ads and its price is set aside before its first ad, so a run that reaches ACTOR_MAX_TOTAL_CHARGE_USD stops reading, still delivers the profile of every advertiser whose ads it returned, never bills a profile without its ads, and finishes SUCCEEDED saying so. Never charged: summary and diagnostic rows, individuals, ads outside your dates, a run that returns nothing (start fee included). A run whose names all fail to resolve is SUCCEEDED — "4 names, none resolved to a verified advertiser … Nothing was charged."

Limits

  • Ad counts are the Center's ranges. adCountMin–adCountMax ("9000"–"10000") is how the Center itself rounds an advertiser's library; this Actor does not count the whole library unless you walk it.
  • daysShown is the Center's own count of days an ad was shown, as the Center reports it — not computed here, and never more than the first-to-last span.
  • Previews are Google-hosted and expire. previewUrl, snapshotImageUrl and variationPreviews are Google's links, signed by Google, passed through untouched; they render through Google's own preview script and may stop working after a while. Re-run to refresh them. adUrl (the Center's page) does not expire.
  • People who advertise under their own name are excluded by design, and a brand whose verified name looks like a person's (two plain words, no company suffix) is excluded with them. An AR id or a domain whose ads turn out to belong to a person is skipped the same way.
  • Dates are filtered here. The Center has no working date filter, so ads are read newest last-shown first and those outside sinceDate/untilDate are dropped before they are returned (and never billed); a page entirely older than sinceDate ends the walk. At most 130 pages are walked per advertiser and format.
  • Limits per run: 5,000 ads per advertiser, 10 advertisers per name, 200 entries, maxRunSecs up to 3,600 s.
  • Rate limits. The Center answers Apify's datacenter proxy. A 429 or a web page in place of data is retried at most twice, each after a pause and from a fresh proxy session, and is then a free rate-limited row; the rest of the run goes on.
  • Regions. A country is sent as the Center's own number (the United States is 2840); anywhere sends no region.
  • The upstream formats may change: this Actor reads the Center's JSON as it is served today, and returns a free rpc-error row rather than a wrong one when an answer no longer has the data it expects.
  • Not affiliated with Google. "Google", "Ads Transparency Center" and every advertiser name are used descriptively, to say where the data comes from and what it describes.

Use it from an AI agent, or from code

One JSON object in, one flat array out — the shape agent runtimes want. The Actor runs with limited permissions and pay-per-event pricing, as an ordinary on-demand run, so it works over the Apify MCP server (mcp.apify.com) and with agentic (x402) payments. The Integrations tab pushes results to Slack, a webhook, Zapier, Make, Google Sheets, Snowflake or BigQuery, and Apify Schedules run it unattended — with sinceDate, each run returns only what is new.

curl -X POST "https://api.apify.com/v2/acts/insight.solutions~google-ads-transparency-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"advertisers":["Nike","allbirds.com"],"region":"US","formats":["image","video"],"maxAdsPerAdvertiser":100}'
# pip install apify-client
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("insight.solutions/google-ads-transparency-api").call(run_input={
"advertisers": ["Nike", "Allbirds", "Duolingo"],
"region": "US",
"maxAdsPerAdvertiser": 200,
"sinceDate": "2026-09-01",
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["rowType"] == "ad":
print(row["advertiserName"], row["format"], row["firstShown"], row["lastShown"], row["daysShown"], row["adUrl"], sep=" | ")
elif row["rowType"] == "advertiser":
print(row["name"], row["region"], row["adCountMin"], row["adCountMax"], row["byFormat"])

Building an app with Lovable? Apify's Lovable connector runs any Actor from inside a Lovable project with your Apify token. Connect Apify in Lovable once, then ask it: "Use Apify to run insight.solutions/google-ads-transparency-api on my competitors and build an ad-library tracker around the results." At the default settings a run of a few brands finishes well inside Lovable's 300-second synchronous limit, and every result is one JSON object per row, so the generated app needs no extra parsing. Usage bills to the Apify account whose token is connected.

FAQ

Why did "Nike" not return the advertiser called exactly "Nike"? Because there are several: the Center lists a one-ad advertiser named "Nike", Nike, Inc. with 9,000–10,000 ads, and Italian NIKE SRL entities. Legal forms are ignored when names are compared, so all of them match, and the largest ad library wins. Raise maxAdvertisersPerName to get more of them, or pass an AR id.

How do I find an advertiser's AR id? Every advertiser row has it (advertiserId), and it is the AR… part of the advertiser's page address in the Center. An ambiguous row lists the ids of the tied candidates.

Can I see how much a brand spends? No — the Center does not publish spend or impressions for these ads, so neither does this Actor. What you get is what ran, when, where and for how long.

Why is daysShown smaller than the gap between firstShown and lastShown? daysShown is the Center's own count of the days the ad was actually shown; an ad paused for a month keeps its first and last dates but not those days.

A preview link stopped working. Preview links are Google's, signed and short-lived. Re-run the Actor for fresh ones, or open adUrl, the Center's own page for the ad.

Why was an advertiser I asked for skipped as an individual? Its verified name reads as a person's — two or three plain words with no company suffix. That rule removes every sole trader and creator who advertises under their own name, and occasionally a brand whose legal name is just two words. Nothing is charged for it.

Does a domain search find every advertiser of that brand? It finds the ads the Center associates with that domain, grouped by advertiser — often the brand itself, sometimes resellers and agencies too. For one brand's own library, its name or AR id is the more exact entry.

  • Public data only. Everything this Actor reads is what Google's Ads Transparency Center shows any anonymous visitor. It never logs in, never sends cookies or tokens, never accepts credentials, and makes the same requests the Center's own page makes.
  • Organisations, not people. Advertiser profiles and ads are returned for businesses and organisations only. Advertisers that are individuals are detected by their verified name and excluded before any of their ads is read; their diagnostic row carries an AR id and a country and nothing that names them.
  • Google's content is linked, not copied. Ad previews and snapshots are Google-hosted links passed through unchanged; the Actor does not download, store or re-host ad creatives.
  • We are not a data broker. This Actor holds no database and sells no list. It reads the Center on demand and writes the result to your dataset on your account.
  • Not affiliated with, endorsed by or sponsored by Google or any advertiser named in the output. Names and trademarks are used descriptively.
  • You are responsible for how you use the output, including any use of ad creatives (which belong to their advertisers) and any outreach to advertisers, under copyright, the GDPR, the CCPA, ePrivacy, CAN-SPAM and applicable marketing law. Nothing here is legal advice.

Our other Actors

Every Insight Solutions Actor is pay-per-result with no browser, no login and no API key, and every one of them returns free diagnostic rows instead of billing for failures. Prices are per 1,000 results.

Video, audio & social

News, documents & the web

Business, finance & jobs

Apps & games