# LinkedIn Ads Presence Lookup: ads checker from $12/1k (`accountable_eel/linkedin-ads-presence-lookup`) Actor

LinkedIn Ads checker by company — see if a company or brand is running LinkedIn Ads, straight from LinkedIn's own Ad Library. One row per company: exact ad count, ads in the last 30 days, ad type mix, sample ad links. An enrichment column for lead lists. Never charged for a miss.

- **URL**: https://apify.com/accountable\_eel/linkedin-ads-presence-lookup.md
- **Developed by:** [Adrian Voss](https://apify.com/accountable_eel) (community)
- **Categories:** Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.12 / 1,000 advertiser founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 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](https://www.linkedin.com/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](https://apify.com/accountable_eel/google-ads-presence-lookup) and [Meta Ads Presence Lookup](https://apify.com/accountable_eel/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, with these columns (all included by default; select fewer with the `columns` input):

| Column | Meaning |
| --- | --- |
| `advertiserName` | The advertiser name as shown on the matched ad cards (falls back to your input if no card carried a name) |
| `adCount` | The exact total ad count LinkedIn's own Ad Library reports for this company |
| `adsLast30d` / `activeLast30d` | Ads shown in the last 30 days, and the yes/no flag most lead lists filter on |
| `adTypesInSample` | Distinct ad types seen in the sample (e.g. `SPONSORED_VIDEO`, `SPONSORED_MESSAGE`, `SPONSORED_STATUS_UPDATE`) |
| `sampleAds` | Up to 5 sampled ads, each with its type and a direct link to the ad's detail page |
| `adLibraryUrl` | The LinkedIn Ad Library search page for this company — a "view all" link for the buyer |

### 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:
   ```bash
   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

```json
{
  "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.

### Sample output

| query | found | status | advertiserName | adCount | adsLast30d | activeLast30d | adTypesInSample | sampleAds | adLibraryUrl | scrapedAt |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Notion | true | OK | Notion | 6090 | 824 | true | \["SPONSORED\_STATUS\_UPDATE","SPONSORED\_UPDATE\_NATIVE\_DOCUMENT","SPONSORED\_VIDEO"] | \[{"creativeType":"SPONSORED\_STATUS\_UPDATE","detailUrl":"https://www.linkedin.com/ad-library/detail/1580797116?trk=ad\_library\_ad\_preview\_content\_image"},{"creativeType":"SPONSORED\_UPDATE\_NATIVE\_DOCUMENT","detailUrl":"https://www.linkedin.com/ad-library/detail/1574838026"},{"creativeType":"SPONSORED\_VIDEO","detailUrl":"https://www.linkedin.com/ad-library/detail/1507180013"},{"creativeType":"SPONSORED\_UPDATE\_NATIVE\_DOCUMENT","detailUrl":"https://www.linkedin.com/ad-library/detail/1574817506"},{"creativeType":"SPONSORED\_UPDATE\_NATIVE\_DOCUMENT","detailUrl":"https://www.linkedin.com/ad-library/detail/1574728576"}] | https://www.linkedin.com/ad-library/search?accountOwner=Notion | 2026-08-31T07:00:51.180Z |

### 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.

```bash
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 Checker by Company | Apify" — 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?**
No — that's deliberate. You get up to 5 sample ad links plus exact counts by recency. If you need every creative's text and media, use a bulk creative scraper; this actor is the cheap per-company presence check that tells you which companies are worth that deeper pull.

**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.

### Related actors

- [Google Ads Presence Lookup](https://apify.com/accountable_eel/google-ads-presence-lookup) — the same enrichment-column approach for Google Ads, with domain matching.
- [Meta Ads Presence Lookup](https://apify.com/accountable_eel/meta-ads-presence-lookup) — the same approach for Meta/Facebook/Instagram ads.
- [LinkedIn Jobs Search Lookup](https://apify.com/accountable_eel/linkedin-jobs-search-lookup) — another per-company LinkedIn enrichment signal, open roles instead of ad spend.

# Actor input Schema

## `companies` (type: `array`):

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. You're only charged for the ones we actually find — a miss costs nothing.

## `testRun` (type: `boolean`):

Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.

## `onlyFound` (type: `boolean`):

Only keep rows where something was actually found. Misses are always free, whether or not you show them here.

## `includeKeywords` (type: `array`):

Optional. Only keep results that mention at least one of these words (e.g. a job title, a city, a product name). Leave empty to keep everything.

## `excludeKeywords` (type: `array`):

Optional. Drop any result that mentions one of these words. Leave empty to skip nothing.

## `maxResults` (type: `integer`):

Optional. Stop the run once this many results have been found — useful for a quick, cheap sample. Leave blank for no limit.

## `columns` (type: `array`):

Choose which pieces of information to include in each result row. All are included by default.

## `maxConcurrency` (type: `integer`):

Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.

## `proxyConfiguration` (type: `object`):

Apify Proxy config. Residential recommended for anti-bot-sensitive targets.

## Actor input object example

```json
{
  "companies": [
    "Notion",
    "Brex"
  ],
  "testRun": false,
  "onlyFound": false,
  "includeKeywords": [],
  "excludeKeywords": [],
  "columns": [
    "advertiserName",
    "adCount",
    "adsLast30d",
    "activeLast30d",
    "adTypesInSample",
    "sampleAds",
    "adLibraryUrl"
  ],
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "Notion",
        "Brex"
    ],
    "includeKeywords": [],
    "excludeKeywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("accountable_eel/linkedin-ads-presence-lookup").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "companies": [
        "Notion",
        "Brex",
    ],
    "includeKeywords": [],
    "excludeKeywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("accountable_eel/linkedin-ads-presence-lookup").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "Notion",
    "Brex"
  ],
  "includeKeywords": [],
  "excludeKeywords": []
}' |
apify call accountable_eel/linkedin-ads-presence-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,accountable_eel/linkedin-ads-presence-lookup"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/uExldRRfkX8aeTrKH/builds/mC6twY4mPRw1wYq4A/openapi.json
