LinkedIn Ad Library Scraper & Competitor Ad Monitor avatar

LinkedIn Ad Library Scraper & Competitor Ad Monitor

Pricing

from $2.00 / 1,000 ad with details

Go to Apify Store
LinkedIn Ad Library Scraper & Competitor Ad Monitor

LinkedIn Ad Library Scraper & Competitor Ad Monitor

Scrape LinkedIn's Ad Library by company or keyword: ad copy, headline, CTA, landing page, images and videos, run dates, impressions by country and targeting. Monitor mode returns only new ads, with webhook alerts. Pay per ad.

Pricing

from $2.00 / 1,000 ad with details

Rating

0.0

(0)

Developer

Yushi Homma

Yushi Homma

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

See every ad a company runs on LinkedIn, from LinkedIn's public Ad Library, and get told when they launch a new one. Search by company name or by keyword. Each ad comes back as a flat row: advertiser, format, full ad copy, headline, call-to-action, landing page, image and video links. For ads shown in the EU it also has run dates, impressions by country and the targeting the advertiser chose.

  • Everything on the ad's page: the full copy (search results cut it off), CTA button, landing page, the MP4 of video ads, who paid for the ad, and, for EU-shown ads, first and last day shown, total impressions, impressions per country, and language, location, company, job and audience targeting.
  • Search by company or keyword: hubspot, Salesforce, or ads that mention AI agents, optionally limited to countries and a date range. Ad Library search links work too, with all their filters.
  • Competitor monitoring built in: every row says whether the ad is newSinceLastRun. Turn on Only new ads to get (and pay for) only new ads, and add a webhook to be alerted about each one.
  • No login, no cookies, no LinkedIn account at risk: the Ad Library is public. Requests use a Firefox browser fingerprint, and switch to a fresh IP automatically when LinkedIn's Cloudflare blocks one.
  • API and AI agent tool: ask "what is this company advertising on LinkedIn?" in one API call, or let an AI agent call it as a tool through the Apify MCP server.

Use cases

  • Watch competitors' LinkedIn ads and hear about each new campaign the day it appears.
  • Collect B2B ad copy, headlines and CTAs to benchmark messaging, offers and creative formats.
  • See where a competitor spends: impressions by country and the job, company and location targeting of their EU ads.
  • Find every advertiser talking about a topic (keywords), e.g. to build a list of companies investing in a category.
  • Feed ads into an LLM for analysis, or give an AI agent a "what is X advertising on LinkedIn?" tool.

How to use it

  1. Add Advertisers: company names as you'd type them into the Ad Library (hubspot), or Ad Library search links (https://www.linkedin.com/ad-library/search?accountOwner=hubspot).
  2. Or add Keywords to find ads that mention a word or phrase, from any advertiser.
  3. Optionally limit to Countries (US, DE…) and a period (Shown during).
  4. Choose Max ads per advertiser or keyword (default 50).
  5. For monitoring, turn on Only new ads, optionally set an Alert webhook URL, and run the Actor on a schedule, for example daily. The first run returns everything and becomes the baseline; later runs return only new ads.

Tutorial: get a Slack message when a competitor launches a LinkedIn ad

  1. In Zapier, Make or n8n, create a scenario that starts with a webhook trigger ("Catch Hook" in Zapier, "Custom webhook" in Make, "Webhook" node in n8n) and copy its URL.
  2. Add a Slack → Send message step. Map item.advertiser, item.headline, item.adText and item.adUrl into the message.
  3. In this Actor, enter your competitors under Advertisers, turn on Only new ads, and paste the webhook URL into Alert webhook URL.
  4. Run it once. That run records the ads already live as the baseline and sends no alerts.
  5. Open Schedules in Apify Console and run the Actor daily with the same input. From then on, each new ad becomes one Slack message, and you pay only for new ads.

The same webhook works for email, Microsoft Teams, Google Sheets or a CRM. Add a different action after the trigger.

Input

{
"advertisers": ["hubspot", "https://www.linkedin.com/ad-library/search?accountOwner=salesforce&countries=DE"],
"keywords": ["AI agents"],
"countries": ["US", "GB"],
"dateOption": "last-30-days",
"maxAdsPerSearch": 50,
"scrapeDetails": true,
"onlyNewAds": true,
"alertWebhookUrl": "https://hooks.example.com/linkedin-ads"
}
FieldRequiredDescription
advertisersone of these twoCompany names or Ad Library search URLs.
keywordsone of these twoWords or phrases in the ad copy, or Ad Library search URLs.
countriesnoTwo-letter country codes. Only ads shown there are returned. A search URL that sets its own countries keeps them.
dateOptionnoall (default), last-30-days, current-month, current-year or last-year.
maxAdsPerSearchno1 to 5,000 ads per advertiser or keyword (default 50).
scrapeDetailsnoOpen each ad's page for the full copy, CTA, landing page, video, payer, run dates, impressions and targeting (default true).
onlyNewAdsnoReturn only ads not seen in earlier runs for the same advertiser or keyword (default false).
alertWebhookUrlnoReceives a POST for every ad that appeared since the previous run.
proxyConfigurationnoLeave empty: LinkedIn is fetched directly, falling back to Apify datacenter and then residential proxies only when it blocks a request.

Output

One dataset item per ad:

{
"adId": "1605968824",
"adUrl": "https://www.linkedin.com/ad-library/detail/1605968824",
"advertiser": "HubSpot",
"advertiserUrl": "https://www.linkedin.com/company/68529",
"advertiserLogoUrl": "https://media.licdn.com/dms/image/v2/…/hubspot_logo",
"paidBy": "HubSpot, Inc.",
"format": "Video Ad",
"creativeType": "SPONSORED_VIDEO",
"adText": "Dein CRM ist nur so gut wie seine Daten. Das HubSpot Smart CRM aktualisiert sich selbst…",
"headline": "Ein CRM – clever und selbst aktualisierend.",
"cta": "Mehr erfahren",
"landingUrl": "https://www.hubspot.de/products/crm/ai-crm-lp?utm_source=linkedin…",
"imageUrl": "https://media.licdn.com/dms/image/v2/…/videocover-high/…",
"imageUrls": ["https://media.licdn.com/dms/image/v2/…/videocover-high/…"],
"videoUrl": "https://dms.licdn.com/playlist/vid/v2/…/progressive-servable-video/…",
"runFrom": "2026-10-22",
"runTo": "2026-10-25",
"totalImpressions": "50k-100k",
"impressionsByCountry": [{ "country": "Germany", "impressions": "100%" }, { "country": "Austria", "impressions": "less than 1%" }],
"targeting": [
{ "parameter": "Language", "value": "Targeting includes Deutsch" },
{ "parameter": "Location", "value": "Targeting includes Deutschland" },
{ "parameter": "Company", "value": "targeted and excluded" },
{ "parameter": "Job", "value": "targeted and excluded" },
{ "parameter": "Education", "value": "not used" }
],
"detailScraped": true,
"source": "advertiser:hubspot",
"newSinceLastRun": true,
"scrapedAt": "2026-10-25T21:47:59.693Z"
}
  • runFrom, runTo, totalImpressions, impressionsByCountry and targeting come from LinkedIn's EU transparency data, so they are filled only for ads shown in the EU. They are null or empty for other ads.
  • targeting lists language and location segments as LinkedIn words them, then says for audience, demographic, company, education, job and interest criteria whether each was targeted, excluded, targeted and excluded or not used.
  • landingUrl is null when LinkedIn doesn't show one (e.g. lead-gen form ads). Links inside the copy stay in adText.
  • With Open each ad's page off, adText is the preview from search results (cut off after a few lines), and cta, landingUrl, videoUrl, paidBy and the EU fields are empty.
  • advertiser is the company, or the person for thought-leader ads promoted by a company.

The webhook body is { "actor": "linkedin-ad-library-monitor", "item": { ...same fields... }, "detectedAt": "<ISO time>" }.

API and AI agents

Run it and get the results in one call:

curl -X POST "https://api.apify.com/v2/acts/yushi3~linkedin-ad-library-monitor/run-sync-get-dataset-items" \
-H "Authorization: Bearer <APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"advertisers": ["hubspot"]}'

It returns the dataset items as a JSON array. AI agents can call the Actor as a tool through the Apify MCP server.

Pricing

EventPrice
Ad with details (ad page read: full copy, CTA, landing page, video, run dates, impressions, targeting)$0.002
Ad from search results only (with Open each ad's page off)$0.001
New ad alert delivered to your webhook$0.002

Proxy traffic is included. With Only new ads on, ads you already received are neither returned nor charged. When LinkedIn keeps blocking an ad's page even after fresh IPs, the ad is still returned from search results and billed as a search result.

Limitations

  • Only what LinkedIn's Ad Library shows publicly. LinkedIn shows run dates, impressions and targeting only for ads shown in the EU, and never shows spend.
  • LinkedIn lists 24 ads per results page. Company search matches LinkedIn's own advertiser name search, so hubspot also finds "HubSpot for Developers".
  • Video links (videoUrl) and image links are signed by LinkedIn and may stop working after some time. Download them if you need to keep them.

When an advertiser or keyword fails

Every advertiser and keyword is processed even if one fails. Failures are listed in the run's key-value store under FAILED_TARGETS with the reason. The run fails outright only when LinkedIn changed its pages in a way the Actor can no longer read (it is re-tested against the live site every 12 hours) or when every advertiser and keyword failed.

Questions and issues

Open an issue on the Actor's Issues tab.