# LinkedIn Ad Library Scraper | Ads & Targeting | $0.50/1K (`monkey.d.scraping/linkedin-ad-library-scraper`) Actor

LinkedIn Ad Library Scraper and LinkedIn Ads API: competitor ads by company, keyword or payer for $0.50/1K. Impressions by country, targeting, payer, dates and CTA. No login.

- **URL**: https://apify.com/monkey.d.scraping/linkedin-ad-library-scraper.md
- **Developed by:** [Monkey D. Scraping](https://apify.com/monkey.d.scraping) (community)
- **Categories:** Marketing, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 ads

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 | Ads & Targeting | $0.50/1K

**LinkedIn Ad Library Scraper** exports ads from the public **LinkedIn Ad Library** by company, keyword or payer. Get ad text, headline, creative, format and advertiser for **$0.50 per 1,000 ads**, platform usage included. Add payer, run dates, call to action, total impressions, **impressions by country** and **targeting** (languages, locations, audience, company, job and more) for **$0.80 per 1,000 ads**. No LinkedIn account, login or cookies needed.

Also known as: LinkedIn Ads Library scraper, LinkedIn Ad Library API, LinkedIn competitor ads scraper, LinkedIn ads spy tool.

Built for B2B marketers, agencies, SaaS teams, sales and analysts who want to see what competitors advertise on LinkedIn, which messages and offers they test, where their ads are seen and whom they target.

#### Why choose this LinkedIn Ad Library scraper?

- **Full details at a low, all-inclusive price.** $0.50 per 1,000 ads, or **$1.30 with full details**. Platform usage (compute and proxies) is **included**. No start fee. Popular LinkedIn ad scrapers in the Apify Store charge $1–$5 per 1,000 ads, and the most used one $4 per 1,000 with details on the free plan (checked on 6 November 2026).
- **Impressions by country, not just a total.** Every country LinkedIn reports, with its share of impressions, plus the total impression range as text and as numbers you can sort.
- **Landing pages with UTM parameters.** The ad's destination link, its domain and its UTM parameters (`source`, `medium`, `campaign`...), so you see where competitors send traffic and how they name their campaigns.
- **Every format, with its media.** Video files and cover, document title, page count and link, carousel cards with title and image, message ads with sender and full text, advertiser logo.
- **No result cap on the free plan.** Some LinkedIn ad scrapers stop at 30 or 300 results until you pay or rent. This one returns as many ads as you ask for, at the same price.
- **Targeting you can analyse.** Targeted and excluded languages and locations (including the hidden "and 23 others" list), and which targeting parameters were used or excluded: audience, demographic, company, education, job, member interests and traits.
- **Search by company, keyword or payer**, with country, date, **ad format** and **impressions range** filters, or paste a LinkedIn Ad Library search URL. Turn on **Only this exact advertiser** to skip partners and resellers whose name contains the brand.
- **You never pay for gaps.** Duplicate ads are free. Details are charged **only when they were actually obtained**. Ad IDs that cannot be read are not charged.
- **Every ad found is delivered.** The search runs first, then details are added. If LinkedIn slows down or the run nears its time limit, the remaining ads are still delivered (without details, which are then not charged). The status message shows progress live.
- **No login, no cookies, no LinkedIn account.**

#### What can you use it for?

- **Competitor ad research**: every LinkedIn ad a competitor runs, with full text, headline, creative, CTA and dates.
- **B2B messaging and offer ideas**: search a keyword (for example `crm`, `cybersecurity` or `webinar`) and see how companies position themselves.
- **Reach and market analysis**: which countries a campaign reached and how impressions are split.
- **Targeting analysis**: which languages, locations and audience criteria advertisers select or exclude.
- **Lead generation**: find which companies advertise on LinkedIn in a niche and who pays for their ads (often the agency).
- **Monitoring with schedules or API**: run the same search weekly and compare results by `adId`. For new and disappeared ads between runs, see the LinkedIn Ad Library Change Monitor below.

#### What data do you get?

| Field | Description | Ad ($0.50/1K) | Details (+$0.80/1K) |
|---|---|---|---|
| `adId`, `adUrl` | Ad ID and link to the ad in the LinkedIn Ad Library | ✅ | ✅ |
| `advertiserName` | Advertiser shown on the ad | ✅ | ✅ |
| `format`, `formatLabel` | `single-image`, `video`, `carousel`, `document`, `event`, `message`, `text`, `spotlight` and others | ✅ | ✅ |
| `adText`, `headline`, `imageUrls` | Ad text (shortened in search results, full with details), headline and creative images | ✅ | ✅ |
| `advertiserUrl`, `advertiserCompanyId` | LinkedIn company page and ID | — | ✅ |
| `paidBy` | Who paid for the ad (company or agency) | — | ✅ |
| `ctaText` | Call to action button | — | ✅ |
| `clickUrl`, `landingDomain`, `utmParameters` | Landing page of the ad, its domain and UTM parameters, when LinkedIn publishes the link | — | ✅ |
| `videoUrls`, `videoPosterUrl` | Video files (best quality first) and cover image | — | ✅ |
| `documentTitle`, `documentPageCount`, `documentUrl` | Document ads: file title, pages and link | — | ✅ |
| `carouselCards` | Carousel ads: each card's title and image | — | ✅ |
| `messageSender`, `messageText` | Message (InMail) ads: sender and full message | — | ✅ |
| `advertiserLogoUrl`, `textLinks` | Advertiser logo and links written in the ad text | — | ✅ |
| `daysRunning`, `isActive` | Days the ad ran and whether it ran in the last two days | — | ✅ (EU) |
| `firstShown`, `lastShown` | Run dates (YYYY-MM-DD) | — | ✅ (EU) |
| `totalImpressions`, `totalImpressionsMin`, `totalImpressionsMax` | Total impressions range, as text and numbers | — | ✅ (EU) |
| `impressionsByCountry` | Every country with its share of impressions | — | ✅ (EU) |
| `targetingLanguages`, `targetingLocations` (+ `Excluded`) | Targeted and excluded languages and locations | — | ✅ (EU) |
| `targetingParameters` | Audience, demographic, company, education, job, interests: targeted or excluded | — | ✅ (EU) |

Every row also has `searchTerm`, `searchBy`, `searchCountry`, `detailsIncluded`, `euData` and `scrapedAt`.

**(EU)**: LinkedIn publishes dates, impressions and targeting for ads shown in the European Union. For other ads these fields are empty (`euData: false`); advertiser, payer, format, text and CTA are still returned.

#### How much does it cost?

You pay only for results. Platform usage is included.

| What you get | Free and Starter plans | Scale plan | Business plan and above |
|---|---|---|---|
| Ads only (details off), per 1,000 ads | **$0.50** | $0.45 | $0.40 |
| Ads with full details (default), per 1,000 ads | **$1.30** | $1.05 | $0.90 |

For example, 100 ads with full details cost $0.13 on the free plan. Prices are per result with platform usage included; the exact price for your plan is shown on the pricing tab.

- Duplicate ads are removed and not charged.
- Details are charged only when they were actually obtained for that ad.
- An ad requested by ID whose details cannot be read is not charged.
- Set a maximum cost per run in Apify Console and the run stops when it is reached.

#### Benchmark on the same search

Same input, same day (6 November 2026): advertiser `hubspot`, 30 ads with details, free Apify plan.

| | This Actor | Popular alternative |
|---|---|---|
| Ads with details | **30 / 30** | 30 / 30 (free plan capped at 30) |
| Landing page | ✅ with UTM parameters | ✅ without UTM parameters |
| Price paid | **$0.039** | $0.045 |
| Run time | 2 min 24 s | **18 s** |

The alternative is faster on small runs; this Actor is cheaper, has no free-plan cap and returns UTM parameters, media and the full targeting lists.

#### Measured on real searches

Runs from 6 November 2026, default settings:

| Search | Result | Run time |
|---|---|---|
| `hubspot`, 100 ads with details | 100 / 100 with details, 56 with EU impressions and targeting | 6 min 51 s |
| keyword `crm`, Germany, 50 ads with details | 50 / 50 with details, 26 advertisers | 3 min 17 s |
| `salesforce`, 500 ads without details | 500 / 500 | 2 min 43 s |
| `hubspot`, 10 ads with details (example input) | 10 / 10 with details | about 1 min |

Results depend on the search and on how busy the LinkedIn Ad Library is. Re-run your own search with 10 ads to check output and cost before larger runs.

#### How to use it

1. Enter one or more **companies, keywords or LinkedIn Ad Library search URLs**, one per line.
2. Choose **Search by**: advertiser (company), keyword, or payer.
3. Optional: choose a **country**, a **date range**, **ad formats** or an **impressions range**.
4. Set **maximum ads per search**. Start with 10 to see the output.
5. Click **Start** and export to JSON, CSV, Excel, or use the API.

##### Tips for large searches

- For thousands of ads, run **without details** first (fast and cheap), then put the IDs of the ads you care about in **Ad IDs or ad URLs** to get their details.
- Use **country** and **dates** to focus on the ads that matter and get faster runs.
- Searching a brand returns partners whose name contains it too. Turn on **Only this exact advertiser** to keep only the brand itself.

#### Input example

```json
{
  "searchTerms": ["hubspot"],
  "searchBy": "advertiser",
  "country": "",
  "maxAdsPerSearch": 10,
  "includeDetails": true
}
```

#### Output example

Real result with details, shortened:

```json
{
  "adId": "1672927376",
  "adUrl": "https://www.linkedin.com/ad-library/detail/1672927376",
  "advertiserName": "Systony - HubSpot Elite Partner",
  "advertiserUrl": "https://www.linkedin.com/company/1130063",
  "advertiserCompanyId": "1130063",
  "paidBy": "Systony",
  "format": "single-image",
  "formatLabel": "Single Image Ad",
  "adText": "PHP-pijn gehad? Voorkom dat het nog eens gebeurt. Met HubSpot CMS heb je geen PHP-updates...",
  "headline": "Geen PHP, geen zorgen: ontdek HubSpot CMS",
  "ctaText": "Learn more",
  "firstShown": "2026-11-04",
  "lastShown": "2026-11-04",
  "totalImpressions": "1k-5k",
  "totalImpressionsMin": 1000,
  "totalImpressionsMax": 5000,
  "impressionsByCountry": [{ "country": "Netherlands", "share": "100%", "sharePercent": 100 }],
  "targetingLanguages": ["English"],
  "targetingLocations": ["Netherlands"],
  "targetingParameters": [
    { "parameter": "Audience", "targeted": false, "excluded": false },
    { "parameter": "Company", "targeted": true, "excluded": true }
  ],
  "euData": true,
  "searchTerm": "hubspot",
  "searchBy": "advertiser",
  "detailsIncluded": true,
  "scrapedAt": "2026-11-06T17:37:57.104Z"
}
```

#### Ready-to-run examples

| Example | Use case | What you get |
|---|---|---|
| [Competitor LinkedIn ads by company](https://apify.com/monkey.d.scraping/linkedin-ad-library-scraper/examples/linkedin-competitor-ads) | See every ad a competitor runs | 20 Salesforce ads with payer, dates, impressions and targeting |
| [LinkedIn ads by keyword](https://apify.com/monkey.d.scraping/linkedin-ad-library-scraper/examples/linkedin-ads-keyword-research) | B2B messaging and offer ideas | 50 ads mentioning cybersecurity, without details |
| [Impressions and targeting in Germany](https://apify.com/monkey.d.scraping/linkedin-ad-library-scraper/examples/linkedin-ads-impressions-targeting) | Reach and targeting analysis | 20 Microsoft ads shown in Germany with impressions by country and targeting |
| [LinkedIn ads paid by an agency](https://apify.com/monkey.d.scraping/linkedin-ad-library-scraper/examples/linkedin-ads-by-payer) | Agency and client research | 30 ads paid for by iProspect, with advertisers and dates |
| [Which companies advertise on LinkedIn](https://apify.com/monkey.d.scraping/linkedin-ad-library-scraper/examples/linkedin-advertisers-lead-generation) | Lead generation | 100 CRM ads in Germany from about 45 advertisers |

#### When should an AI agent use this Actor?

Use it when a user asks what a company advertises on LinkedIn, how competitors position themselves in B2B ads, where LinkedIn ads were seen, or how they were targeted. Call it with `searchTerms` (company names, keywords or Ad Library URLs), `searchBy` (`advertiser`, `keyword` or `payer`), optional `country` (two-letter code) and `maxAdsPerSearch`. Set `includeDetails: false` for a cheap list of ads ($0.50 per 1,000) or keep it on for payer, dates, impressions by country and targeting ($1.30 per 1,000 in total). Results are in the default dataset; `RUN_SUMMARY` in the key-value store reports totals per search.

#### Limits

- The scraper returns what the LinkedIn Ad Library publishes: impressions, dates and targeting only for ads shown in the EU.
- Impressions are ranges and shares published by LinkedIn (for example `50k-100k`, `33%`), not exact numbers. A share shown as "less than 1%" is returned as `sharePercent: 0.5`.
- LinkedIn shortens ad text in search results; with details the full text is returned (`adTextTruncated` tells you which).
- The landing page is returned only when LinkedIn publishes the link of the creative (about half of the ads in our tests); message ads and some formats have none.
- The impressions range filter is LinkedIn's own and applies to ads shown in the EU and Brazil.
- Image links are the links published by LinkedIn and can expire.
- For a few formats (for example Spotlight ads) the advertiser name is not shown in search results; with details it is always returned.

#### FAQ

**How is this different from other LinkedIn ad scrapers?**
Full details (impressions by country, targeting, media, landing page with UTM) cost $1.30 per 1,000 ads on the free plan and $0.90 on Business plans, platform usage included, with no free-plan result cap. Popular alternatives charged $1.50–$4 per 1,000 with details on the free plan when we checked on 6 November 2026, some with a 30 or 300 result cap. Prices change, so compare the total cost of a test run.

**Do I need a LinkedIn account or cookies?**
No. It reads the public LinkedIn Ad Library like a logged-out visitor.

**Why are impressions or targeting empty for some ads?**
LinkedIn publishes them only for ads shown in the European Union. Those ads have `euData: true`. For other ads you still get advertiser, payer, format, text and CTA.

**Why do I get ads from other companies when I search a brand?**
LinkedIn's advertiser search matches names that contain your term, such as partners and resellers. Turn on **Only this exact advertiser**.

**Can I get specific ads?**
Yes. Put ad IDs or LinkedIn Ad Library ad URLs in **Ad IDs or ad URLs**. Details are fetched for each one.

**How do I monitor a competitor?**
Save an Apify task with the company and schedule it, then compare runs by `adId`. If you want new, disappeared and newly seen advertisers computed for you, use the LinkedIn Ad Library Change Monitor.

#### Related ad research tools

- [Microsoft Ads Library Scraper](https://apify.com/monkey.d.scraping/microsoft-ads-library-scraper): Bing ads by keyword, advertiser or website domain, with landing pages, UTM parameters, impressions by country and targeting. From $0.50 per 1,000 ads.
- [TikTok Ads Library Scraper](https://apify.com/monkey.d.scraping/tiktok-ads-library-scraper): TikTok ads by brand or keyword, with reach by country, age and gender, and targeting. From $0.29 per 1,000 ads.
- [Google Ads Scraper — Transparency Center](https://apify.com/monkey.d.scraping/google-ads-transparency-scraper): a competitor's Google Search, YouTube and Shopping ads by domain or brand, with reach by country and platform. From $0.40 per 1,000 ads.
- [LinkedIn Ad Library Change Monitor](https://apify.com/monkey.d.scraping/linkedin-ad-library-change-monitor): new and disappeared LinkedIn ads and new advertisers between scheduled runs.
- [Google Ads Domain Checker](https://apify.com/monkey.d.scraping/google-ads-domain-checker): check whether a website advertises on Google.

#### More tools for marketers

- [Website SEO Audit & Contact Scraper](https://apify.com/monkey.d.scraping/website-opportunity-auditor): audit the landing pages your competitors advertise, with SEO issues and contact details.
- [Google Shopping Price Tracker & Seller Monitor](https://apify.com/monkey.d.scraping/google-shopping-price-change-seller-monitor): track competitor prices and sellers on Google Shopping.
- [Google Trends Scraper — Keyword History API](https://apify.com/monkey.d.scraping/google-trends-keyword-analysis): check the search interest behind the keywords competitors bid on.
- [Affiliate Program Finder & Commission Checker](https://apify.com/monkey.d.scraping/affiliate-program-finder): find affiliate programs and commissions in your niche.

These are separate Actors and are never called by this one.

# Actor input Schema

## `searchTerms` (type: `array`):

One per line: a company name (for example <code>hubspot</code>), a keyword, a payer, or a LinkedIn Ad Library search URL. What is searched depends on <b>Search by</b>.

## `searchBy` (type: `string`):

Advertiser (company name), keyword in the ad, or the entity that paid for the ad.

## `country` (type: `string`):

Only ads shown in this country. Leave on All countries for every ad.

## `maxAdsPerSearch` (type: `integer`):

Ads to return for each company, keyword or URL. Start with 10 to check the output.

## `dateRange` (type: `string`):

When the ads ran. Ignored if you set <b>Shown from</b> or <b>Shown until</b>.

## `includeDetails` (type: `boolean`):

Opens each ad's detail page: payer, run dates, CTA and link, total impressions, impressions by country and targeting (published for ads shown in the EU). Turn off for a faster and cheaper list of ads.

## `exactAdvertiser` (type: `boolean`):

LinkedIn also returns ads of advertisers whose name contains your term (for example partners). Turn on to keep only the advertiser whose name matches exactly. Applies to Search by advertiser.

## `adFormats` (type: `array`):

Only these formats. Leave empty for all formats.

## `impressionsMin` (type: `integer`):

Only ads with at least this many impressions (LinkedIn's own filter, for ads shown in the EU and Brazil). For example 10000.

## `impressionsMax` (type: `integer`):

Only ads with at most this many impressions (EU and Brazil). For example 1000000.

## `dateFrom` (type: `string`):

Custom start date (YYYY-MM-DD).

## `dateTo` (type: `string`):

Custom end date (YYYY-MM-DD).

## `adIds` (type: `array`):

Get details for specific ads: LinkedIn Ad Library ad IDs or detail URLs, one per line.

## Actor input object example

```json
{
  "searchTerms": [
    "hubspot"
  ],
  "searchBy": "advertiser",
  "country": "",
  "maxAdsPerSearch": 10,
  "dateRange": "",
  "includeDetails": true,
  "exactAdvertiser": false
}
```

# Actor output Schema

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

One row per unique LinkedIn ad, with payer, dates, landing page and media when details are on.

## `reach` (type: `string`):

Total impressions, impressions by country and targeting per ad (ads shown in the EU).

## `summary` (type: `string`):

Searches, totals reported by LinkedIn, ads delivered and details obtained.

# 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 = {
    "searchTerms": [
        "hubspot"
    ],
    "maxAdsPerSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("monkey.d.scraping/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 = {
    "searchTerms": ["hubspot"],
    "maxAdsPerSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("monkey.d.scraping/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 '{
  "searchTerms": [
    "hubspot"
  ],
  "maxAdsPerSearch": 10
}' |
apify call monkey.d.scraping/linkedin-ad-library-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,monkey.d.scraping/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/mxrR6LpjdU3gsXRhZ/builds/JEjdHMxCHbDKilUug/openapi.json
