LinkedIn Ad Library Scraper & New Ads Monitor avatar

LinkedIn Ad Library Scraper & New Ads Monitor

Pricing

from $1.50 / 1,000 ads

Go to Apify Store
LinkedIn Ad Library Scraper & New Ads Monitor

LinkedIn Ad Library Scraper & New Ads Monitor

Track competitors' LinkedIn ads from the public LinkedIn Ad Library. Search by company, keyword or payer and country, get ONLY NEW ads since the last run: ad copy, headline, CTA, format, images/video, landing page, payer, EU run dates, impressions and targeting.

Pricing

from $1.50 / 1,000 ads

Rating

0.0

(0)

Developer

Ivan Petrus

Ivan Petrus

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Categories

Share

LinkedIn Ad Library scraper and competitor ad monitor. Enter competitor company names, keywords from the ad copy or payers ("Paid for by"), optionally filtered by country and date range. You get every matching ad from LinkedIn's public Ad Library: ad copy, headline, CTA, format, image / video / document / carousel media, advertiser, landing page and payer. For ads shown in the EU you also get run dates, total impressions range, impressions by country and targeting (language, location, audience, company, job, demographics...). With "Only new ads" on, every scheduled run returns only ads that appeared since the last run, so it works as a daily LinkedIn competitor-ads alert.

No LinkedIn account, no cookies: the actor reads the same public pages as linkedin.com/ad-library. It is built for reliability: polite 2–3 s pacing, retries with backoff, proxy rotation on HTTP 429, automatic switch to residential proxy when datacenter IPs get rate-limited, and a free summary row per search. Failed searches are never charged.

Sample output

One ad row from a real Apify cloud run (Oct 2026, company search "HubSpot", countries DE + US), shortened:

{
"type": "ad",
"searchQuery": "HubSpot",
"format": "Single Image Ad",
"advertiserName": "IXTENSA 🧡 HubSpot",
"adCopy": "Viele HubSpot-Kunden kämpfen mit denselben Problemen – und lassen dadurch viel Potenzial liegen. …",
"headline": "Live-Webinar am 14.10.2026 um 11 Uhr",
"adId": "1558746953",
"detailUrl": "https://www.linkedin.com/ad-library/detail/1558746953",
"isNew": true
}

What you get

DataDetails
🆕 New-ads diffRemembers seen ads (named key-value store) and outputs only new ones on later runs. Each row has isNew.
✍️ CreativeadCopy, headline, cta, format (Single Image, Video, Carousel, Document, Message, Article, Event, Text, Spotlight...), imageUrl(s), videoUrl (+ thumbnail), carouselCards (title, image, link), document (title, page count, page images), article (newsletter, title)
🏢 AdvertiseradvertiserName, advertiserCompanyId, advertiserUrl, logo, paidBy
🔗 Landing pagelandingPageUrl with UTM parameters (often reveals campaign names and tools)
🇪🇺 EU transparency data (with details)startDate, endDate, daysRunning, impressions ("5k-10k") + numeric min/max, impressionsByCountry (% share), targeting (language, location values...), targetingParameters (which of Audience / Company / Job / Education / Demographic / Interests were targeted or excluded)
📋 Summary row (free)Per search: ads fetched, new ads since last run, formats, top advertisers, and a link to the same search on LinkedIn

How it works

  1. Search (cheap): each company / keyword / payer is searched in the Ad Library, newest ads first, 24 ads per page, following LinkedIn's pagination until your limit.
  2. Details (optional, includeDetails): one extra request per ad opens its detail page for the full copy, CTA, landing page, payer and EU data. Without details, ad copy in search results is often shortened by LinkedIn (adCopyTruncated: true).
  3. Diff: seen ad IDs are stored per search + filters, so the next run outputs only new ads.

Use cases

  • Daily LinkedIn competitor alerts for B2B marketers, ABM and demand-gen teams: schedule it and send new ads to Slack, email, Google Sheets or a webhook.
  • Creative and messaging research: which offers, formats, CTAs and landing pages competitors test, and how long ads run.
  • Agencies: monitor many client competitors in one run; paidBy shows which agency or entity pays.
  • Targeting intelligence (EU ads): see which countries get impressions and whether competitors target by job, company, audience or interests.
  • Keyword research: who advertises on "crm", "sales automation", "cybersecurity"... in a given country.

Input examples

Daily monitor of competitors (new ads only):

{ "companies": ["HubSpot", "Salesforce"], "onlyNewAds": true, "maxAdsPerSearch": 50 }

Full details for EU ads in Germany and France, last 30 days:

{ "companies": ["SAP"], "countries": ["DE", "FR"], "dateRange": "last-30-days", "includeDetails": true, "maxAdsPerSearch": 30 }

Keyword research, exact advertiser only, without member (thought leader) ads:

{ "keywords": ["crm"], "countries": ["US"], "maxAdsPerSearch": 100, "onlyNewAds": false }
{ "companies": ["HubSpot"], "exactCompanyMatch": true, "skipMemberAds": true }

Start monitoring silently (record current ads, output nothing on the first run):

{ "companies": ["Notion"], "firstRunBehavior": "baselineOnly", "stateStoreName": "notion-linkedin" }

Output example (with details)

{
"type": "ad",
"searchType": "company",
"searchQuery": "SAP Fioneer",
"adId": "1633089726",
"format": "Video Ad",
"advertiserType": "company",
"advertiserName": "SAP Fioneer",
"advertiserCompanyId": "74481653",
"adCopy": "Insurance broker files can contain hundreds of settlement items. See how FS-CD helps clean items move forward and keeps exceptions visible.",
"headline": "Bring structure to broker settlements",
"cta": "Learn more",
"landingPageUrl": "https://www.sapfioneer.com/blog/why-broker-settlements-belong-inside-receivables-control/?utm_campaign=FS-CD+%257C+Insurance+%257C+2026&utm_source=linkedin&utm_medium=paid",
"videoUrl": "https://dms.licdn.com/playlist/vid/v2/D5610AQGMhMNDO8Y5Yw/progressive-servable-video/...",
"paidBy": "SAP Fioneer GmbH",
"startDate": "2026-10-06",
"endDate": "2026-10-08",
"impressions": "5k-10k",
"impressionsByCountry": null,
"targeting": { "Language": { "values": ["English"] }, "Location": { "values": ["United States", "Canada", "Europe"] } },
"targetingParameters": [ { "parameter": "Company", "targeted": true, "excluded": true }, { "parameter": "Job", "targeted": true, "excluded": false } ],
"detailUrl": "https://www.linkedin.com/ad-library/detail/1633089726",
"isNew": true
}

impressionsByCountry fills in once LinkedIn updates it (up to 48 h), e.g. [{ "country": "Germany", "impressionShare": 69.0 }, { "country": "Switzerland", "impressionShare": 20.0 }, { "country": "France", "impressionShare": 1.0, "lessThan": true }].

Summary row (free): { "type": "summary", "searchQuery": "HubSpot", "adsFetched": 40, "newAdsSinceLastRun": 10, "formats": { "Single Image Ad": 35, "Video Ad": 5 }, "adLibraryUrl": "https://www.linkedin.com/ad-library/search?accountOwner=HubSpot" }

Failed searches appear as { "type": "error", "status": "failed", "error": "...", "hint": "..." } and are not charged.

Pricing (pay per event)

  • $0.005 per search (one company, keyword or payer, all its result pages, summary row included)
  • $1.50 per 1,000 ads ($0.0015 per ad row). With "Only new ads" on, you pay only for new ads.
  • +$1.50 per 1,000 ads with details ($0.0015 extra per ad, only when the detail page was fetched)
  • $0.005 per run start fee. No proxy or compute costs on top. Summary and error rows are free.
  • Example: 10 competitors monitored daily, ~5 new ads each, with details: about $0.21 per day.

Set Max ads per search or a maximum cost per run to cap spending. If the run stops at your limit, undelivered new ads are not marked as seen, so they arrive next time.

Privacy: no personal profile data

Some LinkedIn ads are posted from an individual member's profile ("thought leader" ads) or sent as messages by a person. For those, the actor never outputs the member's name, headline, photo or profile URL: advertiserType is member, and advertiserName shows the company behind the ad when LinkedIn shows one ("Promoted by" / "Paid for by"). If a member ad was paid for by a private person, paidBy is removed (paidByRedacted: true). Turn on skipMemberAds to drop member ads completely. Ad copy is returned as published by the advertiser.

Limits you should know

  • EU data only for EU ads. LinkedIn publishes run dates, impressions and targeting only for ads shown in the EU (Digital Services Act). Other ads have creative, advertiser and payer only. Impressions by country can take up to 48 hours to appear.
  • About one year of history. LinkedIn keeps ads in the library for roughly a year after they last ran.
  • Company search is a name search. LinkedIn matches the text you enter, so "HubSpot" also returns partner pages like "HubSpot Platinum Partner". Use exactCompanyMatch for one exact advertiser name.
  • Ad copy without details may be shortened by LinkedIn; turn on includeDetails for the full text.
  • Rate limits. LinkedIn throttles fast clients (HTTP 429). The actor paces requests, rotates proxy IPs and falls back to residential proxy; very large runs simply take longer.
  • Markup changes. This reads public web pages, not an official API. If LinkedIn changes its layout, runs fail loudly (error rows, not silent empty data) until the actor is updated.

Daily alerts to Slack or email

  1. Fill in the input and click Save as a new task (one task per client or competitor set is a good pattern).
  2. In Schedules, create a schedule (for example every day at 08:00 in your time zone) and add the task.
  3. In the task's Integrations tab, add the Slack or Gmail integration to get a message when a run finishes, or a webhook on "Run succeeded" that passes the run to Zapier, Make, n8n or your own endpoint. Those tools can read the rows from https://api.apify.com/v2/datasets/{defaultDatasetId}/items and format them however you like.

Because monitor mode outputs only the ads that appeared since the previous run, every scheduled run's dataset is your alert list. An empty dataset (apart from free summary rows) means nothing changed. Turn on Apify's run-failure notifications too, so you hear about a failed run instead of silence.

Part of a small competitor-intelligence suite by the same developer. Same conventions everywhere: pay per event, failed items are never charged, and the monitors return only what changed since the last run.

FAQ

What is the LinkedIn Ad Library? LinkedIn's public archive of ads that ran on LinkedIn in the last year, with the advertiser, payer and, for EU ads, dates, reach and targeting. This actor returns it as JSON, CSV or Excel.

Do I need a LinkedIn account or cookies? No. Only public, logged-out pages are used.

Does it show spend or clicks? No. LinkedIn publishes impression ranges (EU ads), not spend or clicks.

Can I monitor by LinkedIn company URL? Yes, linkedin.com/company/<name> URLs are accepted and converted to a name search.

Can I get alerts? Yes. Schedule the actor and connect the dataset to Slack, email, Google Sheets, Zapier, Make or n8n. With "Only new ads", each run's dataset is your list of new ads.

Is it legal? It collects publicly available ad-transparency data without logging in and without personal profile data. You are responsible for complying with LinkedIn's terms and applicable law (e.g. GDPR) in how you use the data.

Keywords: linkedin ad library scraper, linkedin ads scraper, linkedin ads library api, linkedin competitor ads, linkedin ad spy, b2b ads monitor, new ads alert, linkedin ad intelligence, competitor ad tracking, abm competitor research.