LinkedIn Ad Library Scraper: Ads, Impressions and Targeting
Pricing
from $1.45 / 1,000 ad scrapeds
LinkedIn Ad Library Scraper: Ads, Impressions and Targeting
Export LinkedIn ads by advertiser, keyword, company or country: ad copy, images, videos, carousels and documents, who paid for each ad and when it ran. For EU ads you also get impressions by country and the targeting used. No login, no cookies.
Pricing
from $1.45 / 1,000 ad scrapeds
Rating
0.0
(0)
Developer
Oski
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
22 days ago
Last modified
Categories
Share
LinkedIn Ad Library Scraper
Scrape the LinkedIn Ad Library into clean, structured data. Search by advertiser name, keyword, LinkedIn company ID or a pasted Ad Library URL, filter by country and date, and get every ad's copy, media, paying entity, run dates, impressions (total and by country) and targeting. On a real 180-ad test run, every ad LinkedIn could load came back with full details, and 1,000 ads cost about $1.50.
No login, no cookies, no LinkedIn account at risk. Part of an ad-intelligence suite with the Google Ads Transparency Center Scraper and the Facebook Ad Library Scraper, so you can cover LinkedIn, Google and Meta from one account.
What you can use it for
- B2B agencies: pull a prospect's and their competitors' LinkedIn ads before a pitch, with copy, formats and who paid.
- SaaS founders and product marketers: see how competitors position new features, which formats they favour and when campaigns start and stop.
- Demand generation teams: read the targeting block (languages, locations, and whether company, job or audience targeting was used) on EU-covered ads.
- Creative teams: build a swipe file of carousels, document ads, videos and message ads with the full text.
- Recruiters and employer-brand teams: track which companies are advertising roles and culture on LinkedIn, and in which countries.
How to use it
- Under Advertiser names, add companies as they appear on LinkedIn, such as
HubSpot. Or search ad text with Keywords. - Optionally add Countries (names or codes) and a date range with the date pickers.
- Leave Max ads per search at 1,000 (or change it) and click Start.
- When it finishes, open the Output tab and download as CSV, Excel or JSON.
While it runs, the status line at the top of the run page shows progress (for example "Search 1 of 2: advertiser HubSpot. 120 ads so far."). When it finishes, the same line says what was found and explains anything that was skipped, so you never have to read the log.
How much does it cost?
You pay a $0.002 start fee plus $0.0015 per ad returned. Ads LinkedIn cannot load are still listed for transparency but never charged, so you only pay for ads that deliver data.
| Ads returned | Maths | Cost |
|---|---|---|
| 100 | $0.002 + 100 x $0.0015 | about $0.15 |
| 1,000 | $0.002 + 1,000 x $0.0015 | about $1.50 |
| 10,000 | $0.002 + 10,000 x $0.0015 | about $15.00 |
A typical 1,000-ad export of one competitor set costs about $1.50. Turning off includeDetails gives a faster preview-only scrape at the same per-ad price.
Input
| Field | What it does |
|---|---|
advertisers | Advertiser names as shown on LinkedIn (hubspot). One search each. |
keywords | Words in the ad text (payroll software). One search each. |
companyIds | Exact advertiser match by LinkedIn company number (68529) or its linkedin.com/company/68529 link. |
searchUrls | Any linkedin.com/ad-library/search?... URL, with its filters used as-is. |
adUrls | Specific ads by detail URL or numeric ID. |
countries | Only ads shown in these countries: names or codes (United Kingdom, UK, US). Empty means all. |
dateRange | all, last-30-days, current-month, current-year, last-year. |
startDate / endDate | Custom range from the date pickers, or relative dates such as 3 months. Either one alone works: the other end is filled in. LinkedIn's data runs a day behind, so today counts as yesterday. Overrides dateRange. |
includeDetails | On by default. Off gives a faster preview-only scrape (advertiser, format, copy, headline, image). |
maxAdsPerSearch | Cap per search (default 1,000). |
maxAds | Cap for the whole run (0 means no cap). |
proxyConfiguration | Advanced. Apify Proxy; the default datacenter proxy works. |
Example for a CRM competitor sweep:
{"advertisers": ["hubspot", "salesforce", "pipedrive"],"countries": ["GB", "DE", "FR"],"dateRange": "current-year","maxAdsPerSearch": 400,"maxAds": 1000}
Output
One row per ad, always with the same fields in the same order:
{"ad_id": "1560106944","ad_url": "https://www.linkedin.com/ad-library/detail/1560106944","search": "advertiser:hubspot","details_status": "ok","advertiser_name": "HubSpot","advertiser_type": "company","advertiser_company_id": "68529","advertiser_url": "https://www.linkedin.com/company/68529","paid_by": "HubSpot, Inc.","format": "image","format_label": "Single Image Ad","creative_type": "SPONSORED_STATUS_UPDATE","headline": "Sell from anywhere, close everywhere.","commentary": "Remote-first and built on trust.\nSell from wherever you're sharpest, on your own rhythm. The results are what matter here.","cta": "Learn more","image_urls": ["https://media.licdn.com/dms/image/v2/..."],"video_urls": [],"carousel_slides": [],"document_page_urls": [],"has_eu_transparency_data": true,"first_shown": "2026-09-14","last_shown": "2026-09-17","impressions_range": "30k-50k","impressions_min": 30000,"impressions_max": 50000,"impressions_by_country": [],"targeting": {"language": {"includes": ["English"], "excludes": []},"location": {"includes": ["Germany", "Boston, MA", "Toronto, ON", "Australia", "Ireland", "United Kingdom"],"excludes": ["India", "United Arab Emirates"]}},"targeting_parameters": [{"parameter": "Company", "targeted": true, "excluded": true},{"parameter": "Job", "targeted": true, "excluded": false}],"scraped_at": "2026-09-17T14:25:02+00:00"}
Every format is parsed: single image, video (each MP4 rendition with its bitrate, plus video_poster_url), carousel (each slide's title and image), document (every page image), message ads (message_sender, message_body, message_ctas), article, follower and event ads. Rows also carry advertiser_logo_url and commentary_links.
Impression ranges become real numbers (30k-50k gives 30000 and 50000). LinkedIn joins targeted places with commas ("Boston, MA, New York, United States"), so the actor splits them back into real places. Ads LinkedIn cannot load come back with details_status: "unavailable" and are not charged.
Dates, impressions and targeting only exist for some ads. LinkedIn publishes them for ads covered by the EU Digital Services Act; other ads show the creative and payer only. has_eu_transparency_data tells you which is which. Impressions by country can take up to 48 hours to appear for new ads, and LinkedIn keeps about 12 months of ads in the library.
Tips for bigger runs
- Add more advertisers, keywords or company IDs. Each is its own search with its own
maxAdsPerSearchbudget, and an ad found by two searches is only returned (and charged) once. - Use
maxAdsas a spending ceiling when you run many searches at once. - Use company IDs when several advertisers share a name. They match one advertiser exactly.
- Turn off
includeDetailsfor volume scans. Preview mode skips the detail page per ad, so it is much faster; switch it back on for dates, impressions and targeting. - Paste a search URL to use LinkedIn filters the input form does not expose, such as impression ranges.
- Download media you want to keep. LinkedIn CDN links can expire after a while.
Scheduling and integrations
Save your input as a task and schedule it weekly in Apify to track new campaigns. Results can go straight to Google Sheets, a webhook, Make, Zapier or your own code via the Apify API:
curl -X POST "https://api.apify.com/v2/acts/oski~linkedin-ad-library-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"advertisers": ["hubspot"], "countries": ["GB"], "maxAdsPerSearch": 100}'
With full details the actor reads about one ad per second, so the sync endpoint (which waits up to 5 minutes) suits runs of a couple of hundred ads. For bigger runs, start the actor with the runs endpoint and fetch the dataset when it finishes.
If something looks wrong
The status line at the end of every run explains anything that was skipped or came back empty. The common messages:
| Message | What to do |
|---|---|
| Input problem: ... | Something in the input needs changing, and the message says what. The run stopped before anything was charged. |
| No ads for advertiser ... | Check the name as LinkedIn shows it, or use the company number. Widen dates or countries. |
| ... could not be loaded | LinkedIn was busy. Run it again later. |
| Skipped countries: ... | The country was not recognised. Check the spelling or use a two-letter code. |
| N ads were no longer available | Those ads were removed before they could be opened. They are not charged. |
Still stuck? Open an issue on the actor page with the run link and it gets looked at quickly.
FAQ
Is it legal? It reads only the public LinkedIn Ad Library, which LinkedIn publishes for transparency. No login, no cookies and no private data are involved. You are responsible for how you use the data, including respecting privacy law where it applies.
Do I need a LinkedIn account? No. Nothing is logged in, so no account can be restricted.
Why did I get fewer ads than expected? The advertiser may run fewer ads in those countries or dates, the name may match a different advertiser (use a company ID), or a cap was hit. Searches that find nothing are named in the run log.
Why are dates and impressions empty on some ads? LinkedIn only publishes them for ads covered by the EU Digital Services Act. Check has_eu_transparency_data.
How fresh is the data? Every run reads the Ad Library live, so you get what LinkedIn shows at that moment.
What if it breaks? Open an issue on the actor page. It gets fixed fast.
Other scrapers from Oski
- Google Ads Transparency Center Scraper: every Google ad an advertiser runs, with impressions and dates by country.
- Facebook Ad Library Scraper: Facebook and Instagram ads by keyword or advertiser Page ID.
- UK Decision Maker Finder: named directors behind UK company websites.
- Website Contact Finder: emails, phones and socials from any list of company websites.