LinkedIn Ad Discovery — Who's Advertising on Any Topic
Pricing
from $8.00 / 1,000 results
LinkedIn Ad Discovery — Who's Advertising on Any Topic
Discover who advertises on any topic on LinkedIn's public Ad Library. Keyword in → a deduped advertiser list with ad count, sample creatives, active window & formats — enriched with each advertiser's real firmographics (domain, industry, size). No login.
Pricing
from $8.00 / 1,000 results
Rating
0.0
(0)
Developer
Berkan Kaplan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 hours ago
Last modified
Categories
Share
LinkedIn Ad Discovery — Find Every Advertiser on a Topic
Type a keyword — CRM, cybersecurity, solar, a competitor's whole category — and get back who is advertising on it: a deduped, ad-volume-ranked list of the companies running LinkedIn ads on that topic, each with its ad count, live sample creatives and format mix. Where an advertiser resolves to a real company, records also carry best-effort firmographics (domain, industry, size, HQ).
Every other ad-library scraper hands you a pile of individual ads to de-dupe yourself. This one answers the actual question — which companies are spending on this topic — as a ready-made prospect and competitor map. It reads the public LinkedIn Ad Library only: no login, no cookies.
- 🔎 Keyword → advertiser map — one topic in, a deduped list of the companies advertising on it, ranked by ad volume
- 🏢 Firmographics where we can resolve them — domain, industry, employee count, HQ & followers (best-effort, name-resolved for roughly half of advertisers)
- 🧱 Breaks the ~24-ads-per-query ceiling — date × country facet fan-out scans far more of a topic than a single search page
- ⚡ Cookieless, no login — public Ad Library only; one run → JSON / CSV / Excel / API
Quick start (API)
Discover who's advertising on CRM and cybersecurity, enriched, in one call:
curl -X POST "https://api.apify.com/v2/acts/foxlabs~linkedin-ad-discovery/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{ "keywords": ["CRM", "cybersecurity"], "maxAdsPerKeyword": 120, "enrichAdvertiser": true }'
Prefer no code? Open the Input tab, type your keywords, and click Start — then download the results.
What you get
By default, one clean record per advertiser discovered for a keyword (rolled up and ranked by ad volume):
| Field | Type | Description |
|---|---|---|
keyword | string | The topic query that surfaced this advertiser |
advertiserName | string | Advertiser name — the official company name when firmographics resolve, otherwise the name shown on the ad |
adCount | number | How many of the scanned ads on this topic this advertiser is running (the ranking signal) |
formats | array | Format breakdown, e.g. [{ "format": "image", "count": 9 }, { "format": "video", "count": 5 }] |
sampleCreatives | string[] | Up to 3 ad-copy snippets (≤140 chars each) from this advertiser's ads |
advertiserCompanyId | string | LinkedIn numeric organization id — present only when the advertiser is resolved |
advertiserUrl | string | https://www.linkedin.com/company/{id} — present only when resolved |
advertiserCompany | object | Best-effort firmographics (sub-fields below) — present only when resolved |
sources | object | Provenance, e.g. { "ads": "LinkedIn Ad Library (public)", "firmographics": "LinkedIn company page (name-resolved)" } |
scrapedAt | string | ISO-8601 timestamp of the run |
advertiserCompany sub-object (best-effort, present only when the advertiser resolves to a company):
| Field | Type | Description |
|---|---|---|
advertiserCompany.domain | string | Company website domain, e.g. hubspot.com — the field to verify a match |
advertiserCompany.industry | string | LinkedIn industry label |
advertiserCompany.employeeCount | number | Employee count from the public company page |
advertiserCompany.hq | string | HQ location — locality, region, country |
advertiserCompany.followers | number | LinkedIn follower count |
advertiserCompany.website | string | Full company website URL |
Empty fields are dropped, never guessed — an advertiser that can't be resolved simply omits advertiserCompany, advertiserCompanyId and advertiserUrl.
Ads mode (set Output shape → Ads) returns one record per individual ad instead:
| Field | Type | Description |
|---|---|---|
keyword | string | The topic query |
adUrl | string | https://www.linkedin.com/ad-library/detail/{id} |
advertiserName | string | Name shown on the ad card |
body | string | Ad copy (≤200 chars) |
format | string | image or video (when detectable) |
source | string | LinkedIn Ad Library (public) |
scrapedAt | string | ISO-8601 timestamp |
Sample output
Illustrative record (advertiser rollup mode), shape taken from the live Actor:
{"keyword": "CRM","advertiserName": "HubSpot","advertiserCompanyId": "68529","advertiserUrl": "https://www.linkedin.com/company/68529","adCount": 14,"formats": [{ "format": "image", "count": 9 },{ "format": "video", "count": 5 }],"sampleCreatives": ["Grow better with the Smart CRM that connects your marketing, sales and service teams.","See why 250,000+ businesses run on our platform. Start free — no credit card required.","Your CRM shouldn't slow you down. Meet the AI-powered platform built to scale with you."],"advertiserCompany": {"domain": "hubspot.com","industry": "Software Development","employeeCount": 8100,"hq": "Cambridge, Massachusetts, US","followers": 1050000,"website": "https://www.hubspot.com"},"sources": {"ads": "LinkedIn Ad Library (public)","firmographics": "LinkedIn company page (name-resolved)"},"scrapedAt": "2026-07-05T09:12:44.581Z"}
Input & filters
- Keywords / topics — one or more terms to discover advertisers for (e.g.
CRM,cybersecurity,developer tools). You get one advertiser rollup per company found on each topic. - Output shape —
Advertisers(rolled up, one row per unique advertiser — recommended) orAds(flat, one row per individual ad). - Max ads per keyword — how many ads to scan per keyword before rolling up (1–1000, default 120). More ads scanned → more advertisers discovered.
- Enrich advertiser firmographics — on by default; attaches domain, industry, employee count, HQ and followers per advertiser (best-effort, name-resolved). Turn off for a faster, discovery-only run.
- Proxy — Residential proxy by default and strongly recommended; LinkedIn rate-limits and blocks datacenter and un-proxied traffic.
Example inputs (copy & paste)
// 1) Who is advertising across CRM & marketing automation — enriched advertiser map{ "keywords": ["CRM", "marketing automation"], "maxAdsPerKeyword": 200, "enrichAdvertiser": true }// 2) Wide, fast scan of a category (skip enrichment for speed){ "keywords": ["cybersecurity"], "maxAdsPerKeyword": 500, "enrichAdvertiser": false }// 3) Raw ad feed for creative research — one row per ad{ "keywords": ["developer tools"], "output": "ads", "maxAdsPerKeyword": 300 }// 4) Multi-topic prospect list — several adjacent categories, enriched{ "keywords": ["fintech", "payments", "banking software"], "output": "advertisers", "maxAdsPerKeyword": 250, "enrichAdvertiser": true }// 5) Deep single-topic advertiser census — maximum depth{ "keywords": ["artificial intelligence"], "output": "advertisers", "maxAdsPerKeyword": 1000, "enrichAdvertiser": true }// 6) Creative swipe across a theme — flat ads, no enrichment, fast{ "keywords": ["HR software", "recruiting"], "output": "ads", "enrichAdvertiser": false, "maxAdsPerKeyword": 200 }
Use cases
- Account discovery & prospecting. You sell into a category — say CRM tooling. Search
keywords: ["CRM"]with enrichment on and you get a deduped list of the companies actively advertising there, each with adomain,industryandemployeeCountto qualify against — a CRM-ready prospect list you didn't have to hand-build. - Competitive landscaping. Who is spending on your theme, and how heavily?
adCountranks advertisers by ad volume so you can see the loud players versus the long tail on a single topic in one run. - Creative & messaging research.
sampleCreativessurfaces the live ad copy each advertiser is running on the topic — read the market's current positioning and hooks without opening the Ad Library ad by ad. - Market sizing. Pull several related keywords and count the unique advertisers, their industries and size distribution to gauge how crowded (and how enterprise-heavy) a category is.
- ABM & CRM enrichment. Feed the discovered advertisers (domain + firmographics) straight into your ABM tooling or CRM to build target lists of companies that have already shown intent by advertising.
- Agency new-business. Find brands already spending on a theme you specialize in — a warm outbound list of companies that clearly invest in paid social.
Performance & throughput
Each keyword fans out across roughly 16 faceted search queries (date × country) run at concurrency 12, deduping by ad id — this is what breaks LinkedIn's ~24-results-per-query page and scans far more of a topic than a single search. With enrichment on, each unique advertiser adds one cached company-page fetch (looked up once, reused). Raising maxAdsPerKeyword scans deeper (more advertisers, longer run); turning enrichment off makes discovery-only runs noticeably faster. Real throughput is bounded by LinkedIn's rate limits and your proxy, not the Actor — a Residential proxy is required.
Integrations
JavaScript (apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('foxlabs/linkedin-ad-discovery').call({keywords: ['CRM', 'cybersecurity'], maxAdsPerKeyword: 200, enrichAdvertiser: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python (apify-client):
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("foxlabs/linkedin-ad-discovery").call(run_input={"keywords": ["CRM", "cybersecurity"], "maxAdsPerKeyword": 200, "enrichAdvertiser": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["advertiserName"], item.get("adCount"), item.get("advertiserCompany", {}).get("domain"))
Also works with Make / n8n / Zapier (Apify app → run this Actor, map the input), scheduled runs, webhooks, and the Apify MCP server so AI agents can call it as a tool.
Data quality
- The discovery data is exact.
advertiserName,adCount,formatsandsampleCreativesare read directly from the public Ad Library search pages — who is advertising and how much is not estimated. - Firmographics are best-effort. They're resolved from the advertiser name (LinkedIn serves public company data only at slug URLs, not the numeric id, which sits behind a login wall), and resolve for roughly half of advertisers. Specific names resolve well; a generic single-word brand can occasionally match a same-named company in another industry — always verify
advertiserCompany.domainbefore critical use. - No fabrication. Missing fields are omitted, never invented — an unresolved advertiser simply has no
advertiserCompany. - Coverage is broad, not exhaustive for very popular topics — bounded by
maxAdsPerKeyword, not silently truncated at LinkedIn's ~24-per-query page.
No fill-rate percentages are claimed here beyond the approximate resolution rate above; the numbers you get are whatever the public Ad Library returns for your query.
Pricing
Pay per result — you're billed per record returned (per advertiser in the default rollup, or per ad in flat mode). Name-based enrichment caches one company-page lookup per advertiser, so it doesn't multiply cost. There's an Apify free tier to evaluate the full feature set before you scale, and no third-party proxy bill on top when you use Apify Residential proxy.
FAQ
What does one record represent? By default, one advertiser rolled up for a keyword (deduped, ranked by adCount). Switch Output shape → Ads for one record per individual ad.
How do you find "who's advertising"? By searching the public LinkedIn Ad Library for your keyword and fanning out across date and country facets, then deduping ad ids and grouping by advertiser. No login, no cookies.
How accurate are the firmographics? They're best-effort, resolved from the advertiser's name, and land for roughly half of advertisers. Treat them as a qualification bonus and confirm the match via advertiserCompany.domain. The discovery data itself is exact.
Why do some advertisers have no company or domain? Because the name couldn't be confidently resolved to a public company page — we omit the firmographics rather than attach a wrong guess.
Do I need a LinkedIn login, cookies or account? No. The Actor only reads the public Ad Library and public company pages.
Can I get the individual ads instead of the rollup? Yes — set Output shape → Ads for a flat, one-row-per-ad feed with adUrl, body and format.
Do I get impressions, spend, run dates or targeting? Not in this Actor — those are per-ad EU/DSA details. Use the companion LinkedIn Ad Tracker, which tracks a known company's ads in depth (run dates, impressions, targeting). This Actor is for discovery: keyword → advertisers.
Why do I need a Residential proxy? LinkedIn rate-limits and blocks datacenter and un-proxied traffic; Residential (the default) is what keeps runs succeeding.
How many advertisers can I get per keyword? As many as appear within maxAdsPerKeyword (1–1000) ads scanned — raise it to surface more of a busy topic.
What export formats are available? JSON, CSV, Excel, or via the Apify API and integrations.
Troubleshooting
- 0 or very few advertisers → the keyword is too niche or misspelled, or the cap is low. Try a broader term and raise
maxAdsPerKeyword. - Firmographics missing for many advertisers → expected; resolution is best-effort (~half) and worse for generic single-word brands. Keep
enrichAdvertiseron, and verify each match viaadvertiserCompany.domain. - A resolved company looks wrong → name resolution can collide on generic brand names. Always check
advertiserCompany.domainbefore acting on a record; the discovery fields (advertiserName,adCount, samples) remain exact. - Run is slow or getting rate-limited → enrichment adds a company-page fetch per unique advertiser. Lower
maxAdsPerKeyword, turn offenrichAdvertiser, and make sure a Residential proxy is selected.
Notes, limits & legal (honest)
- Public data only. This Actor reads the public LinkedIn Ad Library and public company pages — no login, no cookies, nothing gated or private.
- LinkedIn ToS is your responsibility. LinkedIn provides no official public Ad Library API; this reads publicly served pages. You are responsible for using the output in line with LinkedIn's Terms of Service and applicable law (including GDPR/CCPA where relevant). Use it for legitimate market research and B2B intelligence.
- Firmographics are best-effort (~half of advertisers) and name-resolved — verify via
domain. The discovery data (who advertises, ad count, formats, sample copy) is read directly and is exact. - No per-ad dates, impressions or targeting here. Those live on the companion LinkedIn Ad Tracker (which tracks a known company's ads in depth). This Actor is discovery: keyword → advertisers.
- Coverage is broad, not exhaustive for very popular topics — raise
maxAdsPerKeywordto scan deeper. What's dropped is bounded by your cap, not silently cut at LinkedIn's ~24-per-query page. - Not affiliated with, endorsed by, or sponsored by LinkedIn Corporation. "LinkedIn" is a trademark of LinkedIn Corporation.
Support
Questions, a field you'd like added, or a custom build? Open the Issues tab on this Actor, or email info@foxlabs.com.tr. We reply fast.
If this Actor saves you time, a ⭐ review really helps.
Changelog
0.2 — 2026-07-05
- Reworked docs to the foXLabs gold standard: API quick-start, full field table (advertiser rollup + Ads mode), real sample output, JS/Python/Make/n8n/Zapier/MCP integrations, FAQ, troubleshooting and honest legal notes.
- (Engine, shipped in 0.2) Advertisers are read straight from the ad-library search pages (~2× faster than fetching every ad's detail page); higher enrichment concurrency; multiple slug spellings per advertiser. Per-ad dates, impressions and targeting live on the companion LinkedIn Ad Tracker.
0.1
- Initial release. Keyword → date × country facet fan-out → advertiser rollup (ad count, sample creatives, format mix) with best-effort firmographic enrichment and provenance. Cookieless, no login.
Part of the foXLabs data platform — public-data company, contact, jobs, ads, procurement & AI-search intelligence scrapers. Browse the full suite at data.foxlabs.com.tr. Companion actor: LinkedIn Ad Tracker — track a known company's ads (creative, run dates, EU/DSA impressions & targeting) in depth.
