๐ข LinkedIn Ads Library Scraper
Pricing
from $4.00 / 1,000 results
๐ข LinkedIn Ads Library Scraper
LinkedIn Ads Library Scraper extracts LinkedIn ad copy, creatives, headlines, CTAs, landing pages, impressions, targeting, advertisers, payers, and run dates. Built for competitor ad analysis, B2B research, creative intelligence, and AI pipelines.
Pricing
from $4.00 / 1,000 results
Rating
0.0
(0)
Developer
Data Minds
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
๐ข LinkedIn Ads Library Scraper โ Ad Copy, Creatives, Impressions & Targeting Extractor
LinkedIn Ads Library Scraper is a production-grade Apify Actor for LinkedIn Ad Library data extraction โ no login, no LinkedIn API access, no ad account required. Paste any ad library link (or just type a company name) and it returns ad copy, headlines, creatives, call-to-action buttons, landing pages, the advertiser and the payer, total impressions with a country-by-country split, targeting and exact run dates โ streamed to your Apify Dataset in real time.
๐ก Need a custom version, private integration, or a tailored pipeline? Email hello.dataminds@gmail.com.
Built for competitive intelligence teams, performance marketers, agencies, B2B market researchers, creative strategists and AI/LLM data pipelines โ anyone who needs clean, structured LinkedIn advertising data without scrolling the Ad Library by hand.
๐ Table of contents
- What is LinkedIn Ads Library Scraper?
- Main features
- Who is this Actor for?
- What the scraper does
- Inputs it accepts
- Filtering configuration
- Output format (Dataset)
- Example output (JSON)
- Quick start
- Input parameters reference
- Reliability & anti-blocking
- Integrations & automation
- Pricing & how to control cost
- Frequently asked questions (FAQ)
- Troubleshooting
- Help, support & custom builds
- Is scraping LinkedIn Ads legal?
- SEO keywords targeted
๐ข What is LinkedIn Ads Library Scraper?
The LinkedIn Ad Library is a goldmine of competitor advertising data โ and a nightmare to use at scale. It paginates by infinite scroll, hides impressions and targeting behind a click into each individual ad, and gives you no export button at all.
This Actor turns the whole thing into clean rows:
- Accepts any ad library link โ a company search, a keyword search, a payer search, or a filtered URL you built in the Ad Library UI. Every filter you set there is honoured exactly.
- Or skip links entirely โ fill in a company, payer or keyword in the built-in search builder, add countries, dates, impressions range and targeting categories, and the Actor assembles the search for you.
- Returns the complete ad record โ advertiser, logo, company page, who paid for it, headline, full ad copy, CTA button, landing page, ad format and the image / video / document creative URL.
- Reads what the ad detail page hides โ total impressions, the country-by-country impression split, language and location targeting, and the exact dates the ad ran.
- Works across every ad format โ single image, video, document/carousel, follow-company and more, each with the right creative URL for that format.
- Streams every finished ad to your Dataset โ export to JSON, CSV, Excel, XML, or pull them through the Apify API.
If you have ever needed "every ad this competitor is running right now, with copy, creatives and impressions, as clean rows" โ this is the Actor.
โจ Main features
- ๐ Any ad library URL accepted โ company, payer, keyword or fully filtered search links, all in one bulk input field with file upload and remote list support.
- ๐งฉ Built-in search builder โ no URL writing needed. Company, payer, keyword, 249 countries, date range, sort order, impressions range and targeting categories, all as form fields.
- ๐ข Full advertiser record โ name, logo, LinkedIn company page, and the legal entity that actually paid for the ad (often an agency, not the brand).
- โ๏ธ Complete ad copy โ headline, full untruncated body text, call-to-action button label and the real landing-page URL with its attribution parameters intact.
- ๐จ Every ad format handled โ single image, video (highest-bitrate source), document/carousel cover, follow-company and more.
- ๐ Impressions intelligence โ the total impressions band plus the per-country percentage split, with a sortable numeric column derived for you.
- ๐ฏ Targeting disclosure โ the language and location targeting LinkedIn publishes for each ad.
- ๐
Exact run dates โ when each ad started, when it stopped, and a derived
ACTIVE/INACTIVEstatus. - ๐ฆ Automatic network fallback โ no proxy โ datacenter โ residential, sticky after the first switch, every change written to the log.
- ๐ฆ Live dataset writes and nine prebuilt table views โ Overview, Advertiser, Creative, Ad copy & CTA, Impressions, Targeting, Schedule, Source, Errors.
- ๐งพ Run summary stored in the key-value store, with per-run totals and the network route used.
๐ฅ Who is this Actor for?
- ๐ฌ Competitive intelligence teams โ see exactly what every competitor is running, and for how long.
- ๐ Performance marketers โ mine winning headlines, hooks and CTAs before writing your own.
- ๐ข Agencies โ build a live ad board for every client and every one of their rivals.
- ๐จ Creative strategists โ collect image and video creatives at scale for swipe files and inspiration decks.
- ๐ Market researchers โ track category-wide ad spend signals through impressions bands over time.
- ๐ค AI / LLM data pipelines โ clean, structured ad copy and creative data for RAG, fine-tuning and generation.
- ๐งโ๐ป Developers โ a dependable LinkedIn advertising data source with no ad account or API approval to wait for.
โ๏ธ What the scraper does
- Reads every link and search you provide โ mixed freely in a single run.
- Assembles a real ad library search for each entry, applying your run-wide date and country filters on top.
- Walks the whole result list page by page until it hits your limit or the end of the search.
- Opens each ad's own page for the full record โ impressions, targeting, run dates, CTA and landing page.
- Saves every finished ad straight to your Dataset โ you can watch results land in the Console in real time.
- Keeps going when something fails โ an unreachable ad becomes a clear error row instead of stopping the run.
- Reports a full run summary at the end โ totals by format, active count, advertisers, network route and duration.
๐ฅ Inputs it accepts
| Input type | Example | Notes |
|---|---|---|
| Company search link | https://www.linkedin.com/ad-library/search?accountOwner=apify | The most common starting point |
| Keyword search link | https://www.linkedin.com/ad-library/search?keyword=web+scraping | Every ad whose copy mentions the phrase |
| Fully filtered link | โฆ/search?accountOwner=apify&countries=US&dateOption=last-30-days | Build it in the Ad Library UI and paste it โ all filters carry over |
| Company page link | https://www.linkedin.com/company/nvidia/ | Works, but gives no date or country control |
| Search builder entry | Company apify + Countries US + Last 30 days | No URL needed โ fill in the form fields instead |
All of the above can be mixed freely in a single run, and the URL field supports bulk paste, file upload and remote lists.
๐ฏ Filtering configuration
- Company / advertiser โ the brand whose ads you want.
- Payer โ the entity that paid, which is often the agency rather than the brand.
- Keyword โ a word or phrase that must appear in the ad copy.
- Countries โ any of 249 countries, or all of them.
- Date range โ last 30 days, this month, this year, last year, or an exact
YYYY-MM-DDwindow. โ ๏ธ A custom window's end date must be before today: LinkedIn returns nothing at all for a range ending today or later, so the Actor pulls a today/future end date back to yesterday and says so in the log. - Sort order โ newest first, or oldest first to start from an advertiser's earliest campaigns.
- Impressions range โ a minimum and maximum with a
exact / thousand / millionunit each. Fill in one side and the other is opened up automatically. - Targeting categories โ include or exclude ads by the targeting they use (language, location, audience, demographic, company, education, job, interests & traits).
- Run-wide overrides โ a date range and a country list that apply on top of every link and search in the run.
โ ๏ธ Filters narrow what the ad library has to give. If a search matches fewer ads than your limit, you get fewer rows โ that is the correct answer, not a bug.
๐ค Output format (Dataset)
Every ad streams to the dataset the moment it's ready, organized into nine ready-made Console views:
| View | What it shows |
|---|---|
| โจ Overview | Creative, advertiser, headline, ad copy, format, status, CTA, ad link |
| ๐ข Advertiser | Logo, advertiser name, company page, who paid for the ad, ad ID |
| ๐จ Creative | Format with the image, video or document creative URL |
| โ๏ธ Ad copy & CTA | Headline, full body copy, CTA button, landing page, links found in the copy |
| ๐ Impressions | Total impressions, sortable numeric floor, top country, full country split |
| ๐ฏ Targeting | Language and location targeting, flattened into their own columns |
| ๐ Schedule | Start date, end date, active/inactive status, collection timestamp |
| ๐งญ Source | Which of your searches each ad came from |
| โ ๏ธ Errors | Anything that could not be collected, with a plain-language reason |
๐งพ Example output (JSON)
{"adId": "1467153524","adLibraryUrl": "https://www.linkedin.com/ad-library/detail/1467153524","advertiserLogo": "https://media.licdn.com/dms/image/v2/D4D0BAQF7OnC-r1njIA/company-logo_100_100/โฆ","body": "Remember that $5 free credit? It's still waiting. ๐\n\n52,000+ Actors on Apify ready to pull real-time data from any website.","clickUrl": "https://console.apify.com/?utm_source=linkedin&utm_medium=paid&utm_campaign=โฆ","ctas": ["Learn more"],"advertiserName": "Apify","advertiserUrl": "https://www.linkedin.com/company/10608457","availability": { "start": "2026-07-31", "end": "2026-08-30" },"format": "SINGLE_IMAGE","paidBy": "Apify Technologies s.r.o.","impressionsPerCountry": [{ "country": "United States", "impressions": "30%" },{ "country": "Australia", "impressions": "16%" },{ "country": "Singapore", "impressions": "6%" }],"impressions": "10k-20k","targeting": { "language": "English", "location": "United States, France, Israel" },"headline": "Time to spend your $5 credit.","imageUrl": "https://media.licdn.com/dms/image/v2/D4E10AQGkpPcgyQgxBA/image-shrink_1280/โฆ","startUrl": "https://www.linkedin.com/ad-library/search?accountOwner=apify","adStatus": "ACTIVE","impressionsLow": 10000,"topCountry": "United States","externalLinks": [],"scrapedAt": "2026-08-30T12:00:22.339806+00:00"}
Output fields reference
| Field | Type | Description |
|---|---|---|
adId | string | LinkedIn's own identifier for the ad |
adLibraryUrl | string | Direct link to the ad's page in the Ad Library |
advertiserLogo | string | Advertiser's logo image URL |
body | string | Full ad copy, untruncated |
clickUrl | string | The landing page the ad sends people to, attribution parameters intact |
ctas | array | Call-to-action button label(s), e.g. ["Learn more"] |
advertiserName | string | Advertiser as shown on the ad |
advertiserUrl | string | Advertiser's LinkedIn company page |
availability | object | { start, end } โ the exact dates the ad ran |
format | string | SINGLE_IMAGE, VIDEO, DOCUMENT, FOLLOW_COMPANY, โฆ |
paidBy | string | Legal entity that paid for the ad |
impressionsPerCountry | array | Per-country impression percentage split |
impressions | string | Total impressions band, e.g. "10k-20k" |
targeting | object | { language, location } targeting disclosure |
headline | string | Ad headline (present when the ad's CTA is still live) |
imageUrl | string | Image creative, or a document ad's cover page |
videoUrl | string | Highest-bitrate video source, for video ads |
startUrl | string | Which of your searches this ad came from |
adStatus | string | ACTIVE / INACTIVE / UNKNOWN, derived from the run dates |
impressionsLow | number | Sortable numeric floor of the impressions band |
topCountry | string | Highest-share country from the impression split |
externalLinks | array | Outbound URLs found inside the ad copy |
scrapedAt | string | ISO 8601 timestamp of collection |
Fields the ad library does not publish for a given ad are omitted, not set to
nullโ an ad that stopped running long ago genuinely has no impressions or targeting block to read.
๐ Quick start
Apify Console
- Log in at console.apify.com โ Actors โ open LinkedIn Ads Library Scraper.
- Paste your ad library links, or fill in the Build a search section instead.
- Set Max ads per search, adjust filters if you want, then click Start.
- Watch the log and the Output tab fill up in real time.
- Export to JSON, CSV or Excel when it's done.
API
curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~linkedin-ads-library-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"urls": [{"url": "https://www.linkedin.com/ad-library/search?accountOwner=apify"}],"resultsLimit": 50}'
Python client
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("YOUR_USERNAME/linkedin-ads-library-scraper").call(run_input={"searches": [{"accountOwner": "apify", "countries": ["US"], "dateOption": "last-30-days"},],"resultsLimit": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["advertiserName"], "|", item.get("headline"), "|", item.get("impressions"))
More input examples
Track one competitor's US ads from the last 30 days
{"searches": [{ "accountOwner": "nvidia", "countries": ["US"], "dateOption": "last-30-days" }],"resultsLimit": 200}
Category research by keyword, high-impression ads only
{"searches": [{"keyword": "sales automation","impressionsMinValue": 50, "impressionsMinUnit": "thousand","impressionsMaxValue": 10, "impressionsMaxUnit": "million"}],"resultsLimit": 500}
Several competitors at once, one exact date window for all of them
{"urls": [{ "url": "https://www.linkedin.com/ad-library/search?accountOwner=apify" },{ "url": "https://www.linkedin.com/ad-library/search?accountOwner=nvidia" }],"startDate": "2026-01-01","endDate": "2026-06-30","countryFilter": ["US", "GB", "DE"],"resultsLimit": 100}
Fast sweep โ list data only, no detail pages
{"urls": [{ "url": "https://www.linkedin.com/ad-library/search?keyword=black+friday" }],"resultsLimit": 1000,"skipDetails": true}
โ๏ธ Input parameters reference
๐ Start here
| Field | Type | Default | Description |
|---|---|---|---|
urls | array | [] | LinkedIn Ad Library links, bulk input (file upload and remote lists supported) |
searches | array | [] | Build searches from form fields instead of URLs โ one entry per search |
๐ฌ How much to collect
| Field | Type | Default | Description |
|---|---|---|---|
resultsLimit | integer | 100 | Max ads per search; 0 means every match |
skipDetails | boolean | false | Skip each ad's own page โ much faster, but no impressions, targeting, run dates, CTA or landing page |
๐งฉ Per-search fields (inside each searches entry)
| Field | Type | Description |
|---|---|---|
accountOwner | string | Company or advertiser name |
payer | string | Entity that paid for the ad |
keyword | string | Word or phrase in the ad copy |
countries | array | ISO country codes, or ALL |
dateOption | string | last-30-days / current-month / current-year / last-year |
startDate, endDate | string | YYYY-MM-DD exact window (use both together; end date must be before today) |
sortOrder | string | DESCENDING (newest first) or ASCENDING |
impressionsMinValue, impressionsMinUnit | integer, string | Lower bound + none / thousand / million |
impressionsMaxValue, impressionsMaxUnit | integer, string | Upper bound + none / thousand / million |
includedTargetingFacetCategories | array | Only ads using these targeting categories |
excludedTargetingFacetCategories | array | Skip ads using these targeting categories |
โ ๏ธ Every
searchesentry needs at least one of Company, Payer or Keyword.
๐ฏ Filters for every search
| Field | Type | Default | Description |
|---|---|---|---|
dateFilter | string | โ | Date range applied on top of every link and search |
startDate, endDate | string | โ | Exact YYYY-MM-DD window applied to the whole run; end date must be before today |
countryFilter | array | [] | Countries applied on top of every link and search |
๐ Network & โก Speed
| Field | Type | Default | Description |
|---|---|---|---|
proxyConfiguration | object | no proxy | Automatic no-proxy โ datacenter โ residential fallback unless you pin your own |
maxConcurrency | integer | 1 | Ad pages read in parallel |
requestDelay | number | 1.5 | Seconds enforced between the start of any two requests |
maxRequestRetries | integer | 3 | Retries per request before stepping up to the next network route |
maxScanned | integer | 20000 | Safety cap on result pages walked per search |
Inputs saved for other LinkedIn ad scrapers work here unchanged:
startUrlsandsearchUrlsare accepted as aliases ofurls, andmaxResults/maxItemsas aliases ofresultsLimit.
๐ก๏ธ Reliability & anti-blocking
This Actor starts every run on a direct connection โ no proxy overhead unless it's actually needed. If the ad library pushes back, the run automatically and transparently escalates:
No proxy โ datacenter proxy โ residential proxy (3 retries)
Once the run escalates it stays on the new route for every remaining request, so a single hiccup can't leave you flapping between routes mid-run. Every fallback is written to the log with the reason. You can also pin your own proxy group in Proxy configuration to skip the automatic ladder entirely.
On top of the route ladder:
- โฑ๏ธ Rate pacing โ a real gap is enforced between the start of any two requests, across the whole run. Capping parallelism alone does not cap the request rate, and the rate is what actually gets a run throttled.
- ๐ Per-request retries with exponential backoff, and
Retry-Afterhonoured when the server sends one. - ๐พ Nothing is lost โ every ad is written to your Dataset the moment it's parsed, so even a run that ends early keeps everything it collected.
- ๐ Clean stops โ if you abort a run, it finishes writing what it has and exits tidily instead of dying mid-write.
๐ Integrations & automation
- Schedules โ run this Actor daily or weekly to build a time series of a competitor's ad activity.
- Webhooks โ fire
ACTOR.RUN.SUCCEEDEDto your own endpoint when a run finishes. - Zapier / Make / n8n โ feed dataset items straight into a spreadsheet, CRM, Slack alert or ad board.
- Clay / Airtable / Google Sheets โ pull the dataset directly for enrichment workflows.
- MCP / AI agents โ call this Actor as a tool from Claude, Cursor or any MCP-compatible client via mcp.apify.com.
- REST API โ pull dataset items directly:
GET https://api.apify.com/v2/datasets/{datasetId}/items?format=json.
๐ฐ Pricing & how to control cost
This Actor is billed per ad saved to your dataset, so you pay for results and nothing else โ a run that finds no ads costs you nothing beyond the platform's own start event.
To control cost:
- Set
resultsLimitto sample a competitor before committing to a full sweep. - Turn on
skipDetailsfor a broad, cheap first pass, then re-run without it on the advertisers worth a closer look. - Narrow with
countryFilterand a date range rather than collecting everything and filtering later. - Leave Proxy configuration on automatic โ it only escalates to a paid proxy route when the direct connection is actually refused.
โ Frequently asked questions (FAQ)
Do I need a LinkedIn account, cookies or an ad account? No. This Actor only reads pages any signed-out visitor can open. There is nothing to log in to and no session to supply.
Can I get every ad a company has ever run?
Set resultsLimit to 0 and leave the date filter empty โ the Actor walks the whole search to the end. Note that the Ad Library itself only publishes what it retains.
Why did I get fewer ads than my limit? Your limit is a ceiling, not a target. Filters narrow what the library has to give: a search restricted to one country and 30 days simply has fewer ads in it. Widen the filters and the count goes up.
What does impressions actually mean?
It's the band the Ad Library publishes, like "10k-20k" โ LinkedIn does not disclose exact figures. We also derive impressionsLow as a sortable number so you can rank and chart on it.
My custom date range returned nothing โ why? LinkedIn's custom range only matches ads up to yesterday; a range ending today or later matches nothing at all. The Actor detects this and pulls the end date back to yesterday for you, writing a line in the log so the shift is never silent.
Why is targeting or impressions missing on some ads?
LinkedIn only publishes those blocks for ads it still holds analytics for. When the block isn't on the page, the field is omitted rather than guessed.
Can I search by keyword instead of by company?
Yes โ either paste a keyword search link, or put the phrase in the keyword field of a search builder entry.
Does it get video and document ads too?
Yes. Video ads return the highest-bitrate videoUrl, document/carousel ads return their cover page through imageUrl, and the format field always tells you which kind you're looking at.
Is the ad copy truncated like it is in the results list?
No โ the full body text comes from each ad's own page. (It is truncated if you turn on skipDetails, which is exactly the tradeoff that option makes.)
๐ ๏ธ Troubleshooting
| Symptom | Fix |
|---|---|
Fewer ads than resultsLimit | The search genuinely matches fewer ads โ widen the date range, add countries, or drop the impressions filter |
| A custom date range returns nothing | The end date must be before today โ the Actor corrects a today/future date to yesterday automatically and logs it, so check the log if your window looks shifted |
| An impressions filter returns nothing | The library needs a full range; fill in both sides (the Actor opens the missing side automatically, but an over-narrow band still matches nothing) |
| A search entry is skipped | Every searches entry needs at least one of Company, Payer or Keyword โ check the โ ๏ธ Errors view for the reason |
| A company URL gives thin results | Company pages have no filter control โ paste an ad library search link instead for full date and country control |
| Repeated slow-downs in the log | Raise requestDelay to about 4 and set maxConcurrency to 1, or select a proxy in Proxy configuration |
| Run seems slow | Turn on skipDetails for a fast first pass, or raise maxConcurrency if you're on a proxy |
๐ Help, support & custom builds
Something not working, or need a custom field, private integration or a bespoke pipeline built on top of this Actor? Email hello.dataminds@gmail.com โ we read every message.
โ๏ธ Is scraping LinkedIn Ads legal?
The LinkedIn Ad Library is a public transparency database โ LinkedIn publishes it deliberately so that anyone can see who is advertising and how. This Actor reads only those public pages, exactly as an anonymous visitor's browser would. It does not log in, does not bypass any paywall or authentication, and does not touch private profiles or content.
Ad copy and creatives remain the property of their advertisers, and you are responsible for how you use what you collect โ respect LinkedIn's Terms of Service, applicable copyright law, and privacy regulations (GDPR, CCPA, etc.) for your jurisdiction and use case. If you're unsure whether your use is legitimate, consult your lawyers; Apify's blog post on the legality of web scraping is a good starting point.
๐ SEO keywords targeted
linkedin ads scraper, linkedin ad library scraper, linkedin ad library api, linkedin ads api, scrape linkedin ads, linkedin advertising data, competitor ad analysis, ad intelligence tool, ad spy tool, linkedin ad spy, b2b ad research, competitive intelligence linkedin, linkedin ad creatives scraper, ad copy scraper, linkedin ad impressions data, ad targeting data, linkedin sponsored content scraper, linkedin ad monitoring, advertiser tracking tool, linkedin marketing intelligence, ad library data export, linkedin ads csv export, apify linkedin actor, scrape linkedin without login, linkedin ad transparency data.