LinkedIn Company Jobs Scraper & Monitor - New/Closed (No Login)
Pricing
from $3.50 / 1,000 company monitoreds
LinkedIn Company Jobs Scraper & Monitor - New/Closed (No Login)
LinkedIn company jobs scraper & monitor: track public company job pages as a reliable change feed with hiring signals: new openings, edits, reopenings & safely confirmed closures. No LinkedIn login or cookies. Optional official apply URLs, live status & ghost-job risk.
Pricing
from $3.50 / 1,000 company monitoreds
Rating
0.0
(0)
Developer
Kamer Ozkan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
LinkedIn Company Jobs Monitor - New, Changed & Closed Roles
Monitor public LinkedIn company job pages and turn them into a reliable change feed: new openings, edits, reopenings, and safely confirmed closures. Optionally add the official application URL, current job status, verification confidence, and ghost-job risk to the same row.
No LinkedIn login or cookies are required from the user. Apify Proxy is enabled by default to isolate company sessions and improve reliability.
What you get
new- first time a job is seenchanged- title, location, company, URL, or posting date changedreopened- a previously closed job reappearedclosed- absent from the configured number of complete scanscurrent- unchanged open job when full-snapshot mode is enabled- official apply URL and ATS provider when verification is enabled
low,review,high, orunknownghost-job risk- signed HTTPS webhook delivery for Slack relays, Make, Zapier, n8n, CRMs, and data pipelines
Unlike snapshot scrapers, repeated runs only return changes. State is preserved per watchlist so the dataset is ready for alerts, recruiting intelligence, sales triggers, and hiring-market research.
Set emitCurrentSnapshot: true when a full open-jobs snapshot is more useful than a
changes-only feed.
Quick start
{"companies": ["https://www.linkedin.com/company/tiny-spec-inc/"],"stateNamespace": "auto","closureConfirmationScans": 2,"verifyApplyLinks": true,"verificationMaxTotalChargeUsd": 2}
Accepted company inputs:
https://www.linkedin.com/company/tiny-spec-inc/- LinkedIn company jobs/search URLs containing
f_C - numeric LinkedIn company IDs such as
30920
Use the company's current canonical LinkedIn URL. If LinkedIn silently redirects an obsolete slug to an unrelated company, the Actor rejects it instead of returning a valid-looking dataset for the wrong organization.
Saved Tasks using stateNamespace: "auto" are isolated automatically. API callers
should set one stable, unique namespace per independent watchlist.
Each run accepts up to 100 companies. Split larger portfolios across Tasks with
different namespaces so every shard has an independent state and reliability score.
By default, the Actor scans up to 1,000 open jobs per company. The limit can be
raised to 5,000 for unusually large inventories. If the configured safety cap is
reached before completeness can be proven, the scan is marked incomplete and will
never close missing jobs.
One dataset, including verification
Official apply-link verification no longer creates a disconnected final result. The verification Actor runs as an enrichment step and the selected fields are merged into this Actor's default dataset:
The record below is unedited output from a live run on 2026-07-28: a real Slack
posting, detected as new and verified end to end in the same run, with the long
evidence array shortened here. Verification resolved the official Workday apply route.
{"jobId": "4420986388","title": "Staff ML Engineer, Fine Tuning - Slack","companyId": "1612748","companyName": "Slack","companyUrl": "https://www.linkedin.com/company/tiny-spec-inc","location": "San Francisco, CA","jobUrl": "https://www.linkedin.com/jobs/view/4420986388","postedAt": "2026-07-12","jobTitle": "Staff ML Engineer, Fine Tuning - Slack","eventType": "new","detectedAt": "2026-07-28T14:34:00.682Z","firstSeenAt": "2026-07-28T14:34:00.682Z","lastSeenAt": "2026-07-28T14:34:00.682Z","changedFields": [],"source": "linkedin_public_jobs","verificationStatus": "completed","officialApplyUrl": "https://salesforce.wd12.myworkdayjobs.com/Slack/job/Washington---Seattle/Staff-ML-Engineer--LLM-Fine-Tuning---Slack_JR344115","applyMethod": "OFFSITE","jobStatus": "ACTIVE","safeToPublish": true,"reviewRequired": false,"verificationConfidence": 0.97,"sourceProvider": "workday","companyWebsite": "https://slack.com/","verifiedAt": "2026-07-28T14:34:03.638822+00:00","verificationEvidence": ["linkedin_about_website_direct","linkedin_description_loaded","linkedin_apply_method:OFFSITE","verified_company_website_map","ats_link_on_career_page","official_site_inventory_miss:workday","(12 more evidence entries, shortened here)"],"ghostJobRisk": "low"}
Closed rows use verificationStatus: "not_applicable". If verification is disabled,
rows use not_requested; failures and cost-limit skips are also explicit.
When verification is enabled, at least 95% of submitted jobs must receive a result
by default. Otherwise the run fails without committing state, webhooks, or
company-scan billing, allowing a safe retry of the same events.
Verification is performed by
kamerozkan/linkedin-job-apply-link-verifier, which currently charges $0.004
per completed job decision. maxJobsToVerify and verificationMaxTotalChargeUsd
are hard cost guards; verification is off by default.
Example lifecycle events
The two events below were produced by the production diff engine replaying the real Slack board above through a monitoring cycle (one location edit, one removal), because neither change had yet occurred naturally in this watchlist's run history. Every field is real engine output. The same replay also proved the closure guard live: an incomplete scan with the same job missing advanced no counters and emitted nothing.
A tracked job edited its location; changedFields names exactly what moved:
{"jobId": "4430152298","title": "Senior Director, Product Management, Slackforce","companyId": "1612748","companyName": "Slack","companyUrl": "https://www.linkedin.com/company/tiny-spec-inc","location": "San Francisco, CA (Hybrid)","jobUrl": "https://www.linkedin.com/jobs/view/4430152298","postedAt": "2026-07-09","jobTitle": "Senior Director, Product Management, Slackforce","eventType": "changed","detectedAt": "2026-07-28T15:34:00.682Z","firstSeenAt": "2026-07-28T14:34:00.682Z","lastSeenAt": "2026-07-28T15:34:00.682Z","changedFields": ["location"],"source": "linkedin_public_jobs"}
A job missing from two consecutive complete scans, and only then, is closed:
{"jobId": "4435386808","title": "Slack Enterprise Account Executive - Amsterdam","companyId": "1612748","companyName": "Slack","companyUrl": "https://www.linkedin.com/company/tiny-spec-inc","location": "Amsterdam, North Holland, Netherlands","jobUrl": "https://www.linkedin.com/jobs/view/4435386808","postedAt": "2026-07-22","jobTitle": "Slack Enterprise Account Executive - Amsterdam","eventType": "closed","detectedAt": "2026-07-28T16:34:00.682Z","firstSeenAt": "2026-07-28T14:34:00.682Z","lastSeenAt": "2026-07-28T14:34:00.682Z","changedFields": [],"source": "linkedin_public_jobs"}
Pricing
- Company monitored: $0.01 per company scan
- Dataset output: $0.00001 per event row
- Actor start: $0.00005
- Optional verification child Actor: $0.004 per completed job decision
Platform usage for this monitoring Actor is included in its event pricing.
Daily monitoring
For production:
- Configure the companies and save the input as an Apify Task.
- Schedule the Task hourly or daily.
- Leave
stateNamespaceonautoto isolate each saved Task, or set a stable custom value. - Use a unique namespace when testing so production history is not changed.
Daily is the best default. Hourly runs suit fast sales or recruiting alerts. Runs sharing the same state store and namespace are protected by a renewable, crash-safe lease. If schedules overlap, the later run waits briefly for the first; if the lease stays busy, it exits before scanning, company charging, emitting events, or touching state. A hard crash releases the lease automatically within 90 seconds.
Webhook delivery
Set webhookUrl to an HTTPS endpoint. Every non-empty run sends enriched events in
batches. Add webhookSecret to receive an HMAC-SHA256 signature:
x-hiring-signals-signature: sha256=<hex digest of the exact request body>
A delivered batch looks like this. deliveryId and the HMAC signature below were
generated by the production webhook code for exactly this body, with secret
demo-secret:
{"destination": "https://hooks.example.com/hiring-signals","deliveryId": "8993c76a4a53a3b11d38bb26d54191680aa46ea1baa4122271c885b6e38c56bc","signatureHeader": "x-hiring-signals-signature: sha256=2783af63327704fbf6e5914c007dbef5d0e613eba141c8bf06a2c3a34d8a39a6","body": {"schemaVersion": "1.0","emittedAt": "2026-07-28T17:34:00.682Z","batchIndex": 0,"batchCount": 1,"events": ["(the enriched changed and closed events above, verbatim)"]}}
The webhook retries each batch three times. A failed batch remains in a durable
outbox inside the watchlist state store and is replayed with the same delivery ID,
body, and signature on the next run. Delivery status and pending batch counts are
included in the OUTPUT summary. A webhook failure never deletes dataset output
or silently drops an alert.
This Actor is also exposed to AI agents through Apify's MCP server (mcp.apify.com): an agent can discover it by search and run it with the same pay-per-event billing, with no separate integration.
Closure safety and pagination
LinkedIn's public guest endpoint can return variable page sizes. This Actor:
- reads the public search page's reported total as a coverage target
- forces LinkedIn's Worldwide scope instead of inheriting the crawler IP's country
- captures the larger first-page result set before requesting fragments
- keeps a stable cookie jar and proxy session for each company
- advances by the page size actually returned
- bypasses stale edge-cache fragments so pagination offsets are honored
- confirms an empty terminal page twice
- retries repeated or no-progress pages
- retries transient company failures up to eight times with a fresh network session
- uses all eight attempts when necessary to seek a closure-safe inventory
- fails fast on permanent invalid/removed company URLs instead of wasting retry sessions
- rejects canonical slug mismatches instead of silently scanning a different company
- unions complementary retry inventories so transient page shifts do not create gaps
- treats challenge pages and unverified empty HTML as incomplete, never as zero jobs
- marks capped or unstable scans as incomplete
- never closes a missing job after an incomplete scan
- does not charge the primary company-scan event for incomplete scans
- charges completed company scans only after dataset, outbox, and watchlist state commit
- requires two complete missing scans by default before emitting
closed - fails the run quality gate below 95% usable company coverage while preserving partial output
- enforces a 95% fully closure-safe gate by default with
strictClosureQualityGate
This favors false-negative closures over false positives.
The run-level success rate accepts a terminal snapshot only when it is complete or
has at least 98% of LinkedIn's reported inventory. A 98-99.99% snapshot is useful
for additions and analytics but remains complete: false, so it can never advance
missing-job counters or emit closures. closureSafeRate reports the stricter
fully-complete rate separately.
Privacy-minimized output
The output schema excludes recruiter names, personal profile links, emails, phone numbers, applicant identities, and raw job descriptions. It processes company job listings and job lifecycle facts.
This is privacy-minimized by design, not a blanket legal guarantee. Users remain responsible for applicable law, contractual terms, and how they use the output.
Run summary
The OUTPUT key-value-store record reports:
- requested, successful, failed, complete, and incomplete company scans
- completion rate, total scan attempts, fetched pages, and retry recoveries
- jobs seen and events emitted by type
- verification run and merged-result counts
- webhook delivery counts and failures
- durable webhook outbox pending/replayed counts
- state-lease ownership
- rolling 30-day scan and closure-safe SLOs; the window becomes mature after seven samples spanning at least six days
- pay-per-event billing counters
Local development
npm installnpm run checknpx apify-cli validate-schema