# LinkedIn Ads Library Scraper — Full Details at $1/1K (`meka.im/linkedin-ads-library-scraper`) Actor

Search and export live LinkedIn ads with creatives, advertiser details, payer, targeting, impressions, CTA, video, documents, and thought-leader data. No cookies or LinkedIn account. Pay only for delivered ads.

- **URL**: https://apify.com/meka.im/linkedin-ads-library-scraper.md
- **Developed by:** [Meka.im](https://apify.com/meka.im) (community)
- **Categories:** Social media, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 delivered ads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

Extract ordered ads from public LinkedIn Ads Library search URLs and receive full creative, advertiser, payer, impression, targeting, and media details. The Actor uses LinkedIn's anonymous public transparency pages—no LinkedIn account, cookies, browser session, residential proxy, or proxy configuration is required.

- **Full public details:** ad copy, image/video/document resources, CTA, payer, availability, impressions, and targeting when LinkedIn publishes them.
- **Public cursor pagination:** continues past the first 24 ads while preserving LinkedIn's result order.
- **Reliable bulk delivery:** bounded multi-region failover, failed-item-only retries, global `adId` deduplication, and restart-safe checkpoints.
- **Simple pricing:** **$1 per 1,000 successfully delivered unique ads**. Empty searches, invalid inputs, failed details, and duplicate ads are not charged as delivered ads. Platform usage is included.

### Quick start

Copy a search URL from LinkedIn Ads Library. Keeping the full URL preserves the filters selected in LinkedIn's interface.

```json
{
  "startUrls": [
    {
      "url": "https://www.linkedin.com/ad-library/search?accountOwner=apify&countries=US&dateOption=last-30-days"
    }
  ],
  "resultsLimit": 100,
  "skipDetails": false
}
```

You may also provide a LinkedIn company URL:

```json
{
  "startUrls": [
    { "url": "https://www.linkedin.com/company/nvidia/" }
  ],
  "resultsLimit": 100
}
```

Search URLs are recommended because they retain country, date, keyword, payer, impression, targeting, and sorting choices.

### What each result includes

Every delivered item contains the stable ad identity, canonical Ad Library detail URL, advertiser name, format, and original source URL. Depending on the public creative and transparency sections, a result can also include:

- advertiser logo and public LinkedIn URL;
- complete public ad body and headline;
- CTA labels and click destination;
- primary image or highest-bitrate public MP4;
- Message Ad sender image;
- Document Ad PDF and all public page images;
- paying entity and first/last shown dates;
- public impression range and country percentages;
- public targeting parameters;
- Thought Leader member name, URL, image, and headline.

Fields that LinkedIn does not publish for a particular ad are omitted. The Actor does not replace unavailable data with zero values or guesses.

Representative result:

```json
{
  "adId": "1625789306",
  "adLibraryUrl": "https://www.linkedin.com/ad-library/detail/1625789306",
  "advertiserName": "Augment Code",
  "advertiserUrl": "https://www.linkedin.com/company/101718725",
  "body": "More coding agents won't automatically make your engineering organization more effective...",
  "ctas": [],
  "format": "DOCUMENT",
  "paidBy": "Augment Computing",
  "impressions": "1k-5k",
  "headline": "Build an engineering system that gets smarter over time",
  "documentUrl": "https://media.licdn.com/dms/document/...",
  "imageUrls": [
    "https://media.licdn.com/dms/image/.../1/...",
    "https://media.licdn.com/dms/image/.../2/..."
  ],
  "startUrl": "https://www.linkedin.com/ad-library/search?keyword=AI&countries=US&dateOption=last-30-days"
}
```

Signed media URLs expire. Store or download media according to your own retention needs and rights.

### Input reference

#### `startUrls`

Required list of LinkedIn Ads Library search URLs or LinkedIn company URLs. Exact duplicate source URLs are processed once. Ads appearing on multiple pages or sources are globally deduplicated by `adId`, and only the first occurrence is delivered.

Public search parameters are forwarded rather than reinterpreted. This includes parameters such as:

- `accountOwner`, `payer`, and `keyword`;
- `countries`;
- `dateOption`, `startdate`, and `enddate`;
- impression and targeting-presence filters;
- sort parameters.

#### `resultsLimit`

Maximum successfully delivered ads per source URL. Leave it empty to continue until LinkedIn reports the end of the result stream or the run's spending limit is reached.

#### `skipDetails`

The default is `false`, which opens each public detail page and returns full available fields. Set it to `true` for faster list mode. List mode uses search-card data, so body text may be truncated and transparency/detail fields may be absent.

### Ordering, failures, and recovery

Results retain source order, page order, and card order. A page is checkpointed only after its successfully parsed records have been durably committed to the Dataset. If a run restarts after a Dataset write but before its checkpoint, existing Dataset `adId` values are treated as the delivery source of truth and are not written or charged again.

Cloudflare may reject an individual AWS exit with HTTP 403. The Actor uses bounded region failover and retries only failed detail items; already successful ads are not fetched again. An exhausted or invalid source produces no ad record and no `ad-delivered` event.

### Pricing and cost examples

One successfully delivered unique ad triggers one `ad-delivered` event at `$0.001`:

| Delivered ads | Price |
|---:|---:|
| 100 | $0.10 |
| 1,000 | $1.00 |
| 10,000 | $10.00 |

Platform usage is included. Actor startup, empty searches, invalid URLs, duplicate ads, failed detail pages, and unsupported records are not billed as delivered ads.

### Validated protocol boundary

Validation on September 18, 2026 used the leading Actor's Build `1.1.52` as a Golden reference. The same public query produced 100/100 target ad IDs, and an anonymous search plus five continuation pages produced 144 ordered unique IDs without a silent page break. A separate anonymous detail test delivered 100/100 tested IDs using bounded six-region failover.

The validation fixtures included Single Image, Video, Message, LinkedIn Article, Document, and Thought Leader ads. Carousel, Spotlight, and Event-specific output shapes were not present in the bounded Golden sample and are therefore not claimed yet.

Observed results describe the tested public pages, not a universal speed or availability guarantee. LinkedIn can change its public markup and may restrict individual ads or regions.

### API and automation

After a cloud run starts, its records are available through the default Dataset API in JSON, JSONL, CSV, Excel, XML, and other Apify export formats. You can invoke the Actor from JavaScript, Python, the Apify CLI, HTTP API, schedules, webhooks, or integrations such as Make and Zapier.

The API input uses the same JSON shown in Quick start. Keep `skipDetails: false` when downstream automation expects payer, targeting, impression, or full creative fields.

### Limits and unsupported formats

- Only data displayed by LinkedIn's public Ads Library is returned.
- Signed image, video, and document URLs can expire.
- List mode can contain truncated text.
- Carousel, Spotlight, and Event-specific structures are not claimed until real fixtures are validated.
- Private campaign data, audience identities, click performance, conversion data, and account-only analytics are unavailable.
- Very broad unbounded searches may run until your Apify maximum charge stops further scheduling.

### FAQ and troubleshooting

#### Why is a transparency field absent?

LinkedIn only displays availability, impression, country, and targeting sections for eligible ads. Missing fields are omitted rather than invented.

#### Why should I use a search URL instead of a company URL?

A search URL captures the exact public filters chosen in LinkedIn Ads Library. A company URL is convenient but cannot express all country, date, payer, keyword, targeting, and sort choices.

#### Are duplicate ads charged twice?

No. Duplicate source URLs and repeated `adId` values across pages or searches do not create another Dataset item or delivery event.

#### Is this affiliated with LinkedIn?

No. This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by LinkedIn Corporation. Use public advertising data responsibly and comply with applicable laws, platform terms, and intellectual-property requirements.

# Actor input Schema

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

LinkedIn Ad Library search URLs or LinkedIn company URLs. Search parameters such as accountOwner, payer, keyword, countries, dates, impressions, targeting, and sort are preserved.

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

Maximum successfully delivered ads per input URL. Leave empty to continue until LinkedIn reports the true end or your run budget is reached.

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

Fast list mode. Returns the public search-card fields, which may contain truncated text and fewer details. Full details are recommended.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.linkedin.com/ad-library/search?accountOwner=apify&countries=US&dateOption=last-30-days"
    }
  ],
  "resultsLimit": 100,
  "skipDetails": false
}
```

# Actor output Schema

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

No description

## `runSummary` (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=apify&countries=US&dateOption=last-30-days"
        }
    ],
    "resultsLimit": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("meka.im/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 = {
    "startUrls": [{ "url": "https://www.linkedin.com/ad-library/search?accountOwner=apify&countries=US&dateOption=last-30-days" }],
    "resultsLimit": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("meka.im/linkedin-ads-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=apify&countries=US&dateOption=last-30-days"
    }
  ],
  "resultsLimit": 100
}' |
apify call meka.im/linkedin-ads-library-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,meka.im/linkedin-ads-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/M3zi80mxtUQCdss35/builds/4OK6JjupuzjaSjYF2/openapi.json
