LinkedIn Ad Library Scraper avatar

LinkedIn Ad Library Scraper

Pricing

from $0.50 / 1,000 ad with full details

Go to Apify Store
LinkedIn Ad Library Scraper

LinkedIn Ad Library Scraper

Extract LinkedIn ads from the LinkedIn Ad Library: creatives, impressions by country, targeting and paying entity. No login. Export CSV, JSON, Excel.

Pricing

from $0.50 / 1,000 ad with full details

Rating

0.0

(0)

Developer

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Extract structured advertising intelligence from the LinkedIn Ad Library — ad creatives, estimated impressions by country, targeting parameters and the legal entity that paid for each ad. No login, no cookies, no browser.

🎯 The only LinkedIn ad scraper that doesn't bill you for the wrong advertiser. Searching HubSpot on LinkedIn also returns Sparkon | HubSpot Elite Partner, MAN Digital: HubSpot & RevOps Agency and a dozen other partners — 26% noise in our measurements. This Actor targets by company ID or filters by exact name, and drops the rest before fetching their detail pages, so you never pay for them.

🚀 Try it free — your first $5 of Apify usage is on the house. No credit card, no LinkedIn account.


📌 What is LinkedIn Ad Library Scraper?

The LinkedIn Ad Library is LinkedIn's public ad transparency archive, published under the EU Digital Services Act. It shows every ad an advertiser ran in the last 12 months — 25 at a time, behind an infinite scroll, with no export and no API.

LinkedIn Ad Library Scraper turns it into a dataset: the copy, video and image URLs, landing page, impression bucket, country split, the targeting the advertiser selected, and who paid the bill.

Typical uses: competitive monitoring (what's running right now, via isActive), media agency mapping (payingEntity reveals who runs a brand's paid social), share of voice (absolute impression estimates per country), targeting teardowns, and creative libraries of competitor copy, video and landing pages.


📋 What data does LinkedIn Ad Library Scraper extract?

FieldTypeDescription
🆔 adIdstringLinkedIn's numeric ad ID — stable primary key
🔗 adUrlstringDirect link to the Ad Library detail page
🏢 advertiserName / advertiserId / advertiserUrlstringCompany running the ad, plus its LinkedIn page
💳 payingEntitystringLegal entity that paid (often the media agency)
🏷️ creativeType / adFormatstringSPONSORED_VIDEO, SPONSORED_STATUS_UPDATE, JOBS_V2… / "Video Ad", "Single Image Ad"…
📝 commentarystringFull ad copy, line breaks preserved
📰 headline / callToActionstringSponsored content headline and CTA label
🌐 destinationUrlstringLanding page (LinkedIn tracking stripped, UTMs kept)
🎬 videoUrls / imageUrls / documentPageUrlsarrayDirect media URLs for every creative asset
🎠 carouselCardsarrayPer-slide title, image and destination for Carousel Ads
🔗 commentaryLinksarrayLinks embedded in the body copy — often the real destination
📅 startDate / endDate / durationDaysstring / intNormalised run period
🟢 isActivebooleanWhether the ad is still running today
📈 impressionsTotalRaw / Min / Maxstring / intPublished bucket (100k-150k) plus parsed bounds
🌍 impressionsByCountryarrayCountry, share, and absolute estimate (estimatedMin/estimatedMax) per market
🎯 targetingSegmentsarrayIncluded / excluded values per parameter (Language, Location, …)
🎛️ targetingParametersarrayWhich parameter families were used to target or exclude
🧩 variantsarrayFull per-variant payload for multi-creative ads

Ad formats covered

All 15 creative types LinkedIn's own frontend knows about, including the ones most scrapers flatten: Carousel (per-slide titles and destinations), Event (event name and CTA), LinkedIn Article, Job posting, Document (title plus page images), Single Image, Video, Message, Spotlight, Text and Follow Company ads. Unknown or new formats degrade gracefully to the universal extraction rather than returning empty.

Note: impressions and targeting are only published for ads served in the EU region. Non-EU ads return targetingAvailable: false and null impressions — that is LinkedIn's limitation, not the scraper's.


🚀 How to use LinkedIn Ad Library Scraper

  1. Pick your advertisers. Paste company URLs or IDs for exact targeting, or type names and set advertiserMatch (see the section above).
  2. (Optional) Paste a search URL instead. Apply filters on linkedin.com/ad-library/search, copy the URL into Ad Library URLs. Filters in the URL win over the form fields.
  3. Narrow the search. Countries, date range, impression bounds and targeting families map 1:1 to LinkedIn's own filters.
  4. Keep "Scrape ad details" on to get impressions and targeting. Turn it off for a fast, cheap inventory of which ads exist.
  5. Set a proxy. LinkedIn rate-limits per IP, so the default datacenter Apify Proxy plus 4–8 parallel sessions is the sweet spot. Residential is not needed: this site has no anti-bot.
  6. Press Start, then export from the Output tab as JSON, CSV, Excel or feed it straight into your warehouse via the API.

Re-scrape mode

Paste known IDs into Ad IDs to refresh a fixed ad set daily without re-running the search — ideal for tracking how an impression bucket grows while a campaign is live.


🎯 Getting the right advertiser (and not paying for the rest)

LinkedIn's Ad Library matches advertiser names as a substring. A search for HubSpot returns 2,576 ads across a dozen advertisers; only 1,403 are actually HubSpot's. Everything else is partners and agencies with the brand in their name — and with pay-per-result pricing, that difference lands on your invoice.

LinkedIn Ad Library Scraper gives you three ways to fix it, in order of precision:

ApproachHowPrecision
Company IDscompanyIds: ["68529"]Exact, filtered on LinkedIn's servers. Zero wasted requests
Company URLscompanyUrls: ["https://www.linkedin.com/company/nvidia/"]Same as above — one extra request resolves the page to its numeric ID
Name + matching modeadvertisers: ["HubSpot"] + advertiserMatch: "exact"Filtered client-side, before the detail page is fetched

advertiserMatch has three modes: any (LinkedIn's default behaviour), startsWith (keeps sub-brands like HubSpot for Developers, drops partners) and exact.

Measured on identical 40-ad production runs:

ModeAds deliveredDistinct advertisersPrecisionRequests used
any40768%46
exact401100%44

The precise run used fewer requests than the noisy one: the 22 discarded ads never had their detail page fetched.

The run log tells you exactly what it saved you:

Advertiser filter 'exact' dropped 7/27 ads (26% noise) before fetching
their detail pages — you were not charged for them.

⚙️ Input parameters for LinkedIn Ad Library Scraper

ParameterTypeDefaultDescription
companyIdsarray[]Numeric LinkedIn company IDs — exact, server-side targeting
companyUrlsarray[]Company pages, resolved to their numeric ID automatically
advertisersarray["astara"]Company names (accountOwner, substring match)
advertiserMatchstringanyany / startsWith / exact — how strictly to match those names
searchUrlsarray[]Full Ad Library search URLs with filters applied
adIdsarray[]Ad IDs or detail URLs for re-scrape mode
keywordstringFree-text search inside the creative
payerstringFilter by paying entity
countriesarray[]ISO-2 delivery countries
dateOptionstring""last-30-days, current-month, current-year, last-year
startDate / endDatestringCustom YYYY-MM-DD range (overrides the preset)
impressionsMinValue / impressionsMaxValueintegerImpression bounds, with thousand / million units
includedTargetingFacets / excludedTargetingFacetsarray[]Only ads that targeted (or excluded) these parameter families — filtered server-side
scrapeAdDetailsbooleantrueFetch each ad's detail page
maxAdsPerQueryinteger200Ads per advertiser / URL (0 = no limit)
maxAdsTotalinteger1000Hard cap for the whole run (0 = no limit)
proxyConfigurationobjectApify Proxy (datacenter)Strongly recommended; residential only if you see 429s
sessionsinteger4Parallel identities (one IP each)
requestDelayMsinteger2000Delay per session — see Performance below
maxRetriesinteger4Retries on 429/5xx with exponential backoff

📦 LinkedIn ads output example

{
"adId": "859756133",
"adUrl": "https://www.linkedin.com/ad-library/detail/859756133",
"scrapedAt": "2026-08-20T07:19:10+00:00",
"advertiserName": "astara",
"advertiserId": "1240549",
"adFormat": "Video Ad",
"creativeType": "SPONSORED_VIDEO",
"payingEntity": "WPP MEDIA SPAIN, S.A.U.",
"commentary": "🚗 At #Astara, we keep strengthening our mobility ecosystem!\n\nWe're proud to celebrate another milestone…",
"startDate": "2025-10-01",
"endDate": "2025-10-14",
"durationDays": 14,
"impressionsTotalRaw": "100k-150k",
"impressionsTotalMin": 100000,
"impressionsTotalMax": 150000,
"impressionsByCountry": [
{ "country": "Spain", "sharePct": 30, "shareRaw": "30%", "isUpperBound": false },
{ "country": "Colombia", "sharePct": 26, "shareRaw": "26%", "isUpperBound": false },
{ "country": "Chile", "sharePct": 24, "shareRaw": "24%", "isUpperBound": false },
{ "country": "India", "sharePct": 1, "shareRaw": "< 1%", "isUpperBound": true }
],
"targetingSegments": [
{ "parameter": "Language", "included": ["English"], "excluded": [] },
{ "parameter": "Location", "included": ["Peru", "Chile", "Colombia", "Spain"], "excluded": [] }
],
"videoUrls": ["https://dms.licdn.com/playlist/vid/v2/…/mp4-720p-30fp-crf28/…"],
"targetingAvailable": true,
"detailScraped": true
}

⚡ Performance and LinkedIn rate limits

LinkedIn's Ad Library applies a token bucket per IP: roughly five requests in a burst, then HTTP 429 with a JavaScript challenge. Measured on a clean IP:

Delay per sessionResult
2000 ms0 rate limits over 20 consecutive requests ✅
1500 ms~10% of requests hit 429
< 1000 msthrottled almost immediately

Because the limit is per IP, throughput scales with proxies, not with concurrency — each parallel session gets its own IP.

With 8 sessions at 2000 ms and details on, that is roughly 7,000 ads/hour. Each session keeps its own IP and cookie jar, backs off adaptively, and is recycled onto a fresh IP after repeated 429s.


💰 How much does it cost to use LinkedIn Ad Library Scraper?

LinkedIn Ad Library Scraper is pay-per-event: you pay per ad returned, with no monthly rental. Prices drop automatically with your Apify plan.

EventFreeBronzeSilverGold+
Ad with full details$2.00 / 1K$1.20 / 1K$0.90 / 1K$0.50 / 1K
Ad preview (scrapeAdDetails: false)$0.50 / 1K$0.30 / 1K$0.25 / 1K$0.15 / 1K
Actor start$0.00005 per GB of memory, once per run

Ads dropped by the advertiser filter are never charged, and the run is capped to your budget before scraping starts — so it never fetches pages you can't pay for.

Why the list price isn't the price you pay

The cheapest LinkedIn ad scrapers charge less per ad but hand you whatever LinkedIn's substring search returns. In our measurements that is 26% wrong advertiser — partners and agencies with the brand in their name. You pay for those too.

Compare on what actually matters, the cost of a correct ad:

Cheapest competitorLinkedIn Ad Library Scraper
List price (Free tier)$1.50 / 1K$2.00 / 1K
Ads that are the advertiser you asked for74%100%
Cost per correct ad$2.03 / 1K$2.00 / 1K

The same holds at every discount tier. A higher list price on cleaner data works out cheaper — and you skip the work of filtering the noise out yourself afterwards.

💡 Tip: start with maxAdsPerQuery: 20 to size your own numbers, then scale. You can cap spend per run with the Apify budget limit at any time.

Is scraping the LinkedIn Ad Library free?

Your first $5 of Apify credit covers roughly 2,500 fully detailed ads — enough for a complete competitive audit of a mid-size advertiser at no cost.

What does it cost us to run?

For transparency: 0.064 compute units and ~11 MB of datacenter proxy traffic per 1,000 ads, measured on the platform. Full methodology in docs/EFFICIENCY.md.


Pair it with the rest of the Rastriq ad-intelligence portfolio:

ActorWhat it adds
Facebook Ad Library ScraperThe same competitive-ads intelligence for Facebook and Instagram
TikTok Ad Library ScraperTikTok's EU ad transparency archive, same output shape
Google Ads Transparency ScraperSearch, Display and YouTube ads to close the cross-channel picture
SimilarWeb Data ExtractorTraffic context for the landing pages these ads point to

🔄 Setting up recurring monitoring with LinkedIn Ad Library Scraper

  1. Save your input as a Task in Apify Console, then open Schedules.
  2. Set the frequency — daily, weekly, or a cron expression (0 8 * * 1 = every Monday at 8am).
  3. Add a webhook on run finish to push new ads into Slack, email or your own endpoint.
  4. Use Ad IDs mode to re-scrape a fixed ad set and watch impression buckets grow while a campaign is live.

❓ Frequently Asked Questions about scraping LinkedIn ads

It only accesses publicly available data — the ad transparency archive LinkedIn publishes under the EU Digital Services Act, visible to anyone without logging in. The Actor honours robots.txt and paces requests (one every two seconds per IP) so it never loads LinkedIn's servers.

No personal data is collected: every field describes an advertisement or a company. You remain responsible for your use case complying with GDPR, CCPA and LinkedIn's Terms of Service. See Apify's guide on the legality of web scraping.

Do I need a LinkedIn account or cookies?

No. The Ad Library is served by LinkedIn's guest frontend and returns fully rendered HTML to anonymous requests. Never put your li_at session cookie into a scraper — it risks your personal account and is not needed here.

Is the data personal?

No. Every field describes an advertisement or a company — creative, spend proxy, targeting, paying entity. No names, emails, phone numbers or profiles of individuals are collected.

Why do some ads have no impressions or targeting?

LinkedIn publishes those fields only for ads served in the EU region, under the Digital Services Act. Ads outside that scope come back with targetingAvailable: false.

Why did I get fewer ads than the "N ads match your search" counter?

The counter is an estimate computed before deduplication; the paginated result set is the ground truth. The Actor deduplicates by adId across pages and queries.

How far back does the archive go?

LinkedIn only indexes ads created in the last 12 months. Anything older is gone from the source.

Enable Apify Proxy, or raise requestDelayMs to 3000. Without a proxy the Actor forces sessions: 1, because extra sessions would share one IP and just burn the same bucket faster. If the 429s persist on datacenter IPs, switch proxyConfiguration to the RESIDENTIAL group.

How do I integrate LinkedIn Ad Library Scraper with my stack?

Natively with Make and Zapier, export to Google Sheets, webhooks on run finish, scheduled runs, and the Apify API from any language — see the API tab.

I found a bug or my run failed. Where do I report it?

Open a ticket in the Issues tab with your input and the run ID. If a run returned 0 ads, the raw HTML of the failing search is saved to the key-value store as debug_search_page — attach it and diagnosis is much faster.