See Every LinkedIn Ad a Competitor Is Running, With Impressions
List a competitor's LinkedIn ads with landing pages, run dates, impressions by country and targeting, using the LinkedIn Ad Library Scraper. No login.
The actor referenced in this article. Pay only for results delivered.
Before a campaign planning meeting, someone usually gets asked to find out what a competitor is running on LinkedIn. The public Ad Library has the answer, but it shows one ad at a time: open each one, scroll to the impressions block, copy the countries, note the targeting, and repeat for a few hundred ads. Nobody does that twice.
Try it live: LinkedIn Ad Library Scraper: Ads, Impressions, Targeting. Pay per result delivered. Failed and empty results are never charged.
The LinkedIn Ad Library Scraper runs the same search the Ad Library page runs, opens every ad’s detail page, and gives you one row per ad, with no LinkedIn account.
What you get and who it is for
With ad details on, these are the fields that answer what a competitor is running:
| Field | What it tells you |
|---|---|
advertiser_name, advertiser_id | The page that ran the ad, and its numeric company id |
paid_by | The Paid for by entity, often the legal name or a media agency |
ad_format, headline, body, cta | Format, creative text and call to action |
destination_url | The landing page, when LinkedIn shows it, often with UTM tags |
first_shown, last_shown | The dates the ad ran; a last_shown of today usually means it is live |
impressions_range, impressions_min, impressions_max | Total impressions as LinkedIn’s range, plus the bounds as numbers |
impressions_by_country | Each country’s share of impressions |
targeting_locations, targeted_parameters, excluded_parameters | Where the ad was aimed, and which targeting types it used or excluded |
posted_by_name | On thought leader ads, the member whose post the company promotes |
search_total_ads | How many ads LinkedIn says matched the search |
Demand generation and paid social teams use it to see which offers, events and formats a rival is pushing. Agencies run it before a pitch. Product marketers read the landing pages and UTM tags to see which campaigns and audiences a competitor is building.
The input
{
"advertisers": ["HubSpot"],
"dateRange": "last-30-days",
"sortOrder": "newest",
"maxAdsPerSearch": 200,
"includeAdDetails": true
}
advertiserstakes the name as you would type it in the Ad Library’s Company or advertiser box. A LinkedIn company page link also works; its page name is searched.dateRangeset tolast-30-dayskeeps ads that ran in the last 30 days, so the list is what the competitor is running now or ran recently. Useallfor the full archive.maxAdsPerSearchruns from 20 to 1,000. LinkedIn serves 24 ads per page, and the actor keeps paging until it reaches your number or runs out of ads. Every row carriessearch_total_ads, the count LinkedIn reports for the search; if it is above your cap, raise the cap to get every ad.includeAdDetailsopens each ad’s detail page for the full text, call to action, landing page,paid_by, run dates, impressions and targeting. Without it, text is cut at about 120 characters and those fields are missing.countriesis optional. LinkedIn publishes the impressions and targeting block mainly for ads served in the European Union, so adding EU codes such asDEandFRgets it on every row. The trade is that ads not shown there drop out.
What the output looks like
[
{
"ad_id": "1558773703",
"ad_url": "https://www.linkedin.com/ad-library/detail/1558773703",
"advertiser_name": "HubSpot",
"advertiser_id": "68529",
"advertiser_type": "company",
"paid_by": "HubSpot, Inc.",
"ad_format": "single_image",
"headline": "GROW Europe 2026 · London · Register Today",
"cta": "Register",
"destination_url": "https://www.hubspot.com/grow-europe?utm_source=linkedin&utm_medium=paid...",
"first_shown": "2026-09-23",
"last_shown": "2026-10-07",
"impressions_range": "10k-20k",
"impressions_min": 10000,
"impressions_max": 20000,
"impressions_by_country": [
{"country": "United Kingdom", "country_code": "GB", "share_pct": 89, "share_text": "89%"},
{"country": "Ireland", "country_code": "IE", "share_pct": 11, "share_text": "11%"}
],
"targeting_languages": ["English"],
"targeting_locations": ["Ireland", "United Kingdom"],
"targeted_parameters": ["Company", "Job"],
"excluded_parameters": ["Audience", "Company"],
"search_query": "HubSpot",
"search_total_ads": 2534
},
{
"ad_id": "1567166153",
"advertiser_name": "MAN Digital: HubSpot & RevOps Agency",
"advertiser_id": "10429184",
"paid_by": "MAN Digital sp. z o.o.",
"ad_format": "single_image",
"first_shown": "2026-10-01",
"last_shown": "2026-10-07",
"impressions_range": "1k-5k",
"search_query": "HubSpot"
}
]
Both rows come from our HubSpot advertiser search on October 7, 2026, run with all dates and 50 ads, details on. LinkedIn reported 2,534 ads for the name. Of the 50 we received, 36 were paid for by HubSpot, Inc.: 35 from HubSpot’s main page (advertiser_id 68529) and 1 from the HubSpot for Developers page. The other 14 were not HubSpot’s at all: 13 came from partner and agency pages with HubSpot in their names, such as MAN Digital (6 ads, the second row) and a page called HubSpot Platinum Partner paid for by Coco Invest Oy (5 ads), and 1 was paid for by an individual. That is why every serious use of this data starts with a filter on paid_by or advertiser_id.
The first row shows what the detail page adds: a London event ad that ran from September 23 to the day of our run, reached 10,000 to 20,000 impressions, 89% in the United Kingdom and 11% in Ireland, and was aimed with company and job targeting. 18 of the 50 ads carried this block.
Run it in Apify Console
- Open https://apify.com/themineworks/linkedin-ad-library-scraper and click Try for free (or Start if you already use it).
- In Advertisers, enter each competitor’s name, one per line.
- Set Date range to Last 30 days, Order to Newest first and Max ads per search to 200.
- Leave Include ad details ticked. Optionally pick EU countries in Countries if impressions on every row matter more than full coverage.
- Click Start and watch the Output tab.
- Use the Export button to download CSV, JSON or Excel. In CSV and Excel the country and targeting lists are flattened into columns.
Run it from Python
pip install apify-client
import csv
from collections import Counter
from apify_client import ApifyClient
PAYER = "HubSpot, Inc." # the Paid for by name of the company you are tracking
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("themineworks/linkedin-ad-library-scraper").call(run_input={
"advertisers": ["HubSpot"],
"dateRange": "last-30-days",
"sortOrder": "newest",
"maxAdsPerSearch": 200,
"includeAdDetails": True,
})
own, others = [], Counter()
for ad in client.dataset(run["defaultDatasetId"]).iterate_items():
if ad.get("_type") == "info":
continue # the run summary row, never billed
if ad.get("paid_by") == PAYER:
own.append(ad)
else:
others[ad["advertiser_name"]] += 1
print(f"{len(own)} ads paid by {PAYER}; {sum(others.values())} from other pages:")
for name, n in others.most_common():
print(f" {n:>3} {name}")
print("Formats:", Counter(a["ad_format"] for a in own).most_common())
print("Calls to action:", Counter(a.get("cta") or "none" for a in own).most_common())
fields = ["ad_id", "advertiser_name", "ad_format", "headline", "cta", "destination_url",
"first_shown", "last_shown", "impressions_range", "top_country",
"targeted", "excluded", "ad_url"]
with open("competitor_linkedin_ads.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore")
writer.writeheader()
for ad in own:
countries = ad.get("impressions_by_country") or []
top = max(countries, key=lambda c: c["share_pct"], default=None)
ad["top_country"] = f"{top['country']} {top['share_text']}" if top else ""
ad["targeted"] = ", ".join(ad.get("targeted_parameters") or [])
ad["excluded"] = ", ".join(ad.get("excluded_parameters") or [])
writer.writerow(ad)
Filtering on paid_by keeps every page the company pays for, such as HubSpot for Developers, and the thought leader ads that promote its employees’ posts. Filter on advertiser_id instead when you only want the main page. Thought leader ads name employees, so a company’s employee list taken from its public page is a useful second file when you want to know whose posts are being pushed.
Run it every week
Save the input as a task, open Schedules, create a schedule with a cron expression such as 0 7 * * 1 (Mondays at 7:00), and pick the task. A full weekly pull shows which ads are still live (last_shown moves forward) and how their impression ranges grow. If you only want ads you have not seen before, tick Only new ads (for schedules): each run then returns, and charges, only ads no earlier run of yours delivered. Send the dataset to a Google Sheet with Apify’s integration, or have a webhook call your script when the run finishes.
What it costs
You pay per ad delivered: $1.29 per 1,000 ads on the Bronze plan, plus $1.29 per 1,000 for ad details when Include ad details is on, so $2.58 per 1,000 ads with details. On Silver it is $0.99 plus $0.99, and on Gold, Platinum and Diamond $0.79 plus $0.79. Every run also has a flat $0.005 start fee. An ad that two searches in the same run both find is charged once, and a detail page that fails is not charged as a detail.
A worked example: three competitors at 200 ads each, with details, is 600 ads: about $0.77 for the ads and $0.77 for the details, $1.55 on Bronze, plus $0.005 to start the run. Loosely matched partner ads are delivered and charged like any other row (14 of 50 in our HubSpot run), so a payers search can be cheaper when you only want one company.
Limits worth knowing
- Advertiser search is loose by design. Budget for partner pages and filter on
paid_byoradvertiser_idafter the run. - Run dates, impressions and targeting appear only where LinkedIn publishes them. Impressions are ranges, not exact counts, and a country share under 1% comes back as
share_pct0 with< 1%inshare_text. - There is no spend, click or conversion data.
- One search returns at most 1,000 ads, and a run takes up to 100 searches. HubSpot alone reported 2,534 ads across all dates, so split a heavy advertiser’s archive by date range. LinkedIn’s date filter covers the last 365 days.
- Image and video links are LinkedIn’s signed CDN links. Save the creatives you need soon after the run.
Related
Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.
Frequently asked questions
Why does a search for one company return ads from other pages? +
LinkedIn matches advertiser names loosely, the same way its own Ad Library site does. Our HubSpot search also returned partner and agency pages with HubSpot in their names, so filter on advertiser_id or paid_by to keep one advertiser.
Why do only some ads have impressions and targeting? +
LinkedIn publishes run dates, impressions, the country split and targeting only for some ads, mainly those served in the European Union. In our HubSpot run without a country filter, 18 of 50 ads had them.
Can I search by the company that paid instead of the page name? +
Yes. Put the Paid for by name, such as HubSpot, Inc., in payers. That finds ads paid for by that legal entity, whichever page ran them, and is the tightest way to isolate one company.
Does it show how much a competitor spends? +
No. There is no spend, click or conversion field. Where LinkedIn publishes them, you get impressions as a range such as 10k-20k, the share of impressions per country and the dates the ad ran.
Monitor New LinkedIn Ads for a Keyword Every Week
Get a weekly list of new LinkedIn ads that mention your keywords, from any advertiser, with the LinkedIn Ad Library Scraper and only-new mode.
Benchmark LinkedIn Post Engagement Across Company Pages
Compare reactions and comments per post across LinkedIn company pages, scaled by follower count, with the LinkedIn Company Posts Scraper. No login.
Monitor Competitor LinkedIn Company Posts on a Schedule
Get every new post from competitor LinkedIn company pages each day or week, with only-new mode and an Apify schedule. No LinkedIn login or cookies.
See a Competitor's TikTok Ad Targeting and Reach in the EU
Pull every TikTok ad a competitor ran in the EU, with interests, age groups, audience size and reach by country, using the TikTok Ads Library Scraper.