LinkedIn Ad Library Scraper — Ads, Creatives & Advertisers
Pricing
from $0.35 / 1,000 basic ads
LinkedIn Ad Library Scraper — Ads, Creatives & Advertisers
Scrape LinkedIn's public Ad Library without login: ad creatives, copy, CTA, advertiser, payer, landing pages, and EU impressions and targeting. Search by company, payer, or keyword. From $0.50 per 1,000 ads.
Pricing
from $0.35 / 1,000 basic ads
Rating
0.0
(0)
Developer
Jaybird Technologies
Maintained by CommunityActor stats
0
Bookmarked
24
Total users
10
Monthly active users
a day ago
Last modified
Categories
Share
LinkedIn Ad Library Scraper
Scrape LinkedIn's public Ad Library into clean JSON without an account, cookies, or API approval. Search by advertiser, paying entity, or keyword; filter by country, date, impressions, and targeting category; then choose the price/detail level that fits the job.
- Basic — $0.50 per 1,000 ads: card-visible data with no per-ad request; long copy can be truncated by LinkedIn.
- Enriched — $2.50 per 1,000 ads from November 7, 2026 ($1.50 before): basic data plus one detail-page request per ad for payer, advertiser URL, and EU transparency fields.
Enriched is the default for backward compatibility. Every output row is tagged with detailLevel.
{"type": "ad","detailLevel": "enriched","adId": "1462877434","adUrl": "https://www.linkedin.com/ad-library/detail/1462877434","advertiserName": "Example Company","advertiserLogoUrl": "https://media.licdn.com/dms/image/...","advertiserLinkedInUrl": "https://www.linkedin.com/company/123456","payer": "Example Holdings","format": "single_image","headline": "See what's new","adText": "Explore the latest guide from Example Company.","ctaText": "Learn more","imageUrls": ["https://media.licdn.com/dms/image/..."],"landingPageUrl": "https://www.example.com/campaign","firstShownDate": "2026-07-01","lastShownDate": "2026-07-12","impressionsRange": "10k-50k","impressionsByCountry": [{ "country": "Netherlands", "share": "100%" }],"targeting": {"language": { "included": ["English"], "excluded": [] },"location": { "included": ["Netherlands"], "excluded": [] }},"query": "Example Company","queryType": "company","countries": ["NL"]}
Why use it?
- Low-cost bulk discovery: Basic mode reads about 24 complete ad cards from each server-rendered search page. There is no per-ad fetch.
- Optional enrichment: Pay for detail requests only when you need payer, exact advertiser URL, or EU transparency data.
- "No ads" answers: Check a competitor list and see who is and isn't advertising. A company with no ads gets its own row, so it can't be confused with one that was never checked.
- Employer-brand ads included: Company discovery and employer-brand campaigns use LinkedIn's separate public endpoint; both their search cards and detail pages are supported.
- No account risk: The Actor only accesses LinkedIn's public, logged-out transparency pages. It never asks for or uses credentials.
- Useful creative data: Card-visible copy, headline, advertiser logo, images, video, poster, and format; enriched mode adds full copy, CTA, and the disclosed landing page where available.
- Honest completeness: Blocked or changed pages fail visibly. The run summary distinguishes true zero-result searches from incomplete work.
Basic vs. enriched
| Field | Basic | Enriched |
|---|---|---|
| Ad ID, permalink, advertiser name/logo, format | ✓ | ✓ |
| Headline, images/video, advertiser logo | ✓ | ✓ |
| Full copy, CTA, landing page | Best effort; card text may be truncated | ✓ |
| Advertiser LinkedIn URL and payer | — | ✓ |
| First/last shown dates | — | EU-shown ads only |
| Impression range and country shares | — | EU-shown ads only |
| Targeting details | — | EU-shown ads only |
| LinkedIn requests for 1,000 ads | About 42 search pages | About 42 search pages + 1,000 detail pages |
| FREE-tier event price | $0.50 / 1,000 | $2.50 / 1,000 from Nov 7, 2026 ($1.50 before) |
LinkedIn discloses dates, impressions, and targeting only for ads shown in the EU under the Digital Services Act. Non-EU detail pages do not contain those fields; the Actor leaves them empty rather than inventing data.
Inputs
| Input | Description |
|---|---|
detailLevel | basic or enriched (default) |
companies | Advertiser names or slug-based LinkedIn company URLs; each becomes a query |
payer | Search the public "Paid for by" field as another query |
keyword | Search ad copy as another query |
countries | Repeated ISO alpha-2 country filters, e.g. US, DE, NL |
startDate, endDate | Custom date range in YYYY-MM-DD format |
impressionsMinValue, impressionsMinUnit | Lower impression threshold using none, thousand, or million |
impressionsMaxValue, impressionsMaxUnit | Upper impression threshold |
includedTargetingFacetCategories | Require disclosed categories such as LOCATION, COMPANY, or JOB |
excludedTargetingFacetCategories | Require categories with excluded values |
sortBy | DESCENDING, ASCENDING, or MOST_IMPRESSIONS |
maxAdsPerQuery | Cap per advertiser, payer, or keyword query; default 100, maximum 5,000 |
{"detailLevel": "basic","companies": ["HubSpot", "https://www.linkedin.com/company/salesforce"],"payer": "Example Holdings","keyword": "crm software","countries": ["DE", "NL"],"startDate": "2026-01-01","endDate": "2026-07-01","impressionsMinValue": 10,"impressionsMinUnit": "thousand","includedTargetingFacetCategories": ["LOCATION", "JOB"],"sortBy": "MOST_IMPRESSIONS","maxAdsPerQuery": 100}
If no company, payer, or keyword is supplied, the platform auto-test runs a small HubSpot demo capped at ten ads.
Output
The default dataset holds ads, plus one row per company with no ads, flagged noAdsFound: true with the company in query. Filter on noAdsFound if you only want ads. The OUTPUT key-value record holds diagnostics and one summary per query:
{"detailLevel": "basic","summaries": [{"type": "advertiser-summary","detailLevel": "basic","query": "HubSpot","queryType": "company","totalAdsFound": 2285,"adsScraped": 100,"noAdsFound": false,"adsFailed": 0,"dateRangeCovered": null,"blocked": false,"incomplete": false}],"adsScraped": 100,"noAdsRows": 0,"escalatedToResidential": 0,"chargeLimitReached": false,"charged": {"basic-ad-scraped": 100,"enriched-ad-scraped": 0}}
Local and non-pay-per-event runs report zero custom events even though they still write the dataset.
Pricing
Each stored row emits exactly one mutually exclusive event:
basic-ad-scraped: $0.0005 per ad, or $0.50 per 1,000 at the FREE tier.enriched-ad-scraped: $0.0025 per ad, or $2.50 per 1,000 at the FREE tier, from November 7, 2026. Until then it is $0.0015 per ad ($1.50 per 1,000). Enriched detail pages now have to be fetched through a real Chrome browser, which costs more than the plain-HTTP version it replaced.apify-actor-start: $0.00005 once per run, emitted automatically by Apify.
When LinkedIn answers a company search with no results, you still get an explicit answer: one row flagged noAdsFound: true, billed as one ad at the run's detail level. Checking 1,000 companies with no ads costs $0.50 in basic mode. The answer means LinkedIn found no ads under that name with your filters, so use the name the company advertises under.
Higher Apify pricing tiers receive lower per-ad rates. Failed requests, duplicate ads, keyword and payer searches with no results, and summary records do not emit ad events. The Pricing tab is authoritative for the live rates.
How it works
LinkedIn's logged-out Ad Library is server-rendered:
GET /ad-library/searchreturns roughly 24 complete ad cards.- A pagination token inside an HTML comment leads to
/searchPaginationFragment. - Basic mode stores those cards immediately.
- Enriched mode also requests
/detail/{adId}once per unique standard ad, or/employer-brand/{id}for LinkedIn's employer-brand formats.
Pages load in headless Google Chrome, because LinkedIn's Cloudflare protection rejects plain HTTP clients; only the HTML document is downloaded, never images or stylesheets. Requests begin on datacenter proxies with rotating sessions; repeatedly blocked requests can escalate to residential proxies within a per-run budget. LinkedIn's statuses 999 and 429, Cloudflare blocks, login redirects, missing page markers, and markup failures are treated as errors and retried instead of being reported as empty results.
FAQ
Is there a public LinkedIn ads API or a Google-style batch endpoint? LinkedIn does not expose one on the logged-out Ad Library. Its own page JavaScript paginates by fetching server-rendered HTML fragments. Enriched-only fields still require one public detail request per ad. We did find and support LinkedIn's separate /employer-brand/{id} detail route, but it is also per-ad—not a batch API. Basic mode is the cheap endpoint: the search fragment already contains most card-visible creative fields for about 24 ads at a time, although LinkedIn can truncate long copy there.
Why do some enriched ads have no dates, impressions, or targeting? LinkedIn only publishes those fields for ads shown in the EU. Payer and advertiser details can still be present.
How exact is advertiser matching? LinkedIn uses a loose name match, so HubSpot can return agencies with HubSpot in their name. Use enriched mode's advertiserLinkedInUrl for exact post-filtering. Numeric /company/12345 URLs cannot be resolved to a name while logged out; supply a name or slug URL.
How far back does data go? LinkedIn says ads remain in the Ad Library for one year after their last impression.
Can I schedule or integrate it? Yes. Export to Google Sheets, Drive, S3, or a database; use Zapier, Make, webhooks, schedules, or the Apify API.
Monitoring competitors across channels? See the Meta Ad Library Scraper and Google Ads Transparency Scraper.
The Actor collects public advertising-transparency data only. You remain responsible for lawful use of the output.