Meta & Facebook Ad Library Lead Finder + Website Audit
Pricing
from $30.00 / 1,000 website auditeds
Meta & Facebook Ad Library Lead Finder + Website Audit
Find businesses paying for Facebook and Instagram ads, then audit the landing page they pay to send traffic to. Returns e-mail, phone, CMS, SSL, mobile, site age and a lead score per advertiser. Budget already proven - not a cold list. Large brands filtered out automatically.
Pricing
from $30.00 / 1,000 website auditeds
Rating
0.0
(0)
Developer
Gezgin Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Meta Ad Library Lead Finder
Find businesses that are paying for ads and sending that traffic to a website working against them.
Every other Ad Library scraper answers the same question: what are my competitors advertising? This one answers a different one: which advertisers have a problem I can fix?
The difference is the second half. Search the Meta Ad Library for what you sell into — zahnarzt,
roofing, fitness studio — and for every business currently running ads, this Actor opens the
landing page they are paying to send traffic to and reads it: contact e-mail, phone, CMS, SSL,
mobile layout, how old the footer is, whether any analytics are installed. Then it scores the lead.
Why an advertiser is a better lead
The hardest part of qualifying a small business is finding out whether they have money and whether they are willing to spend it on getting customers. An advertiser has already answered both. They are paying Meta today.
What they often have not done is look at where that traffic lands. A dental practice buying ads into a site with no SSL, or a salon pointing paid clicks at a page last touched in 2019, is not a cold lead — it is a business with budget and a visible, checkable problem.
What comes back
One row per advertiser:
| Field | Meaning |
|---|---|
adDomain, rootDomain | The advertiser's host, and the registrable domain used to keep one row per business |
landingUrl, website, finalUrl | The URL the ad pointed to, the page that was audited, and where it ended after redirects |
foundVia, countries | Which of your search terms and countries surfaced them |
adsFromThisDomain | How many separate ads this domain ran — a rough spend signal |
email, emailSource, emailType, emailConfidence | Address, where it was found, who is behind it, how much to trust it |
phone, phoneSource, contactPageUrl, contactPageChecked | Contact details, where the number came from, and what was actually opened |
emailDomainMatchesSite | false when the address sits on someone else's domain — a privacy vendor, an agency, a parent brand. Those still appear, at reduced confidence, with email_domain_differs_from_site in consistencyFlags |
likelyJsRendered | The page turned out to be an empty shell. Findings that depend on having seen it are suppressed |
trackingTools, opportunityCount, scrapedAt | Which analytics were detected, how many opportunity tags fired, and when the row was produced |
cms, hasSsl, mobileFriendly, copyrightYear, hasTracking, socialLinks, hasContactForm | The technical state of the landing page |
contactabilityScore, opportunityScore, opportunityTags, leadPriority, scoreBreakdown | Can you reach them, do they visibly need help, and how each number was reached |
siteGrade | A to F for the landing page, in the usual direction: A is a healthy site, F is a broken one — so F is the best prospect. Empty when the page could not be read, because a grade for a page nobody saw is a guess |
outreachHook, outreachBasis | One sentence you can open with, built only from what was verified — "Your ads currently point at a page that does not respond." — and which finding produced it. German for DE, AT and CH, English elsewhere |
emailDomainHasMx | Whether the address's domain publishes a mail server, checked by DNS. false means almost certainly undeliverable and lowers the confidence; empty means the lookup itself failed, which is not the same as a negative answer |
statusNote | Plain sentence explaining any row that looks empty |
siteReachable, fetchStatus | ok, http_403, timeout, dns_error. A 403 means the host refused us — it is never scored as a fault of the business |
Large advertisers are dropped automatically. A domain running many separate ads is a brand with a media budget, not a local business you can sell a website to. Counting ads per domain filters them far more reliably than any list of brand names, and the threshold is yours to set.
Input
| Field | Default | What it does |
|---|---|---|
queries | — | What they advertise: zahnarzt, dentist, roofing. Required. |
countries | ["DE"] | Two-letter codes. Ads are indexed per country, so each one is a separate search and adds advertisers |
activeOnly | true | Only businesses running ads right now |
relevanceFilter | strict | strict keeps an advertiser only if the trade appears in their domain, page title or H1, and drops obvious retailers. loose also accepts a mention anywhere on the page. off returns everything |
skipBigAdvertisers | true | Drop domains running many separate ads: those are brands with a media budget |
bigAdvertiserThreshold | 4 | How many ads count as "large" |
auditWebsite | true | Open and profile the landing page. This is the point of the Actor |
maxContactPages | 5 | How hard to look for contact details when the landing page yields none |
maxAdvertisersPerSearch, maxConcurrency, maxRunTimeSecs, proxyConfiguration | Ordinary controls |
Use it when, and don't when
Use it to build a list of local businesses that are already spending on ads and whose website you could improve — web design, hosting, SEO, CRO, marketing services.
Do not use it for competitor ad research. It returns advertisers and their websites, not ad creatives, copy, spend or reach. Several Ad Library scrapers do that far better and cheaper.
Honest limits
Read this before you buy.
One search yields roughly 20 advertisers. This is measured, not estimated: across three search terms the page stopped producing new advertisers after about twenty, and two different scrolling strategies changed nothing. Breadth therefore comes from running several search terms and several countries, not from depth in one. If you need thousands of raw ads rather than a short list of qualified leads with audited websites, a plain Ad Library scraper will serve you better and cost less.
The search matches ad wording, not industry — the filter fixes most of that, not all.
Unfiltered, physiotherapie in Germany and Austria returned 31 advertisers of which about seven
were physiotherapists; the rest were a pet-supply shop, a pet insurer, an insole brand, a hotel and
a school, each of whom mentions the word in their ads. relevanceFilter: strict judges an
advertiser by what it calls itself — domain, page title, H1 — rather than by anything it happens
to mention, and drops obvious retailers.
Measured after that change: zahnarzt returned six advertisers and all six were dental
practices. physiotherapie returned ten, of which seven were physiotherapists. Across both,
roughly four rows in five are on target, against roughly one in four unfiltered.
What still slips through are suppliers to the trade — an anatomy-poster shop, a practice-equipment site — because they name the trade as prominently as its members do. Telling "I am one" from "I sell to them" is a question of meaning, not of words, and this Actor does not attempt it. Prefer narrow search terms, and expect to discard the occasional supplier.
Precision costs volume. Strict filtering takes a search from roughly twenty or thirty rows down
to six or ten. That is the intended trade: a short right list beats a long mixed one. If you would
rather sort it yourself, set relevanceFilter to loose or off.
Placeholder addresses are filtered, including the German ones. max@mustermann.de and
email@adresse.de appeared as contacts on a live run before that was fixed. If you see one, report
it — handing a salesperson a placeholder is worse than handing them an empty cell.
The Ad Library is public, and that is the whole basis of this Actor. EU and US ad-transparency rules require it. No login, no cookies, no proxy — but it also means only what Meta publishes is available, and Meta decides that.
No browser for the landing pages. They are read over plain HTTP, which is what makes this fast
and cheap. A site that builds itself in the browser hands us a shell; those rows are flagged
likelyJsRendered and the "no contact form" and "no social presence" findings are suppressed,
because we never actually saw the page.
The scoring weights are reasoned, not calibrated. Nobody has measured which lead converts.
Every row carries a scoreBreakdown so you can see each contribution and disagree with it.
This Actor is new. The extraction and scoring engine behind the audit is the same one used by our Website Contact Scraper, where it finds e-mail addresses on roughly three quarters of the sites in German and US test batches. The Ad Library half has no track record yet. Treat your first run as a sample, not a promise.
Pricing
You are billed only for rows you actually receive. An advertiser dropped by the relevance filter, a search the Ad Library refused to load, and a landing page that refused us all cost nothing — charging for our own misses is the fastest way to lose the trust this Actor needs to be picked at all.
Pay per event: advertiser-found when a business is returned, website-audited when its landing
page was actually fetched and profiled. A search that finds nothing, and a landing page that refuses
us, cost you nothing.
Legal
Only public data is collected — the Ad Library is published by Meta under advertising-transparency law, and landing pages are read as any visitor reads them. Under GDPR, contacting businesses whose details you obtain this way needs a lawful basis; for B2B outreach in the EU that is usually legitimate interest, and in Germany §7 UWG additionally restricts unsolicited advertising. Every row records where its address came from. This is not legal advice.