LinkedIn Ads Scraper
Pricing
from $3.00 / 1,000 results
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
Actor stats
21
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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:
| Field | Description |
|---|---|
ad_id | LinkedIn ad / creative identifier |
ad_url | Direct LinkedIn Ad Library detail URL |
ad_format | image / video / carousel / document / text / inmail |
advertiser_name | Sponsoring entity (company or person) |
advertiser_logo | Logo image URL |
advertiser_tagline | Sponsoring entity tagline (e.g. "Chief AI Officer") |
advertiser_url | LinkedIn company page URL |
body_text | Ad commentary / body copy as shown in the preview |
headline | Ad headline copy |
cta_text | Call-to-action text (e.g. "Learn more", "Apply now") |
cta_url | Click-through destination URL |
media_urls | All image / video / document / carousel slide URLs |
scraped_at | ISO 8601 UTC timestamp of extraction |
When enrichWithDetailPage=true is enabled, additional fields are pulled from each ad's detail page:
| Field | Description |
|---|---|
paid_for_by | Entity that paid for the ad (often differs from the advertiser) |
body_text_full | Full body / commentary text from the detail page (sometimes longer than the preview) |
advertiser_url | Canonical 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
| Parameter | Type | Default | Description |
|---|---|---|---|
searchTerms | Array | [] | Keyword search queries (e.g. "AI", "remote work"). Matched against ad copy and advertiser name. |
advertisers | Array | [] | Advertiser / company names (e.g. "Microsoft", "Salesforce"). |
countries | Array | [] | ISO-3166-1 alpha-2 country codes (e.g. "US", "GB", "IN"). |
dateOption | Enum | last-30-days | last-30-days / last-90-days / last-year / custom |
dateFrom | String | — | YYYY-MM-DD, only used when dateOption=custom. |
dateTo | String | — | YYYY-MM-DD, only used when dateOption=custom. |
directUrls | Array | [] | Pre-built Ad Library URLs — paste directly if you already configured filters in the LinkedIn UI. |
maxResults | Integer | 50 | Maximum ads to return across all queries. |
enrichWithDetailPage | Boolean | false | Open each ad's detail page to add paid_for_by, full body text, and canonical advertiser URL. Slower but more complete. |
proxy | Object | Apify Proxy | Defaults 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_byshows 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?
searchTermsmatches ad copy AND advertiser name (broad keyword search).advertisersmatches 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.