▶ Run it on Apify · API docs · Input schema · Output schema · Changelog
See every ad an advertiser runs on Google — Search, YouTube, Display, Shopping, Maps and Play — straight from the public Google Ads Transparency Center. Type a website (nike.com), an advertiser name (Nike), an advertiser ID (AR…) or paste a Transparency Center link, filter by country, format and dates, and get one clean row per ad:
- advertiser, format (text, image, video), first and last shown, days shown
- the ad image (Google archives most text and image ads as a picture of the ad) and the ad preview
- for responsive display ads: headline, description, call to action, logo, image and landing page
- for Shopping ads: the product title
- optional: every country the ad ran in, with dates, and the ad's category
Perfect for competitor research, ad copy and creative inspiration, spotting new campaigns early (schedule it with Shown in the last N days) and checking which landing pages competitors push.
Create a free Apify account, copy your API token from Console → Settings → Integrations and export it:
export APIFY_TOKEN="<your Apify API token>"pip install -U apify-client # version 3 or newerimport os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
# maxAdsPerSearch keeps this demo small — remove it to get everything.
run = client.actor("sports-odds-lab/google-ads-transparency").call(run_input={
"searches": ["nike.com"],
"maxAdsPerSearch": 5,
})
items = client.dataset(run.default_dataset_id).list_items().items
for a in items:
print(a["advertiserName"], "|", a["format"], "|", (a.get("headline") or "")[:50], "|", a["firstShown"][:10])Full script: examples/quickstart.py.
npm install apify-clientimport { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
// maxAdsPerSearch keeps this demo small — remove it to get everything.
const run = await client.actor('sports-odds-lab/google-ads-transparency').call({
searches: ['nike.com'],
maxAdsPerSearch: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const a of items) {
console.log(a.advertiserName, '|', a.format, '|', (a.headline ?? '').slice(0, 50), '|', a.firstShown.slice(0, 10));
}Save it as quickstart.mjs (ES modules) — full script: examples/quickstart.mjs.
curl -s -X POST "https://api.apify.com/v2/acts/sports-odds-lab~google-ads-transparency/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d @examples/input.jsonrun-sync-get-dataset-items waits for the run (up to 5 minutes). For long runs start the Actor asynchronously and poll it — see the Apify API docs.
Expose the Actor as a tool to any MCP client (Claude, Cursor, VS Code…) through the Apify MCP server:
{
"mcpServers": {
"google-ads-transparency": {
"url": "https://mcp.apify.com?tools=sports-odds-lab/google-ads-transparency"
}
}
}Sign in with your Apify account when the client asks; the agent then calls the Actor with the same input fields as above.
| Field | Example |
|---|---|
advertiserName, advertiserId, domain |
Nike Retail BV, AR18378488041124659201, nike.com |
creativeId, format |
CR11529870939114176513, text / image / video |
firstShown, lastShown, daysShown |
2021-10-25, 2026-09-30, 1620 |
imageUrl, imageWidth, imageHeight |
the ad as Google archived it |
headline, description, callToAction |
"Découvrez des maisons, des hôtels, etc.", "Un Service Clients disponible 24h/24…", "Réserver" |
displayUrl, landingUrl |
booking.com, http://www.booking.com/index.html?aid=2395786 |
logoUrl, productTitle, html5BundleUrl |
logo, "Nike Zoom Fly 6 Men's Road-Racing Trainers…", HTML5 ad bundle |
previewUrl, adUrl |
Google's ad preview, the ad's page in the Transparency Center |
regions, category |
[{"countryCode": "PL", "country": "Poland", "firstShown": "2023-04-09", "lastShown": "2023-04-09"}, …], "Apparel & Accessories" |
The per-search summary (key-value store record SUMMARY) shows how many ads were saved and Google's estimate of all matching ads for every search.
- Add advertisers or websites — one per line:
nike.com,Nike,AR06641858037806006273orhttps://adstransparency.google.com/advertiser/AR…?region=US. - Optionally filter by country, ad format and dates (Shown in the last N days, or a date range).
- Click Start, then download JSON, CSV or Excel, or read the dataset through the Apify API.
A website returns the ads of every advertiser that promotes it (Nike runs ads through several legal entities); a name picks the best-matching verified advertiser — or all of them with Advertiser names: All matching.
{
"searches": ["booking.com"],
"region": "US",
"lastDays": 30,
"maxAdsPerSearch": 500
}{
"searches": ["nike.com", "adidas.com", "puma.com"],
"adFormat": "video",
"includeRegions": true
}{
"advertiserName": "Booking.com",
"domain": "booking.com",
"creativeId": "CR04173554866964135937",
"format": "text",
"firstShown": "2026-08-27T05:50:16Z",
"lastShown": "2026-09-30T13:21:34Z",
"daysShown": 36,
"headline": "Découvrez des maisons, des hôtels, etc.",
"description": "Un Service Clients disponible 24h/24 et 7j/7, où que vous soyez.",
"callToAction": "Réserver",
"displayUrl": "booking.com",
"landingUrl": "http://www.booking.com/index.html?aid=2395786",
"imageUrl": "https://tpc.googlesyndication.com/simgad/13487100057649545191",
"adUrl": "https://adstransparency.google.com/advertiser/AR02934798844673654785/creative/CR04173554866964135937?region=anywhere"
}About 40 ads per request, most recently shown first — a few hundred ads a minute. Google limits how many requests one IP may send; with Apify Proxy (on by default) the Actor moves to a fresh IP whenever that happens and continues from the same page, so long runs do not stop. Countries of each ad costs one more request per ad — turn it on when you need it.
The Actor is pay-per-result: you pay for the rows it saves, platform usage included, nothing else. The current price per 1,000 results is on the Actor page; Apify's free plan includes monthly platform credit, so you can try real data before paying. Set a spending limit on a run for a hard cap — the Actor stops as soon as the limit is reached.
What is "days shown"? The number of days Google reports the ad as shown. Long-running ads are usually the ones that work.
Why do some ads have only an image? Google's Transparency Center archives most text and image ads as a picture of the ad — you get that image. For responsive display and Shopping ads the Actor also reads the headline, description, product and landing page from the ad's preview.
What about video ads? You get the advertiser, dates and a link to the ad's preview and Transparency Center page.
Which countries? Every country Google lists in the Transparency Center; "Anywhere" searches all of them.
Where does the data come from? From the public Google Ads Transparency Center (adstransparency.google.com), which Google publishes so anyone can see who advertises and what. This Actor is not affiliated with Google.
- ⚽ Football Odds API — every football match from 1,000+ competitions: opening and closing odds from up to 42 bookmakers, no-vig consensus, xG, goal events — full seasons back to 2005
- 🎾 Tennis Odds & Scores API — every ATP, WTA, Challenger and ITF match: live scores, results, rankings and odds from up to 42 bookmakers back to 2009
- 🏀 NBA, NFL, MLB & NHL Odds API — moneyline, spread and total odds — opening and closing — from up to 42 bookmakers, no-vig consensus and box-score stats; full seasons back to 2009
- 📊 Polymarket & Kalshi API — prediction-market odds, volume, price history and resolutions of both platforms in one table, with the full Kalshi archive
- ⏱️ Flashscore Scraper API (24 sports) — live scores, results and odds of football, basketball, hockey, tennis, volleyball, handball, esports, MMA, cricket, darts and more
- 🏟️ ESPN Box Scores & Player Stats API — box scores and player stats for the NFL, NBA, MLB, NHL, college sports and soccer leagues — one row per player per game, or one row per game
- 💼 ATS Jobs API (Greenhouse, Lever, Ashby, Workday…) — open jobs straight from company career sites on 11 applicant tracking systems — by company name or URL, or search a directory of 15,000+ companies
All tools: apify.com/sports-odds-lab · GitHub: github.com/minmaxerdev
Documentation and example code in this repository are MIT-licensed. The Actor itself runs on Apify under Apify's terms; the data comes from publicly available sources and the Actor is not affiliated with them (see the FAQ).