# LinkedIn Ad Library Scraper: Competitor Ads

> LinkedIn Ad Library scraper: search ads by company, keyword or payer. Get ad text, CTA, images, video, run dates, impressions and targeting. No login.

URL: https://cliqtomedia.com/actors/linkedin-ad-library/

Category: Search, SEO & ads · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/linkedin-ad-library?fpr=cliqto

Search the public LinkedIn Ad Library without login. Use a company, a keyword or a payer. You get one row per ad with text, CTA, media, dates, impressions and targeting.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `Apify` in Company names. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Scrape ads from the public [LinkedIn Ad Library](https://www.linkedin.com/ad-library) by company, keyword or payer, and get each ad's text, CTA, images or video, run dates, impressions by country and targeting.

- Who runs it: advertiser name, LinkedIn company ID and page, logo, and who paid for the ad.
- The ad itself: format (image, video, document, carousel, text, message and more), headline, full text, CTA button and link, landing domain, images, video, document pages, carousel cards.
- When and how much: first and last date shown, days running, impressions range, and the share of impressions by country.
- Targeting: what LinkedIn shows about the audience: language, location, job, company and other categories, with included and excluded values.

### Good for

- Watch a competitor's LinkedIn ads: texts, offers, CTAs and landing pages.
- Find ads about a topic in chosen countries and a date range.
- Get only ads you have not seen before, on a schedule.

## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Ad | $0.0018 (from $0.00126 on paid Apify plans) | One ad written to the dataset (card data from search results). |
| Ad details | $0.0018 (from $0.00126 on paid Apify plans) | Full ad page loaded: full text, media, dates, impressions by country and targeting. Only when includeDetails is on and the page loaded. |
| Search | $0.001 | One search (company, keyword, payer, URL or ad ID list) started. |
| Ad checked | $0.0001 | An ad that was read but not written: already seen in onlyNew mode, removed by a format filter, or an ad ID that was not found. |

- One result: about $0.0018.
- 1,000 results: about $1.80.
- Every day 100 results, for 30 days: about $5.40 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 8 November 2026. Current price: https://apify.com/cliqtomedia/linkedin-ad-library?fpr=cliqto

## Questions

### Do I need a LinkedIn account or cookies?

No. The Actor reads the public LinkedIn Ad Library without login.

### Why are dates, impressions and targeting empty for some ads?

LinkedIn shows them only for ads shown in the EU. Impressions are a range, not an exact number.

### Does it get every ad of a company?

It gets what the Ad Library shows for your search, up to maxAds. The library holds ads from about the last year.

### How fresh is the data?

Each row is read at run time (`fetchedAt`). `lastSeen` is the last day LinkedIn says the ad ran.

### Can I use the input from another LinkedIn Ad Library Actor?

Mostly yes: `startUrls`, `resultsLimit`, `skipDetails` and `maxConcurrency` are supported.

## Data fields

- `adId` (string): LinkedIn Ad Library ID of the ad.
- `adLibraryUrl` (string): Public Ad Library link to this ad.
- `advertiserName` (string): Advertiser shown on the ad.
- `advertiserUrl` (string): Advertiser LinkedIn page link.
- `advertiserId` (string): Numeric LinkedIn company (or member) ID of the advertiser.
- `advertiserType` (string): company or member (Thought Leader ads run from a person's post).
- `advertiserLogoUrl` (string): Advertiser logo image.
- `paidBy` (string): "Paid for by" entity.
- `format` (string): Normalized format: image, video, carousel, document, message, article, text, spotlight, follower, event, job, other.
- `formatLabel` (string): Format as LinkedIn labels it, e.g. Single Image Ad.
- `creativeType` (string): LinkedIn creative type code, e.g. SPONSORED_VIDEO.
- `headline` (string): Headline under the image or video, when the ad has one.
- `body` (string): Ad text (introductory text or message body).
- `bodyIsPreview` (boolean): true when body is the shortened search-card text (details off or unavailable).
- `description` (string): Description line under the headline.
- `ctaLabel` (string): Call-to-action button text, e.g. Learn more, Join.
- `ctaUrl` (string): Where the ad sends people: the click URL of the headline or image, or, when the ad has none (often video ads), the first link in the ad text. LinkedIn's own tracking parameters are removed.
- `landingDomain` (string): Domain of ctaUrl.
- `bodyLinks` (array): External links in the ad text, in order (LinkedIn hashtag and profile links excluded).
- `images` (array): Image URLs of the creative (all carousel cards included).
- `videoUrl` (string): Video file URL.
- `videoPosterUrl` (string): Video thumbnail URL.
- `document` (object): Document ad: title, pageCount, coverImageUrls, manifestUrl.
- `carousel` (array): Carousel cards: imageUrl and title.
- `messageButtons` (array): Buttons of message / conversation ads.
- `hashtags` (array): Hashtags linked in the ad text.
- `variantsCount` (integer): How many creative versions LinkedIn shows for this ad.
- `variants` (array): Other versions: headline, body, ctaLabel, ctaUrl, images, videoUrl.
- `firstSeen` (string): First day the ad ran (YYYY-MM-DD); shown for EU ads.
- `lastSeen` (string): Last day the ad ran (YYYY-MM-DD); shown for EU ads.
- `daysRunning` (integer): Days between firstSeen and lastSeen, both included.
- `availabilityText` (string): LinkedIn note about dates when exact ones are not shown.
- `impressionsText` (string): Impressions range as LinkedIn shows it, e.g. 1k-5k.
- `impressionsMin` (integer): Lower bound of impressions.
- `impressionsMax` (integer): Upper bound of impressions.
- `impressionsByCountry` (array): Share of impressions by country: country, percent, lessThanOnePercent.
- `targeting` (array): Targeting by category: category, included, excluded.
- `targetingParameters` (array): Targeting parameters: parameter, targeted, excluded.
- `hasTransparencyData` (boolean): true when LinkedIn shows dates, impressions and targeting (ads shown in the EU).
- `detailsStatus` (string): ok, not_found, failed, not_requested or skipped.

## Input settings

- `companyNames` (array): Advertiser names as LinkedIn shows them ("Apify", "HubSpot"). Each name is one search of the Ad Library. LinkedIn matches names loosely, so turn on Exact company match to drop look-alike advertisers. Up to 50.
- `companyUrls` (array): LinkedIn company pages (linkedin.com/company/apify) or numeric company IDs (10608457). The Actor finds the company ID and returns only that company's ads. Personal profiles are not supported. Up to 100.
- `keywords` (array): Words in the ad text ("web scraping", "CRM"). Each keyword is one search across all advertisers. Up to 50.
- `payers` (array): Name of the paying entity shown as "Paid for by" (agencies, parent companies). Up to 50.
- `startUrls` (array): Paste linkedin.com/ad-library/search?… links with your filters, or single-ad links (linkedin.com/ad-library/detail/…). Filters in a pasted search link win over the filters below. Up to 100.
- `adIds` (array): Numeric LinkedIn ad IDs or ad detail links, to refresh known ads. The whole list counts as one search; an ID that does not exist costs a small ad-checked fee. Up to 1000.
- `countries` (array): Two-letter codes of countries where the ads ran (US, GB, DE, …). All listed countries go into one search. Empty means all countries. Up to 50.
- `dateRange` (string): When the ads ran. LinkedIn keeps ads in the library for one year after they last ran.
- `startDate` (string): Start of a custom date range (YYYY-MM-DD). Needs To date as well.
- `endDate` (string): End of a custom date range (YYYY-MM-DD).
- `impressionsMin` (integer): Keep only ads with at least this many impressions (LinkedIn rounds to 1k / 1M steps). Impressions exist only for ads shown in the EU.
- `impressionsMax` (integer): Keep only ads with at most this many impressions.
- `targetingIncluded` (array): Keep only ads that target by these categories (LinkedIn filter, EU ads only).
- `targetingExcluded` (array): Keep only ads that exclude people by these categories.
- `adFormats` (array): Keep only these formats. Empty means all. Each filtered-out ad costs a small ad-checked fee instead of the ad price.
- `exactCompanyMatch` (boolean): For Company names: keep only ads whose advertiser name equals the name you typed (case and punctuation ignored). Use Company page URLs for a guaranteed exact match.
- `sortOrder` (string): Order in which LinkedIn returns ads.
- `maxAds` (integer): Stop each search after this many ads. You pay per ad delivered.
- `includeDetails` (boolean): Open every ad's detail page: full text, headline, CTA, landing URL, all images and video, payer, run dates, impressions by country and targeting. Charged as an extra ad-details event per ad. Off gives the short search-card preview only.
- `trackChanges` (boolean): Remember which ads each search returned. Every ad gets changeStatus new or seen and firstFoundAt; the CHANGES record lists new ad IDs. Use with a schedule to monitor competitors.
- `onlyNew` (boolean): Deliver only ads not seen by the same search in earlier runs. Each skipped, already seen ad costs a small ad-checked fee instead of the ad price. Turns on change tracking.
- `stateName` (string): Name of the key-value store that keeps the tracking memory. Use different names for independent monitors. Lowercase letters, digits and hyphens.
- `includeAdvertiserSummary` (boolean): Write an ADVERTISER_SUMMARY record: per advertiser ad count, formats, CTAs, landing domains, top countries, targeting categories and longest-running ads. Put 2–3 competitors in one run to compare them. Free.
- `concurrency` (integer): How many ad detail pages are read in parallel through the proxy. Leave empty for the default (5). Lower it if you see many retries in the run summary. Without a proxy the Actor reads one page at a time.
- `requestDelayMs` (integer): Extra pause between requests to LinkedIn. Leave empty for the default pace (250 ms with a proxy). A longer pause makes the run slower, not cheaper.

## Step by step on Apify

1. Open the Input tab. Company names already has `Apify` (box 1 in the picture). Replace it with your competitor's name.
2. Open Limits and details (box 2). Keep Max ads per search at `10` for a first test. Keep Open each ad for full details on to get the full text, dates, impressions and targeting.
3. Click Start at the bottom of the page (below the form, not in the picture).
4. Open the Output tab (box 1 below). The Ads view (box 2) shows the advertiser, format, text, CTA, landing URL, dates and impressions. Dates, impressions and targeting shows reach by country and targeting.

## Use cases

| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| See all ads of a competitor | `companyUrls` or `companyNames` | ad | `headline`, `body`, `ctaUrl`, `firstSeen`, `lastSeen` | CSV or Excel export |
| Find ads about a topic in some countries | `keywords` + `countries` + `dateRange` | ad | `advertiserName`, `body`, `format`, `impressionsText` | Google Sheets via export |
| Check where and to whom an ad was shown | `adIds` or `companyNames` | ad | `impressionsByCountry`, `targeting` | your BI tool via API |
| Get only new competitor ads every week | `companyUrls` + `onlyNew` | ad | `changeStatus`, `firstFoundAt`, `adLibraryUrl` | Schedule + Slack or Notion |

## Tips

- Use companyUrls or exactCompanyMatch for one exact company. A name search can find similar names.
- Use countries with EU countries to get dates, impressions and targeting.
- Turn on onlyNew and run on a schedule to see ads you have not seen.

## Limits



- Up to 5000 ads for each search and up to 100 searches in one run.
- One run makes at most 3000 requests to LinkedIn and runs at most 1 hour. With details, each ad needs about 1.25 requests, so one run gives about 2000–2400 ads with details (our test: 2400 ads in 33 minutes). Without details, 5000 ads need about 220 requests. When a limit is reached, the run stops, keeps the saved ads and ends with `PARTIAL` and reason `TIME_LIMIT` (the run still succeeds). The default run timeout is 1 hour; a shorter timeout gives fewer ads.
- If two searches in a row fail because LinkedIn does not answer, the Actor skips the remaining searches and says so in `RUN_SUMMARY.warnings`. You pay nothing for skipped searches.
- `onlyNew` remembers up to 20,000 ads for each `stateName`; the oldest are forgotten first.
- Run dates, impressions and targeting exist only for ads shown in the EU. LinkedIn shows impressions as a range, not an exact number.
- The library has ads from about the last year. LinkedIn decides what it shows; the Actor does not promise every ad an advertiser ever ran.
- Search by company name can find companies with similar names. Use `companyUrls` or `exactCompanyMatch` for one exact company.
- No personal profiles, no login, no private data. Image and video links come from LinkedIn and can expire.

## Sample result

```json
{
  "adId": "1612091784",
  "adLibraryUrl": "https://www.linkedin.com/ad-library/detail/1612091784",
  "advertiserName": "Apify",
  "advertiserId": "10608457",
  "paidBy": "Apify Technologies s.r.o.",
  "format": "document",
  "headline": null,
  "body": "How would you explain your job to your grandparents? …",
  "bodyIsPreview": false,
  "ctaLabel": null,
  "document": { "title": "How would you explain your job to your grandparents", "pageCount": 12 },
  "firstSeen": "2026-10-26",
  "lastSeen": "2026-11-01",
  "daysRunning": 7,
  "impressionsText": "150k-200k",
  "impressionsByCountry": [
    { "country": "United Kingdom", "percent": 45, "lessThanOnePercent": false },
    { "country": "Canada", "percent": 23, "lessThanOnePercent": false }
  ],
  "targeting": [
    { "category": "Language", "included": ["English"], "excluded": [] },
    { "category": "Location", "included": ["DACH", "United States", "Canada"], "excluded": ["India"] }
  ],
  "hasTransparencyData": true,
  "detailsStatus": "ok",
  "searchSource": "Apify",
  "fetchedAt": "2026-11-01T04:42:47.016Z"
}
```

## Use it from code

Actor ID: `cliqtomedia/linkedin-ad-library`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/linkedin-ad-library").call(run_input={
    "companyNames": [
        "Apify"
    ],
    "dateRange": "all-time"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~linkedin-ad-library/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companyNames": ["Apify"], "dateRange": "all-time"}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/linkedin-ad-library")
result = tool.invoke({"run_input": {"companyNames": ["Apify"], "dateRange": "all-time"}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Use cases with this tool

- [Know what your competitors do](https://cliqtomedia.com/actors/use-cases/competitor-monitoring/): See what your competitors launch, hire, change and advertise. Every week, without opening their sites.

## Similar tools

- [Google Ads Transparency Scraper - Ad Text, No Login](https://cliqtomedia.com/actors/google-ads-transparency-scraper/)
- [Website Contact Scraper](https://cliqtomedia.com/actors/website-contacts-scraper/)
- [Google Autocomplete Scraper: Keyword Suggestions](https://cliqtomedia.com/actors/google-autocomplete-scraper/)
- [Website JSON-LD Structured Data Scraper](https://cliqtomedia.com/actors/website-jsonld-structured-data-scraper/)
- [XML Sitemap URLs Extractor: Indexes & Gzip](https://cliqtomedia.com/actors/xml-sitemap-urls-extractor/)
- [Website Metadata & Open Graph Scraper: Meta Tags & Canonical](https://cliqtomedia.com/actors/website-metadata-open-graph-scraper/)
