LinkedIn Ad Library Scraper — Ads, Creatives & Advertisers avatar

LinkedIn Ad Library Scraper — Ads, Creatives & Advertisers

Pricing

from $0.35 / 1,000 basic ads

Go to Apify Store
LinkedIn Ad Library Scraper — Ads, Creatives & Advertisers

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

Jaybird Technologies

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

18 days ago

Last modified

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

FieldBasicEnriched
Ad ID, permalink, advertiser name/logo, format
Headline, images/video, advertiser logo
Full copy, CTA, landing pageBest effort; card text may be truncated
Advertiser LinkedIn URL and payer
First/last shown datesEU-shown ads only
Impression range and country sharesEU-shown ads only
Targeting detailsEU-shown ads only
LinkedIn requests for 1,000 adsAbout 42 search pagesAbout 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

InputDescription
detailLevelbasic (default) or enriched
companiesAdvertiser names or slug-based LinkedIn company URLs; each becomes a query
payerSearch the public "Paid for by" field as another query
keywordSearch ad copy as another query
countriesRepeated ISO alpha-2 country filters, e.g. US, DE, NL
startDate, endDateCustom date range in YYYY-MM-DD format
impressionsMinValue, impressionsMinUnitLower impression threshold using none, thousand, or million
impressionsMaxValue, impressionsMaxUnitUpper impression threshold
includedTargetingFacetCategoriesRequire disclosed categories such as LOCATION, COMPANY, or JOB
excludedTargetingFacetCategoriesRequire categories with excluded values
sortByDESCENDING, ASCENDING, or MOST_IMPRESSIONS
maxAdsPerQueryCap 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:

  1. GET /ad-library/search returns roughly 24 complete ad cards.
  2. A pagination token inside an HTML comment leads to /searchPaginationFragment.
  3. Basic mode stores those cards immediately.
  4. 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.