LinkedIn Ads Scraper avatar

LinkedIn Ads Scraper

Pricing

from $3.00 / 1,000 results

Go to Apify Store
LinkedIn Ads Scraper

LinkedIn Ads Scraper

Extract ads from the public LinkedIn Ad Library by keyword, advertiser, country, and date range. Returns headline, body, advertiser info, media URLs, impressions, targeting, and dates. No login required.

Pricing

from $3.00 / 1,000 results

Rating

5.0

(21)

Developer

Crawler Bros

Crawler Bros

Maintained by Community

Actor stats

21

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Extract ads from the public LinkedIn Ad Library (linkedin.com/ad-library) by keyword, advertiser, country, or date range. Returns headline, body copy, advertiser info, media URLs, CTA, and — with optional detail-page enrichment — paid_for_by, canonical advertiser URL, and full body text.

No login or LinkedIn account required. The Ad Library is fully public and the actor runs without cookies.

The scraper covers every advertiser visible in LinkedIn's Ad Library across all supported countries — built for ad intelligence, competitive research, lead generation, and brand monitoring.

What you get

For each ad on the search results page:

FieldDescription
ad_idLinkedIn ad / creative identifier
ad_urlDirect LinkedIn Ad Library detail URL
ad_formatimage / video / carousel / document / text / inmail
advertiser_nameSponsoring entity (company or person)
advertiser_logoLogo image URL
advertiser_taglineSponsoring entity tagline (e.g. "Chief AI Officer")
advertiser_urlLinkedIn company page URL
body_textAd commentary / body copy as shown in the preview
headlineAd headline copy
cta_textCall-to-action text (e.g. "Learn more", "Apply now")
cta_urlClick-through destination URL
media_urlsAll image / video / document / carousel slide URLs
scraped_atISO 8601 UTC timestamp of extraction

When enrichWithDetailPage=true is enabled, additional fields are pulled from each ad's detail page:

FieldDescription
paid_for_byEntity that paid for the ad (often differs from the advertiser)
body_text_fullFull body / commentary text from the detail page (sometimes longer than the preview)
advertiser_urlCanonical advertiser URL — overrides the search-result URL when richer

Empty fields are dropped from each record so the dataset stays clean — you only see fields that were actually populated.

Input

ParameterTypeDefaultDescription
searchTermsArray[]Keyword search queries (e.g. "AI", "remote work"). Matched against ad copy and advertiser name.
advertisersArray[]Advertiser / company names (e.g. "Microsoft", "Salesforce").
countriesArray[]ISO-3166-1 alpha-2 country codes (e.g. "US", "GB", "IN").
dateOptionEnumlast-30-dayslast-30-days / last-90-days / last-year / custom
dateFromStringYYYY-MM-DD, only used when dateOption=custom.
dateToStringYYYY-MM-DD, only used when dateOption=custom.
directUrlsArray[]Pre-built Ad Library URLs — paste directly if you already configured filters in the LinkedIn UI.
maxResultsInteger50Maximum ads to return across all queries.
enrichWithDetailPageBooleanfalseOpen each ad's detail page to add paid_for_by, full body text, and canonical advertiser URL. Slower but more complete.
proxyObjectApify ProxyDefaults to free Apify Proxy (no residential group needed).

You can combine inputs freely — every keyword × advertiser combination is tried, scoped by your country and date filters.

Example input — keyword search, fast

{
"searchTerms": ["AI", "machine learning"],
"countries": ["US"],
"dateOption": "last-30-days",
"maxResults": 50
}

Example input — advertiser focus, full enrichment

{
"advertisers": ["Microsoft", "Salesforce"],
"dateOption": "last-90-days",
"maxResults": 100,
"enrichWithDetailPage": true
}

Example input — direct Ad Library URL

{
"directUrls": [
{ "url": "https://www.linkedin.com/ad-library/search?keyword=cloud&country=US" }
]
}

Example input — custom date range

{
"searchTerms": ["recruiting"],
"dateOption": "custom",
"dateFrom": "2026-01-01",
"dateTo": "2026-03-31"
}

Example output

{
"ad_id": "12345678",
"ad_url": "https://www.linkedin.com/ad-library/detail/12345678",
"ad_format": "video",
"advertiser_name": "Anthropic",
"advertiser_url": "https://www.linkedin.com/company/anthropicresearch",
"advertiser_logo": "https://media.licdn.com/dms/image/.../company-logo.jpg",
"headline": "Build with Claude",
"body_text": "Ship faster with the Claude API. Trusted by 1000s of developers.",
"cta_text": "Learn more",
"cta_url": "https://www.anthropic.com/api",
"media_urls": ["https://media.licdn.com/dms/image/.../ad-creative.jpg"],
"paid_for_by": "Anthropic PBC",
"body_text_full": "Ship faster with the Claude API. Trusted by 1000s of developers building agents, RAG pipelines, coding assistants, and more.",
"scraped_at": "2026-05-05T13:42:18Z"
}

Use cases

  • Competitive intelligence — Monitor what competitors are running, in which countries, with what messaging.
  • Lead generation — Build prospect lists of companies actively spending on LinkedIn ads in your category.
  • Brand monitoring — Track every ad featuring your brand, products, or trademarks.
  • Creative research — Mine patterns in headline length, CTA choice, and media format across an industry.
  • Geographic analysis — Compare ad strategies across markets by combining country + advertiser filters.
  • Compliance / due diligence — Verify what an advertiser is publicly claiming on LinkedIn (paid_for_by shows the actual paying entity).

FAQ

Do I need a LinkedIn account? No. The Ad Library is fully public — anyone can browse it without logging in. The actor makes the same anonymous requests the public web UI does.

Do I need a proxy? No. The default Apify Proxy (no residential group required) works out of the box.

What's the difference between searchTerms and advertisers?

  • searchTerms matches ad copy AND advertiser name (broad keyword search).
  • advertisers matches only the advertiser display name (narrow company-targeted search).

Combine them when you want to find a specific company's ads about a specific topic.

When should I enable enrichWithDetailPage? Whenever you need paid_for_by (regulatory / compliance use cases), the canonical advertiser URL, or the full body text. Each ad adds ~1-2 s to the run, so it roughly doubles total runtime — leave it off for fast list pulls and turn it on for high-value reporting.

What does dateOption=custom enable? A user-defined dateFrom / dateTo window. LinkedIn returns ads served at any time during that window. Without custom, the actor uses LinkedIn's predefined buckets (last 30 / 90 / 365 days).

How many ads can I scrape per run? LinkedIn's UI typically renders 25-50 ads per query results page. Adjust maxResults up to 1000 to span multiple queries. For larger pulls, run multiple actor invocations with different keyword / country slices.

What if a query returns no ads? The actor returns an empty result for that query and continues with the rest. If every query returns zero ads, a single sentinel record with type: "linkedin_ads_blocked" is emitted so the run exits cleanly with a non-empty dataset.

Why are some fields like impression counts or targeting missing? LinkedIn only publishes impression ranges and targeting facets in jurisdictions where the EU Digital Services Act mandates it, and only for ads that have served above an activity threshold. Records without that data simply omit those fields.

How current is the data? Live — every run hits LinkedIn at request time. Schedule the actor for daily / hourly refreshes.

Can I scrape closed / paused ads? Yes — the Ad Library shows ads served at any point in the last 12 months, including those no longer active.

Limitations

  • Only ads visible in the public Ad Library are scraped — no access to LinkedIn's full Campaign Manager.
  • Impression counts (when present) are LinkedIn's published ranges (e.g. "10K-50K"), not exact figures.
  • Targeting facets are sparse outside DSA-regulated jurisdictions.
  • LinkedIn may rate-limit aggressive crawling; the scraper rotates TLS fingerprints and randomises delays to stay polite.