# LinkedIn Competitor Ad Intelligence | 💵$2/1K (`webdata_labs/linkedin-ads-library-scraper`) Actor

Monitor LinkedIn competitor ads and export creatives, copy, CTAs, formats, and landing-page hints. $2 per 1,000 ad rows; platform usage included.

- **URL**: https://apify.com/webdata\_labs/linkedin-ads-library-scraper.md
- **Developed by:** [WebData Labs](https://apify.com/webdata_labs) (community)
- **Categories:** Marketing, Business, Social media
- **Stats:** 3 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 linkedin ad creatives

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/platform/actors/running/actors-in-store#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

See what competitors are actually advertising on LinkedIn—not just what they publish in case studies.

This Actor searches LinkedIn's public Ad Library and exports structured competitor ads for creative research, positioning analysis, swipe files, and recurring monitoring. Search by keyword, advertiser, payer, country, or date range without a LinkedIn login.

### What you get

- One clean dataset row per LinkedIn ad creative.
- Advertiser, format, headline, body, CTA, media, detail URL, and search context when available.
- Optional detail-page enrichment for fuller copy and landing-page hints.
- Controlled parallel search and detail-page collection for runs of up to 2,000 unique ads.
- CSV, JSON, Excel, API, webhook, and scheduled-run support.
- A separate free run summary showing searches, errors, ad counts, and unique advertisers.

### Quick start

The default input searches one recent keyword in the US and returns at most 25 ads:

```json
{
  "queries": ["ai customer support"],
  "countries": ["US"],
  "dateOption": "LAST_30_DAYS",
  "maxResults": 25
}
```

At $0.002 per returned ad, this default run costs at most **$0.050**. If fewer ads are found, you pay less. A search that finds no ads does not create a billable dataset row.

### Search options

- `queries`: topics, products, pains, or offers to monitor.
- `accountOwners`: advertiser or company names.
- `payers`: payer names, useful for agencies and parent companies.
- `countries`: ISO country codes such as `US`, `GB`, or `DE`; use `ALL` for all countries.
- `dateOption`: all time, last 30 days, last 90 days, or last year.
- `maxResults`: total ad rows returned across all searches.

Start with either one keyword or one advertiser. Adding several values creates additional searches and is best used after confirming the first result.

Technical enrichment and request pacing are under **Optional enrichment settings**. Most users can leave them unchanged.

### Example output

```json
{
  "recordType": "ad",
  "adId": "1460951094",
  "advertiser": "Parahelp",
  "creativeType": "SPONSORED_STATUS_UPDATE",
  "adFormat": "Single Image Ad",
  "headline": "AI customer support",
  "body": "Lots of other AI support solutions...",
  "ctaText": null,
  "detailUrl": "https://www.linkedin.com/ad-library/detail/1460951094",
  "imageUrl": "https://media.licdn.com/...",
  "searchKeyword": "ai customer support",
  "countries": ["US"]
}
```

### Pricing

The price is **$2 per 1,000 returned ad creatives** ($0.002 per ad). Apify platform usage is included—you do not receive a separate compute charge for this Actor.

Only ad rows written to the default dataset are billable. Failed searches, empty searches, and the run/search summaries stored in `OUTPUT` are not charged.

### Common use cases

- Monitor competitor LinkedIn campaigns on a schedule.
- Build a creative and copy swipe file for a B2B category.
- Compare offers, hooks, formats, and calls to action.
- Export ad copy for AI-assisted clustering or messaging analysis.
- Track advertiser or payer activity across markets.

### Limits

- The Actor reads only LinkedIn's public Ad Library; it does not access private profiles or accounts.
- Available fields vary by ad format and by what LinkedIn exposes publicly.
- Some destination URLs are hidden behind LinkedIn redirects.
- LinkedIn can change its public pages; if a run fails, open an issue and include the run URL.

### FAQ

**Do I need a LinkedIn account?** No.

**Can I search by company?** Yes. Use `accountOwners` for advertisers or `payers` for the entity paying for the ad.

**Can I monitor competitors automatically?** Yes. Save the input as an Apify Task and schedule it.

**What happens if no ads are found?** The run summary records the result, but no billable dataset row is created.

### Support

If a field is missing or a run fails, open an Actor issue with the run URL, input, and expected behavior. Reports with reproducible examples are prioritized.

# Actor input Schema

## `queries` (type: `array`):

Keywords or phrases to search in LinkedIn's public Ad Library.

## `accountOwners` (type: `array`):

Optional company / advertiser names to search. Leave empty to search only by keyword.

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

Optional payer names to search. Useful when ads are paid by an agency or parent company.

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

Optional ISO country codes. Use ALL or leave empty to search all countries.

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

LinkedIn Ad Library date filter.

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

Maximum ad rows to return across all searches. Low default keeps the first run cheap.

## `includeDetailPages` (type: `boolean`):

Fetch each ad detail page to enrich rows with fuller text and external destination hints when available. Slower but better output.

## `requestDelayMs` (type: `integer`):

Optional minimum interval between request starts. Leave at 0 and use the global requests-per-minute limit for parallel runs.

## `searchConcurrency` (type: `integer`):

Number of keyword, advertiser, or payer searches processed concurrently.

## `detailConcurrency` (type: `integer`):

Number of ad detail pages enriched concurrently.

## `maxRequestsPerMinute` (type: `integer`):

Global rate limit shared by search, detail, and retry requests.

## Actor input object example

```json
{
  "queries": [
    "ai customer support"
  ],
  "accountOwners": [],
  "payers": [],
  "countries": [
    "US"
  ],
  "dateOption": "LAST_30_DAYS",
  "maxResults": 25,
  "includeDetailPages": true,
  "requestDelayMs": 0,
  "searchConcurrency": 3,
  "detailConcurrency": 5,
  "maxRequestsPerMinute": 300
}
```

# Actor output Schema

## `ads` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `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 = {
    "queries": [
        "ai customer support"
    ],
    "countries": [
        "US"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdata_labs/linkedin-ads-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 = {
    "queries": ["ai customer support"],
    "countries": ["US"],
}

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

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "ai customer support"
  ],
  "countries": [
    "US"
  ]
}' |
apify call webdata_labs/linkedin-ads-library-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=webdata_labs/linkedin-ads-library-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7XjI80KarOlOYnYzA/builds/341JzmrLFdg5vxjjq/openapi.json
