LinkedIn Ads Scraper
Pricing
$19.99/month + usage
LinkedIn Ads Scraper
LinkedIn Ads Scraper extracts LinkedIn ad data, including creatives, headlines, descriptions, CTAs, advertiser info, formats, and impression insights. Ideal for ad research, competitive analysis, campaign tracking, and automating structured LinkedIn advertising data collection.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
9
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
LinkedIn Ads Scraper — Ad Copy, Creatives and Advertiser Data
LinkedIn Ads Scraper collects public ads from the LinkedIn Ad Library and returns one structured row per ad — the ad copy, the creative type, the creative image links, the call-to-action label, and the "Paid for by" funding entity. Give it a list of companies, and results are typed JSON, ready to export or query with no HTML parsing on your side. No LinkedIn login or account is required. Run it from the Apify Console to see it collect a live batch of ads in minutes.
🔎 What is LinkedIn Ads Scraper?
LinkedIn Ads Scraper is an Apify Actor that automates browsing the public LinkedIn Ad Library — LinkedIn's ad-transparency archive of every sponsored post an advertiser has run, who funded it, and what the creative looked like. Instead of clicking through ads one at a time with no export option, you name the advertisers you want and the Actor returns a structured dataset of their ads. No LinkedIn account, login, or cookies are needed — it reads only pages the Ad Library already shows to any visitor. It's built for competitive-intelligence teams, marketers, agencies, and developers who need LinkedIn ad data in code rather than in a browser.
🌐 What LinkedIn ad data is publicly available to scrape?
The LinkedIn Ad Library itself is fully public — anyone can browse ads by advertiser without signing in. What it does not publish, to anyone but the advertiser, is performance data: that lives behind the advertiser's own Campaign Manager account.
| Data Category | Publicly Available | Restricted (advertiser's own Campaign Manager) |
|---|---|---|
| Ad copy / creative text | ✅ | |
| Creative images & video poster frames | ✅ | |
| Advertiser name & company page link | ✅ | |
| Ad format (image, video, carousel, event, document, message) | ✅ | |
| Call-to-action label | ✅ | |
| "Paid for by" funding entity | ✅ | |
| Impressions, clicks, spend, CTR | ✅ | |
| Audience targeting criteria (job title, seniority, industry) | ✅ |
LinkedIn Ads Scraper only returns publicly visible data — what any visitor to the Ad Library sees. Nothing behind a Campaign Manager login.
📊 What data can I extract with LinkedIn Ads Scraper?
Each run returns ad creative content, advertiser identity, and library metadata for every ad collected. These are the exact fields the Actor writes to the dataset — no simplification, nothing padded.
Ad & advertiser identity fields
| Field Name | Description |
|---|---|
adId | The ad's own identifier, taken from its LinkedIn Ad Library detail URL. |
adLibraryUrl | Direct link to the ad's page in the Ad Library (https://www.linkedin.com/ad-library/detail/{adId}). |
advertiserName | The company or entity that ran the ad, read from the ad preview or the "About this ad" panel. |
advertiserUrl | The advertiser's LinkedIn company page, with tracking parameters stripped to a canonical URL. |
advertiserLogo | URL of the advertiser's logo image, when the ad preview carries one. |
format | The ad's creative type as LinkedIn reports it, e.g. SPONSORED_STATUS_UPDATE, SPONSORED_VIDEO, SPONSORED_UPDATE_CAROUSEL, SPONSORED_UPDATE_EVENT, SPONSORED_UPDATE_NATIVE_DOCUMENT, SPONSORED_INMAILS. |
startUrl | The Ad Library search URL this ad was discovered through. |
Creative content & metadata fields
| Field Name | Description |
|---|---|
body | Full ad copy — the sponsored post text or message body, with a trailing "…see more" cut off. |
ctas | Call-to-action label(s) on the ad's own creative, e.g. Learn more, Register, View event. |
paidBy | The funding entity from the ad's "Paid for by" disclosure. |
imageUrls | Creative image URLs shown inside the ad (and the poster frame for video ads); advertiser logos and member avatars are excluded. |
scrapedAt | UTC timestamp (ISO 8601) recording when the row was collected. |
🛠️ Why not build this yourself?
LinkedIn's own developer documentation offers a Marketing/Advertising API, but as of the date checked (2026-08-15) it covers your own Campaign Manager account data only — there is no public LinkedIn endpoint for browsing another advertiser's ads. The public LinkedIn Ad Library that this Actor reads has no official API at all.
Building this yourself means writing and maintaining an HTML scraper against Ad Library markup that can change without notice, distinguishing a genuine empty result from a soft-blocked page, handling retries and backoff, and optionally routing through proxies — all before you get a single usable row. LinkedIn Ads Scraper already does this and ships a stable, typed output schema instead.
▶️ How to use LinkedIn Ads Scraper
No sign-up beyond an Apify account is required. Run it from the Apify Console or through the API.
- Open LinkedIn Ads Scraper on the Apify Store and click Try for free (or Start, if you already have it).
- Add one or more entries under 🔍 Companies to search — the only input the Actor needs.
- Optionally set 🌍 Country and 📅 When the ads ran, and adjust 📊 How many ads to collect.
- Press Start. Rows land in the dataset as each ad is collected — no need to wait for the run to finish.
- Download results as JSON, CSV, Excel, XML or HTML from the Storage tab, or pull them through the Apify API.
How to scale to bulk ad extraction
input is an array, so one run can hold any number of companies. maxItems is a single total budget spread evenly (round-robin) across every company that returns results, so a company listed first can't starve the ones listed after it. ⚠️ The public Ad Library itself exposes up to 24 ads per company search — that's a property of LinkedIn's own archive, not a setting in this Actor. To collect more ads in total, list more companies rather than raising maxItems alone.
💡 What can you do with LinkedIn ad data?
- 🏢 Competitive intelligence teams tracking a rival's messaging use
bodyandctasto catalog exactly which pitches and calls-to-action a competitor is running right now. - 📣 Agencies and media buyers use
paidByto confirm which legal entity or agency funded a campaign before pitching a prospect. - 🎨 Creative and brand teams build a swipe file from
imageUrlsandformatto benchmark video vs. carousel vs. single-image ad mix across a category. - 🔬 Market researchers re-run the Actor on a schedule and compare
advertiserName,format, andscrapedAtacross periods to track how a company's advertising presence shifts over time. - 🤖 AI engineers feed
body,advertiserName, andformatinto a RAG pipeline or LLM prompt to summarize a category's ad messaging or generate competitor-aware ad copy benchmarks. The same typed JSON is callable through the Apify API from any agent framework.
🛡️ How does LinkedIn Ads Scraper handle rate limits and blocking?
Every fetch opens a fresh HTTP session, and optionally rotates across a small pool of upstream proxy routes resolved from Apify Proxy at the start of the run (off by default — proxyConfiguration is opt-in). Each page is fetched up to 4 times with backoff of roughly 2s, 5s and 10s (plus jitter) between attempts. Rather than trusting an HTTP status code, the Actor validates that a response actually contains the Ad Library's own page markers and a minimum content size before treating it as real — a thin or soft-blocked response is retried, not parsed as an empty result. Requests are paced with randomized delays (around 1–2s between company searches, 0.6–1.6s before each ad detail fetch), and detail-page fetches run with a concurrency cap of 3. The Actor does not solve CAPTCHAs and does not use a headless browser — it reads server-rendered HTML directly. If a page still can't be read after every retry, that company or ad is skipped and logged, and the rest of the run continues.
⬇️ Input
All parameters are optional — a default run needs nothing more than the prefilled example advertiser.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
input | No | array (stringList) | One entry per advertiser: a company name (e.g. google, hubspot, microsoft advertising) or a LinkedIn company URL. You can also paste a ready-made LinkedIn Ad Library search URL and it will be used as-is. | ["hubspot", "https://www.linkedin.com/company/microsoft/"] |
countries | No | string (enum, default "US") | Show ads that ran in this country. Pick ALL to skip the country filter. | "US" |
dateOption | No | string (enum, default "last-30-days") | Time range the ads were active in — the exact ranges the LinkedIn Ad Library itself offers. | "last-30-days" |
maxItems | No | integer (default 10, min 1, max 1000) | Cap on the total number of ads saved across all companies you listed. The public ad library makes up to 24 ads available per company search, so add more companies to collect more ads. | 40 |
proxyConfiguration | No | object (proxy editor) | Optional. A default run does not need it. | {"useApifyProxy": false} |
Example input
{"input": ["hubspot", "https://www.linkedin.com/company/microsoft/"],"countries": "US","dateOption": "last-30-days","maxItems": 40,"proxyConfiguration": { "useApifyProxy": false }}
⬆️ Output
Every run writes typed, normalized JSON with the same field names on every row, exportable as JSON, CSV, Excel, XML or HTML from the Storage tab, or readable through the Apify API and apify_client.
Example output
{"adId": "3741205918","adLibraryUrl": "https://www.linkedin.com/ad-library/detail/3741205918","advertiserName": "HubSpot","advertiserUrl": "https://www.linkedin.com/company/68529","advertiserLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQF8H-SLmMDZlA/company-logo_100_100/0/1646683330132/hubspot_logo","format": "SPONSORED_VIDEO","body": "See how revenue teams use AI to qualify leads faster and close more deals this quarter.","ctas": ["Learn more"],"paidBy": "HubSpot, Inc.","imageUrls": ["https://media.licdn.com/dms/image/v2/D4D10AQEehV4P19WRoA/image-shrink_1280/0/1782413657890/3.png"],"startUrl": "https://www.linkedin.com/ad-library/search?accountOwner=hubspot&countries=US&dateOption=last-30-days","scrapedAt": "2026-08-15T09:12:44Z"}
Each row is billed as one row_result event. Ads that can't be read or parsed are never pushed to the dataset, so every row you see and pay for is a real ad — there is no separate uncharged accounting row to filter out.
⚙️ How does it work?
LinkedIn Ads Scraper makes plain HTTP requests to the public Ad Library's search and detail pages — no headless browser is used. Requests optionally route through a small pool of Apify Proxy addresses resolved at the start of the run, and each retry opens a fresh session. Instead of trusting a 200 status code, the Actor checks that a response actually carries the Ad Library's own page markers before accepting it as real; a thin or blocked response is retried with backoff rather than parsed as empty. Every field is read from a specific, named element inside the ad's own preview or right-rail panel — nothing is inferred from surrounding page content. Only data the Ad Library already shows to any visitor is returned, and the output field names stay the same run to run even if LinkedIn changes its page layout underneath.
🔌 Integrations
LinkedIn Ads Scraper runs on the Apify platform, so it works with the same tools every Apify Actor does.
Calling LinkedIn Ads Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("your-username/linkedin-ads-scraper").call(run_input={"input": ["hubspot"],"countries": "US","maxItems": 40,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["advertiserName"], item["body"])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
MCP integration for AI agents
LinkedIn Ads Scraper can be exposed to MCP-compatible AI agents (Claude, and other MCP clients) through Apify's official MCP server. With APIFY_TOKEN set, register it with:
npx -y @apify/actors-mcp-server --actors your-username/linkedin-ads-scraper
Once registered, an MCP client can call the Actor as a tool and read its dataset directly.
No-code tools (n8n, Make, LangChain)
In n8n, use the Apify node (or a generic HTTP Request node) to start a run and poll the dataset. In Make, the Apify app module maps run input fields directly to this Actor's input schema. In LangChain, Apify's own integration can load a run's dataset directly into a document loader for a RAG pipeline.
⚖️ Is it legal to scrape LinkedIn ads?
Scraping publicly available web data is generally legal. LinkedIn Ads Scraper returns only what the public LinkedIn Ad Library already shows any visitor — ad creative, advertiser names, and "Paid for by" disclosures — which is business and commercial content, not personal data collected about private individuals. That means GDPR's rules on processing personal data generally do not attach to this dataset. You remain responsible for complying with LinkedIn's Terms of Service and any applicable database-rights law in your jurisdiction, and for how you store, reuse, or redistribute the advertiser and company data you collect. Consult legal counsel if your use case involves bulk storage of personal data.
❓ Frequently asked questions
What LinkedIn ad fields does LinkedIn Ads Scraper return?
The core fields are body (ad copy), format (creative type), ctas (call-to-action label), paidBy (funding entity), and imageUrls (creative images). See What data can I extract for the full list.
Does LinkedIn Ads Scraper require a LinkedIn account or login?
No. It reads only public LinkedIn Ad Library pages — no login, cookies, or account of your own are needed.
How many ads can I extract in one run?
Up to maxItems (default 10, maximum 1000), spread across the companies you list. ⚠️ The public Ad Library itself exposes up to 24 ads per company search, so the practical ceiling per company is 24 — list more companies to collect more ads in one run.
What happens if an advertiser has no ads, or a page can't be read?
If a company's ad list genuinely has no matches for your filters, the run logs it and moves on with an empty result for that company. If a page can't be read after 4 retries, that company's search (or that specific ad) is skipped and logged, and the rest of the run continues unaffected.
Why are some fields like ctas, advertiserLogo, or imageUrls empty?
Because those elements genuinely aren't on the ad's page. ctas is empty when the ad's creative carries no call-to-action button — many plain text-and-image posts don't have one. advertiserLogo is empty when the preview doesn't resolve a company logo. imageUrls is empty for ad formats (event, document, message-style ads) that don't show a creative image; company logos and member avatars are deliberately excluded from this field. Nothing is filled in to hide a missing value.
Can I scrape ads for multiple LinkedIn companies at once?
Yes. input is an array — list every company you want in one run, and the maxItems budget is spread evenly (round-robin) across the ones that return results, so a long first list can't crowd out the companies listed after it.
Does LinkedIn Ads Scraper work with Claude, ChatGPT, and other AI agent tools?
Yes. It's callable as an HTTP endpoint through apify_client by any agent framework, and it's reachable through Apify's official MCP server (@apify/actors-mcp-server) for MCP-aware clients like Claude.
Does LinkedIn Ads Scraper return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with consistent field names across runs — no HTML parsing or selectors needed. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when LinkedIn changes its Ad Library layout or anti-bot system?
The Actor is maintained, and its output schema is designed to stay the same shape even if LinkedIn's underlying page markup changes. No specific update turnaround is promised.
Can I use LinkedIn Ads Scraper without managing proxies or browser infrastructure?
Yes. A default run connects directly with no proxy setup. proxyConfiguration is optional and only worth enabling if your account policy requires a specific connection setup.
Which LinkedIn ad fields work best for AI training data and RAG indexing?
For RAG, body (the ad copy itself) and advertiserName are the highest-information text fields to index. For training data, format, ctas, paidBy, and scrapedAt are the most consistently structured fields across every record. All fields return as typed primitives — strings, or string arrays for ctas and imageUrls.
🔗 Related scrapers
| Scraper | What it extracts |
|---|---|
| Reddit-Ads-Scraper | Public sponsored posts collected from Reddit's ad-transparency data. |
| Instagram-Post-Details-Scraper | Public Instagram post content and engagement details. |
| Tiktok-Scraper | Public TikTok video and creator data. |
| Facebook-Video-Transcript-Extractor | Transcripts extracted from public Facebook videos. |
💬 Your feedback
Found a bug, or a field that should be there but isn't? Open an issue from the Issues tab on this Actor's Apify Console page, or reach out to the developer directly through the Actor's Store listing. Bug reports and field requests are what keep this scraper accurate as LinkedIn's Ad Library changes.