LinkedIn Ads Scraper — Ad Library, Impressions, No Login
Pricing
from $0.40 / 1,000 ad scraped (full details included)s
LinkedIn Ads Scraper — Ad Library, Impressions, No Login
LinkedIn Ads Scraper for the LinkedIn Ad Library — no login or cookies. Search by company, keyword, payer or country and export full ad copy, headlines, CTAs, destination URLs, payer, run dates, total impressions, impressions by country and targeting. Filter by ad format. JSON/CSV.
Pricing
from $0.40 / 1,000 ad scraped (full details included)s
Rating
5.0
(2)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
409
Total users
267
Monthly active users
14 hours ago
Last modified
Categories
Share
LinkedIn Ad Library Scraper — Ads, Impressions & Targeting
Turn any LinkedIn Ad Library search into a structured stream of sponsored ads. Start from a company, keyword, payer, country, or a pasted Ad Library URL, and get full ad copy, creative links, run dates, impression ranges, per-country impression splits, and targeting parameters as clean rows.
Why use this scraper?
- No login, no cookies — reads the public Ad Library anonymously and still gets every sponsored ad, impression range, and targeting facet. Nothing to paste, no account to risk.
- Impressions and targeting, not just creatives — impression ranges, per-country splits, and the targeting facets an advertiser used, parsed into typed fields.
- Filter before you pay — narrow by impression volume, targeting category, and ad format on the preview card, so excluded ads cost neither a detail fetch nor a charge.
- Many searches, one run — each entry in
searchescarries its own company, country, date window, and filters. - Numeric impressions —
totalImpressionsMin/totalImpressionsMaxalongside the raw"5k-10k"string, so you can sort and threshold without parsing text. - No browser — every page is fetched over plain HTTP, which is why runs are fast and cheap.
- You are not billed for failures — an ad whose detail page fails is logged and skipped, never pushed and never charged.
Overview
The LinkedIn Ad Library publishes every sponsored ad running on LinkedIn. For ads shown to EU audiences it additionally publishes impression volumes and targeting parameters under DSA transparency rules.
This actor turns that library into a dataset: one row per ad. It's built for competitive-intelligence teams tracking a rival's creatives and spend signals, agencies auditing a category, and researchers studying commercial advertising.
Ads outside the EU still return the full creative, copy, payer, and run dates — but LinkedIn does not publish impressions or targeting for them, so those fields are absent. That's a limit of the source, not the scraper.
Supported inputs
You can start a run four ways, and mix them freely:
1. Company, keyword, or payer
{ "companies": ["HubSpot"], "keywords": ["AI agents"], "payers": ["HubSpot, Inc."] }
2. Independent searches, each with its own filters
{"searches": [{ "company": "HubSpot", "countries": ["DE"], "dateOption": "last-30-days" },{ "keyword": "AI agents", "includedTargetingFacetCategories": ["JOB"] }]}
3. A pasted Ad Library URL — search pages or a single ad detail page
{"startUrls": ["https://www.linkedin.com/ad-library/search?accountOwner=HubSpot&countries=DE","https://www.linkedin.com/ad-library/detail/1441861963"]}
4. Filters on top of any of the above — country, date window, impression range, targeting categories.
Not supported: LinkedIn feed posts, organic company posts, Campaign Manager data, ad spend in currency (LinkedIn publishes impression ranges, never cost), and any page behind a login wall.
Use cases
| Audience | What they use it for |
|---|---|
| Competitive intelligence | Track a competitor's live creatives, messaging shifts, and relative impression volume |
| Performance marketing | Mine winning hooks, headlines, and CTAs across a category before writing new ads |
| Agencies | Audit a prospect's current advertising and build the pitch deck from real data |
| Market research | Measure category-level advertising pressure and geographic mix over time |
| Policy & academic research | Study DSA-disclosed targeting parameters and impression distribution |
| Brand protection | Find who is running ads that name your brand, and which entity paid for them |
How it works
- Your companies, keywords, payers, and
searchesentries are turned into Ad Library search URLs with your filters applied. - Each search page is fetched over HTTP and read directly from the server-rendered markup.
- Pagination follows the Ad Library's own pagination endpoint until
maxItemsis reached, backing off automatically if LinkedIn rate-limits. - When
scrapeAdDetailsis on, each ad's detail page is fetched for payer, run dates, impressions, and targeting. - Rows are pushed to the dataset as they complete, ready to export as JSON, CSV, or Excel.
Input configuration
| Field | Type | Default | Description |
|---|---|---|---|
companies | array | [] | Advertiser/company names — one search each |
keywords | array | [] | Free-text keyword searches |
payers | array | [] | Paying-entity names |
countries | array | [] | ISO country codes, e.g. ["DE","FR"] |
dateOption | string | all-time | all-time, last-30-days, current-month, current-year, last-year. For a custom window set startDate/endDate instead; the actor switches to a custom range on its own |
startDate / endDate | string | – | YYYY-MM-DD; when set they take priority over dateOption |
impressionsMinValue | integer | – | Lower impression bound, combined with its unit |
impressionsMinUnit | string | thousand | none, thousand, or million |
impressionsMaxValue | integer | – | Upper impression bound |
impressionsMaxUnit | string | thousand | none, thousand, or million |
includedTargetingFacetCategories | array | [] | Ad targeting must use these: LANGUAGE, LOCATION, AUDIENCE, DEMOGRAPHIC, COMPANY, EDUCATION, JOB, INTERESTS_AND_TRAITS |
excludedTargetingFacetCategories | array | [] | Ad targeting must NOT use these; same value list |
searches | array | [] | Independent searches; each entry may override any filter above |
adTypes | array | [] | Keep only these formats: SINGLE_IMAGE, VIDEO, CAROUSEL, DOCUMENT, TEXT, EVENT. Empty keeps all. Filtered on the preview card, so excluded ads are never fetched or charged |
startUrls | array | [] | Ad Library search or detail URLs |
maxItems | integer | 100 | Maximum ads for the whole run, spent in URL order. Capped at 30 on the free plan |
maxItemsPerSearch | integer | – | Ceiling per individual search. Set this whenever a run contains more than one company |
scrapeAdDetails | boolean | true | Fetch each ad's detail page for impressions, targeting, and payer |
includeEmployerBranding | boolean | false | Include employer-brand promos alongside sponsored ads |
proxy | object | Not set: the actor uses a scraping API that clears LinkedIn's Cloudflare, with Apify Unblocker behind it when your account has it | Used as a backup: when the scraping API is busy, a page tries your proxy before waiting. LinkedIn blocks most proxy networks (Apify datacenter and residential included), so it rarely helps |
maxConcurrency | integer | 3 | Parallel detail fetches |
minDelay / maxDelay | integer | 1 / 3 | Delay range in seconds between requests |
debug | boolean | false | Verbose per-request logging |
Note on impression filters: LinkedIn requires both bounds. If you set only one, the actor fills the other in automatically so your search still runs.
Example — a competitor's German ads above 100k impressions
{"companies": ["HubSpot"],"countries": ["DE"],"impressionsMinValue": 100,"impressionsMinUnit": "thousand","maxItems": 100}
Example — two unrelated searches in one run
{"searches": [{ "company": "HubSpot", "countries": ["DE"], "dateOption": "last-30-days" },{ "keyword": "AI agents", "includedTargetingFacetCategories": ["JOB"] }],"maxItems": 200}
Output overview
One row per ad. Every row carries identity (adId, adLibraryUrl), the advertiser, the creative and copy, and the CTA destination. Rows for EU-facing ads additionally carry the payer, run window, impression range, per-country impression split, and targeting facets.
Output sample
Real row, trimmed — produced by { "companies": ["HubSpot"], "countries": ["DE"] }:
{"adId": "1441861963","adLibraryUrl": "https://www.linkedin.com/ad-library/detail/1441861963","advertiserName": "HubSpot","advertiserBio": "Promoted","advertiserUrl": "https://www.linkedin.com/company/68529","isPromoted": true,"adStatus": "ACTIVE","format": "VIDEO","headline": "Routine-Anfragen erledigt? Gute Arbeit.","body": "HubSpot's Customer Agent erledigt Routineanfragen von allein und holt dich nur dazu, wenn es zählt. …","ctas": ["Mehr erfahren"],"clickUrl": "http://hubspot.de","imageUrl": "https://media.licdn.com/dms/image/v2/D4D10AQH3o7vyy-TVcA/videocover-high/…","paidBy": "HubSpot, Inc.","availabilityRaw": "Ran from Jul 1, 2026 to Jul 25, 2026","firstShownAt": "2026-07-01","lastShownAt": "2026-07-25","daysRunning": 25,"totalImpressionsRaw": "5k-10k","totalImpressionsMin": 5000,"totalImpressionsMax": 10000,"impressionsByCountry": [{ "country": "Germany", "percentage": 100 }],"targeting": [{ "category": "Language", "included": ["Targeting includes Deutsch"], "excluded": [] },{ "category": "Job", "included": ["Member"], "excluded": [] }],"b2bIntentScore": 60,"b2bIntentSignals": ["Job/seniority targeting", "B2B copy terms: platform, crm"],"scrapedAt": "2026-07-25T19:48:25.821Z"}
Key output fields
Identity — adId, adLibraryUrl, startUrl, scrapedAt
Advertiser — advertiserName, advertiserBio, advertiserUrl, advertiserLogo, paidBy, isPromoted
Creative — format (SINGLE_IMAGE, VIDEO, CAROUSEL, DOCUMENT, EVENT, TEXT), headline, body, imageUrl, imageUrls, videoUrl, videoPosterUrl, documentUrl
Destination — ctas, clickUrl, externalLinksInText
Run window — availabilityRaw, firstShownAt, lastShownAt, daysRunning (whole days from first-shown to last-shown, or to today while still running), adStatus
Reach (EU-facing ads) — totalImpressionsRaw, totalImpressionsMin, totalImpressionsMax, impressionsByCountry[]
Targeting (EU-facing ads) — targeting[] with category, included[], excluded[], raw
Intent — b2bIntentScore (0–100) and b2bIntentSignals[], a transparent heuristic scored from the ad's targeting, call to action, format, and copy. Audit the number against the listed signals; it is derived, not a LinkedIn metric.
Partial rows — detailsPartial: true marks an ad whose own detail page could not be loaded and was read from a backup source instead. Such a row has the creative, CTA, run window, impressions and the language and location targeting, but no paidBy and no other targeting facets. Rows without the flag are complete.
Pricing
Pay per event, tiered by your Apify plan:
| Plan tier | Per ad |
|---|---|
| Free | $0.0015 |
| Bronze | $0.0009 |
| Silver | $0.0007 |
| Gold and above | $0.0004 |
Plus $0.00005 per actor start. Ads that fail detail extraction are never pushed and never charged.
FAQ
Do I need a LinkedIn account or cookie?
No. The actor reads the public Ad Library anonymously and gets every sponsored ad and detail panel that way. It does not ask for or use a LinkedIn login. An old saved input or API call that still carries a sessionCookie field runs normally: the value is ignored, never sent anywhere, and Apify keeps it encrypted like any secret input.
Why are impressions and targeting missing on some ads? LinkedIn publishes them only for ads shown to EU audiences, under DSA transparency rules. A US-only campaign returns creatives and run dates but no impressions. Filtering by an EU country is the reliable way to get rows that always have them.
Can I get ad spend in dollars? No. LinkedIn publishes impression ranges, never cost. Any tool claiming a spend figure is estimating it.
Why did I get fewer ads than maxItems?
Either the search genuinely has fewer matches, or LinkedIn stopped serving more results. The run's status message says which, so a short result never looks like a complete one.
I put 50 companies in one run and only the first few returned anything.
maxItems is a budget for the whole run and it is spent in URL order, so one company with a large ad library can absorb it before the later URLs are ever requested. Those companies then look identical to companies that never advertised. Set maxItemsPerSearch as the per-company ceiling and leave maxItems as the overall cap:
{"companies": ["HubSpot", "NVIDIA", "Salesforce"],"countries": ["DE"],"maxItemsPerSearch": 100,"maxItems": 5000}
Can I filter by impressions with only a minimum? Yes. LinkedIn itself requires both bounds, so the actor fills the missing side in for you.
Does it scrape organic LinkedIn posts? No — sponsored ads from the Ad Library only.
Support
Found a bug or need a field that isn't here? Open an issue on the actor's Issues tab and it will be looked at.
Additional services
Need a tailored export, a different schema, a scheduled feed into your warehouse, or a scraper for another site? Custom work is available — get in touch through the Apify profile.
Explore more scrapers
Browse the full collection at apify.com/memo23 — scrapers for job boards, real-estate portals, review sites, social platforms, and more.
🤖 For AI Agents & LLM Apps
Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: memo23/linkedin-ads-scraper).
Purpose: Scrapes the LinkedIn Ad Library — one row per sponsored ad, including DSA-disclosed impression ranges and targeting facets for EU-facing ads.
Minimal input:
{ "companies": ["HubSpot"], "countries": ["DE"], "maxItems": 25 }
Output: one dataset row per ad — adId, adLibraryUrl, advertiserName, advertiserBio, advertiserUrl, isPromoted, adStatus, format, headline, body, ctas[], clickUrl, externalLinksInText[], imageUrl, imageUrls[], videoUrl, documentUrl, paidBy, availabilityRaw, firstShownAt, lastShownAt, daysRunning, totalImpressionsRaw, totalImpressionsMin, totalImpressionsMax, impressionsByCountry[{country, percentage}], targeting[{category, included[], excluded[]}], b2bIntentScore, b2bIntentSignals[], scrapedAt.
Behaviors an agent should know:
- Always set
maxItems; a broad keyword can match thousands of ads. - Set
maxItemsPerSearchtoo whenever the run holds more than one company, otherwise the first busy advertiser spends the wholemaxItemsbudget and the rest are skipped without being fetched. impressionsMinValuerequires a unit (none/thousand/million); a one-sided range is completed automatically.includedTargetingFacetCategoriesaccepts only:LANGUAGE,LOCATION,AUDIENCE,DEMOGRAPHIC,COMPANY,EDUCATION,JOB,INTERESTS_AND_TRAITS.adTypeskeeps only the listed formats (SINGLE_IMAGE/VIDEO/CAROUSEL/DOCUMENT/TEXT/EVENT); the filter runs before the detail fetch, so excluded ads cost nothing.daysRunningis present only when the ad exposes run dates (EU-facing ads); it is absent otherwise, like impressions.- Impressions and targeting are absent for non-EU ads — don't treat that as a scrape failure.
- Billing is per dataset item plus a per-run start fee; failed ads are not pushed and not charged.
- Set
scrapeAdDetails: falsefor a cheap, fast listing-only pass without impressions or targeting.
⚠️ Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by LinkedIn Corporation, Microsoft Corporation, or any of their subsidiaries. All trademarks mentioned are the property of their respective owners.
The scraper accesses only the publicly available LinkedIn Ad Library, which LinkedIn publishes for advertising transparency — no authenticated endpoints, paid features, or member content behind the linkedin.com login wall. The actor uses no LinkedIn credentials of any kind. Users are responsible for ensuring their use complies with LinkedIn's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.
SEO Keywords
linkedin ads scraper, scrape linkedin ads, linkedin ad library scraper, linkedin ads api, linkedin.com ad library scraper, Apify linkedin ads, ad library scraper, ad intelligence scraper, competitor ads scraper, ad creative scraper, ad impressions data, ad targeting data, competitive ad intelligence, ad spend research, b2b advertising data, DSA ad transparency data, marketing intelligence scraper, paid social data, adtech data extraction, b2b marketing research