Competitor Ad Footprint: Google + Meta Ads Checker
Pricing
from $1.80 / 1,000 domain footprints
Competitor Ad Footprint: Google + Meta Ads Checker
Is this company advertising? See one row per domain from the public Google Ads Transparency Center and Meta Ad Library: ad counts, formats, platforms, first/last seen, regions, sample ads and a 0-100 footprint score. Monitor mode flags changes. No login.
Pricing
from $1.80 / 1,000 domain footprints
Rating
0.0
(0)
Developer
Detroit Web Agent - Open Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share

| Price per 1,000 domains | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| This Actor | $3.00 | $2.50 | $2.20 | $1.80 |

Is this company advertising, where, and how much? Give it a list of domains. You get one row per company with its footprint in the public Google Ads Transparency Center and Meta Ad Library: ad counts, formats, platforms, first and last seen dates, countries, sample ads and a 0-100 footprint score. $3 per 1,000 domains, no login, no API key.
What does it do?
For each domain (for example hubspot.com) the actor:
- Google Ads Transparency Center (Search, YouTube, Display, Shopping): finds every creative that points to the domain, the verified advertisers behind them, the ad count, the split by format (text, image, video), first and last shown dates and the countries the ads ran in.
- Meta Ad Library (Facebook, Instagram, Messenger, Threads, Audience Network): finds the advertiser Pages whose ads link to the domain (or whose name matches the brand), then counts their active ads and reads platforms and start dates.
- LinkedIn Ad Library: LinkedIn's robots.txt forbids automated access, so the actor does not fetch it. Each row carries a ready
linkedin.libraryUrlyou can open by hand, andsourceStatus.linkedinsaysunavailable. - Adds up to 3 sample ads per library (text, dates, preview and library link) and a footprint score from 0 (no ads anywhere) to 100 (heavy, recent, multi-channel advertiser).
- Monitor mode (
onlyNew): schedule it and get a row only when a company's ad counts or newest ads change.
Who is it for?
- Agencies qualifying leads: a company already spending on Google and Meta is a warm lead for ads management; one with zero ads is a pitch for getting started.
- Competitor research: see which competitors advertise, on which channels, since when, and get alerted when they launch new campaigns.
- Sales and RevOps: enrich a CRM account list with an "is advertising" flag and score.
Input
| Field | What it does | Default |
|---|---|---|
domains | Domains or website URLs, one per line | ["hubspot.com"] |
startUrls | Paste website URLs instead (domain is taken from each) | empty |
brandNames | Optional brand keyword per domain, same order (for example Blue Bottle Coffee) | taken from the domain |
sources | google, meta, linkedin | all three |
country | Two-letter country where ads ran, or ANY | US |
includeAdSamples | Sample ads per library (first 3 included in the price) | 3 |
maxItems | Max domains per run | 100 |
onlyNew | Monitor mode: only domains that changed since the last run | false |
stateStoreName | Key-value store that remembers the last snapshot | ad-footprint-state |
proxyConfiguration | Apify Proxy (residential by default, Meta blocks datacenter IPs) | residential US |
An empty input {} checks hubspot.com.
Example inputs (presets)
- Qualify a lead list:
{"domains": ["hubspot.com", "notion.so", "basecamp.com"], "includeAdSamples": 0} - Competitor deep check in the UK with more samples:
{"domains": ["monzo.com", "revolut.com"], "country": "GB", "includeAdSamples": 6} - Weekly competitor alert (schedule it):
{"domains": ["asana.com", "monday.com", "clickup.com"], "onlyNew": true, "stateStoreName": "pm-tools-watch"}
Output sample
{"domain": "hubspot.com","brandName": "hubspot","advertisingAnywhere": true,"google": {"advertiserIds": ["AR10072600183532683265", "AR16516028954147028993"],"advertisers": [{ "id": "AR10072600183532683265", "name": "Hubspot, Inc.", "creativesInSample": 36 }],"adsCount": 1000, "adsCountMax": 2000, "adsCountIsRange": true,"formats": ["text", "image", "video"], "formatCounts": { "text": 800, "image": 71, "video": 300 },"firstShown": "2021-10-25", "lastShown": "2026-10-13","regions": ["US", "CA", "MX", "FR", "DE"],"transparencyUrl": "https://adstransparency.google.com/?domain=hubspot.com®ion=US"},"meta": {"pageNames": ["HubSpot", "HubSpot Academy"], "pageIds": ["6039999393", "151402415246767"],"activeAdsCount": 129, "platforms": ["facebook", "instagram", "messenger", "threads"],"mediaTypes": ["video", "image"], "oldestActiveStart": "2026-01-22", "newestStart": "2026-10-08","libraryUrl": "https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=US&q=hubspot&search_type=keyword_unordered"},"linkedin": { "adsCount": null, "latestAdDate": null, "libraryUrl": "https://www.linkedin.com/ad-library/search?accountOwner=hubspot" },"sourceStatus": { "google": "ok", "meta": "ok", "linkedin": "unavailable" },"samples": [{ "source": "meta", "advertiserName": "HubSpot", "adId": "1666749958340789", "format": "video", "text": "HubSpot Smart CRM keeps notes and next steps current, so you...", "url": "https://www.facebook.com/ads/library/?id=1666749958340789" }],"footprintScore": 97,"checkedAt": "2026-10-13T20:10:00.000Z"}
sourceStatus per library: ok (answered, even with zero ads), error (failed this run, see sourceErrors), skipped (not requested), unavailable (LinkedIn). The Overview table view shows the key columns; OUTPUT in the key-value store has run stats.
Pricing
Pay per event. You pay only for domain rows delivered. A domain where no library answered, and an unchanged domain in monitor mode, is never charged.
| Apify plan | Per domain | Per 1,000 domains |
|---|---|---|
| Free | $0.0030 | $3.00 |
| Bronze | $0.0025 | $2.50 |
| Silver | $0.0022 | $2.20 |
| Gold and above | $0.0018 | $1.80 |
Up to 3 sample ads per library are included. Samples beyond 3 per library cost $0.0005 each (ad-sample event). The run stops before it would pass the maximum cost you set.
Use it via API, schedules or AI agents (MCP)
- API:
POST https://api.apify.com/v2/acts/transparent_meteorite~ad-footprint-by-domain/run-sync-get-dataset-items?token=YOUR_TOKENwith{"domains": ["hubspot.com"]}as the body. - Schedules: set
onlyNew: trueand a watch list, schedule weekly, and send new rows to Slack, email or a sheet with an Apify integration. - MCP / AI agents: add
https://mcp.apify.com?actors=transparent_meteorite/ad-footprint-by-domainto Claude, Cursor or any MCP client and ask "which of these 20 companies advertise on Google and Meta?".
Limits (honest)
- Google ad counts are ranges for big advertisers (the Transparency Center shows "1,000-2,000").
adsCountis the lower bound,adsCountMaxthe upper,adsCountIsRangetells you which. Small advertisers get exact counts. - Google
firstShown/lastShowncover the most recent 40 creatives for the domain (Google lists newest first), sofirstShowncan be later than the advertiser's very first ad. - The Google domain search also lists other advertisers whose ads point at the domain (for example landing pages hosted on it);
advertisersshows each with its creative count, owner first. - Meta counts active ads in the chosen country for up to 3 matched advertiser Pages. Brands with generic names may need
brandNames. Meta dates are taken from the first 30 ads per Page. - LinkedIn is not fetched (robots.txt). The row gives the library link only.
- About 6-15 seconds per domain with all sources.
Run in 30 seconds
- Open the Actor page and click Try for free (or Start if you are signed in).
- Paste this example into the JSON tab of the input:
{"domains": ["hubspot.com", "notion.so"],"country": "US","includeAdSamples": 3}
- Click Start. Each domain takes roughly 6 to 15 seconds with all sources, so this run is done in well under a minute.
- Open the Output tab for the Overview table, or use Export to download CSV, Excel or JSON. The full record for each company, including sample ads, is in the JSON export.
Why check the ad libraries by domain
Both Google and Meta publish ad transparency data for anyone to read, but each library is searched one company at a time through a web page, and each answers in a different shape. The Google Ads Transparency Center groups ads by verified advertiser, while the Meta Ad Library groups them by Facebook Page. Joining the two for a list of companies is slow by hand. This actor runs the same public lookups for each domain and returns one flat row, so that a list of 50 or 500 companies can be compared in a spreadsheet.
The result answers three practical questions:
- Is the company advertising at all?
advertisingAnywhereis true when at least one library that answered shows ads. - Where and in what format? The
googleblock has formats and regions, themetablock has platforms and media types. - Is it recent?
lastShownfor Google,newestStartfor Meta and thefootprintScoreall react to recent activity.
Use cases in detail
Agency lead qualification. Take a purchased or exported account list, paste the domains, and sort by footprintScore. Companies with a high score already spend on both channels, so the pitch is optimisation. Companies with advertisingAnywhere false are candidates for a first-campaign offer. Use includeAdSamples of 0 to keep this run small.
Competitor watch. Put your five closest competitors in a watch list, set onlyNew to true, and schedule the actor weekly. A new row appears only when a competitor's ad counts or newest ads change, which is the signal that a campaign launched or ended.
Sales enrichment. Add the footprint score and the two library links to each account in a CRM. A rep can open google.transparencyUrl or meta.libraryUrl directly before a call and see the creatives the prospect is running.
Market mapping. Run a whole category, for example all project-management tools, and compare which channels and countries each vendor uses. Change country to see how the footprint differs between markets.
Due diligence. Check whether a brand that claims heavy marketing spend actually has an ad history, and how long ago the oldest active ads started.
Input fields explained
domainstakes one domain per line. Full website URLs work too, and the domain is extracted.startUrlsis the same input in the format other actors use. Each URL's domain is checked once.brandNamesis optional and aligns withdomainsby position. Meta matches advertiser Pages by link to the domain or by brand name, so a distinctive brand name helps when the domain is generic. For example, a domain such asbluebottlecoffee.comcan be paired with the brandBlue Bottle Coffee.sourcesselects amonggoogle,metaandlinkedin. Leaving LinkedIn in only adds a library link and a status ofunavailable, since the actor does not fetch that site.countryis a two-letter code for the market where the ads ran, orANY. It defaults toUS.includeAdSamplesaccepts 0 to 20 samples per library and defaults to 3.maxItemsaccepts 1 to 5000 and defaults to 100.onlyNewturns on monitor mode, andstateStoreNamenames the key-value store that holds the last snapshot. Use one store name per watch list so lists do not overwrite each other.proxyConfigurationdefaults to residential Apify Proxy because Meta rate-limits datacenter addresses. Google is requested directly first.
Output fields reference
| Field | Meaning |
|---|---|
domain, brandName | The checked domain and the brand keyword used for Meta |
advertisingAnywhere | True when any library that answered shows ads |
footprintScore | 0 to 100 summary of volume, recency and channels |
google.advertisers | Verified advertisers behind ads for the domain, with creative counts |
google.adsCount, adsCountMax, adsCountIsRange | Lower bound, upper bound, and whether Google reported a range |
google.formats, formatCounts | Text, image and video creatives |
google.firstShown, lastShown, regions | Dates and countries for the newest creatives |
google.transparencyUrl | Link to the same lookup on Google |
meta.pageNames, pageIds | Matched Facebook advertiser Pages |
meta.activeAdsCount | Active ads in the chosen country across matched Pages |
meta.platforms, mediaTypes | Where the ads run and in what format |
meta.oldestActiveStart, newestStart | Start dates read from the first ads per Page |
meta.libraryUrl, linkedin.libraryUrl | Links to open the library by hand |
sourceStatus | ok, error, skipped or unavailable for each library |
samples | Up to the requested number of sample ads with text, format, dates and a library link |
checkedAt | Time of the check |
More worked examples
Compare a sector in a second market
{"domains": ["monzo.com", "revolut.com", "wise.com"],"country": "GB","includeAdSamples": 5}
Meta only, with a brand override for a generic domain
{"domains": ["bluebottlecoffee.com"],"brandNames": ["Blue Bottle Coffee"],"sources": ["meta"],"country": "US"}
Weekly watch list
{"domains": ["asana.com", "monday.com", "clickup.com"],"onlyNew": true,"stateStoreName": "pm-tools-watch","includeAdSamples": 0}
Tips
- Run the first pass with
includeAdSamplesof 0 and add samples only for the companies that matter. - Check
sourceStatusbefore trusting a zero. A zero with statusokmeans the library answered with no ads. A status oferrormeans the lookup failed and the zero is not a finding;sourceErrorsexplains why. - For generic domain names, provide
brandNamesso the Meta match is correct. - Keep one
stateStoreNameper watch list. - Read ranges correctly: when
adsCountIsRangeis true,adsCountis a lower bound. - Use
countryset toANYwhen you want a global answer, and a specific code when you want a market answer.
Call it from Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("transparent_meteorite/ad-footprint-by-domain").call(run_input={"domains": ["hubspot.com", "notion.so", "basecamp.com"],"includeAdSamples": 0,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["domain"], row["footprintScore"], row["advertisingAnywhere"])
More questions
Does a score of 0 mean the company never advertised? It means no ads were found in the libraries that answered, for the selected country. Check sourceStatus and country.
Why do the Google and Meta counts differ so much? They count different things: Google counts creatives for verified advertisers pointing at the domain, Meta counts active ads of matched Pages in one country.
Can I check subdomains or landing pages? Paste the URL in startUrls. The domain is taken from it.
Does the actor show how much a company spends? No. The libraries publish ads, formats and dates, not spend, so spend is not a field here.
Can I compare more than 100 domains in one run? Yes. Raise maxItems up to 5000.
Why is LinkedIn not included? LinkedIn's robots.txt forbids automated access, so each row has a library link and a status of unavailable instead.
Is the data real time? It is as current as the libraries at the time of the check. checkedAt records when that was.
Can I send results to a spreadsheet or chat tool? Yes, with an Apify integration on the dataset, or with the API calls above.
FAQ
Do I need API keys or logins? No. The actor reads the same public pages a logged-out visitor sees.
Why residential proxy? Meta's Ad Library rate-limits datacenter IPs. Google is called directly and only falls back to the proxy if refused.
Can I get every ad, not just a summary? Use our Meta Ad Library scraper for full Meta ad rows. This actor is built for one fast summary row per company.
What does the footprint score mean? For each library that answered: 20 points for having ads, up to 15 for volume (log scale), 5 if an ad ran in the last 30 days; scaled to 0-100 over the libraries that answered.
Something missing or broken? Open an issue on the Issues tab with the run URL and we will reply there.
Related actors
Pair this with other actors that take a domain as input:
- Website Tech Stack Detector shows which marketing and analytics tools a site runs.
- Company Enrichment by Domain adds company details to the same domain list.
- Domain Intelligence Lookup returns registration and DNS facts for each domain.
Legal note
The actor collects public ad transparency data published by Google and Meta about businesses' advertising. It does not log in, solve captchas or collect personal data about private individuals. You are responsible for using the data in line with each platform's terms and privacy laws such as GDPR.
More from DWA Open Data
Browse all 69 data Actors, with live prices and sample output, at open-data-actors.pages.dev.
Feedback: if this Actor was useful, or if it fell short, an honest review on the Reviews tab helps other users decide. Problems or feature requests: please open an Issue and we usually reply within one business day.
