UGC Leads Finder: Active Meta Advertisers
Pricing
from $1.00 / 1,000 results
UGC Leads Finder: Active Meta Advertisers
Find UGC and agency leads from brands actively running Meta (Facebook/Instagram) ads, complete with contact info and an opportunity score for every advertiser.
Pricing
from $1.00 / 1,000 results
Rating
5.0
(1)
Developer
Leafy
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Find brands actively running Meta ads right now, and turn them into a ready-to-pitch, priority-ranked list of UGC and outreach leads, complete with contact info.
If you're a UGC creator, video editor, or agency hunting for brands to pitch, this turns hours of scrolling the Ad Library and Googling every brand for an email into a ranked list of who's actively spending and worth reaching out to today.
Point it at one or more niches and a country. Walk away with every advertiser currently running Meta (Facebook/Instagram) ads that match, each one scored on how active and how "fresh" their ad activity is, with the exact reason to reach out.
Add a whole list of close query variations in one run (skincare, skin care, serum, acne, moisturizer, ...). Each is searched separately, then results are merged and de-duplicated so every unique advertiser is scored only once.
Built for UGC creators, video editors, ad agencies, marketing agencies, landing-page designers, CRO agencies, and freelance marketers.
⚡ Actively maintained: latest fixes (August 2026)
This actor is monitored and patched quickly whenever Meta changes its Ad Library. Recently shipped:
- FIXED: runs that returned 0 results. Meta rate-limits its Ad Library by IP, and a shared default proxy IP can already be rate-limited by unrelated traffic before your run even starts. Meta requests now automatically route through a residential proxy, which isn't shared the same way, so runs recover on their own.
- IMPROVED: enrichment speed. Website and contact lookups for each qualified lead now run in parallel instead of one page at a time, and the run logs progress every ~10% of leads processed, so a large batch never looks stuck.
Meta requests use a residential proxy automatically. That can add a small amount to run cost versus a plain datacenter proxy, but it's the reliable way to keep runs from getting rate-limited, and the log always says exactly what happened.
Why it beats a generic Ad Library scraper
A normal Facebook Ad Library scraper dumps every ad and leaves you to figure out who's actually worth contacting: hundreds of rows, many from the same handful of advertisers. This one does the qualifying for you:
- ✅ Groups by advertiser, not by ad. One clean row per business, not a wall of duplicate ad rows to sift through.
- ✅ Filters by activity, not just presence. Only advertisers running at least your minimum number of active ads make the list.
- ✅ Finds their website and contact info for you. Email, phone, Instagram, TikTok, and LinkedIn, pulled straight from the advertiser's own site.
- ✅ Ranks every lead 0 to 100 so you work the hottest prospects first.
- ✅ Tells you why each business is a lead, in plain English you can drop straight into your cold-outreach or UGC pitch template.
- ✅ No other paid Apify Actor or scraping service required. The Meta Ad Library extraction is built directly in.
What you get
One row per advertiser. Export to CSV / JSON / Excel, or pipe straight into Instantly, Smartlead, Apollo, HubSpot, or Pipedrive.
{"advertiserName": "GlowLab Skincare","facebookPageId": "123456789","facebookPageUrl": "https://www.facebook.com/glowlabskincare","website": "https://glowlabskincare.com","domain": "glowlabskincare.com","emails": ["hello@glowlabskincare.com"],"phones": ["+15551234567"],"instagram": "https://www.instagram.com/glowlabskincare","linkedin": null,"tiktok": "https://www.tiktok.com/@glowlabskincare","activeAdCount": 19,"videoShare": 0.16,"adsStartedLast30Days": 8,"creativeVelocity": "HIGH","opportunityScore": 85,"opportunityReason": "High-opportunity advertiser: 19 active ads, 8 new ads started in the last 30 days, only 16% of creatives are video, and a public business email was found."}
(abbreviated; see Output fields below for the full row)
Creative velocity, at a glance
Every advertiser gets a creativeVelocity rating based on how many new ads they've started in the last 30 days, a quick read on how actively they're testing new creative.
| Velocity | What it means | Why it matters |
|---|---|---|
VERY_HIGH | 20+ new ads in the last 30 days | Constantly testing, always hungry for fresh creative |
HIGH | 10 to 19 new ads in the last 30 days | Active, ongoing testing cadence |
MEDIUM | 4 to 9 new ads in the last 30 days | Steady but modest testing |
LOW | 1 to 3 new ads in the last 30 days | Slow cadence, an easy opening to pitch fresh creative |
NONE | 0 new ads in the last 30 days | Running the same creative for a while |
⚠️ Important: this is not ad-spend data
Active ad count is not estimated ad spend. This actor counts how many distinct ads an advertiser currently has running in the Meta Ad Library. It does not know, estimate, or imply how much money any advertiser is spending. Treat activeAdCount and creativeVelocity as signals of advertising activity, not budget.
How it works
- Searches the public Meta Ad Library for active ads matching each of your search queries.
- Groups every ad by advertiser (their Facebook Page), merging and de-duplicating across all your queries so each business is scored once.
- Calculates ad activity per advertiser: how many active ads, how fast they're adding new ones, and what formats they favor.
- Drops any advertiser below your minimum activity bar before doing any expensive work.
- Visits each qualifying advertiser's own website and pulls public email, phone, and social links.
- Scores every remaining advertiser 0 to 100 and writes one row per advertiser to the dataset.
Input
{"searchQueries": ["skincare", "serum"],"country": "US","minActiveAds": 5,"maxAdvertisers": 100}
| Field | Type | Default | What it does |
|---|---|---|---|
searchQueries | string[] | ["skincare"] | Keywords to search. Use several close variations (skincare, skin care, serum, acne) to widen coverage of a niche; results are merged and de-duplicated by advertiser across all queries. |
country | string | US | Country to search, picked from a dropdown of country names (matches the country selector on the public Ad Library site). |
maxAds | integer | 1000 | Cap on total raw ads scanned across all queries: a cost and runtime ceiling, not a lead count. |
maxAdvertisers | integer | 100 | Stop once this many qualified advertisers (leads) have been found. |
minActiveAds | integer | 1 | Only advertisers running at least this many active ads become leads. Raise this to focus on heavier advertisers. |
includeContactEnrichment | boolean | true | Visit each qualifying advertiser's website for public contact info. Turn off to run faster and cheaper (Meta data only). |
maxWebsitePagesPerLead | integer | 4 | Max pages checked per advertiser website during contact lookup (home, contact, about, team). |
Output fields
Every record contains every field below. Nullable fields are null when not found.
| Field | Type | Description |
|---|---|---|
advertiserName | string | Advertiser / Facebook Page name |
facebookPageId | string | null | Facebook Page ID |
facebookPageUrl | string | null | Link to the Facebook Page |
website | string | null | Advertiser's own website, discovered from their ads |
domain | string | null | Root domain of website |
emails | string[] | Public emails found on the website |
phones | string[] | Public phone numbers found on the website |
instagram / linkedin / tiktok | string | null | Social profile links found on the website |
contactPageUrl | string | null | The page the contact info was found on |
activeAdCount | int | Number of currently active ads |
imageAdCount / videoAdCount / carouselAdCount | int | Active ads by creative format |
videoShare | number | Share (0 to 1) of active ads that are video |
adsStartedLast7Days / adsStartedLast30Days / adsStartedLast90Days | int | New ads started in each window |
oldestActiveAdDate / newestActiveAdDate | string | Date range of active ads |
creativeVelocity | enum | NONE | LOW | MEDIUM | HIGH | VERY_HIGH (see table above) |
ctas | string[] | Unique call-to-action button texts used |
landingPages / landingDomains | string[] | Unique ad destination URLs / domains |
platforms | string[] | Where the ads run, e.g. FACEBOOK, INSTAGRAM |
queriesMatched | string[] | Which of your search queries surfaced this advertiser |
opportunityScore | int | 0 to 100 deterministic score (see below) |
opportunityReason | string | Plain-English explanation of the score |
sampleAds | array | A handful of the advertiser's most recent ads (id, date, text, CTA, destination, format) |
Opportunity score
A deterministic 0-100 score, no AI involved. Every point is traceable to a rule, so it's always explainable and reproducible:
| Signal | Weight | Rewards |
|---|---|---|
| Advertising activity | 35 | More active ads |
| Creative velocity | 25 | More new ads in the last 30 days |
| Creative format opportunity | 20 | Low video share (the actual opportunity for video editors and UGC creators) |
| Contactability | 10 | A public email (full credit) or phone/social (partial) was found |
| Advertiser longevity | 10 | Longer-running advertisers, which signals a real, committed budget rather than a one-off test |
Priority at a glance:
- 70 to 100 (High-opportunity): heavy, active ad activity with real room to improve creative. Your strongest pitch.
- 40 to 69 (Medium-opportunity): solid ad activity, worth a look.
- 0 to 39 (Low-opportunity): lighter activity or already video-heavy. Lower priority, but kept in the dataset so you can decide.
Sample output
Three rows across the priority range (illustrative data):
[{"advertiserName": "GlowLab Skincare","website": "https://glowlabskincare.com","domain": "glowlabskincare.com","emails": ["hello@glowlabskincare.com"],"phones": ["+15551234567"],"instagram": "https://www.instagram.com/glowlabskincare","activeAdCount": 19,"videoShare": 0.16,"adsStartedLast30Days": 8,"creativeVelocity": "HIGH","opportunityScore": 85,"opportunityReason": "High-opportunity advertiser: 19 active ads, 8 new ads started in the last 30 days, only 16% of creatives are video, and a public business email was found."},{"advertiserName": "Sunrise Botanicals","website": "https://sunrisebotanicals.co","domain": "sunrisebotanicals.co","emails": [],"phones": ["+15559876543"],"instagram": "https://www.instagram.com/sunrisebotanicals","activeAdCount": 6,"videoShare": 0.5,"adsStartedLast30Days": 3,"creativeVelocity": "MEDIUM","opportunityScore": 52,"opportunityReason": "Medium-opportunity advertiser: 6 active ads, 3 new ads started in the last 30 days, 50% of creatives are video, and public contact details were found (no direct email)."},{"advertiserName": "Pure Radiance Co.","website": "https://pureradianceco.com","domain": "pureradianceco.com","emails": [],"phones": [],"instagram": null,"activeAdCount": 2,"videoShare": 1,"adsStartedLast30Days": 0,"creativeVelocity": "NONE","opportunityScore": 19,"opportunityReason": "Low-opportunity advertiser: 2 active ads, no new ads started in the last 30 days, 100% of creatives are video, and no public contact info was found yet."}]
How fast and how big
- Meta scanning is fast: it pulls structured data only (no image or video downloads), so a few hundred ads scan in well under a minute.
- Enrichment is the slowest phase since it visits each qualifying lead's real website. A batch of 100 leads typically finishes in a couple of minutes, with progress logged as it goes.
- The run stops as soon as
maxAdvertisersqualified leads are found, ormaxAdsraw ads have been scanned, whichever comes first, so a broad query doesn't run forever. - Every website is only ever visited once per run, and reused for a while across runs, even if the same brand matches several of your search queries.
- Cost scales mainly with how many advertisers pass
minActiveAds, not with how many ads exist for a niche. RaisingminActiveAdsis the fastest way to shrink both cost and runtime.
FAQ
I'm a UGC creator, not an agency. Is this actually for me? Yes. Every advertiser here is a brand already paying to run ads, which means they have budget and are actively looking for creative that converts. That's exactly the kind of brand worth pitching for a UGC or content partnership, and the opportunity score highlights the ones investing heavily without much video yet, which is your strongest angle.
Does this tell me how much a business is spending on ads?
No. activeAdCount and creativeVelocity measure ad activity, meaning how many ads are running and how often new ones appear, not budget. Meta's Ad Library doesn't expose spend for most advertisers, and this actor never estimates or implies one.
Why did I get fewer leads than maxAdvertisers?
maxAdvertisers is a ceiling, not a target. If fewer advertisers in your niche meet minActiveAds, you'll get fewer rows. Lower minActiveAds or add more searchQueries to surface more.
A lead has no email or phone. Why keep it? Not every business publishes contact info on their site, but their ad activity is still a real signal. The lead is kept with empty contact fields rather than dropped. Filter those out in your spreadsheet if you only want fully-enriched rows.
Can I search several niches at once?
Yes. Add close variations to searchQueries (e.g. skincare, skin care, serum, acne). Each is searched separately, then results are merged and de-duplicated so the same advertiser is only scored once, even if it matches several queries.
Do I need to configure a proxy? No. The actor automatically requests a residential proxy for its Meta Ad Library traffic (Meta rate-limits shared datacenter IPs aggressively) and falls back gracefully if your account doesn't have one available. Nothing to turn on.
Is this allowed? It collects publicly visible ad and business information straight from Meta's own public Ad Library and each business's own website. You're responsible for using the data in line with applicable laws and platform terms, including marketing and anti-spam rules (e.g. CAN-SPAM, GDPR) when you run outreach.
Use cases
- UGC creators and video editors finding brands already investing in paid social, ready to pitch for a content or brand deal
- Ad agencies and marketing agencies building outbound prospecting lists
- Landing-page and CRO agencies targeting advertisers with room to improve
- Freelance marketers building a warm-lead pipeline
- Niche research: see which brands in a category are actively advertising right now
Limitations
- Meta's Ad Library only shows ads currently classified as active; an advertiser that paused ads the same day won't appear.
- Very high-volume advertisers with many near-duplicate ads (which Meta itself groups together) may show a slightly lower
activeAdCountthan their true total. - Contact info depends on what a business actually publishes; a real, active advertiser can still come back with no email or phone if their site doesn't list one.
activeAdCountandcreativeVelocityare activity signals, not ad spend. See the note above.
Contact / feedback
Bug reports, feature requests, and use-case tips are welcome. Email the developer at leafydevjr@gmail.com.