Competitor Ad Footprint: Google + Meta Ads Checker avatar

Competitor Ad Footprint: Google + Meta Ads Checker

Pricing

from $1.80 / 1,000 domain footprints

Go to Apify Store
Competitor Ad Footprint: Google + Meta Ads Checker

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

Detroit Web Agent - Open Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

Share

Competitor ad checker for a list of domains: one row per company with its footprint in the public Google Ads Transparency Center and Meta Ad Library, with ad counts, formats, platforms, first and last seen dates, countries, sample ads and a 0-100 footprint score.

This Actor vs alkausari_mujahid/google-ads-transparency-scraper: that one is well-used for checking which domains have ever run Google Ads. This one also checks the Meta Ad Library, adds ad counts, formats, countries, sample ads and a 0-100 score, and has a monitor mode that returns a row only when a company's ads change.

Competitor Ad Footprint: features, price and a real output row

Run it free on Apify

Price per 1,000 domainsFree planStarterScaleBusiness
This Actor$3.00$2.50$2.20$1.80

Competitor Ad Footprint sample output table from a real run

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.libraryUrl you can open by hand, and sourceStatus.linkedin says unavailable.
  • 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

FieldWhat it doesDefault
domainsDomains or website URLs, one per line["hubspot.com"]
startUrlsPaste website URLs instead (domain is taken from each)empty
brandNamesOptional brand keyword per domain, same order (for example Blue Bottle Coffee)taken from the domain
sourcesgoogle, meta, linkedinall three
countryTwo-letter country where ads ran, or ANYUS
includeAdSamplesSample ads per library (first 3 included in the price)3
maxItemsMax domains per run100
onlyNewMonitor mode: only domains that changed since the last runfalse
stateStoreNameKey-value store that remembers the last snapshotad-footprint-state
proxyConfigurationApify Proxy (residential by default, Meta blocks datacenter IPs)residential US

An empty input {} checks hubspot.com.

Example inputs (presets)

  1. Qualify a lead list: {"domains": ["hubspot.com", "notion.so", "basecamp.com"], "includeAdSamples": 0}
  2. Competitor deep check in the UK with more samples: {"domains": ["monzo.com", "revolut.com"], "country": "GB", "includeAdSamples": 6}
  3. 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&region=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 planPer domainPer 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_TOKEN with {"domains": ["hubspot.com"]} as the body.
  • Schedules: set onlyNew: true and 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-domain to 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"). adsCount is the lower bound, adsCountMax the upper, adsCountIsRange tells you which. Small advertisers get exact counts.
  • Google firstShown / lastShown cover the most recent 40 creatives for the domain (Google lists newest first), so firstShown can 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); advertisers shows 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

  1. Open the Actor page and click Try for free (or Start if you are signed in).
  2. Paste this example into the JSON tab of the input:
{
"domains": ["hubspot.com", "notion.so"],
"country": "US",
"includeAdSamples": 3
}
  1. Click Start. Each domain takes roughly 6 to 15 seconds with all sources, so this run is done in well under a minute.
  2. 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? advertisingAnywhere is true when at least one library that answered shows ads.
  • Where and in what format? The google block has formats and regions, the meta block has platforms and media types.
  • Is it recent? lastShown for Google, newestStart for Meta and the footprintScore all 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

  • domains takes one domain per line. Full website URLs work too, and the domain is extracted.
  • startUrls is the same input in the format other actors use. Each URL's domain is checked once.
  • brandNames is optional and aligns with domains by 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 as bluebottlecoffee.com can be paired with the brand Blue Bottle Coffee.
  • sources selects among google, meta and linkedin. Leaving LinkedIn in only adds a library link and a status of unavailable, since the actor does not fetch that site.
  • country is a two-letter code for the market where the ads ran, or ANY. It defaults to US.
  • includeAdSamples accepts 0 to 20 samples per library and defaults to 3.
  • maxItems accepts 1 to 5000 and defaults to 100.
  • onlyNew turns on monitor mode, and stateStoreName names the key-value store that holds the last snapshot. Use one store name per watch list so lists do not overwrite each other.
  • proxyConfiguration defaults to residential Apify Proxy because Meta rate-limits datacenter addresses. Google is requested directly first.

Output fields reference

FieldMeaning
domain, brandNameThe checked domain and the brand keyword used for Meta
advertisingAnywhereTrue when any library that answered shows ads
footprintScore0 to 100 summary of volume, recency and channels
google.advertisersVerified advertisers behind ads for the domain, with creative counts
google.adsCount, adsCountMax, adsCountIsRangeLower bound, upper bound, and whether Google reported a range
google.formats, formatCountsText, image and video creatives
google.firstShown, lastShown, regionsDates and countries for the newest creatives
google.transparencyUrlLink to the same lookup on Google
meta.pageNames, pageIdsMatched Facebook advertiser Pages
meta.activeAdsCountActive ads in the chosen country across matched Pages
meta.platforms, mediaTypesWhere the ads run and in what format
meta.oldestActiveStart, newestStartStart dates read from the first ads per Page
meta.libraryUrl, linkedin.libraryUrlLinks to open the library by hand
sourceStatusok, error, skipped or unavailable for each library
samplesUp to the requested number of sample ads with text, format, dates and a library link
checkedAtTime 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

  1. Run the first pass with includeAdSamples of 0 and add samples only for the companies that matter.
  2. Check sourceStatus before trusting a zero. A zero with status ok means the library answered with no ads. A status of error means the lookup failed and the zero is not a finding; sourceErrors explains why.
  3. For generic domain names, provide brandNames so the Meta match is correct.
  4. Keep one stateStoreName per watch list.
  5. Read ranges correctly: when adsCountIsRange is true, adsCount is a lower bound.
  6. Use country set to ANY when you want a global answer, and a specific code when you want a market answer.

Call it from Python

from apify_client import ApifyClient
client = 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.

Pair this with other actors that take a domain as input:

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.