LinkedIn Ad Library Multi-Search Scraper
Pricing
from $1.00 / 1,000 fast ad results
LinkedIn Ad Library Multi-Search Scraper
Search the public LinkedIn Ad Library across multiple companies, ad text keywords, and payer names. Collect ad creatives in fast mode or add public transparency, impression, targeting, and landing-page fields in full mode.
Pricing
from $1.00 / 1,000 fast ad results
Rating
0.0
(0)
Developer
Juyeop Park
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
This is an independent, unofficial tool. It is not affiliated with, endorsed by, or sponsored by LinkedIn. It only reads information exposed by the public LinkedIn Ad Library and does not accept LinkedIn credentials, cookies, or member data.
Search multiple company names, ad text keywords, and payer names in one run. Results from every search are merged by LinkedIn ad ID, while the matches field preserves exactly which searches found each ad.
Use Fast mode for affordable creative research or Full mode when you need the public transparency fields LinkedIn exposes on individual ad pages.
What it collects
- Advertiser name, company ID and public company URL
- Ad format, text, headline, CTA, creatives, and source URL
- Every matching company, keyword, or payer search with its rank
fullmode: public payer name, run period, landing URL, impression range, country breakdown, and targeting- Restricted ads as explicit rows without inventing hidden values
The Actor does not scrape LinkedIn profiles, emails, contacts, or logged-in content.
Input
Provide at least one value in companyNames, keywords, or payerNames. Across the three lists, you can submit up to 20 unique searches.
{"companyNames": ["HubSpot", "Salesforce", "Monday.com"],"keywords": ["CRM", "AI agent"],"countries": ["US", "GB", "DE"],"dateOption": "last-30-days","detailMode": "fast","maxResultsPerSearch": 25,"maxTotalResults": 100}
Date filters
Choose last-30-days, current-month, current-year, last-year, or custom-date-range. A custom range requires both dates, must stay within the most recent year, and must end no later than the previous UTC day because LinkedIn only exposes completed days.
{"keywords": ["cybersecurity"],"countries": ["FR", "DE"],"dateOption": "custom-date-range","startDate": "2026-07-01","endDate": "2026-07-23","detailMode": "full"}
ALL must be used by itself. Otherwise, use up to five ISO two-letter country codes.
Fast and Full modes
fast mode returns fields visible on search cards and is the best choice for
creative discovery and competitor monitoring. It costs $0.001 per saved
result.
full mode opens each public ad detail page and costs $0.002 per saved
result. LinkedIn only exposes some transparency fields for eligible ads and
regions. Missing non-EU transparency data is returned as null and is not
considered an error. If a detail page fails, the search-card result is retained
with detailStatus: "failed".
Output
Each Dataset row represents one unique ad ID:
{"adId": "1455310303","matches": [{"type": "company","value": "JetBrains","rank": 1,"countries": ["FR", "DE"],"searchUrl": "https://www.linkedin.com/ad-library/search?accountOwner=JetBrains"}],"advertiser": {"name": "JetBrains","companyId": "12515","companyUrl": "https://www.linkedin.com/company/12515","logoUrl": "https://media.licdn.com/..."},"payerName": "JetBrains s.r.o.","adFormat": "Single Image Ad","adText": "Build better software.","headline": "Try IntelliJ IDEA","ctaLabel": "Learn more","landingUrl": "https://www.jetbrains.com/idea/","creatives": [{"type": "image","url": "https://media.licdn.com/...","thumbnailUrl": null}],"runPeriod": {"startDate": "2026-07-22","endDate": "2026-07-23"},"restricted": false,"impressions": {"display": "30k-50k","min": 30000,"max": 50000,"byCountry": [{ "country": "France", "percentage": 60 }]},"targeting": [{"category": "Location","included": ["France", "Germany"],"excluded": []}],"detailStatus": "complete","retrievalMode": "http","sourceUrl": "https://www.linkedin.com/ad-library/detail/1455310303","scrapedAt": "2026-07-24T00:00:00.000Z"}
The default Key-Value Store record SUMMARY contains search-level statuses, raw and deduplicated counts, confirmed empty searches, partial results, browser fallbacks, bounded error messages, final output count, and billing-limit state. Summary data is never mixed into the Dataset.
Empty results and blocking
An HTTP page is considered empty only when LinkedIn shows an explicit empty-result message. A 403, 429, error shell, meaningless 404, or page without both ads and empty-result evidence is treated as blocking or a parse failure.
HTTP requests retry twice with a new session. Independent HTTP searches run with a maximum concurrency of five. If a search still fails, only that search is reprocessed in a browser, with at most two browser fallbacks at once. A run succeeds partially when at least one search succeeds. It fails only when every search is blocked or unparsable; an all-empty run succeeds normally.
Pricing
| Charge | Price |
|---|---|
| Fast saved result | $0.001 |
| Full saved result | $0.002 |
| Actor start event | $0.00005 per charged start unit |
That is $1 per 1,000 Fast results or $2 per 1,000 Full results, plus the
small start event. Apify automatically scales the synthetic start-event count
with allocated memory; at the default 1 GB, a run charges one start unit for a
total of $0.00005. The start event also makes the first five seconds of
compute eligible for Apify's PPE startup coverage.
The minimum maximum charge is $0.0022, which supports a default-memory start,
one Full result, and a small safety margin. Set a higher maximum charge when
requesting more results.
Before Full detail work, the Actor checks how many full-ad-result events still
fit within the user's limit. Fast mode checks fast-ad-result instead. Each row
is validated, saved, and charged together. When another result cannot be
charged, the Actor stops and records chargeLimitReached: true in SUMMARY.
Result estimate:
Fast = unique saved results × $0.001Full = unique saved results × $0.002Default-memory start = $0.00005
SUMMARY.pricing records the observed Fast, Full, and start prices and whether
they match the release contract. Production runs refuse to start when the
deployed PPE configuration differs from this contract, preventing accidental
misbilling.
Run through the API
Run and wait for Dataset output with an Apify API token in the authorization header:
curl --request POST \"https://api.apify.com/v2/acts/jy-labs~linkedin-ad-library-multi-search-scraper/run-sync-get-dataset-items?format=json&clean=true" \--header "Authorization: Bearer $APIFY_TOKEN" \--header "Content-Type: application/json" \--data '{"companyNames": ["HubSpot", "Salesforce"],"countries": ["US", "DE"],"detailMode": "fast","maxResultsPerSearch": 10,"maxTotalResults": 20}'
For larger runs, start the Actor asynchronously with /runs, then read the
default Dataset and the SUMMARY record using the storage IDs returned by the
run.
Common use cases
- Compare LinkedIn ads from multiple competitors
- Search B2B categories such as CRM, cybersecurity, or AI agents
- Find ads by the disclosed payer entity
- Inspect public EU impression and targeting transparency
- Compare creative strategies across countries
FAQ and troubleshooting
Why did a successful search return zero rows?
confirmed_no_results means LinkedIn explicitly showed that no ads matched the
filters. Broaden the date range, use ALL, or try the advertiser's exact public
name. A blocked or ambiguous page is never reported as an empty result.
Why are impressions or targeting null?
LinkedIn exposes these fields only for eligible ads and regions. Use Full mode
and include relevant European countries. Missing public transparency data is
represented as null; the Actor does not infer it.
What does completed_partial mean?
At least one search succeeded, but another search, pagination page, or detail
page was unavailable. Review SUMMARY.searches, detailErrors, and
browserFallbackSearches. Successfully collected card rows remain in the
Dataset.
Why did output stop before maxTotalResults?
The run's maximum charge may not allow another result. Increase the maximum
charge and rerun. SUMMARY.chargeLimitReached distinguishes this from search
limits or deduplication.
Does the Actor require a LinkedIn account?
No. It accepts no LinkedIn login, cookie, or member data and reads only the public Ad Library.
Responsible use
You are responsible for using the output in accordance with applicable laws, LinkedIn's current terms, robots policies, and Apify's platform rules. Public web content can change without notice. Before Store publication, the latest relevant policies must be reviewed; if publication is not permitted, keep the Actor private.