LinkedIn Jobs Monitor avatar

LinkedIn Jobs Monitor

Pricing

from $1.50 / 1,000 new jobs

Go to Apify Store
LinkedIn Jobs Monitor

LinkedIn Jobs Monitor

The LinkedIn Jobs Monitor watches job searches on a schedule and returns only postings that were not there before β€” capturing titles, companies, locations, posted dates, salaries, seniority and applicant counts, with no charge on days when nothing new appears.

Pricing

from $1.50 / 1,000 new jobs

Rating

0.0

(0)

Developer

FalconScrape

FalconScrape

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

πŸš€ LinkedIn Jobs Monitor

Watch LinkedIn job searches on a schedule and get back only the postings that weren't there last time.

Every other LinkedIn job scraper is one-shot: run it today, run it tomorrow, and tomorrow you get the same 900 jobs back plus a handful of new ones β€” and you pay for all 900 again. This monitor remembers every job it has already reported to you, forever, and hands you only the difference.

Point it at your searches, put it on a daily schedule, and you have a job feed instead of a job dump.

✨ Features

  • Only new jobs, ever. Each run is compared against everything the monitor has reported before, keyed on LinkedIn's own job ID. A job you've already seen is never delivered twice and never charged twice.
  • Quiet days are free. No start fee, no per-check fee. If nothing new was posted, the run finds nothing, charges nothing, and finishes successfully β€” it doesn't fail and it doesn't wake you up.
  • Memory that survives. The seen-list is stored permanently in your own account, so it works across weeks and months of scheduled runs, not just within one run.
  • Multiple titles and locations in one monitor. Every keyword is watched against every location.
  • Two levels of depth, so you pay for what you need:
    • Listing β€” title, company, location, posted date, logo, links
    • + Job detail β€” full description, posted salary parsed into min/max/currency/period, seniority, employment type, job function, industries, applicant count, apply type
  • Worldwide by default. Leave the location empty and you watch everywhere, not just the country the server happens to sit in.
  • Only filters that actually work. Posted-within window, keyword and location genuinely narrow the search. Workplace type, experience level, job type and salary band are deliberately not offered: LinkedIn accepts them on this endpoint and then ignores them, so exposing them would hand you unfiltered data that looks filtered.
  • Nothing is silently dropped. If a run stops at your item limit, the jobs it didn't reach stay unreported and are picked up by the next run. Every run writes a RUN_SUMMARY saying what it found, what it already knew, and why it stopped.
  • No proxy needed. Runs clean without one; proxy support is there as a fallback for high volume, not a requirement.

πŸ› οΈ How It Works

  1. Enter the keywords and locations you want to watch.
  2. Pick a posted within window β€” how far back each run looks.
  3. Run it once. The first run has no history, so it reports everything it finds and becomes your baseline.
  4. Put it on a schedule (see below). Every run after that returns only what's new.

⏰ Setting up the schedule

In the Apify Console, open the actor β†’ Schedules β†’ Create new schedule, pick a frequency (daily is the usual choice) and attach this actor with your input. That's it β€” no other configuration is needed. The monitor picks up its own memory on every run.

Match the posted within window to how often you run it, with room to spare:

ScheduleSuggested window
HourlyPast 24 hours
DailyPast 3 days
WeeklyPast week

A wider window than your schedule strictly needs costs a few extra requests and finds nothing extra to charge you for β€” anything already reported is filtered out. A window that's too tight is the one that can miss jobs, if a run is ever delayed.

πŸ”‘ Monitor ID

By default the memory is tied to the exact keywords, locations and window you entered β€” so editing any of them starts a fresh monitor, and the next run re-reports everything as new.

If you expect to tweak a query over time (add a job title, add a city), set a Monitor ID such as eu-engineering. Runs sharing an ID share one memory, so you can change the query without being sent your whole feed again.

πŸ”” Getting notified when there's something new

Open the actor β†’ Integrations and connect Slack, email, a webhook, Zapier or Make to the ACTOR.RUN.SUCCEEDED event.

One thing to set up correctly, because it is easy to get wrong: Apify only has run-state events β€” CREATED, SUCCEEDED, FAILED, ABORTED, TIMED_OUT, RESURRECTED. There is no "only if the dataset has rows" trigger. A run that finds nothing new succeeds with an empty dataset by design, so a plain "notify me on success" hook will ping you every single day whether or not there is anything to see β€” which is exactly the noise this actor exists to remove.

Filter on the run's own numbers instead. Every run writes a RUN_SUMMARY record to its key-value store:

{ "newJobs": 12, "jobsChecked": 240, "alreadyReportedBefore": 228, "remembered": 1043 }
  • Webhook / Zapier / Make β€” read newJobs from RUN_SUMMARY (or the dataset item count) and drop the event when it's 0.
  • Slack / email integration β€” send the dataset, and add a filter step for a non-empty result before the message goes out.

Set that up once and a quiet week is genuinely silent.

πŸ“‹ Output Fields

Listing (every run)

FieldDescription
jobIdLinkedIn job posting ID β€” the key the monitor remembers
jobUrlCanonical LinkedIn job URL
titleJob title
companyNameHiring company name
companyUrlCompany LinkedIn URL, normalised so it works as a join key
companySlugCompany slug
locationJob location
postedDatePosting date (YYYY-MM-DD)
postedTimeAgoRelative posting age, e.g. "10 hours ago"
companyLogoCompany logo image
sourceQueryWhich watched search this job came from
scrapedAtISO 8601 timestamp of when the monitor first found the job

Job detail

FieldDescription
descriptionFull job description text
salaryTextPosted salary range as displayed
salaryMin / salaryMaxParsed salary bounds
salaryCurrency / salaryPeriodCurrency, and year / hour / month
seniorityLevelEntry level, Mid-Senior level, ...
employmentTypeFull-time, Part-time, Contract, ...
jobFunctionJob function
industriesIndustries
applicantCountApplicant count as a number
numApplicantsCaptionApplicant caption as displayed
applyTypeeasyApply or offsite (external ATS)
jobTitle / jobLocationTitle and location from the posting page
criteriaOriginal name/value criteria list
similarJobsSimilar jobs LinkedIn surfaces alongside this posting
peopleAlsoViewedJobs that viewers of this posting also viewed

Salary is only present where the employer posts it β€” common in the US, rare elsewhere. Fields with no data are null, never invented.

πŸ“Š Sample Output Data

{
"jobId": "4448051837",
"jobUrl": "https://www.linkedin.com/jobs/view/4448051837",
"title": "Public Health Nurse I - Limited Service",
"companyName": "State of Vermont",
"companyUrl": "https://www.linkedin.com/company/state-of-vermont",
"companySlug": "state-of-vermont",
"location": "Newport, VT",
"postedDate": "2026-08-05",
"postedTimeAgo": "10 hours ago",
"companyLogo": "https://media.licdn.com/dms/image/v2/C4E0BAQEQo8ZcYGAzIQ/company-logo_100_100/0/1631332078814",
"sourceQuery": "f_TPR=r604800&keywords=registered nurse&location=Vermont",
"scrapedAt": "2026-08-06T05:32:01.291Z"
}

With job detail depth, each new job also carries the description, parsed salary, seniority and applicant count:

{
"jobId": "4419374453",
"title": "Associate, Scoring Service",
"companyName": "Pearson",
"location": "Montana, United States",
"postedDate": "2026-08-01",
"salaryText": "$19.50 - $33.99",
"salaryMin": 19.5,
"salaryMax": 33.99,
"salaryCurrency": "$",
"salaryPeriod": "hour",
"seniorityLevel": "Not Applicable",
"employmentType": "Full-time",
"jobFunction": "Other",
"industries": "Education Administration Programs and E-Learning Providers",
"applicantCount": 25,
"applyType": "offsite"
}

Each run also writes a RUN_SUMMARY to the key-value store:

{
"newJobs": 12,
"jobsChecked": 240,
"alreadyReportedBefore": 228,
"remembered": 1043,
"truncated": false,
"truncationReason": null,
"searchRequests": 24
}

πŸ’° Pricing

Pay only for jobs you haven't already been given:

EventPrice (Free plan)Price (Gold plan)
New job found$0.004$0.0015
New job with full details$0.006$0.0025

There is no run fee and no monitoring fee. A scheduled run that finds nothing new costs nothing at all, so watching a quiet niche is free until it stops being quiet.

A daily monitor turning up 20 new jobs a day costs about $2.40/month on the Free plan and $0.90/month on Gold.

❓ FAQ

What happens on the very first run? It has no history, so everything it finds is new and gets reported β€” that's your baseline. Keep maxItems low on the first run if you're watching a broad search and don't want the whole backlog.

I changed my keywords and got everything again. Why? By default the memory is tied to the exact query. Set a Monitor ID and reuse it, and you can edit the query freely without losing history.

Will it ever send me the same job twice? Only if a run is interrupted between delivering a job and saving its memory β€” the monitor deliberately errs toward a duplicate rather than silently dropping a job you paid to be told about.

Does zero results mean it's broken? No. Zero new jobs is the normal outcome on a quiet day and the run succeeds. A run only fails when LinkedIn actually refuses the search.

Do I need a LinkedIn account or cookies? No. Only publicly visible job data is collected.

I want the whole search, not just what's new. Use the LinkedIn Jobs Search Scraper, which goes past LinkedIn's 1,000-result cap in a single run. For all open roles at named companies, use the LinkedIn Company Jobs Scraper.

πŸ”— More LinkedIn Actors

Same data source, different slice: