A step-by-step walkthrough of the LinkedIn Ad Library using HubSpot as the example: how to search, what each ad shows, where the numbers are, and how to do it by domain and at scale with the Adyntel API.
Emils Veveris
Co-Owner @ Adyntel
LinkedIn publishes every ad that runs on its platform. You can search them at linkedin.com/ad-library, no account needed, and each ad stays there for a year after it last ran.
LinkedIn did not do this by choice. The EU's Digital Services Act made large platforms open up their ads, and LinkedIn's library went live in June 2023, two months before the deadline. Meta and Google built theirs for the same reason. It does the minimum the law asks for, meaning they are not exactly incentivized to make it user-friendly. For example, search by company name and you also get every other company with a similar name. Impressions and targeting only show for ads that ran in the EU, because that is the only place the law requires them. And you cannot export anything, and ads disappear a year after they stop running.
So the library is useful, but only if you know how to work around it. This guide shows how, on one real question: what is HubSpot running on LinkedIn right now, checked on September 22, 2026. Then it does the same through our API by domain, and across 1,523 companies, which is where the wider numbers come from.
Go to linkedin.com/ad-library. Type HubSpot in the "Company or advertiser" box and click Search.

You get 2,568 ads. Before you start reading them, look at the advertiser names on the cards. Most say HubSpot. Some say "Wagada Digital | HubSpot Partner", which is an agency. The box matches any page whose name contains what you typed, so every partner agency with HubSpot in its name lands in HubSpot's results.
It gets worse with short names. "SAP" also returns Saputo, a Canadian dairy company (not the SAP you were looking for). "Lattice" returns 187,461 ads because there are a lot of companies called Lattice. "Microsoft" returns Microsoft plus every reseller with Microsoft in its page name.
The obvious fixes do not work. A domain like hubspot.com returns "No results found". So does the LinkedIn URL. There is no suggestion list while you type. The box takes a name and nothing else.
Every LinkedIn company page has a number, and the library accepts it in the address bar. Start here next time. HubSpot's number is 68529.
To find the number, click "View details" on any ad that is clearly from the right company. In the "About the ad" panel, click the advertiser name. It opens the company page at an address like linkedin.com/company/68529. That number is the id.
Open this address:
linkedin.com/ad-library/search?companyIds=68529

HubSpot now shows 1,443 ads. All of them HubSpot's. The other 1,125 from the name search belonged to other pages, so the name search was off by 78%.
It has to be the number. companyIds=hubspot fails to load. If you need ids for a list of companies, Clay's company enrichment returns it as "Org Id", and our API finds it from the domain (step 10).
Each card shows the advertiser's name and logo, the post text, the creative, the headline and the call-to-action label. Results load 24 at a time, newest first. You can flip to oldest first, and that is the whole sort menu. There is no export, which you will feel by the third page.
HubSpot's 24 newest ads were 11 videos, 10 single images and one document. Three campaigns account for most of them. "Get ready for your 9am at 8.56" is a brand video that runs in English and in German. "Finish every quarter on a high note" sells the sales product. "Fall 2026 Spotlight" is a product launch.
Three kinds of card look different:
Click "View details" on the first video ad. The "About the ad" panel on the right has three lines: Video Ad, Advertiser HubSpot, Paid for by HubSpot, Inc.

That is all you get for this ad. No dates, no impressions, no targeting, and no hidden tab.
Why? Because of where the ad was shown. That is step 5.
LinkedIn publishes run dates, an impressions range and targeting for ads that were shown to at least one person in the EU, because the EU Digital Services Act makes it. Where the company is based does not matter. HubSpot is American. Its German ads carry the data and its US-only ads do not.
Add Germany in the Country filter, or add &countries=DE to the address. HubSpot drops from 1,443 ads to 179. Open the German version of the brand video. The About panel now shows:
| Field | This ad |
|---|---|
| Ran from | Sep 16, 2026 to Sep 22, 2026 |
| Total impressions | 1k-5k |
| Impressions by country | Germany 100% |
| Targeting | Language: Deutsch. Location: Deutschland. Then a table of Audience, Demographic, Company, Education, Job, Interests and Traits, each marked targeted, excluded or both. On this ad, Audience is excluded and Company and Job are both targeted and excluded. |

Impressions are always a range. The ranges LinkedIn uses: under 1k, 1k-5k, 5k-10k, 10k-20k, 20k-30k, 30k-50k, 50k-100k, 100k-150k, 150k-200k, 200k-300k, 300k-500k, 500k-1M, over 1M.
The country split is the part most people get wrong. It is not limited to EU countries. It lists every country the ad reached. A Robinhood job ad that ran worldwide for 18 months shows United States 65%, Canada 8%, India 7%, United Kingdom 5%. Of the 2,250 EU-served ads we pulled, 57% listed the United States. If a competitor runs one global campaign, you get its US share as long as the campaign touched the EU once.
One limit on the targeting itself: only the top three parameters are shown. An advertiser using six shows you three.
With the id in the address, add filters and the counts start answering questions. HubSpot, on the day this was checked:
| Add to the address | Count | What it tells you |
|---|---|---|
&dateOption=last-30-days |
360 | A quarter of the year's ads started this month. A launch |
&keyword=AI |
511 | 35% of all ads mention AI |
&keyword=Sales Hub |
101 | The sales product has its own campaigns |
&keyword=Breeze |
46 | The new assistant, launched this month |
&countries=US |
532 | 37% of ads name the US as a target |
&countries=DE |
179 | 12%, in German |
The keyword filter keeps ads that contain every word you typed, in any order. Quotes do nothing. With the company box empty it lists every advertiser using a term, which is useful for a distinctive term and useless for a common one. "attribution" on its own returns 68,401 ads.
Also read the landing page when there is one. On about one ad in six the headline links out, and the link carries the full URL with its tracking parameters. HubSpot's German video links to hubspot.de with the campaign name BrandStrategy_VideoViews_DE_EMEA_DACH_GBC_AnnoyinglyGood-Q3-2026_OLV_GG-BDM_Butter-30. A second copy ends in Butter-15. One string, and you know the DACH team is testing a 30-second and a 15-second cut of a Q3 brand campaign called "Annoyingly Good", bought on a video-views objective, and sending people to the German homepage. Nobody at HubSpot would tell you that on a call.
Clear the company box and type HubSpot in the Payer box. You get 1,658 ads, 215 more than the page itself runs. The extra 215 are posts HubSpot pays to boost from other people's profiles: executives, employees, customers, partners.

Payer search is the only way to see a whole company at once. "Microsoft" as payer returns ads from Microsoft Advertising, Microsoft 365, Azure Cosmos DB, Minecraft Education and a handful of Microsoft employees. A name search on Microsoft misses most of them. The same box tells you which agency runs a competitor's ads, because the advertiser is the agency and the payer is the client.
Of the 554 advertisers with ads that we pulled, 144 were boosting posts from people's profiles, and those posts were 10% of all ads. Refine Labs had 17 of its 24 newest ads promoted this way. Salesforce had 13 of 24, across nine people.
On EU-served ads the impressions range tells you which creatives got budget, and most did not. Of 2,250 EU-served ads, 56% were under 5,000 impressions and 9% were over 100,000. A single ad above 50,000 is one the advertiser kept paying for, for weeks.
The "More" button has an impressions filter. Set a minimum of 50,000 and you are left with the ads that scaled, which for most companies is a handful. The same panel filters by targeting, so you can ask for every ad where Job targeting was used, or where an Audience list was excluded. An excluded audience list usually means a prospecting campaign, because they are keeping existing contacts out.
Both filters only work on EU-served ads. Everything about performance in the library does.
Spend. Not for any ad, in any country. LinkedIn has never published it and the Digital Services Act does not require it. Any tool that shows you a spend figure for a LinkedIn ad is estimating it, including us. One way to estimate is the middle of the impressions range times a CPM benchmark. The method is in how to estimate ad spend on LinkedIn.
Also missing: clicks, conversions, exact impressions, any dates or impressions for ads that never reached the EU, the full targeting list, anything older than a year after its last impression, and an export. LinkedIn's own Ad Library API is an application-only product for researchers.
Everything above is one company at a time, by name or by id. Fine for a competitor. Useless for a prospect list.
Our LinkedIn endpoint takes the domain instead. Send hubspot.com and it finds page 68529, returns the ads, and reports the same count the id search shows, 1,443. No name problem, no id to look up, no browser.
POST https://api.adyntel.com/linkedin
{
"api_key": "your_key",
"email": "your_email",
"company_domain": "hubspot.com",
"impression_data": true
}
impression_data: true adds the EU block to every ad. It costs 2 credits per call instead of 1. The German brand video comes back like this:
{
"ad_id": "1552591373",
"creative_type": "SPONSORED_VIDEO",
"cta": "Mehr erfahren",
"destinationUrl": "http://hubspot.de?utm_source=linkedin&utm_medium=paid_brandstrategy&utm_campaign=BrandStrategy_VideoViews_DE_EMEA_DACH...",
"eu_transparency": {
"startDate": "2026-09-16T00:00:00.000Z",
"endDate": "2026-09-22T00:00:00.000Z",
"totalImpressions": "1k-5k",
"impressionsByCountry": [{ "country": "Germany", "impressions": "100%" }],
"targeting": {
"language": "Targeting includes Deutsch",
"location": "Targeting includes Deutschland"
}
}
}
An ad that never reached the EU returns the same block with every value null. total_ads is the count for the page. date_filter narrows the window: last 30 days for Clay gave 73 ads out of 462. continuation_token pages through 24 ads at a time. A domain with no LinkedIn page returns HTTP 204 with an empty body. The same lookup exists for Meta and Google, so one domain gives you all three. Documentation: docs.adyntel.com/ad-libraries/linkedin.
This is where the library stops and the API starts. We ran 1,523 domains through it, 24 newest ads each, in about an hour. Doing that in the library means finding 1,523 page ids by hand (nobody does that).
64% of the companies had no LinkedIn ads in the last year. Among those that did:
| Company type | Had ads | Median ads in the library |
|---|---|---|
| Enterprise and consulting | 93% | 3,771 |
| Tech headquartered in the EU | 96% | 876 |
| B2B software | 56% | 248 |
| Finance and ETF issuers | 93% | 203 |
| Consumer brands | 32% | 17 |
| Agencies and ecommerce tools | 26% | 13 |
| Local businesses (dentists, home services, real estate, restaurants) | 23% | 7 |
HockeyStack, one of our customers, uses 50 or more ads as its cut-off for an account to go after. Half of the advertisers in this pull cleared it. That is a qualification rule you can run on a whole prospect list by domain.
Three more numbers from the run. Only a quarter of all ads carried the EU data, so the numbers in step 5 are the exception, not the rule. 26% of advertisers were boosting employee or customer posts, so the payer-versus-page check from step 7 is worth doing on any competitor. And 17% of ads carried a landing page link, which is enough to audit where a company sends its traffic across an account list.
The library tells you what a company is running. The numbers only show up for ads that touched the EU, and spend never shows up at all. Everything else is there, if you search by id and know where to look.
| Question | Where | Address parameter |
|---|---|---|
| One company only | Page id | companyIds=68529 |
| Ads aimed at one country | Country filter | countries=DE |
| Recent ads | Date filter | dateOption=last-30-days |
| Ads on a theme | Keyword | keyword=Breeze |
| Everything a company pays for | Payer box | payer=HubSpot |
| Ads with 50k+ impressions | More filters | impressionsMinValue=50&impressionsMinUnit=thousand |
| Same data by domain | Adyntel API | company_domain: "hubspot.com" |
Does the LinkedIn Ad Library show ad spend? No. LinkedIn does not publish spend for any ad, in any country. It publishes impressions ranges only for ads that reached the EU. If you need a spend figure, you estimate it from ad counts and impressions ranges. One method is in how to estimate ad spend on LinkedIn.
Why are impressions and dates missing on the ads I am looking at? The ad never reached anyone in the EU. LinkedIn only publishes impressions, run dates and targeting for ads served in the EU, under the Digital Services Act. A US-only campaign shows the format, the advertiser and the payer, and nothing else.
Is the EU data only about EU countries? No. Once an ad qualifies, the country split covers every country it reached. A global campaign that touched the EU shows its US share too. A US-only campaign shows nothing.
Why can't I find a company's ads? The name search matched a different page, so search by page id instead (step 2). An agency runs the ads, so the advertiser name is the agency's and the company appears only as the payer. The ads target another country and you have a country filter on. Or the company has not run an ad in the last year. Of the 1,523 companies we checked, 64% had none.
Can I search by domain or LinkedIn URL? Not in the library. The company box takes a name, and the address takes a numeric page id. The Adyntel API takes the domain.
How long do ads stay in the library? One year after the ad's last impression. An ad that is still running stays as long as it runs. Nothing before June 1, 2023 is searchable.
Can I see who paid for an ad? Yes. Every ad shows "Paid for by" with the legal entity, and you can search by payer. Agency-run ads and partner ads show a different advertiser and payer.
Can I see the landing page? Sometimes. On about one ad in six the headline links to the destination URL with its tracking parameters. On the rest the call-to-action is a button with no link behind it.
How do I find a company's thought-leader ads? Search the company in the Payer box. Every post it pays to boost from an employee's or customer's profile shows up, with the person's name on the card and "Promoted by" the company underneath. There is no format filter, so this is the only way to isolate them.
Can I see inactive or past ads? Yes. The library keeps every ad for one year after its last impression, whether it is still running or not. Deleted ads stay too, with the creative blurred and a "View anyway" button. There is no filter for active only. For EU-served ads the end date tells you whether it is still running.
Do I need a LinkedIn account? No. The library is public and needs no login.
Can I export the results or use an API? The library has no export. LinkedIn's own Ad Library API is for approved researchers. For commercial use, the Adyntel endpoint returns the same data by domain.