LinkedIn Ad Library Search Scraper
Pricing
from $6.00 / 1,000 ad records
LinkedIn Ad Library Search Scraper
Search public LinkedIn Ad Library ads by advertiser or keyword, with normalized creatives and EU transparency fields.
Pricing
from $6.00 / 1,000 ad records
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Search public LinkedIn Ad Library records by advertiser or creative keyword. This Actor returns normalized ad creatives, advertiser information, call-to-action links, and public EU transparency data when LinkedIn makes it available. It is designed for B2B competitive-intelligence teams, creative analysts, and AI agents that need a bounded JSON record rather than a browser export.
When to use this Actor
Use this Actor to research an advertiser's visible LinkedIn creative, discover ads that mention a product category, review campaign timing, or compare eligible EU transparency signals. Start with one advertiser or one keyword and a small result cap, then paginate only when the first result set is relevant. The default uses Microsoft so a new run is valid, fast, and easy to inspect. You do not need to supply LinkedIn cookies, a browser session, or a Campaign Manager account.
Do not use it for LinkedIn profiles, private Campaign Manager reporting, member data, lead lists, or exact ad-performance analytics. The output only reflects public Ad Library information made available by the underlying provider routes. LinkedIn documents that its Ad Library may be searched by company/advertiser, payer, keyword, country, and date range; LinkedIn also notes that ads remain in the library for one year after their last impression. LinkedIn Ad Library Help
What you receive
Each dataset item is one normalized public ad. Keys are stable across search-only and detail-enriched runs; unavailable fields are null or empty arrays, never omitted.
| Field | Meaning |
|---|---|
adId, adUrl | Public LinkedIn Ad Library identifier and detail page URL. |
advertiserName, advertiserLinkedInUrl | Disclosed advertiser identity and public LinkedIn company URL when returned. |
headline, description, adType, cta | The public creative text and format. |
destinationUrl, imageUrl, videoUrl | Public creative and landing-page URLs when returned. |
adRunStart, adRunEnd, estimatedImpressions | Transparency fields that LinkedIn may show for eligible ads. Impression ranges are not exact counts. |
impressionCountries, targetingSummary | Bounded country-share and targeting arrays in detailed mode. These are not a complete audience definition. |
searchType, searchTerm, searchCountries | Provenance showing how this record was found. |
sourceProvider, detailProvider, detailsFetched | The provider route used and whether optional detail enrichment succeeded. |
For ads targeted in the European Union, LinkedIn says the Ad Library can show estimated impressions, country-level impression breakdowns, targeting parameters, and dates the ad ran. Those fields are therefore descriptive transparency signals, not an exhaustive view of an advertiser's targeting. LinkedIn transparency help
Inputs
Use advertisers for a known company, for example Microsoft or HubSpot. Use keywords for creative-level research, for example CRM software. Supplying both creates independent advertiser and keyword searches so provenance remains clear. countries accepts ISO alpha-2 codes such as US, DE, and GB; leave it empty to avoid a country filter.
maxResults is the hard cap on persisted, primary-event-billed records. maxPagesPerSearch bounds provider pagination independently so you can control breadth before increasing the record cap. Optional startDate and endDate must use YYYY-MM-DD and may be used independently. Invalid dates, inverted ranges, invalid country codes, and unsupported enum values return an actionable INVALID_INPUT outcome without billing result events.
Set fetchAdDetails to true when you need a second provider call per saved record. Detail enrichment can provide fuller public creative, date, impression, country-share, and targeting values. Set it to false for faster creative discovery when the search response is enough. responseFormat: concise keeps array fields empty for smaller agent payloads; detailed includes bounded media, country, and targeting arrays.
Input examples
Console input
{"advertisers": ["Microsoft"],"countries": ["US", "DE"],"maxResults": 20,"maxPagesPerSearch": 1,"fetchAdDetails": true,"providerPreference": "scrapecreators-first","responseFormat": "detailed"}
JavaScript API
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('khadinakbar/linkedin-ad-library-search-scraper').call({keywords: ['CRM software'],countries: ['US'],maxResults: 10,fetchAdDetails: false,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python API
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('khadinakbar/linkedin-ad-library-search-scraper').call(run_input={'advertisers': ['HubSpot'],'maxResults': 10,'fetchAdDetails': True,'responseFormat': 'concise',})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item['advertiserName'], item['adUrl'])
Pricing
This Actor uses Pay per event + platform usage. Platform usage is billed separately by Apify; the result limit and the status message show the maximum event-charge envelope before collection begins.
| Event | Price | Charged when |
|---|---|---|
| Actor start | $0.00005 | Once per run, scaled by Actor memory. |
| Ad record | $0.006 | A complete normalized public ad record is persisted to the dataset. |
| Ad detail enrichment | $0.004 | Optional detail enrichment succeeds after that record has been saved. |
For example, a maximum of 10 detailed records has at most $0.10 in event charges ($0.06 record events + $0.04 detail events), plus platform usage. A search-only run at the same cap has at most $0.06 in record events, plus platform usage. The Actor never charges an ad-record event before its validated dataset row is written, and it never charges a detail event after a failed detail request.
Reliability and output outcomes
ScrapeCreators is the default provider route and SociaVault is the fallback. Both routes were probed for search and ad-detail field parity before this Actor was built. The Actor reports the attempted provider routes in RUN_SUMMARY without exposing provider credentials. It never accepts a user-supplied provider API key.
Every terminal path writes two key-value store records:
OUTPUTis the compact contract withoutcome, persisted counts, event counts, and safe warnings.RUN_SUMMARYcontains provider attempts, pages fetched, write failures, billing counters, and timestamps.
COMPLETE means all persisted records were collected without route or write warnings. PARTIAL means usable records were persisted but a search, detail, validation, or cost-cap condition prevented full completion. VALID_EMPTY means a valid provider search returned no matching ads. INVALID_INPUT means the request can be corrected by changing the supplied inputs. UPSTREAM_FAILED means every configured provider route failed or returned unusable data before any record could be saved. These outcome records let an agent distinguish no matches from an outage without parsing logs.
Limits and compliance
The Actor only returns public Ad Library data exposed by its configured providers. Restricted ads can have redacted previews or advertiser and payer fields, as LinkedIn describes in its Ad Library documentation. Data availability, field depth, and result counts can vary by country, date, and the underlying public record. Keep result caps small when exploring a new query, validate data against your own use case, and respect applicable laws, contractual obligations, and privacy requirements.
Related workflow
Use this Actor for public ad intelligence. Route LinkedIn profile or company enrichment to a dedicated profile/company Actor, and use a CRM or analytics system for private campaign performance. For long-running monitoring, save the exact input that produced useful results and compare future outputs by adId and adUrl rather than assuming a complete archive.