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 Ad Library into clean JSON: ad creatives, copy, CTA, advertiser & payer, EU impressions and targeting. Search by company or keyword. $4 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
1
Total users
1
Monthly active users
18 days 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 — $1.50 per 1,000 ads: basic data plus one detail-page request per ad for payer, advertiser URL, and EU transparency fields.
Basic is the default (lower cost, no per-ad requests); choose enriched when you need payer, advertiser URL, or EU transparency fields. 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 browser and no per-ad fetch.
- Optional enrichment: Pay for detail requests only when you need payer, exact advertiser URL, or EU transparency data.
- 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 | $1.50 / 1,000 |
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 (default) or enriched |
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 contains ads only, so JSON, CSV, and Excel exports stay homogeneous. 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,"adsFailed": 0,"dateRangeCovered": null,"blocked": false,"incomplete": false}],"adsScraped": 100,"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 ad 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.0015 per ad, or $1.50 per 1,000 at the FREE tier.apify-actor-start: $0.00005 once per run, emitted automatically by Apify.
Higher Apify pricing tiers receive lower per-ad rates. Failed requests, duplicate ads, true zero-result searches, 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.
There is no headless browser. Requests begin on datacenter proxies with rotating sessions; repeatedly blocked requests can escalate to residential proxies within a per-run budget. LinkedIn's status 999, login redirects, missing page markers, and markup failures are treated as errors instead of 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.