LinkedIn Ad Library Change Monitor avatar

LinkedIn Ad Library Change Monitor

Pricing

from $5.00 / 1,000 verified search units

Go to Apify Store
LinkedIn Ad Library Change Monitor

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

Monkey D. Scraping

Maintained by Community

Actor 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

CapabilityDetails
Data sourcePublic LinkedIn Ad Library, logged out
Search targetsAdvertiser, payer, keyword, or direct Ad Library URL
InputOne company or a list of monitored inputs
StatePrevious snapshot in the Actor key-value store
Change feedNew ads, disappeared ads, and new advertisers
Reference dataObserved ads with per-run coverage; named datasets accumulate observations
SchedulingDesigned for daily or weekly runs
AuthenticationNone required
AI enrichmentNone; 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

SituationOutput
First run for a new monitorId and scopeBaseline only; no change alerts
Complete run with an ad not in the previous snapshotnew
Complete run with a previous ad no longer presentdisappeared
Advertiser never seen in this monitor's historynew-advertiser
Result set truncated at maxResultsChange alerts are suppressed
LinkedIn challenge, block, or parser failurePrevious snapshot is preserved

This Actor vs similar LinkedIn Actors

CapabilityThis ActorSolidCode LinkedIn Ads ScraperJaybird LinkedIn Ad Library Scraper
Primary jobMonitor changes between scheduled runsExtract LinkedIn ads in bulkExtract LinkedIn ads and optional details
OutputChange events plus full snapshotFlat ad rowsFlat ad rows with basic/enriched modes
Stateful baselineYes, isolated by monitorIdNot the core workflowNot the core workflow
AlertsNew, disappeared, new advertiserConsumer compares results separatelyConsumer compares results separately
SearchAdvertiser, payer, keyword, direct URLKeyword, advertiser, direct URLCompany, payer, keyword, direct URL
Public/no loginYesYesYes

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:

ActorBest forMain output
Telegram Keyword Search & Channel ScraperPublic Telegram research and keyword discoveryMatching posts and channel data
Google Shopping Price Tracker & Seller MonitorProduct prices, offers, and seller monitoringChanged 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.

DestinationContentsHow to find it
Default datasetDelivered ads, run manifest and active verified-search evidenceOutput → Ads and run records, or the run's default dataset ID
Named changes datasetnew, disappeared and new-advertiser events, run summaries and company metricschangesDataset name in the run manifest
Named snapshot datasetDelivered ad observations collected by this monitorsnapshotDataset 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:

EventCurrent priceWhat is billed
apify-actor-start$0.00005 per memory unitAutomatically billed by Apify at startup: one unit per whole GB allocated, minimum one
ad-tracked$0.0005 per adEach normalized ad delivered in the snapshot dataset
change-detected$0.003 per changeEach 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 deliveredTotal 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

ActorWhen to use it
Hiring IntelligenceResearch public job postings and technology mentions for companies whose advertising you follow
Google News Scraper LiteCollect 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.