Ads Presence Unified Lookup: Google/LinkedIn/Meta from $16/1k
Pricing
from $12.16 / 1,000 ad presence checked (found on at least one platform)s
Ads Presence Unified Lookup: Google/LinkedIn/Meta from $16/1k
Is this company running ads anywhere? One domain or name in, one row out: Google Ads Transparency Center, LinkedIn Ad Library and Meta's Ad Library API checked at once. Never charged for a company with no ads on any checked platform.
Pricing
from $12.16 / 1,000 ad presence checked (found on at least one platform)s
Rating
0.0
(0)
Developer
Adrian Voss
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
Ads Presence Unified Lookup: Google, LinkedIn & Meta Ads for One Company
You give this actor a list of company domains or names. For each one, it checks the Google Ads
Transparency Center, the LinkedIn Ad Library, and Meta's official Ad Library API at once, and
returns a single row answering "is this company advertising, and where" — which platforms it's
active on, roughly how many ads, how recently, and a handful of sample ad URLs to click through
and verify by eye. It's a composite of this portfolio's own three single-platform actors
(google-ads-presence-lookup, linkedin-ads-presence-lookup, meta-ads-presence-lookup), fanned
out and billed as one flat charge per company instead of three separate ones.
Who it's for
You're building or cleaning an outbound list and want one column that answers "is this prospect already running paid ads anywhere" — a company that's actively buying ads on Google, LinkedIn or Meta is a company with an ad budget and (usually) a marketing team already running campaigns, which changes how you'd pitch a marketing, creative, or ad-tech tool to them. You're also useful to a media buyer or competitive-intelligence analyst who wants a fast triage pass across a competitor list before going deep on any one of them with the single-platform actors, and to an agency doing prospecting who wants to filter out companies that already have an agency or in-house team clearly running paid media. This isn't a bulk creative export — for that, see the three single-platform actors below, each of which returns the full sample-ad detail for its one platform. This is the fast, cheap "which of these 500 domains are worth a closer look" pass.
Why this one
- Three ad platforms, one row, one price. Instead of running three actors and joining the
results yourself, this fans out to all three ad libraries per company and folds them into one
flat row —
anyAds,platformsActive, and per-platform found/count fields — charged once, not three times. See "Price" below for exactly what "once" costs. - Never charged for a company that isn't advertising. If none of the checked platforms show an
ad, the row still comes back (
anyAds: false) explaining why on each platform, and costs nothing. - Degrades gracefully instead of failing. Meta's Ad Library API needs your own access token
(see the FAQ) — without one,
metaAdsFoundcomes backfalsewith a plain-English reason, not an error, and Google and LinkedIn still run normally. Same for a rate limit or a blocked request on any platform: a per-platform miss never fails the row or the other two platforms. - Turn off any platform you don't need. "Check Google Ads" / "Check LinkedIn Ads" / "Check Meta Ads" in the Input tab are on by default; turning one off skips it entirely for every row in the run — useful if you only have a Meta token, or only care about B2B (LinkedIn) presence.
- Sample ad URLs to verify by eye. Up to 3 URLs per active platform (Google Ads Transparency
Center pages, LinkedIn Ad Library detail pages, Meta Ad Library snapshot URLs) so you're never
taking the
true/falseon faith.
What you get
One row per company. The three platform blocks are independent — a null on any found/count/
reason field means that platform wasn't checked this run (see the checkboxes above), not that it
returned zero.
| Field | Type | Description |
|---|---|---|
query | text | The domain or company name you submitted |
found | boolean | Same as anyAds below — true if at least one checked platform found ads. This is what's billed. |
status | text | OK if any platform found ads; NOT_FOUND if none did |
message | text | Plain-English summary of what each checked platform reported — only present when found is false |
advertiserName | text | Best-matching advertiser/page name, from whichever platform matched first (Google, then LinkedIn, then Meta) |
googleAdsFound | boolean/null | true/false if Google was checked; null if "Check Google Ads" was off |
googleAdsCount | number/null | Estimated total ads in the Google Ads Transparency Center for the matched advertiser |
googleAdsLast30Days | number/null | Estimated Google ads shown in the last 30 days |
googleAdsReason | text/null | Why Google came back not-found or unchecked; null when found |
linkedinAdsFound | boolean/null | true/false if LinkedIn was checked; null if "Check LinkedIn Ads" was off |
linkedinAdsCount | number/null | Ads currently in the LinkedIn Ad Library for the matched advertiser |
linkedinAdsReason | text/null | Why LinkedIn came back not-found or unchecked; null when found |
metaAdsFound | boolean/null | true/false if Meta was checked; null if "Check Meta Ads" was off |
metaAdsCount | number/null | Active Meta ads found, capped at 50 (Meta's own per-request sample size) |
metaAdsReason | text/null | Why Meta came back not-found or unchecked — most commonly "no access token supplied" |
anyAds | boolean | true if at least one checked platform found ads for this company |
platformsActive | array | Which of google, linkedin, meta actually had ads (subset of what was checked) |
sampleAdUrls | array | Up to 3 sample ad/library URLs per active platform, combined into one list |
scrapedAt | ISO 8601 datetime | When the check ran |
Deselect any field in the Input tab's "Which columns do you want?" picker to drop it from every row — this changes what's returned, not what's billed, since the price is flat per company either way.
Price
- Ad presence checked (found on at least one platform): $16 per 1,000 company domains or names
Plus a $0.00005 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.
1,000 companies through this actor: ~$16 if every one is found running ads somewhere ($0.016 per found row, plus a $0.00005 actor-start charge), less if some aren't. That's roughly the sum of what the three single-platform actors would charge separately for the same company (google-ads-presence-lookup $0.003, linkedin-ads-presence-lookup $0.012, meta-ads-presence-lookup $0.003 — $0.018 combined) minus a 10% bundle discount for buying all three at once, and it's a single flat charge regardless of how many of the three platforms actually had ads — a company running ads on all three costs exactly the same as one running ads on only one. A company with no ads on any checked platform is never billed at all.
How to use
- In the Apify Console. Open the actor page and click Start — the
domainsfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~ads-presence-unified-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"domains":["hubspot.com","notion.com","a-company-that-almost-certainly-runs-no-ads.example"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
- If you have your own Meta Ad Library API access token, paste it into "Your Meta Ad Library API access token" at the top of the Input tab — without it, Meta is skipped gracefully on every row (see the FAQ).
- Leave "Try it first" on for your first run to see the output shape on 5 companies before spending on the full list.
- Turn off "Check Google Ads" / "Check LinkedIn Ads" / "Check Meta Ads" for any platform you
don't need — this doesn't change the price of a found row, but it does mean one less request
per company (faster, and one fewer thing that can come back
BLOCKED).
Input
{"domains": ["hubspot.com","notion.com","a-company-that-almost-certainly-runs-no-ads.example"]}
One domain or company name per line. Each is checked against Google Ads Transparency Center, the LinkedIn Ad Library and Meta's Ad Library API, and comes back as one row. Accepted formats: nike.com, https://www.nike.com/gb/, Nike, Inc..
A bare domain works best for Google (which has a real domain filter); LinkedIn and Meta have no
domain filter at all, so a domain input is turned into a best-effort brand-name guess for those two
(stripping www. and the TLD — "nike.com" becomes the search term "nike"). A company name
("Nike, Inc.") works for all three and is generally more reliable for LinkedIn and Meta.
Sample output
| query | found | status | advertiserName | googleAdsFound | googleAdsCount | googleAdsLast30Days | googleAdsReason | linkedinAdsFound | linkedinAdsCount | linkedinAdsReason | metaAdsFound | metaAdsCount | metaAdsReason | anyAds | platformsActive | sampleAdUrls | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| hubspot.com | true | OK | Hubspot, Inc. | true | 4000 | 2000 | true | 2568 | false | No Meta Ad Library API access token supplied — provide your own to check Meta. | true | ["google","linkedin"] | ["https://adstransparency.google.com/advertiser/AR10072600183532683265/creative/CR02771141177443876865?region=anywhere","https://adstransparency.google.com/advertiser/AR10072600183532683265/creativ... | 2026-09-21T06:10:16.874Z |
A company with no ads found on any checked platform gets a row with found: false,
anyAds: falsemessage summarizing what each platform reported — and is never charged.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~ads-presence-unified-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"domains":["hubspot.com","notion.com","a-company-that-almost-certainly-runs-no-ads.example"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~ads-presence-unified-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"domains":["hubspot.com","notion.com","a-company-that-almost-certainly-runs-no-ads.example"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~ads-presence-unified-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"domains":["{{company domain or name}}"]}, mapping the row's company domain or name into the domains array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Ad Library Checker: Google, Meta & LinkedIn by Domain" — the agent will find and run this actor.
Typical uses: adding an "already running ads?" column to a Clay prospect table before a marketing- or ad-tech-tool outreach sequence, a weekly n8n workflow that re-checks a target-account list and flags newly-active advertisers, or an AI agent qualifying a lead list by ad spend signal before handing it to a sales rep.
Tips
- Leave all three platforms on for the first pass over a new list — you can always narrow to one platform later once you know which one matters for your use case.
- If you only care about B2B accounts, "Check LinkedIn Ads" alone (with Google and Meta off) is the fastest and cheapest way to run this actor, since it skips the Google RPC and Meta API requests entirely.
- Without a Meta access token,
metaAdsFoundis alwaysnull(not checked) rather thanfalse— that's expected, not a bug; see the FAQ for how to add one. sampleAdUrlslinks straight to each platform's own ad library page — worth a quick manual click-through before you act on atrue, especially for a brand-name (not domain) input where the match is a best-effort text search rather than a verified identity.- Domains match Google reliably; for LinkedIn and Meta, a company name ("Nike, Inc.") is more reliable than a bare domain, since neither has a real domain filter.
vs. alternatives
| What it costs | What you get | Trade-off | |
|---|---|---|---|
This actor (ads-presence-unified-lookup) | $0.016 per found row (~10% off the three single-platform prices combined), $0.00005 actor start, nothing for a miss | One row per company: Google, LinkedIn and Meta ad presence, counts, recency, and sample URLs, checked live on every run | Presence and rough volume, not a full creative export — for that, run the single-platform actor for the one you care about |
google-ads-presence-lookup + linkedin-ads-presence-lookup + meta-ads-presence-lookup (this portfolio, run separately) | $0.003 + $0.012 + $0.003 = $0.018 per company found on all three, billed as three separate events | The same three platforms' full single-platform detail (image/text/video breakdown, verified/legal name, ad-type mix) — more depth per platform | Three actors to run and join yourself, and no bundle discount |
| PowerAdSpy (checked 2026-09) | $69–$399/month subscription, tiered by network | Facebook, Instagram, Google PPC and YouTube on every tier; LinkedIn only unlocks on the $399/mo Palladium tier | A real ad-creative library across many networks, but LinkedIn coverage costs 6x the entry price, and it's a seat-based monthly tool, not a pay-per-row API you can call from a workflow |
| Doing it yourself | Your time + reverse-engineering three different transports (Google's internal RPC, LinkedIn's Cloudflare-fronted HTML behind a residential-grade proxy requirement, Meta's official API auth flow), then joining three result sets per company | The same data | The per-platform quirks (LinkedIn needs Apify's UNBLOCKER proxy group specifically — see that actor's own notes — Google's RPC needs an undocumented client-context blob, Meta needs your own app token) are exactly what this actor absorbs |
Prices for third-party tools are their published list prices as of September 2026 and are not tracked here — check the vendor before relying on the comparison.
FAQ
Do I need a Meta Ad Library API access token?
Only if you want Meta results. Apply for one at
developers.facebook.com/docs/graph-api/reference/ads_archive and paste it into the Input tab —
it's never shipped, stored, or logged by this actor, only sent as a request parameter on your own
runs. Without one, metaAdsFound comes back null for every row (not checked), and Google and
LinkedIn still run normally.
Why is metaAdsFound false even outside the EU/UK when I know a company runs Facebook ads?
Meta's official Ad Library API only covers ordinary commercial ads inside the EU/UK; everywhere
else, it's restricted to political and issue ads. This is Meta's own API restriction, not a bug
here — see meta-ads-presence-lookup's README for the full explanation. If you specifically need
Meta commercial-ad coverage outside the EU/UK, this actor can't provide it (no actor legitimately
can without violating Meta's terms).
Am I charged for a company with no ads found?
No. found/anyAds is false and the row explains why on each checked platform, and
Actor.charge() is never called for that row.
What's the difference between null and false on googleAdsFound (or linkedin/meta)?
false means that platform was checked and found nothing. null means that platform wasn't
checked this run at all — either because you turned its checkbox off, or (Meta only) because no
access token was supplied. Check the matching ...Reason field for the specific explanation
either way.
Does turning off a platform change the price?
No — the price is one flat charge per company with anyAds: true, regardless of how many
platforms were checked or how many came back positive. Turning off a platform you don't need saves
time (fewer requests per company) and reduces what can come back BLOCKED, not money.
Do I need to configure proxies? No. Google and LinkedIn each use a specific Apify proxy group internally (RESIDENTIAL and UNBLOCKER respectively — LinkedIn requires UNBLOCKER specifically, see linkedin-ads-presence-lookup's own notes on why), baked in and not buyer-configurable. Meta calls its official API directly with no proxy at all.
Is this a live check or a stored database? Live, on every run — there's no cached snapshot behind any of the three platforms. A company that starts or stops running ads shows up differently the next time you check it.
Should I use this instead of the three single-platform actors? Use this one for a fast "which of these companies are advertising anywhere" triage pass across a list. Once you've narrowed to a handful of companies you want the full picture on — every sample ad, image/text/video breakdown, verified advertiser identity — run the matching single-platform actor(s) for the depth this one deliberately leaves out.
Can I schedule this to re-check the same list on a cadence? Yes — set up an Apify Task with a schedule (daily, weekly, whatever cadence fits) and point it at this actor with a saved input.
Can an AI agent call this directly? Yes. It's registered on the Apify MCP server — an agent in Claude, Cursor, or another MCP client can find and run it by name, or call the REST endpoint shown above from any script or workflow tool.
Related actors
- Google Ads Presence Lookup — the full single-platform Google Ads Transparency Center detail: image/text/video ad breakdown, verified advertiser identity, legal name, and monitoring mode.
- LinkedIn Ads Presence Lookup — the full single-platform LinkedIn Ad Library detail, plus monitoring mode.
- Meta Ads Presence Lookup — the full single-platform Meta Ad Library API detail, including EU reach data.
- Company Domain Enrichment — broader firmographic and technical enrichment (registration, DNS, tech stack, hiring signal) for the same domain.