Search & SEO · Live on Apify

LinkedIn Ad Library Scraper: Competitor Ads

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.

About $1.80 for 1,000 results$0.0018 per result + $0 per run. Apify bills you, not us.Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Run it on Apify Opens apify.com, the website where our tools run. Sign up free with Google or email, no card needed.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure

What you get, for example

adId1612091784
adLibraryUrlhttps://www.linkedin.com/ad-library/detail/1612091784
advertiserNameApify

How to use it: 3 steps

  1. Make a free Apify accountApify 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 StartNo 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 resultsWhen 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.

This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.

What it does

Scrape ads from the public LinkedIn 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.

Who uses it

Marketers

Watch the texts, offers and CTAs of rival ads.

Agency teams

Find ads about a topic in chosen countries and dates.

Market researchers

Track new ads on a schedule.

Price

Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.

What you pay forPriceWhen
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.001One search (company, keyword, payer, URL or ad ID list) started.
Ad checked$0.0001An 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.

Examples

  • 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. That is enough for about 2,700 results.

Prices checked on 8 November 2026. See the current price on Apify.

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.

Details

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
TaskInputYou getKey fieldsNext step
See all ads of a competitorcompanyUrls or companyNamesadheadline, body, ctaUrl, firstSeen, lastSeenCSV or Excel export
Find ads about a topic in some countrieskeywords + countries + dateRangeadadvertiserName, body, format, impressionsTextGoogle Sheets via export
Check where and to whom an ad was shownadIds or companyNamesadimpressionsByCountry, targetingyour BI tool via API
Get only new competitor ads every weekcompanyUrls + onlyNewadchangeStatus, firstFoundAt, adLibraryUrlSchedule + Slack or Notion
Tips for better results
  • 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 and good to know
  • 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

For developers

Sample result

One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.

one 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. You need your Apify API token from Apify Console → Settings → API & Integrations.

Python · apify-client
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)
cURL
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"}'
LangChain · langchain-apify
# 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)

The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.

Data fields (40)
FieldTypeMeaning
adIdstringLinkedIn Ad Library ID of the ad.
adLibraryUrlstringPublic Ad Library link to this ad.
advertiserNamestringAdvertiser shown on the ad.
advertiserUrlstringAdvertiser LinkedIn page link.
advertiserIdstringNumeric LinkedIn company (or member) ID of the advertiser.
advertiserTypestringcompany or member (Thought Leader ads run from a person's post).
advertiserLogoUrlstringAdvertiser logo image.
paidBystring"Paid for by" entity.
formatstringNormalized format: image, video, carousel, document, message, article, text, spotlight, follower, event, job, other.
formatLabelstringFormat as LinkedIn labels it, e.g. Single Image Ad.
creativeTypestringLinkedIn creative type code, e.g. SPONSORED_VIDEO.
headlinestringHeadline under the image or video, when the ad has one.
bodystringAd text (introductory text or message body).
bodyIsPreviewbooleantrue when body is the shortened search-card text (details off or unavailable).
descriptionstringDescription line under the headline.
ctaLabelstringCall-to-action button text, e.g. Learn more, Join.
ctaUrlstringWhere 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.
landingDomainstringDomain of ctaUrl.
bodyLinksarrayExternal links in the ad text, in order (LinkedIn hashtag and profile links excluded).
imagesarrayImage URLs of the creative (all carousel cards included).
videoUrlstringVideo file URL.
videoPosterUrlstringVideo thumbnail URL.
documentobjectDocument ad: title, pageCount, coverImageUrls, manifestUrl.
carouselarrayCarousel cards: imageUrl and title.
messageButtonsarrayButtons of message / conversation ads.
hashtagsarrayHashtags linked in the ad text.
variantsCountintegerHow many creative versions LinkedIn shows for this ad.
variantsarrayOther versions: headline, body, ctaLabel, ctaUrl, images, videoUrl.
firstSeenstringFirst day the ad ran (YYYY-MM-DD); shown for EU ads.
lastSeenstringLast day the ad ran (YYYY-MM-DD); shown for EU ads.
daysRunningintegerDays between firstSeen and lastSeen, both included.
availabilityTextstringLinkedIn note about dates when exact ones are not shown.
impressionsTextstringImpressions range as LinkedIn shows it, e.g. 1k-5k.
impressionsMinintegerLower bound of impressions.
impressionsMaxintegerUpper bound of impressions.
impressionsByCountryarrayShare of impressions by country: country, percent, lessThanOnePercent.
targetingarrayTargeting by category: category, included, excluded.
targetingParametersarrayTargeting parameters: parameter, targeted, excluded.
hasTransparencyDatabooleantrue when LinkedIn shows dates, impressions and targeting (ads shown in the EU).
detailsStatusstringok, not_found, failed, not_requested or skipped.
Input settings (25)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
Company namescompanyNamesarray["Apify"]
Company page URLs or IDscompanyUrlsarray
Keywordskeywordsarray
Paid bypayersarray
Ad Library URLsstartUrlsarray
Ad IDsadIdsarray
Countriescountriesarray
Date rangedateRangestring"all-time"
From datestartDatestring
To dateendDatestring
Min impressionsimpressionsMininteger
Max impressionsimpressionsMaxinteger
Targeting includestargetingIncludedarray
Targeting excludestargetingExcludedarray
Ad formatsadFormatsarray
Exact company matchexactCompanyMatchbooleanfalse
OrdersortOrderstring"newest"
Max ads per searchmaxAdsinteger10
Open each ad for full detailsincludeDetailsbooleantrue
Track new adstrackChangesbooleanfalse
Only new adsonlyNewbooleanfalse
Tracking memory namestateNamestring"linkedin-ad-library-state"
Advertiser comparison summaryincludeAdvertiserSummarybooleanfalse
Ad pages read at onceconcurrencyinteger
Pause between requests (ms)requestDelayMsinteger

Use cases with this tool

Each guide shows all the steps and the other tools.

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure