# LinkedIn Ad Library Scraper (`lagenuina_agency/linkedin-ad-library-scraper`) Actor

Scrape the public LinkedIn Ad Library by company, keyword, country and date: ad copy, images and videos, CTA, advertiser, targeting, impression ranges and run dates. No LinkedIn login or cookies.

- **URL**: https://apify.com/lagenuina_agency/linkedin-ad-library-scraper.md
- **Developed by:** [Quelli di Carne Genuina](https://apify.com/lagenuina_agency) (community)
- **Categories:** Lead generation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 ad with details

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## LinkedIn Ad Library Scraper

Extract ads from the public **LinkedIn Ad Library** by company, keyword, payer or URL. Get the full ad copy, headline, call-to-action, landing page with UTM parameters, images, videos, documents, total impressions, impressions by country, targeting (language, location, audience, job, company…) and the dates each ad ran. No LinkedIn account or cookies needed.

> Independent tool, not affiliated with or endorsed by LinkedIn Corporation. It reads only what LinkedIn publishes in its public Ad Library.

### What you get

One row per ad, with copy, landing page and reach (real result, shortened):

```json
{
  "adId": "1558746953",
  "format": "SINGLE_IMAGE",
  "advertiserName": "IXTENSA 🧡 HubSpot",
  "paidBy": "IXTENSA GmbH & Co. KG",
  "headline": "Live-Webinar am 14.10.2026 um 11 Uhr",
  "ctas": ["Sign Up"],
  "clickUrl": "https://lp.ixtensa.de/webinar-hubspot-probleme?utm_campaign=Webinar+HubSpot+Probleme&utm_source=linkedin&utm_medium=paid",
  "availability": { "start": "2026-09-24", "end": "2026-10-10" },
  "impressions": "5k-10k",
  "impressionsPerCountry": [{ "country": "Germany", "impressions": "100%", "percent": 100 }],
  "targeting": { "language": "English", "location": "Germany" }
}
```

**Try it in 1 click.** Press *Start* with the prefilled input (HubSpot ads in the US, 20 ads with full details). LinkedIn detail pages are slower than most sources: in our tests today 50 detailed ads took 2–3 minutes at 512 MB, so expect roughly a minute for the 20-ad example (estimate, not timed separately); it costs at most $0.064 on the Apify Free plan (less on paid plans). For a faster first look turn on `skipDetails`.

**Price:** per 1,000 ads with full details, from $3.20 on the Apify Free plan down to $0.90 on Gold and above (list-only ads $1.60 down to $0.44), no start fee.

### Why this LinkedIn ads scraper

- **Cheaper than silva95gustavo's LinkedIn Ad Library actor on every Apify plan**: 20% less on Free, Bronze and Silver, 10% less on Gold and above (detailed ads; see the price table below), no start fee, and you pay only for ads delivered.
- **Drop-in compatible**: `startUrls`, `resultsLimit`, `skipDetails` and `concurrency` work like in other popular LinkedIn Ad Library actors, and the main output fields keep the same names (`adId`, `advertiserName`, `body`, `headline`, `ctas`, `clickUrl`, `impressions`, `impressionsPerCountry`, `targeting`, `availability`…).
- **No URL building needed**: search by `companies`, `keywords`, `payers` or `companyIds` with `countries` and date filters.
- **Richer data**: numeric `impressionsMin` / `impressionsMax`, `percent` per country, `targetingParameters` (what was targeted or excluded), `landingDomain`, parsed `utm` tags, all images, highest-quality video URL, document title and pages, message-ad sender, ISO dates.
- **Monitoring mode**: `onlyNewAds` returns (and bills) only ads you have not seen before. Schedule it daily for competitor alerts.
- **Reliable by design**: LinkedIn blocks many proxy IPs; the actor keeps healthy sessions and rotates blocked ones automatically, and if a detail page cannot be loaded you still get the ad from the result list instead of losing it.

### Use cases

- **Competitor research**: every ad a competitor runs on LinkedIn, with copy, offer, CTA and landing page.
- **B2B messaging and positioning analysis**: collect ad copy by keyword (e.g. "cybersecurity", "CRM") across an industry.
- **Media buying intelligence**: see which agency pays for a brand's ads (`paidBy`) and how much reach each ad got.
- **Targeting insights**: which audiences, jobs, companies and countries an advertiser chooses.
- **Swipe files and creative libraries**: images, videos and documents of top-performing B2B ads.
- **Lead generation**: find companies actively spending on LinkedIn ads in a market.

### Input

```json
{
  "companies": ["hubspot", "salesforce"],
  "keywords": ["cybersecurity"],
  "countries": ["US", "DE"],
  "dateOption": "last-30-days",
  "resultsLimit": 100,
  "skipDetails": false,
  "onlyNewAds": false
}
```

| Field | What it does |
|---|---|
| `startUrls` | Ad Library search URLs (all filters kept), single ad URLs `/ad-library/detail/<id>`, or company pages `linkedin.com/company/<name or id>`. |
| `companies` | Advertiser names, one search each. |
| `keywords` | Words in the ad copy, one search each. |
| `payers` | Entity that paid for the ads (often an agency). |
| `companyIds` | Numeric LinkedIn company IDs for an exact advertiser. |
| `countries` | Two-letter country codes; empty = all. |
| `dateOption` / `startDate` / `endDate` | Last 30 days, current month, current year, last year, or a custom range. |
| `resultsLimit` | Max ads per search; empty = all. |
| `skipDetails` | List data only: faster and cheaper. |
| `onlyNewAds` / `monitorStoreName` | Monitoring memory between runs. |

### Output

```json
{
  "adId": "1558746953",
  "adUrl": "https://www.linkedin.com/ad-library/detail/1558746953",
  "format": "SINGLE_IMAGE",
  "creativeType": "SPONSORED_STATUS_UPDATE",
  "advertiserName": "IXTENSA 🧡 HubSpot",
  "advertiserUrl": "https://www.linkedin.com/company/7267658",
  "paidBy": "IXTENSA GmbH & Co. KG",
  "headline": "Live-Webinar am 14.10.2026 um 11 Uhr",
  "body": "Viele HubSpot-Kunden kämpfen mit denselben Problemen…",
  "ctas": ["Sign Up"],
  "clickUrl": "https://lp.ixtensa.de/webinar-hubspot-probleme?utm_campaign=Webinar+HubSpot+Probleme&utm_source=linkedin&utm_medium=paid",
  "landingDomain": "lp.ixtensa.de",
  "utm": { "utm_campaign": "Webinar HubSpot Probleme", "utm_source": "linkedin", "utm_medium": "paid" },
  "imageUrl": "https://media.licdn.com/dms/image/v2/…",
  "videoUrl": null,
  "document": null,
  "availability": { "start": "2026-09-24", "end": "2026-10-10" },
  "impressions": "5k-10k",
  "impressionsMin": 5000,
  "impressionsMax": 10000,
  "impressionsPerCountry": [{ "country": "Germany", "impressions": "100%", "percent": 100 }],
  "targeting": { "language": "English", "location": "Germany" },
  "targetingParameters": { "Company": { "targeted": true, "excluded": false }, "Job": { "targeted": true, "excluded": false } },
  "startUrl": "https://www.linkedin.com/ad-library/search?accountOwner=hubspot&countries=DE"
}
```

Impressions, countries, targeting and run dates are published by LinkedIn for ads shown in the European Union; for other ads these fields are empty. With `skipDetails` each item has `adId`, `adUrl`, `format`, `advertiserName`, a shortened `body`, `imageUrl` and `detailsIncluded: false`.

### Pricing

Pay per event, no start fee. The price depends on your Apify plan:

| Event | Free | Bronze | Silver | Gold, Platinum, Diamond |
|---|---|---|---|---|
| Ad with details | $0.0032 | $0.0024 | $0.0012 | $0.0009 |
| Ad from the result list (`skipDetails`, or when a detail page is unavailable) | $0.0016 | $0.00144 | $0.0008 | $0.00045 |

Example: 1,000 fully detailed ads cost $3.20 on Free, $0.90 on Gold. Set a maximum total charge on the run to cap spending; the actor stops cleanly when it is reached.

### Migrating from silva95gustavo/linkedin-ad-library-scraper

The four input fields of silva95gustavo's actor exist here with the same names, so an existing input usually works after changing the actor ID to `lagenuina_agency/linkedin-ad-library-scraper`.

| silva95gustavo input | This actor | Notes |
|---|---|---|
| `startUrls` | `startUrls` | Same: Ad Library search URLs, and company pages (`linkedin.com/company/...`). Single ad URLs (`/ad-library/detail/<id>`) also work here. |
| `resultsLimit` | `resultsLimit` | Same: max ads per input; empty = all. |
| `skipDetails` | `skipDetails` | Same: list data only, billed at the lower list price. |
| `concurrency` | `concurrency` | Same idea; default 5 here (max 20) instead of a value picked from memory. |
| (not available) | `companies`, `keywords`, `payers`, `companyIds`, `countries`, `dateOption`, `startDate`, `endDate` | Extra: search without building URLs. |
| (not available) | `onlyNewAds`, `monitorStoreName` | Extra: monitoring mode. |
| (not set in input) | `proxyConfiguration` | Residential Apify Proxy by default. |

**Output:** all fields in silva95gustavo's README example keep their names (`adId`, `advertiserLogo`, `advertiserName`, `advertiserUrl`, `availability.start/end`, `body`, `clickUrl`, `ctas`, `format`, `headline`, `imageUrl`, `impressions`, `impressionsPerCountry[].country/impressions`, `paidBy`, `startUrl`, `targeting`). Added here: `adUrl`, `creativeType`, `formatLabel`, `description`, `landingDomain`, `utm`, `imageUrls`, `videoUrl`, `videoPosterUrl`, `document`, `messageSender`, `thoughtLeader`, `variantCount`, `impressionsMin`, `impressionsMax`, `impressionsPerCountry[].percent`, `targetingParameters`.

**Price per 1,000 ads** (public Apify Store prices, checked on 17 October 2026; both actors price by Apify plan; silva95gustavo also adds a small start fee of $0.00005 per GB of run memory):

| Apify plan | silva95gustavo, with details | This actor, with details | silva95gustavo, list only | This actor, list only |
|---|---|---|---|---|
| Free | $4.00 | $3.20 (-20%) | $2.00 | $1.60 (-20%) |
| Bronze | $3.00 | $2.40 (-20%) | $1.80 | $1.44 (-20%) |
| Silver | $1.50 | $1.20 (-20%) | $1.00 | $0.80 (-20%) |
| Gold and above | $1.00 | $0.90 (-10%) | $0.55 | $0.44 (-20%) |

Speed and completeness: we have not benchmarked the two actors side by side. Run the same input on both and compare your own runs.

### Limits / not supported

- Impressions, impressions by country, targeting and run dates are published by LinkedIn only for ads shown in the EU; for other ads these fields are empty.
- History is limited to what the Ad Library keeps (about one year).
- No spend, budget, clicks or CTR: LinkedIn does not publish them.
- `companies` and company-page URLs with a name use LinkedIn's advertiser-name search, which can include similarly named advertisers. Use `companyIds` (or a numeric company URL) for one exact advertiser.
- `countries` and the date filters apply to `companies`, `keywords`, `payers` and `companyIds`; a pasted search URL keeps its own filters.
- A residential proxy is needed (LinkedIn blocks datacenter IPs). Detail pages make runs slower: about 2–3 minutes per 50 ads at 512 MB in our tests.
- If a detail page keeps failing, the ad is returned from the result list with `detailsIncluded: false` and billed at the list price.

### Monitoring new LinkedIn ads

1. Turn on `onlyNewAds` and give each competitor its own `monitorStoreName`.
2. The first run returns all current ads; later runs return and bill only new ones.
3. Add an Apify Schedule (daily) and a Slack, email or webhook integration.

### Use it from AI agents (MCP)

The actor works as a tool in any MCP client (Claude, ChatGPT, Cursor, custom agents) via the Apify MCP server:

```json
{
  "mcpServers": {
    "apify": { "url": "https://mcp.apify.com/?actors=lagenuina_agency/linkedin-ad-library-scraper" }
  }
}
```

Ask things like *"What LinkedIn ads did HubSpot run in Germany this month, and which agency paid for them?"* or *"Find LinkedIn ads about cybersecurity in France and list their landing pages."* The inputs map one-to-one to such questions and results come back as structured JSON.

### Integrations and API

Call it from your code with the official Apify clients:

```python
## pip install apify-client
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lagenuina_agency/linkedin-ad-library-scraper").call(run_input={"startUrls": [{"url": "https://www.linkedin.com/ad-library/search?accountOwner=hubspot&countries=US"}], "resultsLimit": 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```js
// npm i apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('lagenuina_agency/linkedin-ad-library-scraper').call({"startUrls": [{"url": "https://www.linkedin.com/ad-library/search?accountOwner=hubspot&countries=US"}], "resultsLimit": 20});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

No-code: use the Apify app in **n8n**, **Make** or **Zapier** (action "Run Actor", pick `lagenuina_agency/linkedin-ad-library-scraper`), or the `langchain-apify` / CrewAI `ApifyActorsTool` integrations for AI agents. Results can also be pushed to Google Sheets, Slack, webhooks or any S3 bucket via Apify integrations.

### More tools from Quelli di Carne Genuina

**Ad intelligence**

- [Google Ads Transparency Scraper](https://apify.com/lagenuina_agency/google-ads-transparency-scraper): every ad a brand or domain runs on Google Search, YouTube, Shopping, Maps and Play.
- [Meta Ad Library Scraper](https://apify.com/lagenuina_agency/meta-ad-library-scraper): Facebook and Instagram ads by page, keyword or Ad Library URL, with creatives and landing pages.
- [TikTok Top Ads Scraper](https://apify.com/lagenuina_agency/tiktok-top-ads-scraper): top-performing TikTok ads from the Creative Center with CTR, likes and MP4 video URLs.

**Competitor & SEO research**

- [Similarweb Website Traffic Scraper](https://apify.com/lagenuina_agency/similarweb-scraper): monthly visits, ranks, traffic sources and top countries for any list of domains.
- [Google Trends Scraper](https://apify.com/lagenuina_agency/google-trends-scraper): interest over time, by region, related queries and Trending Now.
- [Google Play Store Scraper](https://apify.com/lagenuina_agency/google-play-scraper): app search, details, top charts and reviews from Google Play, any country.

**Travel prices**

- [Google Hotels Scraper](https://apify.com/lagenuina_agency/google-hotels-scraper): hotel prices and every booking site's rate for any city and dates.
- [Google Flights Scraper](https://apify.com/lagenuina_agency/google-flights-scraper): fares, airlines, stops, price level and price calendar for any route and date.

**Retail prices**

- [Woolworths AU Product Scraper](https://apify.com/lagenuina_agency/woolworths-scraper): Woolworths Australia grocery prices, specials, unit prices and barcodes.
- [Coles AU Product Scraper](https://apify.com/lagenuina_agency/coles-scraper): Coles Australia grocery prices, half-price specials, unit prices and barcodes.

**Content & social data**

- [YouTube Transcript Scraper](https://apify.com/lagenuina_agency/youtube-transcript-scraper): transcripts of videos, Shorts, playlists and channels as text, SRT or VTT.
- [Medium Scraper](https://apify.com/lagenuina_agency/medium-scraper): Medium articles by tag, author or search, with full text as Markdown.
- [Likee Scraper](https://apify.com/lagenuina_agency/likee-scraper): Likee videos, profiles and creator engagement analytics.

### FAQ

**How do I see all LinkedIn ads of a company?** Put the company name in `companies` (or paste its Ad Library or company page URL) and leave `resultsLimit` empty.

**Can I export LinkedIn ads to CSV or Excel?** Yes: every run's dataset downloads as CSV, Excel, JSON or XML, or via API.

**Is there a LinkedIn Ad Library API?** LinkedIn does not offer a public API for the Ad Library. This actor works as one: send company names, keywords or URLs through the Apify API and get JSON back, from Python, JavaScript, n8n, Make, Zapier or MCP.

**Does it need my LinkedIn login?** No, the Ad Library is public.

**Why are impressions empty for some ads?** LinkedIn publishes impressions, countries and targeting only for ads delivered in the EU.

**How far back does it go?** As far as LinkedIn's Ad Library: about one year.

**Is it legal to scrape the LinkedIn Ad Library?** It is public transparency data. You are responsible for how you use it; avoid processing personal data without a legal basis and check local laws.

**Something missing or broken?** Open an issue on the Issues tab, we reply within 24 hours.

# Actor input Schema

## `startUrls` (type: `array`):

Paste search URLs from linkedin.com/ad-library (all filters in the URL are kept), single ad URLs (/ad-library/detail/<id>) or company pages (linkedin.com/company/<name>).

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

Advertiser names as you would type them in the Ad Library 'Advertiser' box, e.g. "salesforce". One search per name.

## `keywords` (type: `array`):

Words or phrases in the ad copy, e.g. "cybersecurity". One search per keyword.

## `payers` (type: `array`):

Entity billed for the ads, often a media agency. One search per payer.

## `companyIds` (type: `array`):

Numeric LinkedIn company IDs (linkedin.com/company/<id>) to target one exact advertiser.

## `countries` (type: `array`):

Two-letter country codes (US, DE, IT…). Applied to companies/keywords/payers searches. Empty = all countries.

## `dateOption` (type: `string`):

Only ads shown in this period. Leave empty for all available dates (LinkedIn keeps ads for one year).

## `startDate` (type: `string`):

Custom range start (YYYY-MM-DD). Overrides Date range.

## `endDate` (type: `string`):

Custom range end (YYYY-MM-DD).

## `resultsLimit` (type: `integer`):

Maximum ads per URL, company, keyword or payer. Empty = all ads.

## `skipDetails` (type: `boolean`):

Only read the result list: ad ID, format, advertiser, short copy and image. Detail pages add full copy, headline, CTA, landing page, video, document, impressions, countries, targeting and run dates.

## `concurrency` (type: `integer`):

Detail pages fetched in parallel.

## `onlyNewAds` (type: `boolean`):

Remember ad IDs between runs and output only ads not seen before. Schedule the actor for new-ad alerts on competitors.

## `monitorStoreName` (type: `string`):

Named key-value store holding seen ad IDs. Use a different name per monitored competitor.

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

Residential proxy is required: LinkedIn blocks datacenter IPs. The actor rotates blocked sessions automatically.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.linkedin.com/ad-library/search?accountOwner=hubspot&countries=US&dateOption=last-30-days"
    }
  ],
  "resultsLimit": 20,
  "skipDetails": false,
  "concurrency": 5,
  "onlyNewAds": false,
  "monitorStoreName": "linkedin-ad-library-monitor",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.linkedin.com/ad-library/search?accountOwner=hubspot&countries=US&dateOption=last-30-days"
        }
    ],
    "resultsLimit": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lagenuina_agency/linkedin-ad-library-scraper").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 = {
    "startUrls": [{ "url": "https://www.linkedin.com/ad-library/search?accountOwner=hubspot&countries=US&dateOption=last-30-days" }],
    "resultsLimit": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("lagenuina_agency/linkedin-ad-library-scraper").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 '{
  "startUrls": [
    {
      "url": "https://www.linkedin.com/ad-library/search?accountOwner=hubspot&countries=US&dateOption=last-30-days"
    }
  ],
  "resultsLimit": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call lagenuina_agency/linkedin-ad-library-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lagenuina_agency/linkedin-ad-library-scraper"
        }
    }
}
```

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/Xl1sZSidYrZyLd825/builds/GWvFpfr5EsXTigyBw/openapi.json
