LinkedIn Job Postings API — Public Hiring Data
Pricing
from $33.50 / 1,000 public job postings
LinkedIn Job Postings API — Public Hiring Data
Query public LinkedIn job postings by role, location, employment type, and posting age. Receive normalized records through an Apify dataset or API. Public job postings only; no accounts, profiles, or people data. Pay per delivered record.
Pricing
from $33.50 / 1,000 public job postings
Rating
0.0
(0)
Developer
NexGen Watch
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Query public LinkedIn job postings and receive normalized hiring records through an Apify dataset or API response. This actor is for recruiting, hiring-intelligence, and labour-market workflows that need repeatable structured records rather than manual browsing.
What it delivers
- One structured record per public posting, keyed by LinkedIn's numeric
job_id. - Role title, hiring organisation, place, posting date, salary text when published, and the public posting URL.
- Optional public description retrieval with an explicit
description_status. - Source URL and UTC
observed_atprovenance on every record. - A bounded 500-record maximum and fail-loud handling for blocks, throttling, source-shape loss, and time-budget exhaustion.
This actor reads public logged-out job-posting pages only. It does not use accounts, cookies, profiles, people records, applicant data, or authenticated LinkedIn surfaces.
Pricing
Pay per delivered record. The record is pushed to the dataset before its charge fires.
| Event | Unit | FREE | BRONZE | SILVER | GOLD / PLATINUM / DIAMOND |
|---|---|---|---|---|---|
apify-actor-start | Run start | $0.02 | $0.02 | $0.02 | $0.02 |
job_record | Public job posting delivered | $0.05 | $0.045 | $0.04 | $0.0335 |
Worked example: 200 delivered public postings cost $0.02 + (200 × $0.05) = $10.02 on the base customer tier. Empty, blocked, or undelivered records never trigger job_record.
Input
{"keywords": "data engineer","location": "United States","jobType": "full-time","datePosted": "past-week","maxResults": 100,"fetchDescriptions": false,"watchMode": false}
The supplied store prefill requests five recent records and normally completes in well under five minutes. maxResults cannot exceed 500.
Sample output
{"job_id": "4425881907","title": "Data Engineer","company": "Example Cloud","location": "United States","posted_at": "2026-08-12","job_url": "https://www.linkedin.com/jobs/view/data-engineer-at-example-4425881907","salary_text": "$120k-$150k","employment_type": "full-time","description": null,"description_status": "not_requested","change_type": null,"changed_fields": [],"first_seen": null,"detected_at": null,"source_url": "https://www.linkedin.com/jobs/view/data-engineer-at-example-4425881907","observed_at": "2026-08-12T17:14:17Z","query": "data engineer"}
Delta mode
Set watchMode to true and schedule stateless runs. The first run writes a KV baseline and emits zero alerts. Later runs deliver only newly seen postings, changed postings, and postings absent from the public result window on two consecutive eligible runs. The source-native composite key is job_id; a maximum of 500 deltas can be delivered in one run.
Delta mode stores only its bounded baseline in a named KV store. It does not run an always-on process. A partial source read never commits a new baseline.
API, CLI, and MCP
API:
curl -X POST "https://api.apify.com/v2/acts/nexgenwatch~linkedin-job-postings-api/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords":"data engineer","location":"United States","maxResults":100}'
CLI:
$apify call nexgenwatch/linkedin-job-postings-api -p '{"keywords":"data engineer","maxResults":100}'
MCP: expose this actor through Apify's Actor tools and ask an agent to call nexgenwatch/linkedin-job-postings-api with the same JSON input. The output remains the default Apify dataset; no agent receives broader source access.
Use with
linkedin-job-postings-api → company/domain enrichment → hiring-intensity analysis → scheduled delta runs. Keep downstream enrichment on company-level public facts; this actor supplies no personal profiles or applicant data.
Honest limits
- LinkedIn can throttle, block, or change its public guest-posting HTML without notice. A blocked first page fails loudly and bills no
job_record; a later block retains delivered rows and labels the runPARTIAL. - Public result windows are not a complete census of all jobs. Ranking and availability can vary by place, query, and time.
- Salary, description, and employment type can be absent because the source did not publish them.
removed_from_public_searchmeans a posting disappeared from this public query twice; it is not proof that the employer closed the requisition.- The exact-host robots policy is re-read every run. This actor proceeds under Steve's recorded one-actor source ruling dated 2026-08-12; it never defeats a login, CAPTCHA, WAF, or paywall.
FAQ
Does this actor access LinkedIn profiles or people data? No. It is limited to public logged-out job postings.
Does it require my LinkedIn account? No account, cookie, credential, or authenticated surface is accepted.
What happens when the source blocks a request? Three bounded attempts run before the terminal decision. Zero delivered records fails loud and bills nothing; an interruption after delivery is labeled PARTIAL.
Why can description be null? Description retrieval is optional, and some public detail fragments are missing, removed, or blocked. description_status records the reason.
Does a zero-row run mean the actor succeeded? Only a usable public response with no matching cards is GENUINE_EMPTY. Login pages, challenges, 403/429/5xx responses, and timeouts are block-class outcomes.
Compliance
Public logged-out job postings only; transparent NexGenWatchBot/1.0 user agent; no authentication, profiles, people data, CAPTCHA solving, browser spoofing, paywall circumvention, or anti-bot defeat. Comply on objection.