LinkedIn Ad Library Change Monitor
Pricing
from $5.00 / 1,000 verified search units
LinkedIn Ad Library Change Monitor
Collect public LinkedIn Ad Library ads and monitor verified changes across complete snapshots.
Pricing
from $5.00 / 1,000 verified search units
Rating
0.0
(0)
Developer
Monkey D. Scraping
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Collect public LinkedIn Ad Library ads by advertiser, payer, keyword or a search URL. The default dataset contains observed ads and a run manifest. Complete snapshots can also be compared with the previous baseline to record new ads, ads missing from the verified search results and newly observed advertisers in a named changes dataset.
This is a deterministic LinkedIn advertising monitor for competitive intelligence, campaign tracking, lead-generation research, and daily or weekly alerts. It uses no login, cookies, AI, or external Actor.
At a glance
| Capability | Details |
|---|---|
| Data source | Public LinkedIn Ad Library, logged out |
| Search targets | Advertiser, payer, keyword, or direct Ad Library URL |
| Input | One company or a list of monitored inputs |
| State | Previous snapshot in the Actor key-value store |
| Change feed | New ads, disappeared ads, and new advertisers |
| Reference data | Observed ads with per-run coverage; named datasets accumulate observations |
| Scheduling | Designed for daily or weekly runs |
| Authentication | None required |
| AI enrichment | None; deterministic normalization and set comparison |
What this Actor does
- Tracks one company or a list of competitors in one run.
- Searches by advertiser, payer, keyword, or a direct LinkedIn Ad Library URL.
- Detects new LinkedIn ads and ads that disappeared since the previous complete run.
- Flags a new advertiser appearing in the monitored results.
- Preserves a full current snapshot for audit and historical comparison.
- Calculates active-ad count, ads first seen in the period, average observed longevity, format mix, and payer-to-advertiser mapping.
- Keeps state isolated by
monitorId, so separate competitors, users, and schedules do not share baselines.
Search phrases this Actor answers
- track competitor LinkedIn ads
- monitor LinkedIn Ad Library
- get alerts on new LinkedIn ads
- detect when competitor ads disappear
- see which companies advertise on LinkedIn
- track LinkedIn advertiser and payer activity
- compare competitor ad campaigns over time
- export LinkedIn ad change events to a dataset
Why the change feed is useful
Most ad-library scrapers return a flat dump that must be compared manually. This Actor does the set comparison for you. The first run creates a baseline and intentionally emits no new alerts. Later complete runs emit only differences, so the changes dataset is suitable for schedules, downstream automations, and daily review.
Results are conservative: if LinkedIn truncates the page at maxResults, returns a challenge/block page, or produces an unparseable empty response, the previous snapshot is not replaced and false disappearance alerts are avoided.
Event semantics
| Situation | Output |
|---|---|
First run for a new monitorId and scope | Baseline only; no change alerts |
| Complete run with an ad not in the previous snapshot | new |
| Complete run with a previous ad no longer present | disappeared |
| Advertiser never seen in this monitor's history | new-advertiser |
Result set truncated at maxResults | Change alerts are suppressed |
| LinkedIn challenge, block, or parser failure | Previous snapshot is preserved |
This Actor vs similar LinkedIn Actors
| Capability | This Actor | SolidCode LinkedIn Ads Scraper | Jaybird LinkedIn Ad Library Scraper |
|---|---|---|---|
| Primary job | Monitor changes between scheduled runs | Extract LinkedIn ads in bulk | Extract LinkedIn ads and optional details |
| Output | Change events plus full snapshot | Flat ad rows | Flat ad rows with basic/enriched modes |
| Stateful baseline | Yes, isolated by monitorId | Not the core workflow | Not the core workflow |
| Alerts | New, disappeared, new advertiser | Consumer compares results separately | Consumer compares results separately |
| Search | Advertiser, payer, keyword, direct URL | Keyword, advertiser, direct URL | Company, payer, keyword, direct URL |
| Public/no login | Yes | Yes | Yes |
The positioning is intentionally different: those Actors are optimized for extracting ad data, while this Actor is optimized for recurring monitoring and a ready-to-use change feed. Check each Actor’s Pricing tab for its effective prices.
Other Actors from the same publisher
Use these complementary Actors for a broader monitoring workflow:
| Actor | Best for | Main output |
|---|---|---|
| Telegram Keyword Search & Channel Scraper | Public Telegram research and keyword discovery | Matching posts and channel data |
| Google Shopping Price Tracker & Seller Monitor | Product prices, offers, and seller monitoring | Changed offers and product snapshot |
Output datasets
The default dataset contains delivered ad rows (recordType: snapshot) and a run-manifest. When verified-search billing is active, it also contains verified-search evidence records. Ads are saved before their batch charge, so already delivered data remains accessible if a later step fails.
Start with Ads and run records to read advertiser, ad ID, text, format, source URL and collection time. Use Run coverage to inspect completeness, failed or skipped inputs and the names of the two monitor-specific datasets. These views choose columns; they do not filter record types. API consumers can use recordType to distinguish ads from diagnostics.
| Destination | Contents | How to find it |
|---|---|---|
| Default dataset | Delivered ads, run manifest and active verified-search evidence | Output → Ads and run records, or the run's default dataset ID |
| Named changes dataset | new, disappeared and new-advertiser events, run summaries and company metrics | changesDataset name in the run manifest |
| Named snapshot dataset | Delivered ad observations collected by this monitor | snapshotDataset name in the run manifest |
The named datasets accumulate history across runs. Use observedAt to select one collection; they are not overwritten with a latest-only table. A delivered snapshot can be partial: read coverage before treating it as a complete inventory. sourceUrl identifies the public search/source page and is not necessarily a direct ad-detail URL. adId is a public identifier when available, with a stable derived fallback.
State is updated only after a complete collection and successful output writes. Capped, blocked or incomplete collection preserves the previous baseline and suppresses change alerts. The first complete collection establishes a baseline and produces no change events.
Input example
{"monitorId": "acme-competitors-weekly","advertisers": ["OpenAI", "Anthropic"],"country": "IT","dateRange": "30d","searchType": "advertiser","maxResults": 100}
Use the same monitorId and filter scope on recurring runs. Changing the scope intentionally starts a new baseline instead of creating false changes.
Pricing and spending limits
The Pricing tab is the source of truth for the prices effective for your run. Current events are:
| Event | Current price | What is billed |
|---|---|---|
apify-actor-start | $0.00005 per memory unit | Automatically billed by Apify at startup: one unit per whole GB allocated, minimum one |
ad-tracked | $0.0005 per ad | Each normalized ad delivered in the snapshot dataset |
change-detected | $0.003 per change | Each emitted new-ad, disappeared-ad, or new-advertiser event |
Scheduled verified-search pricing
A confirmed pricing change adds advertiser-checked at $0.005 per verified search memory unit, effective 24 October 2026 at 17:28 UTC. This new fee is inactive unless the effective Pricing tab includes it. The code uses the effective run pricing, so a pending change does not activate the fee early.
One unique search uses one unit per whole GB of allocated RAM, rounded up, with a minimum of one. At 1 GB, a search costs $0.005; at 2 GB, it costs $0.010, before ads and change events. Duplicate inputs that resolve to the same search URL are searched once. Internal retries do not generate a second check fee.
A verified search means a valid public Ad Library response with parseable ads or an explicit empty result. A valid search with zero ads is billed; a blocked page or unverified empty response is not billed for this event. A capped or incomplete collection can deliver ads and incur this search fee, but does not update the baseline or emit change alerts. When active, a verified-search record is saved in the default dataset before this fee is charged.
When this scheduled fee is effective, example totals for one search at 1 GB, with no change events, would be:
| Ads delivered | Total including startup, search and ads |
|---|---|
| 0 | $0.00505 |
| 1 | $0.00555 |
| 100 | $0.05505 |
Change events add $0.003 each. These are conditional examples, not a statement that the scheduled fee is already active. Use 1 GB for typical searches; allocating more RAM increases memory-based events. Set a spending limit that covers your selected memory, all searches, ads and possible changes. A search is skipped before navigation if the remaining budget cannot cover all its check units. Skipped inputs appear in skippedCompanies and preserve their previous baseline.
Dataset manifests, search-evidence records and aggregate metrics do not create additional item charges. The first complete collection creates a baseline and emits no change events.
Reliability and limitations
The source is LinkedIn's public Ad Library, so its availability, pagination, markup, and fields can change. No login or private LinkedIn data is accessed. Run a weekly smoke test and verify that both named datasets receive records before relying on alerts in production.
The Actor blocks ad images, video and fonts to reduce browser traffic while retaining scripts, data requests and stylesheets needed for collection. Source latency and startup times vary; no fixed speed or cost is guaranteed.
Verified result coverage
Change events require both the current snapshot and the saved baseline to have verified coverage. The Actor compares the loaded card count with LinkedIn's visible result total (English and Italian result headings). A pause in infinite scrolling is never evidence that all ads were loaded. Unknown totals, partial loading, parser mismatches, access failures and spending limits preserve the prior baseline and suppress change events. If the search has more results than maxResults, narrow the search or increase the limit before expecting change events.
The default dataset's run manifest exposes per-company coverage (reportedTotal, loadedCount, deliveredCount, complete, reason, stateUpdated) and failedCompanies, skippedCompanies, and the effective billing mode. Previously saved baselines from older versions are refreshed without emitting changes on the first fully verified collection. A partial collection is still available in the snapshot dataset; it does not update the baseline.
Run npm test for coverage regression tests, including a slow-loading 18 → 31 → 89 sequence, missing counters, empty results, caps and legacy baseline migration.
Country and date filters
For company, payer and keyword searches, country accepts a two-letter country code such as IT, or an empty value for all countries. dateRange accepts 30d (alias for last-30-days), last-30-days, current-month, current-year, last-year, a custom interval such as 2026-10-05..2026-10-06, or an empty value for all dates. Unsupported filter values fail explicitly instead of returning an unfiltered search. Direct Ad Library URLs retain the filters already present in the URL; use the search form on LinkedIn to generate them.
The filter correction starts a fresh baseline for existing monitors. The first complete run after this update emits no change events, preventing unfiltered historical results from being compared with correctly filtered results.
Named output datasets accumulate observations across runs. Filter records by observedAt to inspect one run; a partial collection is not a complete current snapshot. disappeared means absent from the verified search results, not a confirmed campaign shutdown. For multi-company runs, allow enough execution time for retries and dataset writes; the recovery tests use a 360-second run timeout and a spending cap.
First run and collection failures
The Console includes a small example: OpenAI ads in Italy during the last 30 days, capped at 5 ads. Replace the company and use a unique monitor ID for each independent monitor. A capped, incomplete snapshot does not trigger change comparisons. If a monitored input cannot be collected after retries, the run fails and lists it in failedCompanies in the run manifest. Previously stored snapshots for failed inputs are preserved. Successful inputs may still deliver snapshots in their named dataset.
More Actors from this publisher
| Actor | When to use it |
|---|---|
| Hiring Intelligence | Research public job postings and technology mentions for companies whose advertising you follow |
| Google News Scraper Lite | Collect headlines and source links for brand or competitor research alongside ad observations |
Real observed output excerpt
Reduced snapshot from an owner verification run on 13 October 2026, using OpenAI, Italy and the last-30-days search. Values are preserved from that observation and do not establish that the ad is still active. Creative text and other fields are omitted for readability.
{"recordType": "snapshot","adId": "1588837714","advertiser": "OpenAI for Business","format": "SPONSORED_STATUS_UPDATE","sourceUrl": "https://www.linkedin.com/ad-library/search?accountOwner=OpenAI&countries=IT&dateOption=last-30-days","observedAt": "2026-10-13T13:07:29.499Z"}
This run saved one ad snapshot and a separate run-manifest; two dataset rows therefore did not mean two ads. The manifest reported loadedCount 1 and reportedTotal 1 for this specific search. That does not establish complete advertising coverage across countries, advertisers or later dates. sourceUrl is the search page used, not a unique ad detail URL. This is an owner verification sample, not proof of customer revenue or advertiser spend.