LinkedIn Jobs Scraper — Short Output
Pricing
$0.90 / 1,000 job results
LinkedIn Jobs Scraper — Short Output
Fast LinkedIn jobs scraper with a compact output — no login, cookies, proxy, or start fee. Returns the core fields for job alerts: title, company, location, URL, date, description, and optional LinkedIn criteria/contact details. Delta mode bills only unseen postings.
Claude / Codex skill to describe and setup this actor: SKILL.md
Extract live job postings from LinkedIn's public job search into compact JSON — no account, cookies, browser, or start fee. Filter by keyword, location, remote-only, and posting age.
Choose this Actor for a lighter retrieval path. LinkedIn Jobs Scraper — FULL (All Info) reads the public detail page as well; both publish the same shared flat fields, with mapped source identifiers in custom.data.
Built for scheduled monitoring and job-alert bots: run it on a cron and compare each full current snapshot downstream to detect new postings.
Why this scraper
| This Actor | Typical alternatives | |
|---|---|---|
| Price per 1,000 jobs | $0.90 | $0.40–$10.00 |
| Start fee per run | $0 | up to $0.005–$0.05 — adds up fast on scheduled runs |
| Login / cookies / proxy | None needed | some require cookies or proxies |
| Zero-result runs | Free + diagnostic row | often billed or fail silently |
| Max jobs per run | ~200 (honest guest-API limit) | up to 1,000 for bulk scrapers |
If you need 1,000+ postings in one bulk pull, a large-scale scraper serves you better. For frequent LinkedIn polling, the Actor returns a current snapshot that your alerting system can compare with prior results.
What LinkedIn jobs data does this scraper extract?
Published postings follow nomad-agent-job-row-v1. The shared fields carry
source identity, title and company, parsed locations, dates, the complete
plain-text body when available, source markup when usable, and work type.
Unavailable scalar facts are null; no parsed location is []. Source-only
facts appear in versioned custom.data only when mapped there. See the
Output example section for the exact dataset fields and diagnostic rows.
The Actor reads LinkedIn's job-criteria list. Mapped jobFunction, industries and applicantsCount values appear in custom.data; employment type and seniority are not separate output columns.
Mapped hiringContact* facts from the "Meet the hiring team" block appear in custom.data when LinkedIn names a poster; otherwise they are absent rather than guessed.
LinkedIn's guest cards never carry salary data, so no salary field is emitted — we don't fabricate one.
A run that returns zero postings (or hits an unexpected error) still finishes successfully and pushes a single non-billed diagnostic row with a warnings field explaining why — so an empty result is never a silent failure.
How to scrape LinkedIn jobs with this Actor
- Click Try for free / Run — no login to the target site, no cookies, no proxies to configure.
- Adjust the input (keyword, filters,
maxItems) or keep the defaults. - Run it and export the dataset as JSON, CSV or Excel, or read it over the API.
Run it from your own code:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("nomad-agent/linkedin-scraper").call(run_input={"maxItems": 50})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], "—", item["company"], item["url"])
Or a single HTTP call that runs the Actor and returns items in one response:
curl -X POST \"https://api.apify.com/v2/acts/nomad-agent~linkedin-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"maxItems": 50}'
Input
| Field | Type | Default | Notes |
|---|---|---|---|
keyword | string | "" | Job title, skill or role to search for (e.g. "software engineer", "product manager react"). Leave empty to… |
location | string | "" | City, region or country to filter by (e.g. "Spain", "London", "European Union"). Leave empty for worldwide… |
remote | boolean | false | When enabled, restricts results to remote-eligible postings. |
postedWithin | string | 24h | Keep only jobs published inside this window. Use any for no date filter, or a duration — 1h, 24h, 3d, 2w, 6m. Jobs the source published no date for are kept rather than dropped. Sent to LinkedIn as its own f_TPR window — the narrowest rung that still contains your window — then cut exactly client-side. Replaces timeFilter, postedSince, still accepted for existing integrations. |
maxItems | integer | 100 | Maximum number of job postings to return. Hard ceiling: ~200 per run — LinkedIn's guest search endpoint stops paginating past that offset no matter what you set here (0 = "no limit" still caps at ~200). |
includeDescription | boolean | true | Fetch and include the full plain-text job description for each posting. Disabling this makes runs faster… |
includeCompanyInfo | boolean | false | Also read structured job details (employmentType, seniorityLevel, jobFunction, industries, applicantsCount) from each posting. Reuses the description request — no extra requests when includeDescription is already on. |
includeHiringContact | boolean | false | Also read the job poster (hiringContactName, hiringContactTitle, hiringContactUrl) from each posting — who to contact about the role. Reuses the description request — no extra requests when includeDescription is already on. Present on ~25% of postings. |
skipJobId | array of strings | [] | Explicit dedup list — drop any posting whose numeric job id is in this array. Use it to skip ids you already have, in a single call. |
titleExclude | array of strings | [] | Drop a result if its title contains any of these words or phrases (case-insensitive). |
companyExclude | array of strings | [] | Drop a result if its company name contains any of these words or phrases (case-insensitive). |
cacheTtlSeconds | integer | 1800 | Reuses the last fetch for this many seconds so rapid re-runs don't hit LinkedIn again. Set 0 to always fetch live. |
Every filter and the explicit skipJobId dedup list default to off/empty, so existing integrations see no behavior change unless you opt in.
Output example
Every row follows nomad-agent-job-row-v1, the one shape shared by all of
this fleet's job Actors. A row carries every field; null means the
source did not publish that fact, and locations: [] means no
usable location was parsed from the posting. Nothing is guessed.
{"schemaVersion": "nomad-agent-job-row-v1","recordType": "posting","source": "linkedin","id": "a1b2c3","url": "https://example.com/linkedin/jobs/a1b2c3","title": "Senior Backend Engineer","company": "Example Company","locations": ["Bilbao","Spain"],"postedAt": "2026-09-02T00:00:00Z","deadline": null,"description": "The complete posting body as plain text, exactly as the source published it — never truncated.","descriptionHtml": "<p>The complete posting body as the source's own markup.</p>","workType": null,"custom": {"schemaId": "nomad-agent-job-custom-linkedin-v1","data": {"jobFunction": "…","industries": "…","applicantsCount": "…"}}}
| Field | Meaning |
|---|---|
schemaVersion | Always "nomad-agent-job-row-v1". |
recordType | "posting" for a job, "diagnostic" for a row reporting something about the run itself. |
source | Which job source the posting came from, from the collector registry's vocabulary — not the Actor name. |
id | Stable identifier for the posting within source. |
url | Canonical public URL of the posting on the source site. |
title | Job title exactly as the source publishes it, untruncated. |
company | Employer name as published. |
locations | Places the role is based, most specific first — e.g. ["Bilbao", "Spain"]. |
postedAt | When the source published the posting, ISO-8601 UTC (YYYY-MM-DDTHH:MM:SSZ). |
deadline | Closing date for applications as an ISO-8601 calendar date (YYYY-MM-DD). |
description | The complete posting body as plain text — never truncated, never summarised. |
descriptionHtml | The posting body as the source's own markup, preserving lists, headings and links. |
workType | Working arrangement: "remote", "hybrid" or "onsite". |
custom | Facts only this source publishes, as {"schemaId", "data"}. |
A run also emits diagnostic rows — recordType: "diagnostic" with a
warnings array — when it has something to report, such as a source
returning nothing. They are never billed and are easy to filter out on
recordType.
Pricing
$0.0009 per job returned — and nothing else. No start fee, no subscription, no rental. 100 jobs ≈ $0.09. Every run returns and bills its current matching snapshot.
Integrations
Export results as JSON, CSV or Excel; connect via Make, Zapier or n8n; call directly with run-sync-get-dataset-items; or plug into AI agents through the Apify MCP server.
Use cases
- Job-alert bots and job boards that need fresh LinkedIn postings
- Recruiting and sourcing pipelines tracking who is hiring
- Salary and hiring-market research by role or region
- AI agents that match candidates to live openings
FAQ
Is it legal to scrape LinkedIn jobs? This Actor reads only publicly available job postings — data any visitor can see without logging in. No personal data behind authentication is touched. Review the target site's terms and your local regulations for your specific use case.
Do I need an account on the target site? No. Postings are fetched from public pages/APIs — no login, cookies or session tokens.
How fresh is the data?
Every run fetches live listings. Results are cached for cacheTtlSeconds (default 30 min, set 0 to always hit the source live).
How many jobs can I get?
maxItems caps the run (set 0 where supported for no cap). Most sources paginate from newest to oldest.
Does it work without a LinkedIn account? Yes. The scraper reads LinkedIn's public guest job-search endpoint, so no login, cookies or session tokens are needed.
Something broken or missing? Open an issue on the Actor's Issues tab — it is monitored and reliability fixes ship fast.
Is this Actor useful to you? A quick ⭐ review on the Actor's Reviews tab helps other job-alert and recruiting users find it — and tells us what to build next.
Related Actors
- Web Developer Jobs Scraper — 10 Boards in One
- AI & ML Engineer Jobs Scraper — 8 Boards in One
- Research & Academic Jobs Scraper — 10 Sources
- Remote Jobs Scraper — RemoteOK Remotive WWR
From the maker of Oink — an open-source, AI-powered job-search bot for Telegram that runs on these Actors. Try the free bot, get a managed instance at oinkjobsearch.com, or browse the full catalog of 50+ Actors.