LinkedIn Ads Scraper avatar

LinkedIn Ads Scraper

Pricing

from $0.50 / 1,000 advertisement without details

Go to Apify Store
LinkedIn Ads Scraper

LinkedIn Ads Scraper

[๐Ÿ’ฐ $0.5 / 1K] Extract ads from LinkedIn's public Ad Library โ€” advertiser, headline, body, format, dates, impressions, CTAs. Search by keyword, advertiser, country, and date range. Optional detail enrichment for impressions-per-country and targeting.

Pricing

from $0.50 / 1,000 advertisement without details

Rating

0.0

(0)

Developer

SolidCode

SolidCode

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Extract competitor ads from LinkedIn's public Ad Library at scale. Get advertiser, headline, body copy, creative format, image and video URLs, dates active, impression ranges, and (for EU-served ads) full targeting and country-level impressions. Perfect for B2B competitive intelligence, ad creative inspiration, brand monitoring, and marketing research.

Why This Scraper?

  • Public Ad Library data, structured โ€” Every ad LinkedIn discloses in its transparency portal, returned as clean JSON rows ready for analysis
  • Three flexible search modes โ€” Search by keyword, by advertiser company, or by pasting any LinkedIn Ad Library URL directly. Combine all three in a single run
  • 40+ countries supported โ€” Filter ads by where they were served, from the US and UK to Germany, India, Japan, Brazil, and the UAE
  • Optional EU detail enrichment โ€” Turn on detail mode to get country-level impression breakdowns and full targeting (languages, locations, audience parameters) for ads served in the EU under the Digital Services Act transparency rules
  • Tiered pay-per-event pricing โ€” $0.50 per 1,000 basic ads, $0.90 per 1,000 enriched ads. You only pay per ad returned โ€” no compute or platform fees
  • Date-range filters โ€” Last 30 days, this month, this year, last year, or any custom 12-month window
  • Bulk-friendly โ€” Run dozens of keyword and advertiser searches in a single execution; results are deduplicated by ad ID across queries
  • All ad formats included โ€” Single image, video, carousel, document, message, spotlight, text, and thought-leader ads, each tagged with a clean format enum

Use Cases

Competitive Intelligence

  • Monitor every ad your competitors run on LinkedIn, including paused campaigns
  • Track which messaging, headlines, and CTAs your industry is testing this quarter
  • Spot new product launches by watching competitors' ad volume spike

Ad Creative Research

  • Pull thousands of ad creatives by topic ("AI", "cybersecurity", "fintech") for inspiration
  • Build a swipe file of high-performing B2B ad copy across formats
  • Compare image vs video vs document ad strategies in your niche

Brand Monitoring

  • Watch for competitors targeting your brand keywords
  • Detect partner or reseller ads that misrepresent your product
  • Audit your own agency's live campaigns from the public viewer

Lead Generation & Sales Intelligence

  • Identify which companies are actively running paid LinkedIn campaigns (a strong intent signal)
  • Build prospect lists of advertisers in specific verticals or geographies
  • Surface ad agencies and SaaS vendors actively investing in growth

Market & Trend Research

  • Quantify ad spend trends by geography or industry over time
  • Map which message frames dominate B2B marketing right now
  • Feed datasets into BI dashboards for client-facing reporting

Getting Started

The fastest way to get started. Enter one or more keywords; each runs its own search and the results are merged.

{
"keywords": ["marketing automation", "sales enablement"],
"maxResults": 500
}

Example B โ€” Advertiser-scoped, multi-country, with date filter

Pull every ad a competitor ran in the US and UK over the last year. The slug is the part after linkedin.com/company/ in their company URL.

{
"advertisers": ["hubspot", "salesforce"],
"countries": ["US", "GB"],
"dateOption": "last-year",
"maxResults": 2000
}

Example C โ€” Detail-enriched run for EU advertisers

Turn on fetchDetails to capture per-country impression ranges and full targeting (languages, locations, audience parameters) for ads served in the EU. Non-EU ads still return โ€” they're charged at the basic tier since LinkedIn doesn't disclose extra data for them.

{
"keywords": ["b2b saas"],
"countries": ["DE", "FR", "NL", "ES", "IT"],
"dateOption": "last-30-days",
"fetchDetails": true,
"maxResults": 1000
}

Example D โ€” Bulk via Start URLs

Already built a search in the LinkedIn Ad Library UI? Paste the URL directly โ€” every filter is preserved.

{
"startUrls": [
"https://www.linkedin.com/ad-library/search?keyword=cybersecurity&countries=US",
"https://www.linkedin.com/ad-library/search?accountOwner=nvidia&dateOption=last-year"
],
"maxResults": 5000
}

Example E โ€” Custom date range

Pull ads active in a specific six-week window. Both dates must fall within the last 12 months (LinkedIn's retention limit).

{
"keywords": ["generative ai"],
"dateOption": "custom-date-range",
"startDate": "2026-02-01",
"endDate": "2026-03-15",
"maxResults": 1000
}

Input Reference

ParameterTypeDefaultDescription
keywordsstring[][]Free-text search terms (e.g. "AI marketing", "crypto"). Each keyword runs its own search and the results are combined
advertisersstring[][]LinkedIn company slugs (e.g. "nvidia", "microsoft", "hubspot"). The slug comes from the LinkedIn company URL โ€” linkedin.com/company/<slug>. Use the slug from the URL, not a display name like "Microsoft Corp"
startUrlsstring[][]Paste full LinkedIn Ad Library search URLs directly. Bypasses the keyword and advertiser fields above
countriesstring[][]Restrict results to ads served in selected countries. 40+ supported (US, GB, CA, DE, FR, JP, BR, IN, AE, and more). Empty = all countries
dateOptionstring"last-30-days"Time window. One of: last-30-days, current-month, current-year, last-year, custom-date-range
startDatestringnullCustom start date in YYYY-MM-DD format. Only used when dateOption is custom-date-range. Must be within the last 12 months
endDatestringnullCustom end date in YYYY-MM-DD format. Only used when dateOption is custom-date-range. Must be within the last 12 months
fetchDetailsbooleanfalseWhen enabled, opens each ad's detail page to extract impressions-per-country and full targeting. Increases per-ad price for ads where extra data is actually available (typically EU-served ads)
maxResultsinteger1000Cap the total number of ads returned across all queries combined. Set to 0 for unlimited (each query is internally capped at ~4,800 ads by LinkedIn's pagination depth โ€” split popular keywords across narrower searches if you need more)

Output

Each run pushes one row per ad. Two record shapes are possible โ€” a basic search-card record, and (when fetchDetails: true) a record enriched with detail-page fields.

Basic record (search-card data, fetchDetails: false)

{
"recordType": "ad",
"adId": "1281881684",
"adLibraryUrl": "https://www.linkedin.com/ad-library/detail/1281881684",
"advertiserName": "Maxio",
"advertiserSlug": null,
"advertiserUrl": null,
"advertiserLogoUrl": "https://media.licdn.com/dms/image/v2/C4E0BAQE361-JB8cBLA/company-logo_100_100/0/1649952212473/wearemaxio_logo",
"paidBy": null,
"format": "image",
"creativeType": "SPONSORED_STATUS_UPDATE",
"headline": "Download Maxio Institute's Latest Report",
"headlineDescription": null,
"body": "In the realm of SaaS, benchmarks are more than just numbers โ€” they're game-changers. Here's why...",
"imageUrl": "https://media.licdn.com/dms/image/v2/D5610AQFymJR7uHth1w/image-shrink_1280/B56Z3FO9k9HQAc-/0/1777130527273",
"videoUrl": null,
"clickUrl": null,
"country": null,
"firstSeen": null,
"lastSeen": null,
"impressionsRange": null,
"impressionsPerCountry": null,
"targeting": null,
"detailsFetched": false,
"query": "keyword: marketing automation",
"scrapedAt": "2026-04-27T15:42:01Z"
}

advertiserSlug and advertiserUrl are populated only when fetchDetails: true โ€” LinkedIn dropped the company link from search cards in late 2026, so the link is read from each ad's detail page.

Detail-enriched record (EU ad with fetchDetails: true)

{
"recordType": "ad",
"adId": "1389159976",
"adLibraryUrl": "https://www.linkedin.com/ad-library/detail/1389159976",
"advertiserName": "Niketa Calame-Harris, MFA",
"advertiserSlug": "niketacalame",
"advertiserUrl": "https://www.linkedin.com/in/niketacalame",
"advertiserLogoUrl": "https://media.licdn.com/dms/image/v2/D4D03AQ.../profile-displayphoto.jpg",
"paidBy": "The Harris Tech Pivot",
"format": "image",
"creativeType": "SPONSORED_STATUS_UPDATE",
"headline": "Welcome to The Harris Tech Pivot",
"headlineDescription": null,
"body": "Bridging the gap between underrepresented talent and tech opportunity.",
"imageUrl": "https://media.licdn.com/dms/image/v2/D4D22AQ.../feedshare-shrink_2048_1536.jpg",
"videoUrl": null,
"clickUrl": "https://harristechpivot.example.com/welcome",
"country": null,
"firstSeen": "2026-04-10",
"lastSeen": "2026-04-14",
"impressionsRange": {"min": 1000, "max": 5000},
"impressionsPerCountry": null,
"targeting": {
"languages": ["English"],
"locations": ["City of Johannesburg", "United States"],
"locationsExcluded": ["India", "Europe", "Accra"],
"parameters": {
"Audience": {"targeted": false, "excluded": false},
"Demographic": {"targeted": true, "excluded": false},
"Company": {"targeted": false, "excluded": false},
"Education": {"targeted": false, "excluded": false},
"Job": {"targeted": true, "excluded": false},
"Member Interests and Traits": {"targeted": false, "excluded": false}
}
},
"detailsFetched": true,
"query": "advertiser: nike",
"scrapedAt": "2026-04-27T15:42:14Z"
}

impressionsPerCountry is populated only when LinkedIn renders the per-country breakdown in the detail page โ€” typically EU ads with significant cross-country reach. Many EU ads serve in only one country and return null for this field.

Output Field Reference

FieldTypeDescription
recordTypestringAlways "ad". Discriminator for downstream pipelines that may receive other record kinds in the future
adIdstringLinkedIn's unique ad identifier
adLibraryUrlstringPublic Ad Library detail page URL
advertiserNamestringDisplay name of the advertiser (company or member)
advertiserSlugstring | nullLinkedIn identifier from the advertiser's URL โ€” either a numeric company id (e.g. "2029") or a member vanity slug (e.g. "niketacalame"). Populated only when fetchDetails: true
advertiserUrlstring | nullFull LinkedIn URL of the advertiser's company or member page. Populated only when fetchDetails: true
advertiserLogoUrlstring | nullAdvertiser's logo / profile image URL
paidBystring | nullLegal entity that paid for the ad. Populated when fetchDetails: true and LinkedIn discloses it
formatstringAd format enum: image, video, carousel, document, message, spotlight, text, thoughtleader, or unknown
creativeTypestring | nullLinkedIn's internal creative type (e.g. SPONSORED_STATUS_UPDATE, SPONSORED_VIDEO). Preserved as-is for advanced filtering
headlinestring | nullPrimary headline shown on the ad
headlineDescriptionstring | nullSecondary headline / description line. Often null โ€” LinkedIn rarely renders a sub-headline in current UI
bodystring | nullMain ad body copy. Newlines preserved for multi-paragraph copy
imageUrlstring | nullAd creative image URL
videoUrlstring | nullAd video URL (HLS playlist) โ€” present for video ads
clickUrlstring | nullExternal destination URL the ad links to. Populated only when fetchDetails: true
countrystring | nullReserved for future use โ€” currently always null. LinkedIn doesn't tag individual ads with a country on the search card; the countries filter is a page-level constraint
firstSeenstring | nullFirst date the ad was active, YYYY-MM-DD. Populated only when fetchDetails: true
lastSeenstring | nullLast date the ad was active, YYYY-MM-DD, or null if still running. Populated only when fetchDetails: true
impressionsRangeobject | nullTotal impressions range as {"min": int, "max": int} (e.g. {"min": 10000, "max": 50000}). Populated only when fetchDetails: true AND LinkedIn discloses the range
impressionsPerCountryobject | nullPer-country impressions: { "Country Name": {"min": int, "max": int}, ... }. Populated only for EU ads with multi-country reach when fetchDetails: true. Often null even on EU ads
targetingobject | nullEU-only targeting breakdown โ€” { languages: string[], locations: string[], locationsExcluded: string[], parameters: { "<facet>": {"targeted": bool, "excluded": bool} } }. locations lists the regions/countries the advertiser targeted; locationsExcluded lists the regions/countries explicitly excluded from the audience. The parameters map keys come from LinkedIn's facet labels (e.g. Audience, Demographic, Company, Education, Job, Member Interests and Traits); targeted: true means the advertiser used that facet to include people, excluded: true means they used it to exclude people. Populated only when fetchDetails: true AND the detail page contained the EU "Ad Targeting" section
detailsFetchedbooleantrue when the ad's detail page contained the EU "Ad Targeting" section (so the higher pricing tier was applied); false otherwise. With fetchDetails: false this is always false
querystringThe search term, advertiser slug, or URL label that produced this row (e.g. "keyword: marketing automation", "advertiser: hubspot", "URL: https://...")
scrapedAtstringISO-8601 UTC timestamp when the row was captured

When fetchDetails: true, the actor opens each ad's detail page regardless of where it ran. That means advertiserUrl, advertiserSlug, paidBy, firstSeen, lastSeen, and clickUrl populate for every ad โ€” even ads that don't qualify for the higher pricing tier (US ads, etc.). You're only billed at the detail tier for ads where LinkedIn actually disclosed the EU "Ad Targeting" section.

Tips for Best Results

Cast a wider net with multiple keywords

LinkedIn's search ranks results by relevance; try several related keywords (e.g. "marketing automation", "marketing platform", "demand generation tool") to surface more ads in your space. Results are deduplicated by ad ID across queries โ€” there's no double-charging.

Narrow by country to reduce noise

Without a countries filter you'll get every market โ€” useful for global brands, less useful when you only care about North America. Add 1โ€“3 countries to keep results focused.

Use fetchDetails selectively

Detail enrichment costs more per ad ($0.90 vs $0.50 per 1,000) but only delivers extra data for EU-served ads under the Digital Services Act. Turn it on when:

  • Your countries filter includes EU markets (DE, FR, NL, ES, IT, BE, PT, SE, NO, DK, FI, PL, AT, CH, IE)
  • You need impressions-per-country breakdowns for transparency-required campaigns
  • You want full targeting parameters (languages, locations, audience filters)

For US/UK/non-EU-only runs, leave it off โ€” you'll get the same search-card data at the basic price.

Filter ad formats client-side

LinkedIn doesn't expose a server-side format filter, so every run returns all formats. Use the format field in your dataset to filter to just videos, just carousels, etc., after the run completes.

Custom date ranges

LinkedIn's Ad Library only retains ~12 months of history. If you set a startDate older than 12 months ago, it's automatically clamped to the earliest available date. Both startDate and endDate are required when dateOption is custom-date-range.

Pagination & overshoot

Results come in pages of 24. The actor stops requesting new pages once your maxResults cap is hit, but always keeps the last page intact โ€” so you may get up to 23 extra rows beyond your cap. This avoids losing partial results.

Run hygiene

For very large runs (10,000+ ads) split your work across multiple shorter runs by varying the keywords or date window. Shorter runs are easier to monitor and easier to retry if something goes wrong. Each individual keyword or advertiser search is internally capped at roughly 4,800 ads (LinkedIn's pagination depth limit) โ€” if you need more, split a popular keyword into narrower variants (e.g. by country or date range).

Pricing

Tiered pay-per-event pricing โ€” you only pay per ad returned.

  • $0.50 per 1,000 ads โ€” basic ads (when fetchDetails is off, or when detail enrichment data isn't available)
  • $0.90 per 1,000 ads โ€” ads enriched with detail data (impressions per country and full targeting)

The higher tier triggers automatically when detail enrichment data is available โ€” currently EU ads with public targeting/impression disclosures under the Digital Services Act. You're never charged the higher tier for ads where no extra data was actually delivered.

No compute charges โ€” you only pay per ad returned.

Example costs

Ads returnedBasic tier ($0.50 / 1K)Detail tier ($0.90 / 1K)
100$0.05$0.09
1,000$0.50$0.90
10,000$5.00$9.00

A typical mixed run (e.g. EU + US ads with fetchDetails: true) is billed per-ad: each EU ad fires the detail-tier event, each non-EU ad fires the basic-tier event. The total is the sum.

Integrations

Export results in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

  • Zapier / Make / n8n โ€” Workflow automation
  • Google Sheets โ€” Direct spreadsheet export
  • Slack / Email โ€” Notifications on new results
  • Webhooks โ€” Push results to your own endpoints
  • Apify REST API โ€” Full programmatic access from any backend

Good to Know

  • Detail enrichment is EU-focused. impressionsPerCountry and targeting populate only for ads served in the EU under the Digital Services Act transparency rules. US and other non-EU ads return null for these fields even with fetchDetails: true โ€” and they're billed at the basic tier in that case.
  • Pagination overshoots, never trims. Once your maxResults cap is reached, no new pages are requested, but the last page is kept whole. You may receive up to 23 extra rows beyond the cap.
  • dateOption: custom-date-range requires both startDate and endDate, both within the last 12 months. Invalid or older dates are clamped or fall back to last-30-days.
  • No server-side format filter. LinkedIn's Ad Library doesn't expose one. Filter your dataset on the format field after the run.

This actor is designed for legitimate market research, competitive intelligence, brand monitoring, and ad creative analysis. The data it collects is from LinkedIn's public Ad Library โ€” a transparency portal LinkedIn explicitly publishes for this purpose. Users are responsible for complying with applicable laws and LinkedIn's Terms of Service. Do not use the data for spam, harassment, deceptive comparative advertising, or any illegal purpose.