MindCase
Kritish Puri

How to Monitor Competitor Ads on LinkedIn's Ad Library

LinkedIn's Ad Library shows exactly what a competitor is running and who paid for it — here's how to pull it as structured data instead of scrolling.

linkedinadvertising
How to monitor competitor ads on LinkedIn's Ad Library

LinkedIn's Ad Library is public. Anyone can look up which ads a company is running on LinkedIn right now, who paid for them, and how long they've been live. Most people use it the way it was built to be used: click a company, scroll the ads, close the tab.

That's fine for a one-off check. It falls apart the moment you want to watch a competitor's messaging shift over weeks, or compare three competitors side by side instead of one.

If you're an agent (or building one) reading this rather than a human, the full machine-readable schema for every endpoint below lives at mindcase.co/skills.md.

What does LinkedIn's Ad Library actually expose?

Every ad in the library comes with more than just the creative. LinkedIn attaches who paid for it, when it started, whether it's still running, and roughly how many people saw it — broken down by country. That's the part worth pulling as data: a single ad tells you what a competitor is saying. The metadata around it tells you what's working for them.

How do you pull a competitor's ads from LinkedIn's Ad Library?

The LinkedIn Ads API takes a company page URL (or a direct Ad Library URL, if you already have one) and returns every ad tied to it.

curl -X POST "https://api.mindcase.co/v1/data/linkedin/ads-library/run?wait=true" \
-H "Authorization: Bearer $MINDCASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "params": {
    "urls": "https://www.linkedin.com/company/salesforce",
    "maxResults": 50
  }
}'

# $0.002 per ad

One company URL per call — if you're tracking several competitors, that's one call each, not a combined list. Each row comes back with 16 fields: who paid for the ad, the creative itself, and its performance and timing data.

What can you actually learn from who paid, how long, and how many saw it?

Three groups of fields matter more than the rest. paidBy names the exact advertiser entity — useful the moment a competitor runs ads through a regional subsidiary or an agency account instead of their main page. started, ended, and daysActive tell you whether a campaign is being scaled or quietly pulled: an ad still live after six weeks is one a competitor has decided works. impressions and impressionsByCountry show where they're actually spending attention, not just where their company page claims to operate.

The rest — headline, body, mediaUrl, mediaType, format, clickUrl — is the creative itself: what they're saying, and where the ad sends someone who clicks it.

Put the two groups together and a single row answers more than one question at once. If Salesforce has an ad live for 40+ days with impressionsByCountry concentrated in the US and UK, paidBy naming Salesforce's own page rather than a regional entity, and a clickUrl pointing at a specific landing page rather than the homepage — that's a campaign they're actively running and measuring, not a one-off test. None of that requires opening LinkedIn and scrolling.

How do you track a competitor's ads over time?

There's no history field on any single pull — each call returns what's live right now. Tracking change is something you build on top, not something the endpoint stores for you: run the same call on a schedule (weekly is often enough for B2B ad cycles) and diff the results by adId. A new adId you haven't seen before is a new ad. An adId that drops out of the results is one that ended. That diff, not any single pull, is what tells you a competitor just changed strategy.

How do you use this data responsibly?

Everything the Ad Library returns is information LinkedIn already publishes for anyone to see — that's the entire point of an ad transparency library, public accountability for who's paying for what. Using it to understand a competitor's positioning or ad cadence is exactly what it's for. Where teams get it wrong is treating impressions or daysActive as a precise performance benchmark rather than a directional signal — LinkedIn doesn't publish click-through rates or conversion data here, and neither does anyone reading its Ad Library, including this endpoint.

What can't you get from LinkedIn's Ad Library?

Two cases.

Exact ad spend. The Ad Library returns impressions, not budget or spend — LinkedIn doesn't expose that in its own Ad Library UI either, so this isn't a gap specific to any API pulling from it. Impressions are the closest available proxy for scale.

Anything outside LinkedIn's own ad platform. The library only covers ads LinkedIn itself served. A competitor's organic posts, or ads they're running on other platforms, need their own endpoints — LinkedIn Posts for organic content, for instance.

Which endpoint should you use for which job?

EndpointInputPriceBest for
LinkedIn Ads LibraryCompany or Ad Library URL$0.002 / adSeeing what a competitor is paying to promote right now
LinkedIn PostsProfile/company URL, or a keyword search$0.002 / postTracking organic content, not paid
LinkedIn CompaniesCompany URL, or search filters$0.004 / companyFirmographic context on the advertiser itself

FAQ

A company page URL works on its own — you don't need to find the ad library's own URL for that company first.

Live on every run. Each call reflects what LinkedIn's Ad Library is currently serving, not a cached snapshot.

Not in a single call — the endpoint takes one company or Ad Library URL per request. Tracking several competitors means one call per company, which you can run in parallel.

Only LinkedIn. It reads LinkedIn's own Ad Library, which only contains ads run through LinkedIn's ad platform.