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 adOne 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?
| Endpoint | Input | Price | Best for |
|---|---|---|---|
| LinkedIn Ads Library | Company or Ad Library URL | $0.002 / ad | Seeing what a competitor is paying to promote right now |
| LinkedIn Posts | Profile/company URL, or a keyword search | $0.002 / post | Tracking organic content, not paid |
| LinkedIn Companies | Company URL, or search filters | $0.004 / company | Firmographic 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.
