LinkedIn Ad Tracker — Competitor Ads, Spend & Targeting avatar

LinkedIn Ad Tracker — Competitor Ads, Spend & Targeting

Pricing

from $4.00 / 1,000 results

Go to Apify Store
LinkedIn Ad Tracker — Competitor Ads, Spend & Targeting

LinkedIn Ad Tracker — Competitor Ads, Spend & Targeting

Track every ad a company runs on LinkedIn's public Ad Library — creative copy, payer, run dates, EU/DSA impressions + per-country split + targeting — enriched with the advertiser's real firmographics (domain, industry, size). Breaks the 24-ad limit. No login.

Pricing

from $4.00 / 1,000 results

Rating

0.0

(0)

Developer

Berkan Kaplan

Berkan Kaplan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 hours ago

Last modified

Share

LinkedIn Ad Tracker

LinkedIn Ad Tracker — Competitor Ads, Spend Signals & Targeting

Name a competitor and get every ad they run on LinkedIn. Feed in a company name, LinkedIn company URL or numeric id, and this Actor pulls that advertiser's ads from the public LinkedIn Ad Library (no login) — creative copy, the paying entity, run dates, EU/DSA impression ranges, per-country split and targeting — then enriches each advertiser with real firmographics (domain, industry, employee count, HQ, followers) that no other ad-library scraper attaches.

  • 🎯 You name the companies, it returns their ads — this is a tracker for advertisers you already know (its sibling, LinkedIn Ad Discovery, does the reverse: a keyword in → who's advertising on it).
  • 🚀 Breaks the ~24-ads-per-query ceiling — LinkedIn caps public search at ~24 ads; this fans out across date × country facets and de-duplicates (6×+ in testing) toward your cap.
  • 🏢 Advertiser resolved to a real company — domain, industry, size, HQ and followers fused onto every ad, turning an ad dump into competitive company intelligence.
  • One run → one flat dataset (JSON / CSV / Excel / API), cookieless, residential-proxied.

Quick start (API)

Track two competitors' last-30-days ads in one call:

curl -X POST "https://api.apify.com/v2/acts/foxlabs~linkedin-ad-tracker/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"advertisers": ["HubSpot", "https://www.linkedin.com/company/salesforce/"],
"dateRange": "last-30-days",
"maxAdsPerAdvertiser": 150
}'

Prefer no code? Open the Input tab, list your advertisers, set the options, and click Start — then download the results.

What you get

One clean, flat record per ad:

FieldTypeDescription
adIdstringLinkedIn Ad Library ad identifier
adUrlstringDirect link to the ad's public detail page
advertiserNamestringAdvertiser — resolved company name, or the name you supplied
advertiserCompanyIdstringAdvertiser's numeric LinkedIn company id
advertiserUrlstringAdvertiser's LinkedIn company URL (numeric-id form)
paidBystringThe funding/paying entity ("Paid for by …") — often an agency ≠ the advertiser
headlinestringAd headline
bodystringAd creative copy (commentary text)
ctastringCall-to-action button label (best-effort)
clickUrlstringAd destination URL (best-effort; omitted when login-gated)
formatstringimage or video
imageUrlstringCreative image URL
availabilityStartstringFirst date the ad ran (e.g. Mar 3, 2026)
availabilityEndstringLast date the ad ran
adDurationDaysnumberDays between start and end
impressionsstringEU/DSA impression range (e.g. 10k-50k) — ranges, never exact counts
impressionsPerCountryarrayPer-country impression split, [{ country, share }] (EU/DSA)
targetingLanguagestringTargeting language(s) (EU/DSA)
targetingLocationstringTargeting location(s) (EU/DSA)
advertiserCompanyobjectFirmographics { domain, industry, employeeCount, hq, followers, website } (when enrichment is on)
sourcesobjectProvenance { ad, firmographics }
scrapedAtstringISO timestamp of collection

Fields are only present when public data exists for them — missing values are omitted rather than guessed.

Sample output

{
"adId": "526342715",
"adUrl": "https://www.linkedin.com/ad-library/detail/526342715",
"advertiserName": "HubSpot",
"advertiserCompanyId": "68529",
"advertiserUrl": "https://www.linkedin.com/company/68529",
"paidBy": "HubSpot, Inc.",
"headline": "The AI-powered customer platform",
"body": "Marketing, sales and service software that helps your business grow without compromise. Get a demo today.",
"cta": "Learn more",
"clickUrl": "https://www.hubspot.com/products/crm",
"format": "image",
"imageUrl": "https://media.licdn.com/dms/image/v2/D4E10AQ.../ad-creative.jpg",
"availabilityStart": "Mar 3, 2026",
"availabilityEnd": "Apr 12, 2026",
"adDurationDays": 40,
"impressions": "10k-50k",
"impressionsPerCountry": [
{ "country": "Germany", "share": "34%" },
{ "country": "France", "share": "21%" },
{ "country": "Netherlands", "share": "8%" },
{ "country": "Ireland", "share": "<1%" }
],
"targetingLanguage": "English",
"targetingLocation": "Germany, France, Netherlands, Ireland",
"advertiserCompany": {
"domain": "hubspot.com",
"industry": "Software Development",
"employeeCount": 11000,
"hq": "Cambridge, Massachusetts, US",
"followers": 2500000,
"website": "https://www.hubspot.com"
},
"sources": {
"ad": "LinkedIn Ad Library (public)",
"firmographics": "LinkedIn company page"
},
"scrapedAt": "2026-07-05T09:12:44.201Z"
}

Illustrative record — field shapes are real (as emitted by the Actor); the values are an example.

Input & filters

  • Advertisers — the companies to track. Each entry is a name (Salesforce), a LinkedIn company URL (https://www.linkedin.com/company/hubspot/) or a numeric company id. A URL or id resolves exactly; a plain name is slugified as a best-effort guess.
  • Date rangeall (full ~1-year retention), last-7-days, last-30-days or last-90-days.
  • Max ads per advertiser — cap on ads collected per advertiser (1–1000). The facet fan-out works toward this cap to beat LinkedIn's ~24-per-query limit.
  • Enrich advertiser firmographics — on by default; resolves each advertiser to its real company page and attaches advertiserCompany. Turn off for a faster, ads-only run.
  • Proxy — residential proxy is the recommended default; LinkedIn rate-limits and blocks un-proxied and datacenter traffic.

Example inputs (copy & paste)

// 1) Monitor two competitors' recent ads, enriched
{ "advertisers": ["Salesforce", "HubSpot"], "dateRange": "last-30-days", "maxAdsPerAdvertiser": 150 }
// 2) Deep pull for a single advertiser (exact match via company URL)
{ "advertisers": ["https://www.linkedin.com/company/hubspot/"], "dateRange": "all", "maxAdsPerAdvertiser": 1000 }
// 3) Fast creative swipe file — many advertisers, no enrichment
{ "advertisers": ["Notion", "Airtable", "Asana"], "enrichAdvertiser": false, "maxAdsPerAdvertiser": 50 }
// 4) Change detection — only the last 7 days of new creatives
{ "advertisers": ["Adobe", "Canva", "Figma"], "dateRange": "last-7-days", "maxAdsPerAdvertiser": 100 }
// 5) Quarterly campaign review — last 90 days, enriched firmographics
{ "advertisers": ["Snowflake", "Databricks"], "dateRange": "last-90-days", "maxAdsPerAdvertiser": 300 }
// 6) Pin an advertiser by numeric LinkedIn company id (avoids name-match ambiguity)
{ "advertisers": ["1035"], "dateRange": "all", "maxAdsPerAdvertiser": 200 }
// 7) Category watchlist — several advertisers, enriched, recent window
{ "advertisers": ["Zoom", "Slack", "Miro", "Loom", "Notion"], "enrichAdvertiser": true, "dateRange": "last-30-days", "maxAdsPerAdvertiser": 120 }

Use cases

  • Competitive intelligence. Track a rival's advertisers list on a schedule and see exactly what they promote, to whom (targetingLocation/targetingLanguage), since when (availabilityStart), and how heavily (impressions range + adDurationDays) — no manual library browsing.
  • Creative & messaging research. Build a swipe file of live B2B ad copy: pull body, headline, cta, format and imageUrl across the players in your category to see which angles are running.
  • Agency & spend-signal monitoring. paidBy reveals the funding entity (often the agency behind the campaign); combine it with impression ranges and flight length as directional spend signals.
  • Campaign change detection. Re-run on a cadence and diff the dataset to catch new creatives, paused ads (an availabilityEnd appears) or a ramp in impression ranges.
  • Sales & ABM context. Before you reach out, see what a target account is currently advertising — and use the fused advertiserCompany firmographics (domain, industry, size, HQ) to prioritise.
  • Category & market research. Compare several companies' ad strategies side by side — volume, formats, geographies and messaging — to size a category's ad activity.

Performance & throughput

Each advertiser is resolved once (a single company-page fetch for firmographics), then its ads are collected with a two-phase, adaptive facet fan-out and pulled at concurrency 12. Small and medium advertisers finish in a single cheap pass (base + date facets); only advertisers that actually hit LinkedIn's ~24-per-query cap trigger the wider EU-first country fan-out — so you don't pay for fan-out you don't need. Runs use a residential proxy (the recommended default) to avoid LinkedIn's rate-limiting. Throughput scales with your Apify plan and is bounded by maxAdsPerAdvertiser; there is no login, cookie or API key.

Integrations

JavaScript (apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('foxlabs/linkedin-ad-tracker').call({
advertisers: ['Salesforce', 'HubSpot'], dateRange: 'last-30-days', maxAdsPerAdvertiser: 150,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python (apify-client):

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("foxlabs/linkedin-ad-tracker").call(run_input={
"advertisers": ["Salesforce", "HubSpot"], "dateRange": "last-30-days", "maxAdsPerAdvertiser": 150,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["advertiserName"], item.get("headline"), item.get("impressions"))

Also works with Make / n8n / Zapier (Apify app → run this Actor, map the input), scheduled runs, webhooks, and the Apify MCP server for AI agents that need live competitor-ad data.

Data quality (honest)

  • Ad copy, payer, formats, dates and the ad URL come straight from each ad's public detail page — read, never fabricated. Missing values are omitted, not guessed.
  • EU/DSA fields are conditional. impressions, impressionsPerCountry and the two targeting* fields exist only for ads served in the EU (DSA transparency). For a global advertiser only a fraction of ads carry them — ≈20–25% in testing — while EU-served ads fill them reliably. This is a structural property of the library that every scraper shares, not a gap unique to this tool.
  • Beyond 24 per query. LinkedIn's public search returns ~24 ads per query; the facet fan-out pulls many multiples (6×+ in testing) toward maxAdsPerAdvertiser. What's dropped for very large advertisers is bounded by your cap, not silently truncated at 24.
  • cta / clickUrl are best-effort — LinkedIn often routes the click through a login-gated redirect, so the public destination isn't always available; when it isn't, the field is omitted.
  • Firmographics are attached only when the advertiser's public company page resolves; otherwise the ad still carries its advertiser name and id.

No invented fill-rate percentages are claimed here — the figures above (≈20–25% EU-served, 6×+ fan-out) are the observations recorded during development.

Pricing

Pay per result — you're billed per ad record returned. Advertiser enrichment reuses a single company-page fetch per advertiser, so it adds firmographic intelligence without a per-ad cost. There's an Apify free tier to evaluate the full feature set before you scale. Runs use Apify's residential proxy (included in your Apify usage).

FAQ

How is this different from LinkedIn Ad Discovery? This is a tracker: you supply the companies (advertisers) and it returns their ads. LinkedIn Ad Discovery does the reverse — a keyword in → the list of companies advertising on that topic. Use Discovery to find advertisers, this Actor to monitor ones you already know.

Do I need a LinkedIn login or API key? No. It reads only the public LinkedIn Ad Library — cookieless, no login, no key.

Does it include ad spend? No. LinkedIn does not publish spend anywhere in the library, and no tool can source it. You get spend signals: the paying entity (paidBy), EU/DSA impression ranges and flight duration (adDurationDays).

How does it get more than 24 ads per advertiser? LinkedIn's public search caps ~24 ads per query. The Actor fans out across date × country facets and de-duplicates the ad ids (6×+ in testing) up to maxAdsPerAdvertiser.

Why do some ads have no impressions or targeting? Those are EU/DSA transparency fields; LinkedIn only publishes them for ads served in the EU. Non-EU ads simply omit them.

How do I identify an advertiser reliably? Pass a LinkedIn company URL or numeric id for an exact match. A plain name is slugified as a best-effort guess and may not resolve to the right page.

How fresh is the data, and how far back does it go? Each run reads the library live. LinkedIn retains ads in the library for ~1 year; older ads aren't available.

What export formats are available? JSON, CSV, Excel, or via the Apify API/integrations.

How many ads can I collect per advertiser? Up to 1,000 via maxAdsPerAdvertiser.

Can I use this commercially? It's public ad-library data, but you are responsible for complying with LinkedIn's Terms of Service and applicable law (see the legal note below). Use it for legitimate competitive research and B2B intelligence.

Troubleshooting

  • 0 ads for an advertiser → either they've run no ads within the retention/date window, or a plain-name input didn't resolve to their company page. Pass the LinkedIn company URL or numeric id instead.
  • impressions / per-country / targeting* are empty → those are EU-only DSA fields; expect them on only a fraction of a global advertiser's ads. This is by design, not a miss.
  • No advertiserCompany block → the public company page couldn't be resolved (numeric-id pages are login-walled; only the /company/<slug>/ page serves public firmographics). Supply the slug URL, or keep enrichment on and provide a resolvable identifier.
  • Blocked, slow or empty results → keep the residential proxy on (the default). Un-proxied or datacenter traffic is rate-limited and blocked by LinkedIn.
  • Public data only. The Actor reads the public LinkedIn Ad Library and public company pages — no login, no cookies, no private or gated data.
  • LinkedIn ToS & your responsibility. LinkedIn does not offer an official public Ad Library API, and its Terms restrict automated access. You are responsible for how you use this Actor and its output, and for compliance with LinkedIn's Terms and applicable law — including data-protection law where ad copy or firmographics contain personal data.
  • Not affiliated. Not affiliated with, endorsed by, or sponsored by LinkedIn Corporation; "LinkedIn" is a trademark of its respective owner.
  • Impression ranges, not spend. LinkedIn exposes impression ranges (e.g. 10k-50k) for EU-served ads and never publishes spend or exact counts. No tool can source those from this library.
  • EU/DSA conditionality. Impressions, per-country split and targeting exist only for ads served in the EU (DSA transparency), so they appear on a subset of ads.
  • Best-effort fields. cta and clickUrl are taken from the public creative when present; login-gated redirect destinations are omitted rather than guessed.
  • Retention & completeness. The library retains ads ~1 year; coverage is broad but not guaranteed-complete for very large advertisers — what's dropped is bounded by maxAdsPerAdvertiser.

Support

Questions, a field you'd like added, or a custom build? Open the Issues tab on this Actor, or email info@foxlabs.com.tr. We reply fast.

If this Actor saves you time, a ⭐ review really helps.

Changelog

0.2 — 2026-07-05

  • Reworked docs: API quick-start, full field table, real-shape sample output, integration snippets (JS/Python/Make/MCP), FAQ, troubleshooting, and honest EU/DSA + legal notes.
  • Faster runs — higher concurrency and an adaptive facet fan-out (small advertisers finish in one cheap pass; only large advertisers trigger the full country fan-out).

0.1

  • Initial release. Facet fan-out beyond the 24-ad cap; full ad records (creative, payer, dates, EU/DSA impressions + per-country + targeting) with inline advertiser firmographic enrichment + provenance. Cookieless.

Part of the foXLabs data platform — public-data company, jobs, ads, procurement & AI-search intelligence scrapers. Browse the full suite at data.foxlabs.com.tr.