LinkedIn Jobs Scraper - Search & Export
Pricing
from $0.03 / 1,000 result extracteds
LinkedIn Jobs Scraper - Search & Export
Export public LinkedIn jobs by keyword, location, filters, or URL. Collect company details, descriptions, salary and applicant signals when available; download CSV, Excel, or JSON.
Pricing
from $0.03 / 1,000 result extracteds
Rating
0.0
(0)
Developer
Fetch Cat
Maintained by CommunityActor stats
0
Bookmarked
93
Total users
19
Monthly active users
5 days ago
Last modified
Categories
Security
Limited permissionsShare
Export public LinkedIn jobs by keyword, location, filters, search URL or individual job URL. LinkedIn Jobs Scraper returns job titles, companies, locations and source links, with optional descriptions, salary text and applicant signals when publicly available.
Use the dataset for recruiting research, hiring intelligence or job matching. Download CSV, Excel or JSON from Apify, or retrieve results through the Dataset API. No LinkedIn account or cookies are required. Public results and filters can differ from the logged-in site.
Quick start
- Enter a job keyword and location, or paste a public LinkedIn Jobs URL.
- Set a small
maxItemsand choose whether you need job details. - Start the Actor, then open the dataset to inspect and export the rows.
{"keywords": ["software engineer"],"location": "United States","maxItems": 10,"includeDetails": true,"datePosted": "pastWeek","workplaceType": "remote","sortBy": "recent"}
Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.
Ready-to-run examples
Choose a public example to see its settings before starting a run:
- Scrape a Public LinkedIn Jobs Search URL
- Recent Data Analyst Jobs in London
- Remote Software Engineer Jobs on LinkedIn
What you get
One unique saved public job row with its ID, source job link, title, company and location. Optional detail requests can add public descriptions, job criteria, salary text and applicant signals. A useful search-card row can survive failed details, while missing values remain unknown rather than zero salary or applicants.
Who is it for?
- Recruitment researchers reviewing public roles and employers in selected searches.
- Hiring-market analysts comparing their own role, region and employer-keyword samples.
- Job-matching developers feeding source-linked descriptions into a separate matching workflow.
- Compensation researchers retaining disclosed salary and applicant text with their limits.
How you can use the data
- Review a recent remote software-engineer sample. Use the existing United States/past-week/remote example with a ten-job cap and details enabled. Keep jobUrl and visible workplace and criteria fields before applying exact eligibility rules, since LinkedIn interprets the requested filters.
- Choose a URL-only or combined collection deliberately. Keywords and supplied URLs are additive. Clear the keyword prefill for URL-only work. Pasted search URLs carry their own filters, while individual job URLs request a posting rather than a filtered search.
- Keep disclosed compensation and applicant context. Retain salaryText and applicantsText beside parsed values. Over 200 applicants can yield a numeric value of two hundred rather than an exact count, and a company keyword is not an exact company-ID selector.
- Compare or score exports in your own workflow. Join job IDs and collection times across retained datasets, then apply your own matching or alerts. DetailFetched and RUN_SUMMARY help distinguish incomplete enrichment from absent jobs. The Actor itself does not maintain historical changes, score matches or send notifications.
For an existing automation recipe, see Score LinkedIn job matches with OpenAI, Google Sheets, Slack, and Apify. Scoring and notifications happen in that external workflow, not inside this Actor.
Input settings
Keyword searches and supplied URLs are processed together. For URL-only collection, omit keywords or send keywords: []. Clear the form's keyword prefill when pasting a URL. If both keywords and URLs are omitted, the Actor searches for software engineer.
| Setting | JSON key | Default / purpose |
|---|---|---|
| Keywords | keywords | Optional list of job titles, skills or search phrases. |
| Location | location | Optional location text for keyword searches. |
| Company IDs | companyIds | []. Up to 100 numeric ID strings; generated searches send f_C. |
| Geographic ID | geoId | Empty. Numeric LinkedIn geographic ID; replaces location text in generated searches. |
| Search radius | searchRadius | Omitted. Send a distance of 0–100 miles for generated searches. LinkedIn may normalize or ignore unsupported distances. |
| Early-applicant search | under10Applicants | false. Send f_EA=true; not a guarantee of current applicant counts. |
| Excluded job IDs | excludeJobIds | []. Up to 10000 numeric ID strings; skip prior jobs before detail requests and result billing. |
| Title includes / excludes | titleInclude, titleExclude | []. Up to 100 literal substrings each (200 characters per term). Case-insensitive; any include matches, any exclude rejects. |
| Search scan budget | maxSearchPages | Omitted: max(20, ceil(maxItems/10)*3). Global ceiling 3000 pages, plus an aggregate card ceiling of 25 times the page budget. |
| Job search or job URLs | startUrls | Public LinkedIn Jobs search URLs or /jobs/view/ URLs. |
| Maximum jobs | maxItems | 20. Maximum unique rows across all sources, from 1 to 10000. |
| Fetch job details | includeDetails | true. Add available descriptions and other public details. |
| Date posted | datePosted | any. Also past24h, pastWeek, pastMonth. |
| Workplace type | workplaceType | any. Also onsite, remote, hybrid. |
| Experience levels | experienceLevels | []. internship, entry, associate, midSenior, director, executive. |
| Job types | jobTypes | []. fullTime, partTime, contract, temporary, volunteer, internship, other. |
| Easy Apply only | easyApplyOnly | false. Request LinkedIn's Easy Apply search filter. |
| Sort by | sortBy | relevance. recent requests newest-first search ordering. |
| Retries per request | retryCount | 3. Optional retry limit. |
| Initial retry delay | initialRetryDelayMillis | 1000. Milliseconds. |
| Request pacing | requestPacingMillis | 250. Milliseconds. |
| Detail concurrency | detailConcurrency | 4. Requested ceiling; memory-aware safety limits allow up to 2 workers at 256 MB, 4 at 512 MB, and up to 12 with sufficient memory. |
| Safe run-time limit | runTimeSecs | 240. Seconds. |
| Proxy configuration | proxyConfiguration | Apify Proxy enabled by default. Automatic routing may retry rate-limited searches or descriptions through the existing Residential pool within retry/time limits, which can increase proxy costs. Explicit managed settings, custom proxies and opt-outs are preserved. |
Search filters and sorting apply to keyword-generated searches. For a pasted search URL, put the desired filters in that URL. Direct job URLs request that posting rather than a filtered search. LinkedIn determines how it interprets each filter. Verify returned fields before applying exact eligibility rules. Sorting requests the source's ordering, not a final global sort across multiple sources.
Requests reuse a bounded worker process, not sessions, cookies or connections. Proxy selection and retry behavior remain unchanged. RUN_SUMMARY.requestTimings includes numeric process-startup and DNS/connect/TLS/first-byte/body/total aggregates. Concurrent timings overlap and cannot be subtracted from elapsed time. Completed-transfer samples and unavailable early-abort/error measurements are counted separately; no target or proxy details are included. Network conditions still determine run time, so startup savings are not a guaranteed total-cost reduction.
Example inputs
Use the Quick start input as a small first run. To collect a company-specific public search while skipping prior jobs and selecting titles:
{"keywords": ["engineer"],"companyIds": ["1441"],"geoId": "103644278","searchRadius": 25,"under10Applicants": true,"excludeJobIds": ["1234567890"],"titleInclude": ["engineer", "developer"],"titleExclude": ["intern"],"maxItems": 10,"maxSearchPages": 5}
Use your actual LinkedIn company, geographic and previously saved job IDs. Company/geo/radius/early-applicant controls apply only to generated keyword searches; pasted URLs retain their own parameters. These are source search requests, not verified local eligibility guarantees.
Title and prior-job filters apply to both source modes. Search-card titles are matched before description requests and result billing. Matching uses trimmed, case-insensitive literal substrings, not regex or whole-word rules; exclusions win. A missing title fails a nonempty include list. The later detail title is not checked again, so the exported title can differ from the eligible card title. A known excluded direct ID is never fetched; direct title filtering requires its initial fetch and cannot avoid that resource cost. Filtered/excluded jobs incur no result event, but search/startup/resource costs still apply.
Full filtered pages continue toward maxItems, within the independent global page/card budgets and existing time/charge/retry limits. A short or empty public page ends that source; this is source exhaustion, not whole-market coverage. RUN_SUMMARY separates filtered unique title rejections, excluded unique prior IDs and duplicates repeated IDs, and reports cardsScanned, maxSearchPages, maxSearchCards, stoppedByScanLimit and stoppedByRepeatedPage. Repeated pages, scan caps and time caps indicate limited/incomplete collection, not no matches; useful rows remain with PARTIAL status. A zero-row incomplete run fails rather than claiming an empty search. An exhausted all-filtered search can succeed as EMPTY_FILTERED with emptyReason. Direct URLs do not consume the search-page/card budget.
Output data
Shortened illustrative shape only, not a current job listing. Optional values may be null.
{"jobId": "1234567890","title": "Example engineering role","companyName": "Example employer","location": "Example location","jobUrl": "https://www.linkedin.com/jobs/view/1234567890","description": null,"salaryText": null,"applicantsText": null,"detailFetched": false,"sourceKind": "search"}
| Output field | Meaning |
|---|---|
jobId, jobUrl | LinkedIn posting identifier and public job link. |
title, location | Public title and location text. |
companyName, companyUrl, companyId, companyLogoUrl | Employer identity and logo when visible. Not a full company profile. |
postedAtText, postedAt | Displayed posting-age text and timestamp when available. |
description, descriptionHtml | Public description in plain text and HTML when details succeed. |
employmentType, seniorityLevel, industries, jobFunction | Public job criteria when available. |
workplaceType, salaryText | Visible workplace label and disclosed compensation text. |
applicantsText, applicantsCount | Public applicant text and its numeric portion, not necessarily an exact count. |
applyUrl, easyApply | Application destination and Easy Apply label when exposed. |
criteria | Object containing public label/value criteria. |
sourceSearchUrl, sourceKind | Origin URL and whether the row came from search or a direct job URL. |
detailFetched, scrapedAt | Whether detail enrichment succeeded and when the row was parsed. |
For example, “Over 200 applicants” may yield applicantsCount: 200. Retain applicantsText for context. Optional fields depend on what LinkedIn exposes, and detail fields require includeDetails: true.
Download your results
Open your run's dataset, choose Export and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.
See Apify's download and export guide for the available formats and field options.
Pricing
The start event is charged once after input validation. The result event applies to each unique saved job row, including a search-card row retained when optional details fail. Duplicate, title-filtered and excluded jobs and source errors are not extra job results. A valid empty run can still incur the start charge.
Begin with a small row cap and disable optional details when titles, companies, locations and links suffice. See the live Pricing tab for current rates and discounts.
Future pricing — 18 November 2026, 00:00 UTC
The per-job price will increase from this date. Until then, existing rates remain effective. Gold, Platinum and Diamond customers will share one Business rate. The one-time start fee, the result event and the saved-row charging conditions above are unchanged.
The live Pricing tab is the source of truth for all current and upcoming numeric rates. Prices apply to saved rows, not blocks of rows. No new extraction mode, output fields or charging conditions accompany this price change. Check the effective and upcoming schedule before running a batch.
Tips for best results
- Use specific roles and regions with small explicit caps. A maximum is not a promise of that many matches.
- Clear unwanted keyword prefills for URL-only searches. Both input sources otherwise contribute work.
- Enable details for descriptions and richer criteria. Search-card rows can remain when enrichment fails.
- Retain applicant and salary text with any parsed numbers. Missing or qualified values are not exact zero or exact applicant totals.
- Inspect summary errors and time stops before comparing exports. Source sort requests do not globally reorder all saved sources.
Limits and caveats
Only public LinkedIn Jobs search and posting data is supported, without a LinkedIn account or cookies. Private recruiter records, messages, applicant identities and logged-in-only profiles are outside scope. This is not an official LinkedIn API, and public results can differ from signed-in searches.
LinkedIn can block requests or change filter behavior. Exact filter matches, complete coverage and source ordering are not guaranteed. Date and workplace settings apply to generated keyword searches, while pasted search URLs keep their own filters and direct job URLs request individual postings. Sorting requests source order rather than a global final sort across inputs.
Rate-limited or timed-out description requests can retry through the public job page within your existing retry and time limits. The returned page must identify the requested job; no login or cookies are used. After a guest-endpoint rate limit or timeout, later jobs start on the public-page route instead of repeating the known-troubled first attempt; failed public-page attempts can still retry the guest endpoint. After a rate limit, requests slow down and share recovery delays across jobs, without shortening longer requested delays or extending the run-time limit.
A recognized no-job search can finish empty. Failed requests are not proof of privacy or deletion, and useful saved search cards can remain after detail failures. RUN_SUMMARY reports partial coverage, source errors and time-limit stops. Check detailFetched before treating an absent enriched field as a missing job.
Descriptions, company metadata, salary and applicant fields depend on public availability. Employer fields are not a complete company profile, and applicant numbers can be only the numeric part of qualified source text. Repeat-export joins, match scoring, notifications and historical analysis require a separate downstream workflow.
Automation and integrations
Save your settings for next time
Once you have an input that works for you, save it as an Apify task. This keeps your settings together so you can use them again without filling in the form from scratch.
Run on a schedule
Need fresh results regularly? You can schedule the Actor or a saved task to run at a time that suits you.
Each scheduled run collects the data again. If you want to compare results or highlight changes, add that step in your own workflow.
Send results to your other tools
Use n8n, Make or Zapier to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the Apify integration guides for your chosen tool.
For a custom connection, an Apify webhook can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.
API usage
Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.
The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its defaultDatasetId to fetch the results.
For setup instructions, see Apify's JavaScript client guide, Python client guide and Actor runs API reference.
cURL
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~linkedin-jobs-scraper/runs' \-H "Authorization: Bearer $APIFY_TOKEN" \-H 'Content-Type: application/json' \--data @- <<'JSON'{"keywords": ["software engineer"],"location": "United States","maxItems": 10,"includeDetails": true,"datePosted": "pastWeek","workplaceType": "remote","sortBy": "recent"}JSON
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('fetch_cat/linkedin-jobs-scraper').call({"keywords": ["software engineer"],"location": "United States","maxItems": 10,"includeDetails": true,"datePosted": "pastWeek","workplaceType": "remote","sortBy": "recent"});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('fetch_cat/linkedin-jobs-scraper').call(run_input={'keywords': ['software engineer'], 'location': 'United States', 'maxItems': 10, 'includeDetails': True, 'datePosted': 'pastWeek', 'workplaceType': 'remote', 'sortBy': 'recent'})print(client.dataset(run['defaultDatasetId']).list_items().items)
API usage notes
Save the quick-start JSON as input.json. This starts a run asynchronously. Check the returned run ID for completion, then read the dataset identified by defaultDatasetId.
MCP and AI agents notes
Example prompt: “Export up to 10 public software engineering jobs in the United States with available descriptions. Keep source links and flag missing details.” Use the documented input keys, read nullable values honestly and check RUN_SUMMARY before treating a dataset as complete.
MCP and AI agents
You can ask your AI assistant to collect data with LinkedIn Jobs Scraper - Search & Export and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.
Connect your assistant through the Apify MCP server. MCP gives your assistant a way to find this scraper, run it and read the results. Follow the official setup and sign-in guide for your app.
Easier setup with an Apify plugin
If you use a supported coding assistant, the official Apify plugin can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.
Use Apify AI in Console
Prefer to keep everything in Apify? Open Apify AI in Console and ask it to find Fetch Cat's LinkedIn Jobs Scraper - Search & Export. You can describe the data you want and ask questions about the results.
Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.
Choose your assistant
- Claude and Claude Code (Anthropic): Apify setup guide.
- ChatGPT and Codex (OpenAI): Apify setup guides.
- Grok Bot (xAI): Apify plugin guide.
- Gemini CLI (Google): MCP server setup guide. Use the server URL below with the HTTP configuration supported by Gemini CLI.
Connect just this scraper
To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=fetch_cat/linkedin-jobs-scraper"}}}
Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.
Use Apify's general server
Already connected to the general Apify MCP server at https://mcp.apify.com? You can use it to find this scraper without adding another server. Ask your assistant to use LinkedIn Jobs Scraper - Search & Export by Fetch Cat, or give it the identifier fetch_cat/linkedin-jobs-scraper.
Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.
Example requests
- “Use Fetch Cat’s LinkedIn Jobs Scraper to collect up to 5 software engineer jobs in the United States from the past week, requesting remote workplace and recent ordering with details enabled. Keep source job links and visible criteria without guaranteeing exact eligibility.”
- “Collect up to 5 data analyst jobs in London from the past week with recent source ordering and details off. Show titles, companies, locations and job links, marking fields that require unavailable details.”
- “Retrieve up to 5 software engineer jobs in the United States from the past week with details enabled. Keep salary and applicant text beside parsed values for my own analysis, and check summary outcomes without treating Over 200 as an exact applicant count.”
Normal Apify charges apply. Check the live Pricing tab before asking your assistant to run a larger batch.
Pay with x402
If your AI agent has a funded wallet, it can pay for Apify usage through x402. This experimental option lets an agent use Apify without a conventional account.
Apify AGI provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.
Some MCP setups also support paying for each request directly. That is a different payment option, so check the official guide for its availability.
Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.
Other ways for agents to pay
Apify also supports MPP for prepaid access through AGI and Skyfire for eligible Actors. If your agent already uses one of these, see the agentic payment guide to choose the right setup.
FAQ
Can I export LinkedIn job search results without logging in?
Yes. This Actor targets public job search and job pages without LinkedIn cookies. Public coverage can differ from a signed-in search, and access is not guaranteed.
Can I export LinkedIn jobs to CSV or Excel?
Yes. Open the run's dataset to download CSV, Excel or JSON, or use the Dataset API.
Is this a LinkedIn Jobs API alternative?
It provides programmatic access to collected public job data through Apify. It is not an official LinkedIn API and does not grant private-data access.
Why are descriptions or salary fields empty?
Details may be disabled, unavailable or unsuccessful. Salary is only returned when publicly shown. Inspect detailFetched and RUN_SUMMARY. Missing values do not mean zero salary or zero applicants.
Can I monitor hiring over time?
Save snapshots and compare them downstream by jobId. Apify offers schedules and webhooks if you choose to configure them. The Actor itself does not maintain a history, score matches or send alerts.
Related Actors
- Greenhouse Job Board Scraper — Employer-hosted Greenhouse jobs.
- Workday Jobs Scraper — Jobs on Workday career sites.
- Lever Jobs Scraper — Public Lever job boards.
- SmartRecruiters Jobs Scraper — Public SmartRecruiters postings.
- RemoteOK Jobs Scraper — RemoteOK job listings.
Support and feedback
For custom additions or integrations, email hello@fetchcat.dev.
Found an error or have a feature request? Open an issue with the run URL, a non-sensitive input example and what you expected.
Need help sharing it? See Apify’s guide to sharing a run when reporting an issue. Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.
Tried this scraper? We'd love to hear how it worked for you. Leave a review to help others choose the right tool and help us improve it. Your feedback means a lot to us.
Made with care for curious people, AI agents and the possibilities in data. ♥