LinkedIn Ad Library Multi-Search Scraper avatar

LinkedIn Ad Library Multi-Search Scraper

Pricing

from $1.00 / 1,000 fast ad results

Go to Apify Store
LinkedIn Ad Library Multi-Search Scraper

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

Juyeop Park

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

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
  • full mode: 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

ChargePrice
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.001
Full = unique saved results × $0.002
Default-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.