LinkedIn Ad Library Scraper
Pricing
from $1.50 / 1,000 ads
LinkedIn Ad Library Scraper
Scrape ads from the public LinkedIn Ad Library by advertiser, keyword, country and date: ad text, media, payer, run dates, impressions and targeting. No login or cookies. Pay only for ads returned.
Pricing
from $1.50 / 1,000 ads
Rating
0.0
(0)
Developer
Muhammad Noman Riaz
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
What does LinkedIn Ad Library Scraper do?
LinkedIn Ad Library Scraper collects ads from the public LinkedIn Ad Library, the transparency site where LinkedIn lists ads that ran on its platform. Search by advertiser name, by keyword in the ad text, or paste Ad Library search and ad URLs. You can limit searches to countries and to a date range. For every ad you get the advertiser and its LinkedIn page, who paid for the ad, the ad format, the full ad text, headline, call to action, landing URL and image, video or carousel media URLs. When LinkedIn shows them, you also get the run dates, the total impressions range, the share of impressions per country and the targeting the advertiser picked (language, location and which audience parameters were used). It works without a LinkedIn account, cookies or login. Use it for competitor ad research, creative inspiration, B2B market research and lead lists of companies that advertise on LinkedIn.
How to use it
- Add one or more advertiser names (for example
HubSpot), keywords, or Ad Library URLs. - Optionally pick countries and a date range.
- Set Max ads per search and start the run.
- Download the ads as JSON, CSV, Excel or HTML, or read them through the Apify API.
Input
| Field | Type | Default | Description |
|---|---|---|---|
advertisers | array of strings | Company or advertiser names. Each name is one search. | |
searchKeywords | array of strings | Keywords in the ad text. Each keyword is one search. | |
startUrls | array of URLs | Ad Library search URLs (https://www.linkedin.com/ad-library/search?...) and ad URLs (https://www.linkedin.com/ad-library/detail/<id>). Other URLs are ignored. | |
countries | array of strings | all | Two letter ISO codes such as DE, FR, US. Applies to advertiser and keyword searches. |
dateRange | string | all | all, last-30-days, current-month, current-year, last-year or custom-date-range. |
startDate, endDate | string | YYYY-MM-DD, only used with custom-date-range. | |
maxAdsPerSearch | integer | 50 | Maximum ads per advertiser, keyword or search URL. |
includeDetails | boolean | true | Open each ad page for payer, CTA, landing URL, run dates, impressions, countries and targeting. Charged extra only when details load (see Pricing). Off returns only the search card fields. |
maxConcurrency | integer | 5 | Ad pages loaded at the same time. |
maxRequestRetries | integer | 6 | Attempts per page, each on a new proxy IP. |
proxy | object | Residential | Proxy settings. Residential proxies are recommended. |
Input example
{"advertisers": ["HubSpot"],"searchKeywords": ["crm"],"countries": ["DE"],"dateRange": "last-30-days","maxAdsPerSearch": 30,"includeDetails": true,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Output
One item per ad. This is a real item from a test run (advertiser HubSpot):
{"adId": "1644380406","adUrl": "https://www.linkedin.com/ad-library/detail/1644380406","advertiserName": "HubSpot","advertiserUrl": "https://www.linkedin.com/company/68529","paidBy": "HubSpot, Inc.","format": "video","creativeType": "SPONSORED_VIDEO","adText": "Your CRM data is more powerful than you think. Put it to work on Google and reach the people most likely to convert.","headline": "Google Ads in HubSpot","cta": "Learn more","landingUrl": null,"media": [{ "type": "video", "url": "https://dms.licdn.com/playlist/vid/v2/D5610AQH7YyKZCNgEGQ/progressive-servable-video/B56aE8kiTPHQAY-/0/1792017574172?e=2147483647&v=beta&t=5Sw4xFkvU8O1kHuPW9VxGFAkYcfQ-I41IRYmbbH_yfI" },{ "type": "thumbnail", "url": "https://media.licdn.com/dms/image/v2/D5610AQH7YyKZCNgEGQ/videocover-high/B56aE8kiTPHQBI-/0/1792017574927?e=2147483647&v=beta&t=0_Sd0PO1AZLKwraUaBnVM4czcVHCUNybneAEFBD84DM" }],"firstShown": null,"lastShown": null,"impressionsRange": null,"impressionsMin": null,"impressionsMax": null,"countries": [],"targeting": null,"searchQuery": "https://www.linkedin.com/ad-library/search?accountOwner=HubSpot","scrapedAt": "2026-10-17T16:56:02.267Z"}
When LinkedIn publishes run dates, impressions and targeting for an ad, the same item carries them. These fields come from another ad in the same run:
{"firstShown": "2026-10-15","lastShown": "2026-10-17","impressionsRange": "1k-5k","impressionsMin": 1000,"impressionsMax": 5000,"targeting": {"language": { "includes": "English" },"location": { "includes": "DACH" },"parameters": [{ "parameter": "Audience", "targeted": false, "excluded": false },{ "parameter": "Company", "targeted": true, "excluded": true },{ "parameter": "Job", "targeted": true, "excluded": true }]}}
Country shares look like { "country": "Germany", "impressionsShare": "100%", "impressionsSharePercent": 100 }. A share shown as < 1% keeps that text and has impressionsSharePercent: null.
Ads that could not be loaded are listed in the FAILED_ITEMS record of the run's key-value store, with the reason.
Pricing
Two parts, so you only pay for what you get:
| What | Price per 1,000 ads |
|---|---|
| Every ad returned (search data: advertiser, format, text, headline, media) | $1.50 |
| Extra, only for ads whose details loaded (payer, CTA, landing URL, run dates, impressions, countries, targeting) | $3.50 |
A fully detailed ad costs $5 per 1,000. LinkedIn blocks some detail pages; those ads are still returned with detailsLoaded: false and cost only $1.50 per 1,000. Ads that could not be loaded at all are not charged.
FAQ
Do I need a LinkedIn account?
No. The LinkedIn Ad Library is public and the scraper never logs in or uses cookies. If LinkedIn answers with a login wall or a challenge, the scraper retries on a new IP and never tries to get past it.
Which countries are covered?
Every country in the Ad Library country filter. Ads can be searched worldwide or limited with the countries input. LinkedIn shows run dates, impressions, country shares and targeting for some ads only. In our tests they appeared on ads served in Europe, while ads without them still came with advertiser, payer, format, text and media.
How far back does it go?
As far as the Ad Library goes. The custom date filter on the site accepts dates up to one year back. Searches without a date range return what LinkedIn lists, newest first.
Can I see ad spend?
No. LinkedIn does not publish spend in the Ad Library. You get the total impressions range and the share of impressions per country where LinkedIn shows them.
Known limits
- Run dates, impressions, country shares and targeting are only returned when LinkedIn shows them on the ad page.
landingUrlis only filled when the ad page links to an outside site. Many single image and video ads in the library have no clickable link.- Location targeting is returned as LinkedIn's text (for example
"Richmond, VA, McLean, VA, Berlin"), not split into a list, because place names contain commas. - Ads with several versions return the first version shown.
- Document, event, spotlight, message and conversation ads have not been checked against live pages yet. Their common fields (advertiser, payer, format, text, run data) use the same page layout, but media may be incomplete.
- With
includeDetailsoff, only advertiser name, format, shortened text, headline and media from the search card are returned. - LinkedIn rate-limits fast traffic. Keep residential proxies on for runs beyond a few dozen ads.