LinkedIn Jobs Scraper & Hiring Signals avatar

LinkedIn Jobs Scraper & Hiring Signals

Pricing

from $15.60 / 1,000 job results

Go to Apify Store
LinkedIn Jobs Scraper & Hiring Signals

LinkedIn Jobs Scraper & Hiring Signals

LinkedIn jobs scraper for public job listings and hiring signals. Compare prior snapshots for new listings, repost candidates and evidence-based closure signals, with scoped company hiring counts.

Pricing

from $15.60 / 1,000 job results

Rating

0.0

(0)

Developer

daehwan kim

daehwan kim

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

Share

Collect public LinkedIn job listings for a bounded set of keywords and locations. Compare an earlier dataset to see newly observed listings, repost candidates and evidence-backed closure suspicions. Each job includes company counts for the observed search scope; these are not company-wide hiring totals.

Quick start

All inputs are arrays, including numbers and switches. Explicit acknowledgement is required; the UI does not pre-accept it for you. The included prefill.json is an acknowledged validation example with one keyword, one location and ten results:

{
"keywords": ["software engineer"],
"locations": ["New York, United States"],
"maxResults": [10],
"datePostedDays": [7],
"proxyModes": ["RESIDENTIAL"],
"comparisonModes": ["snapshot"],
"disclaimerAck": ["accepted"]
}

Use up to five keywords and two locations, with maxResults between 1 and 300. Search combinations are visited in rounds; a reached result cap means the search is incomplete. jobUrls accepts up to 100 public LinkedIn job URLs; set keywords and locations to empty arrays for direct jobs only.

previousDatasetIds: ["YOUR_DATASET_ID"] supplies one accessible dataset produced by this Actor. Set comparisonModes: ["compare"] to request comparison. A missing baseline produces no_baseline; access/schema problems produce baseline_unavailable; different search scopes produce scope_mismatch. Baselines are limited to 2,000 observations and are read in pages. The originating run must have succeeded and its final coverage manifest is checked, so interrupted or partially delivered datasets cannot silently become complete baselines. No arbitrary HR or applicant datasets are supported.

Results and uncertainty

Every result exposes all 83 documented keys. id, jobId and canonicalJobId share a job ID. url, link and jobUrl share its canonical URL; title and jobTitle share its title. fieldAvailability distinguishes observed data from unmeasured or policy-excluded fields. The exact field contract is in src/row-schema.json.

comparisonStatus is comparable only when both matching scopes were completed. isNew means absent in that comparable baseline, not a confirmed new publication. isReposted is a candidate with the same company ID, normalized title and location, a different job ID and a later observed publication date. A changed date on the same job ID is recorded separately. Missing dates remain unknown.

A listing disappearing from search is not enough to mark it closed. closure_suspected requires a matching completed scope plus an explicit closure message or HTTP 404/410 on the public detail page. Closure is never asserted from login, captcha, throttling, timeout or a changed parser. Closure records are uncharged status records. companyDelta is withheld on incomplete coverage. No company summary rows are added.

For a first capped run, a typical observation has recordType: "active_job", comparisonStatus: "no_baseline", coverageComplete: false, and null change flags. On a capped comparison, the status is incomplete. OUTPUT in the key-value store reports request counts, blocking rate, reasons, runtime and billing mode even when no job row is produced.

Billing

The platform-managed apify-actor-start costs $0.001 once per run in every tier, including input rejection, zero results, blocked requests and failed runs. The code never charges a second startup event. job-result applies to each validated, unique active-job row delivered. Comparison signals and scoped company aggregation are included.

PlanStartup per runJob result per row
FREE$0.001$0.0300
BRONZE$0.001$0.0240
SILVER$0.001$0.0195
GOLD$0.001$0.0156
PLATINUM$0.001$0.0156
DIAMOND$0.001$0.0156

At the FREE base price, 100 delivered jobs cost $3.001; zero jobs cost the $0.001 startup fee. Registered event pricing includes platform usage; no separate usage surcharge is configured. Owner validation is not evidence of a paying customer's invoice.

Input rejection, blocked requests, internal failures, duplicate rows and closure-status records do not trigger job-result. Internal failures remain FAILED. Notices belong in OUTPUT, not billable job rows. A spending limit stops additional unfunded work and retains delivered results. No FREE-account-only cap is applied. Pricing comes from platform metadata, not account-tier guesses.

A durable ledger keyed by run ID and job ID serializes charges. A saved charge is restored to the dataset after interruption. Ambiguous charge responses stop without an automatic retry; resurrection reconciles platform counts before delivery. If the outcome cannot be established, the run fails for operator reconciliation. Cross-run deduplication is not promised: a new run is a new observation.

Collection boundaries and responsibilities

This is an unofficial tool, not affiliated with or endorsed by LinkedIn. The operator must have authority to process inputs, comply with applicable target terms and laws, and verify and lawfully use outputs. Where applicable, the operator is the controller of personal data and Ntriq acts as processor under the governing contract. This notice does not remove Ntriq's own legal or contractual obligations.

The Actor uses public HTTP pages and identifies itself as a bot. It does not log in, use cookies, solve captchas, rotate accounts, or bypass access controls. RESIDENTIAL is the default proxy group; proxyModes can select DATACENTER. Temporary HTTP 429, timeout, network, 5xx and empty-body failures receive up to three retries, waiting 2, 6 and 18 seconds with 20% jitter and a fresh proxy session for each retry. Login, captcha and other access-denied requests are recorded without retry. Five consecutive blocked responses stop collection and mark it incomplete. All requests, including retries, start at least one second apart, with at most three in flight. Details are collected page by page, so a later search failure retains earlier job results. OUTPUT.source reports attempts, completed and failed requests, retries, blocks, and classifications by request stage. Failed requests never trigger job-result; the registered platform startup event still applies.

Recruiter names, contact/profile information, job-description text/HTML and company posts are excluded. Their compatibility keys are null and labeled excluded_by_policy; their contents are not stored. Pages are parsed transiently under a 1 MB response limit. Keyword and experience-number extraction retains only structured facts, not description prose. Use this tool for bounded job research, not systematic replication of LinkedIn's database.

Operations

The default allocation is 256 MB with a 1,800-second timeout. The supported result cap is 300, validated in two private runs; larger batches are not enabled.

npm test validates input, privacy fields, comparison and billing recovery. npm start runs the Actor. test/heartbeat.js defines three public heartbeat scenarios (search, detail, baseline). Scheduling these on the deployed private Actor remains an operator task before publication; no external scheduler is created by this package. Parser failures set incomplete coverage rather than fabricating an empty complete search.