LinkedIn Ads Checker: Is a Company Running LinkedIn Ads? avatar

LinkedIn Ads Checker: Is a Company Running LinkedIn Ads?

Pricing

from $9.12 / 1,000 advertiser founds

Go to Apify Store
LinkedIn Ads Checker: Is a Company Running LinkedIn Ads?

LinkedIn Ads Checker: Is a Company Running LinkedIn Ads?

Check LinkedIn Ads for a list of companies without login, by company name, from LinkedIn's Ad Library. Enrich a prospect list with ad activity: ad count, ads in the last 30 days, sample links. Clay enrichment. Spy on and monitor competitor ads: alert when a competitor starts or stops LinkedIn Ads.

Pricing

from $9.12 / 1,000 advertiser founds

Rating

0.0

(0)

Developer

Adriana Voss

Adriana Voss

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

LinkedIn Ads Presence Lookup: LinkedIn Ads Checker by Company

Paste a list of company or brand names. Get back one row per company telling you whether it's running LinkedIn Ads right now, with the exact ad count LinkedIn itself reports, how many ran in the last 30 days, the ad type mix, and links to sample ads. Data comes straight from LinkedIn's own Ad Library, the public register of every ad shown by advertisers on LinkedIn.

Who it's for

  • Outbound and RevOps teams enriching a lead list: "does this prospect run LinkedIn Ads?" is a buying-intent and B2B-budget signal you can filter on in Clay, n8n, or a spreadsheet.
  • Agencies prospecting for ad clients: find companies that are already advertising on LinkedIn (they have budget) or not yet advertising (they need you).
  • Competitor and market analysts who want a quick per-company read — active LinkedIn ad program or not, how heavy, which formats — without scraping thousands of creatives.
  • AI agents that need a single structured answer per company, callable over plain HTTP.

Why this one

Every other LinkedIn Ads actor on Apify is a bulk creative scraper: you give it a query, it downloads hundreds or thousands of individual ads, and you pay per ad. The store's top LinkedIn Ad Library incumbent is rated 5.0 with hundreds of monthly users — and it's exactly that kind of tool. Fine for building a creative-intelligence archive; the wrong tool for enriching a 5,000-row lead list, where you'd pay for hundreds of ads from one company just to learn "yes, they advertise."

This actor asks the opposite question: one input company → one output row, sized and priced as an enrichment column, matching the same "enrichment column, not a bulk scraper" positioning as this portfolio's Google Ads Presence Lookup and Meta Ads Presence Lookup.

  • One row per company, not one per ad. Predictable output, predictable cost.
  • Never charged for a miss. A company with no ads in LinkedIn's Ad Library costs you nothing.
  • Exact counts, not estimates. LinkedIn's Ad Library reports an exact ad count ("6,019 ads match your search criteria"), not a Google-style order-of-magnitude range.
  • Name match only — and that's honest, not hidden. Unlike this portfolio's domain-matching enrichment actors, LinkedIn's Ad Library has no domain filter at all; it only matches the advertiser/page name as it appears on LinkedIn. Paste the exact name for best results — see Tips below.

What you get

One dataset row per input by default (or one summary row + individual ad rows when returnAds is on), with these columns (all included by default; select fewer with the columns input):

ColumnMeaning
rowTypebrand for the company summary row; ad for individual ad rows
advertiserNameThe advertiser name as shown on the matched ad cards (falls back to your input if no card carried a name)
adCountThe exact total ad count LinkedIn's own Ad Library reports for this company
adsLast30d / activeLast30dAds shown in the last 30 days, and the yes/no flag most lead lists filter on
adTypesInSampleDistinct ad types seen in the sample (e.g. SPONSORED_VIDEO, SPONSORED_MESSAGE, SPONSORED_STATUS_UPDATE)
sampleAdsUp to 5 sampled ads, each with its type and a direct link to the ad's detail page
adLibraryUrlThe LinkedIn Ad Library search page for this company — a "view all" link for the buyer
adListCompleteWhether all active ads were read under the cap
newAdCount / stoppedAdCount / stoppedAdsMonitoring: new ads and stopped ad IDs since the last run
adId / adUrlAd rows: LinkedIn Ad Library ID and public detail link
creativeType / creativeLabelAd rows: Creative format (e.g. SPONSORED_STATUS_UPDATE / Single Image Ad, Video Ad, Message Ad)
paidForByAd rows: The entity paying for the ad
adText / headline / ctaAd rows: The ad copy, headline, and call-to-action button text
destinationUrl / adTextLinksAd rows: Outbound landing page link and commentary links
imageUrls / videoUrls / videoPosterUrlAd rows: Media creative URLs
ranFrom / ranTo / impressionsRange / impressionsByCountryAd rows (EEA): Dates, impression ranges, and country breakdown
eeaDataVisible / targetingLanguages / targetingLocations / targetingParametersAd rows (EEA): EEA transparency status, targeted languages, locations, and category parameters
isNewAdAd rows (monitoring): whether this ad was first seen on this run
notifyErrorsNotification errors if alerts were sent to a webhook
isNew / changeType / changePct / monitorFirstSeenAtPresence monitoring: overall volume movements

Ad rows & competitor ad alerts

  • Ad rows (returnAds: true): Adds one row per ad up to maxAdsPerBrand (default 10, up to 24). Returns full creative copy, headline, CTA button, destination URLs, media links, and EEA transparency details.
  • Competitor ad alerts (alertOnNewAds: true): Delivers only ads that have never been seen before by your watchlist. Turns on monitoring and ad rows automatically.
  • Direct webhook notifications (notifyUrl): Send new ad alerts instantly to Discord, Slack, Telegram, or any HTTP endpoint as JSON as soon as a company's ads are detected.

Download the ad creatives

Turn on Download ad creatives (downloadCreatives: true) to store durable local copies of every matched ad's images, progressive MP4 videos, and video poster thumbnails in the run's default Key-Value Store:

  • Key-Value Store files: Each stored creative file is saved directly into the run's Key-Value Store (<adId>-image-<index>.jpg, <adId>-video-<index>.mp4, <adId>-poster.jpg).
  • creativeFiles column: Each ad row receives a creativeFiles array listing each creative's format (image, video, poster), storage key (kvKey), direct access link (kvUrl), byte size, sha256 checksum, pixel dimensions (width, height), and video duration (duration_s).
  • Configurable limits:
    • maxCreativesPerCompany (default 20, up to 100): Caps the total creative files downloaded per company. Files beyond this limit add an error entry and are not charged.
    • maxMb (default 100 MB, up to 500 MB): Caps the file size for any single media download. Files exceeding the limit stream-abort and add an error entry without being charged.
  • Billing: Successfully stored files are charged under the creative-file event. Failed, blocked, or over-cap creative downloads are never charged. When creative downloads are off (the default), no creative files are downloaded, no creativeFiles key appears on any row, and no creative events are charged.

Run it on a schedule

Turn on deltaMode or alertOnNewAds and this actor becomes a competitor ad alert — each run after the first bills and returns only the companies or ads that actually changed. Give it a Watchlist name (deltaName), and point it at the same company list on a cadence (e.g., daily). Schedule it in Apify (Schedules > Create) or trigger it from n8n/Make; the delta state lives in a named key-value store (linkedin-ads-presence-lookup-delta), so every schedule run bills only what changed.

How to use LinkedIn Ads Presence Lookup — Are They Running Ads?

  1. In the Apify Console. Open the actor page and click Start — the companies field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~linkedin-ads-presence-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"companies":["Notion","Brex"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.

Input

{
"companies": [
"Notion",
"Brex"
]
}

One company or brand name per line, exactly as it appears on LinkedIn. This is a NAME match only, not a domain match (unlike some enrichment actors in this catalogue) — LinkedIn's Ad Library has no domain filter. Accepted formats: Notion, Brex, Stripe.

Bulk example. A 25-company watchlist of well-known B2B brands:

{
"companies": [
"Notion", "Brex", "Stripe", "HubSpot", "Salesforce", "Zendesk", "Intercom",
"Segment", "Twilio", "Datadog", "Snowflake", "MongoDB", "Asana", "Airtable",
"Figma", "Miro", "Canva", "Zoom", "Slack", "Dropbox", "Atlassian",
"ServiceNow", "Workday", "Gusto", "Rippling"
]
}

25 companies ≈ $0.32 if every one is found ($0.012 per found row at the FREE tier, plus the $0.02 actor-start charge) — less for any that come back with no ads in the Ad Library, since misses are never billed.

Sample output

queryfoundstatusrowTypeadvertiserNameadCountadsLast30dactiveLast30dadTypesInSamplesampleAdsadLibraryUrlisNewchangeTypechangePctmonitorFirstSeenAtadListCompletenewAdCountstoppedAdCountstoppedAdsadIdadUrlcreativeTypecreativeLabelpaidForByadTextheadlinectadestinationUrladTextLinksimageUrlsvideoUrlsvideoPosterUrlranFromranToimpressionsRangeimpressionsByCountryeeaDataVisibletargetingLanguagestargetingLocationstargetingParametersisNewAdnotifyErrorsscrapedAt
NotiontrueOKbrandNotion5611410true["SPONSORED_STATUS_UPDATE","SPONSORED_UPDATE_NATIVE_DOCUMENT"][{"creativeType":"SPONSORED_STATUS_UPDATE","detailUrl":"https://www.linkedin.com/ad-library/detail/1631069996?trk=ad_library_ad_preview_content_image"},{"creativeType":"SPONSORED_STATUS_UPDATE","de...https://www.linkedin.com/ad-library/search?accountOwner=Notionfalse2026-10-05T06:20:16.354Z

Monitoring: only presence changes

Turn on Only return companies whose ad presence changed since the last run and this actor becomes a competitor ad alert. Each company is compared with the numbers it last reported, and it is returned and billed only when it started or stopped running LinkedIn ads, or when its ads in the last 30 days or its total ad count moved by more than Minimum change (%) (default 25). changeType says how (started, stopped, scaled-up, scaled-down) and changePct says how much. A company that did not change comes back as an uncharged UNCHANGED row.

The first run has nothing to compare against, so it reports every company and stores its numbers as the baseline. This watches presence and volume, not individual new ads.

To turn that into an alert:

  1. Save your competitor list as a task with the checkbox on and Hide rows with no result on.
  2. Add a Schedule to that task, daily or weekly.
  3. Add a webhook on Run succeeded, pointing at Slack, n8n, Make or Zapier.

Baselines live in a named key-value store, linkedin-ads-presence-lookup-delta, one record per watchlist and company.

Pricing

$12 per 1,000 companies or brands, plus a $0.02 start fee. Misses (found:false) are never charged.

Compare: assembling the same answer from a bulk creative scraper priced per ad means paying for every ad a heavy advertiser runs just to learn that they advertise — a company running hundreds of ads can cost more than this actor's entire 1,000-company run.

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~linkedin-ads-presence-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"companies":["Notion","Brex"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~linkedin-ads-presence-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"companies":["Notion","Brex"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~linkedin-ads-presence-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"companies":["{{company or brand}}"]}, mapping the row's company or brand into the companies array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "LinkedIn Ads Spy: Ad Activity by Company" — the agent will find and run this actor.

Tips

  • Use the exact LinkedIn name. accountOwner is a real name match, not a fuzzy keyword search — paste the name as it appears on the company's LinkedIn Company Page or its own ads (e.g. "Notion", not "notion.so" or "Notion Labs, Inc."). A near-miss spelling is a common cause of a false found: false.
  • No domain matching. LinkedIn's Ad Library has no equivalent of Google's domain-linked-ad filter — a company domain pasted here will very likely 0-match. Use the brand/company name instead.
  • activeLast30d is the enrichment flag. adCount includes historical ads; a company can have thousands in the library and none running this month.
  • adCount is exact, straight from LinkedIn's own "N ads match your search criteria" count — no estimate ranges to interpret.
  • Multiple similarly-named companies exist on LinkedIn. If a name is ambiguous (a generic word, a common brand name shared across countries), check sampleAds' advertiser names and adLibraryUrl to confirm you got the company you meant.

FAQ

What does "no ads found" (found: false) actually mean? No ads currently match that exact name in LinkedIn's Ad Library — the company isn't advertising on LinkedIn right now (or ever), or the name didn't match closely enough. It's never charged.

How fresh is the data? It's read live from LinkedIn's Ad Library at run time — the same page LinkedIn shows the public, including today's ads.

Can I filter by domain instead of name? No — LinkedIn's Ad Library itself only supports a name-based advertiser search. If you need domain-based ad-presence matching, this portfolio's Google Ads Presence Lookup supports it for Google Ads.

Are the ad counts exact? Yes. Unlike Google's Ads Transparency Center (which reports order-of-magnitude ranges for large advertisers), LinkedIn's Ad Library reports an exact count.

Does this download the actual ad creatives? By default, you get a lightweight summary row with up to 5 sample ad links plus exact counts by recency. If you want the full creatives, turn on Also return one row per ad (returnAds: true) to get individual rows for up to 24 ads per company, including full copy, headline, CTA, landing URLs, image/video URLs, and EEA transparency details. To download high-res images, progressive MP4 videos, and poster thumbnails into the run's default Key-Value Store, turn on Download ad creatives (downloadCreatives: true).

Rate limits / getting blocked? No proxy or anti-bot handling is used by default — repeated live testing during development saw zero blocking signal from LinkedIn's Ad Library at modest concurrency. If a run reports BLOCKED rows, lower maxConcurrency (5 by default) and retry later.

Is this legal? The Ad Library is LinkedIn's own public transparency register, built so anyone can inspect who advertises what. This actor reads only that public data — no login, no personal data.

If this saved you a scrape, a rating on the Store page helps other buyers find it.