Request a tool
All toolsGuidesMCP serverRequest a toolPlatformsCategories
LinkedIn Jobs Scraper icon

LinkedIn Jobs Scraper

Scrape public LinkedIn jobs by keyword, location, URL or ID. Filter by date, workplace type and experience, and pull full descriptions.

35 runs on Apify $0.0008 per LinkedIn job ($0.8 / 1,000)
Run this in the cloudRun on Apify →

Job Market Scrapers

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust searchQueries, locations, country (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.0008 per LinkedIn job = $0.8 per 1,000

You are charged forWhenPrice
LinkedIn jobOne successfully saved LinkedIn job listing.$0.0008
Actor StartCharged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event).$0.001

Pay-per-event pricing: you are billed per result, not per subscription — a run that returns nothing costs nothing beyond the start fee. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-04, and they are what you are actually charged.

Inputs

FieldWhat it doesType
searchQueriesJob titles or keywords. Every query is searched against every location. Leave empty when using direct job URLs or IDs.array
locationsCities, regions, or countries. Every location is combined with every query. Leave empty for an unrestricted location search.array
countryOptional country name appended to each search location, for example Canada or United States. It is also used alone when no location is supplied.string
jobUrlsPublic LinkedIn /jobs/view/ URLs to fetch directly. URLs and IDs are deduplicated with search results.array
jobIdsNumeric LinkedIn job IDs to fetch directly.array
datePostedLinkedIn's server-side posting-age filter.string
workplaceTypeLinkedIn's server-side on-site, remote, or hybrid filter.string
experienceLevelsOptional LinkedIn server-side experience filters. Select one or more.array
jobTypesOptional LinkedIn server-side employment-type filters.array
sortBySort search results by relevance or newest first.string
includeDetailsFetch each job detail page for description, seniority, employment type, job function, industries, and applicant count. Direct URLs and IDs always fetch details. Turning this off makes searches faster and cheaper.boolean
maxItemsMaximum unique real job rows across all searches, URLs, and IDs.integer
maxPagesPerSearchSafety limit for each query/location combination. LinkedIn currently returns about 10 jobs per guest page.integer
countryCodeOptional two-letter country code used only if LinkedIn blocks direct traffic and the actor activates its datacenter proxy fallback, for example US, CA, GB, or DE.string
maxProxyRetriesMaximum fresh datacenter proxy sessions tried for one blocked request.integer
requestTimeoutSecsTimeout for each lightweight LinkedIn guest endpoint request.integer

What you get

A structured dataset — each result includes fields like:

titlecompanylocationworkplaceTypeemploymentTypepostedAturl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Job Market Scrapers

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

BuiltIn Jobs Scraper iconJob Market Scrapers

BuiltIn Jobs Scraper

Scrape Built In tech jobs at $0.81/1,000 - salary, location, skills, posted date. No login or API key. 1,000 jobs in under 2 minutes.

Ready to run — no setup

Dice Jobs Scraper iconJob Market Scrapers

Dice Jobs Scraper

Dice jobs scraper at $0.90 per 1,000 jobs plus a $0.001 run start. Companies, locations, posting dates, apply URLs and full descriptions. No login needed.

Ready to run — no setup

SEEK Jobs Scraper iconJob Market Scrapers

SEEK Jobs Scraper

SEEK jobs scraper at $0.81 per 1,000, flat at every volume. Australia and New Zealand, with salary ranges, workplace type and full descriptions. No login.

Ready to run — no setup

Career Site Jobs Scraper iconJob Market Scrapers

Career Site Jobs Scraper

Scrape open jobs from any company career page. Auto-detects the ATS across 10 platforms and returns title, location, department, type.

Ready to run — no setup

Internshala Scraper iconJob Market Scrapers

Internshala Scraper

Scrape Internshala internships and fresher jobs by keyword, city, category, stipend or work-from-home.

Ready to run — no setup

XING Jobs Scraper iconJob Market Scrapers

XING Jobs Scraper

Scrape XING jobs in Germany, Austria and Switzerland by keyword, city, remote or hybrid.

Ready to run — no setup

See all Job Market Scrapers →

LinkedIn Jobs Scraper

Collect public LinkedIn job listings without login, cookies, or a LinkedIn account. The actor uses LinkedIn's lightweight public guest jobs endpoints, starts with direct traffic, and activates rotating Apify datacenter proxy sessions only after a block or rate limit.

It supports batch keyword and location searches, direct job URLs and IDs, pagination, global deduplication, server-side LinkedIn filters, and optional full job descriptions.

Why this actor

  • No login, cookies, or LinkedIn account.
  • Batch every query against every location in one run.
  • Mix search results with direct LinkedIn job URLs and IDs.
  • Filter by country/location, date posted, workplace type, experience level, and job type.
  • Choose fast card-only output or full descriptions and job criteria.
  • Deduplicate all jobs globally by LinkedIn job ID.
  • Use direct requests first, then rotating datacenter proxies. Metered proxy groups (residential, SERP) are never used.
  • Receive explicit, uncharged diagnostics for blocked, empty, invalid, or failed sources.

Input

FieldDescription
searchQueriesJob titles or keywords. Each query is paired with each location.
locationsCities, regions, or countries. Leave empty for an unrestricted location search.
countryOptional country name appended to every location or used alone.
jobUrlsDirect public LinkedIn /jobs/view/ URLs.
jobIdsDirect numeric LinkedIn job IDs.
datePostedany, past24h, pastWeek, or pastMonth.
workplaceTypeany, onSite, remote, or hybrid.
experienceLevelsOne or more of internship, entry, associate, midSenior, director, executive.
jobTypesOne or more of fullTime, partTime, contract, temporary, internship, volunteer, other.
sortByrelevance or recent.
includeDetailsFetch descriptions, seniority, employment type, job function, industries, and applicant text. Direct IDs and URLs always fetch details.
maxItemsGlobal unique job limit across every source. Default 100, maximum 5,000.
maxPagesPerSearchPer query/location pagination limit. Default 10.
countryCodeOptional two-letter country for the proxy fallback, such as US, CA, GB, or DE.
proxyConfigurationFallback proxy configuration. It is not used until direct traffic is blocked or rate-limited. Metered groups are replaced with datacenter; your own proxyUrls are honoured verbatim.
maxProxyRetriesFresh datacenter proxy sessions tried per blocked request. Default 3.
requestTimeoutSecsPer-request timeout. Default 20 seconds.

No field is required. An input with no query, URL, or ID returns exactly one clearly labeled _sample: true row and does not charge.

Batch search example

This creates four searches: two queries multiplied by two locations.

{
  "searchQueries": ["software engineer", "data engineer"],
  "locations": ["Toronto, Ontario", "Vancouver, British Columbia"],
  "country": "Canada",
  "datePosted": "pastWeek",
  "workplaceType": "remote",
  "experienceLevels": ["entry", "associate", "midSenior"],
  "jobTypes": ["fullTime", "contract"],
  "sortBy": "recent",
  "includeDetails": false,
  "maxItems": 100
}

Direct job example

{
  "jobUrls": [
    "https://www.linkedin.com/jobs/view/example-role-1234567890"
  ],
  "jobIds": ["9876543210"],
  "maxItems": 10
}

Output

Each successful real job row contains:

  • jobId, title, company, companyUrl, and companyLogo
  • location, salary, postedAt, and postedText
  • workplaceType, employmentType, and seniorityLevel
  • jobFunction, industries, and applicants
  • description and descriptionHtml when details are fetched
  • canonical LinkedIn url
  • sourceType, searchQuery, searchLocation, and detailFetched

Example:

{
  "ok": true,
  "sourceType": "search",
  "jobId": "1234567890",
  "title": "Senior Software Engineer",
  "company": "Example Company",
  "companyUrl": "https://www.linkedin.com/company/example",
  "companyLogo": "https://media.licdn.com/example.png",
  "location": "Toronto, Ontario, Canada",
  "salary": null,
  "postedAt": "2026-07-24",
  "postedText": "1 day ago",
  "workplaceType": "remote",
  "employmentType": "Full-time",
  "seniorityLevel": "Mid-Senior level",
  "jobFunction": ["Engineering"],
  "industries": ["Software Development"],
  "applicants": "25 applicants",
  "description": "Build reliable systems...",
  "descriptionHtml": "<p>Build reliable systems...</p>",
  "url": "https://www.linkedin.com/jobs/view/1234567890",
  "searchQuery": "software engineer",
  "searchLocation": "Toronto, Ontario, Canada",
  "detailFetched": true
}

LinkedIn does not expose every field on every job. Card-only searches usually leave detail fields as null or empty arrays. Enable includeDetails when those fields matter.

Pricing and cost control

$0.80 per 1,000 jobs ($0.0008 each), plus $0.001 each time a run starts. Flat rate — no volume tiers, no plan gates — and you are charged only for job rows actually written to the dataset.

Two charge events exist and that is all: the run start, and one job event fired after a real row is saved. includeDetails does not cost extra — a full detail page bills the same $0.0008 as a card-only row — and there is no per-search, per-keyword or per-location fee, so a run that batches 40 queries costs no more than one that runs a single query for the same number of jobs.

Sample rows, no-result rows, blocked requests, parse failures, invalid direct jobs, and network errors are diagnostic output and are not charged. A run that returns nothing costs $0.001.

The default search mode downloads only small guest-search HTML fragments. Full detail pages are much larger, so includeDetails is off by default. Direct traffic is tried first and the datacenter proxy is only a fallback. Metered proxy groups (RESIDENTIAL, GOOGLE_SERP) are not offered: if you request one it is replaced with rotating datacenter addresses and the run log says so. Your own proxyUrls are always used exactly as supplied. Keep includeDetails off for high-volume discovery, use narrow date filters, and set a matching countryCode only when fallback is needed.

Diagnostics

Diagnostic rows have ok: false, _diagnostic: true, and an errorCode:

  • BLOCKED or RATE_LIMITED: direct traffic and the configured datacenter proxy retries were exhausted.
  • NO_RESULTS: LinkedIn returned an empty result page for that query/location.
  • NOT_FOUND: a direct job no longer exists or is not public.
  • PARSE_ERROR: LinkedIn returned HTML without the expected public job structure.
  • NETWORK or SERVER_ERROR: a transient request failure.

Diagnostics never trigger the job billing event. A failed source does not prevent other batch sources from completing.

Limits and responsible use

This actor accesses public guest job pages only. It does not log in, use cookies, bypass private access controls, or collect private profile data. LinkedIn can change or throttle its public endpoints. Use reasonable limits, respect applicable law and LinkedIn's terms, and process personal data only when you have a lawful basis.

Billing

Two charges apply: a $0.001 run-start fee each time a run begins, and $0.0008 per job actually delivered. Samples, diagnostics, duplicates, blocked look-ups and no-result runs never incur the per-result fee — a run that returns nothing costs only the $0.001 start fee. 1,000 jobs works out at $0.801 all-in.