# LinkedIn Jobs Scraper

> Get every LinkedIn job posting for a role and a place, with company, salary, full description, applicant count and the recruiter who posted it.

LinkedIn Jobs Scraper collects the job postings for a job title and a place, or from any LinkedIn job search link with your filters already set. Each job is one row with its title, company, location, salary when it’s shown, and the date posted. Full descriptions, seniority, applicant count and company details are optional add-ons. It needs no LinkedIn account.

- Web page: https://keklik.io/scrapers/linkedin-jobs-scraper
- Apify Actor: `keklik/linkedin-jobs-scraper` (https://apify.com/keklik/linkedin-jobs-scraper)
- You enter: A job title and a place, or a LinkedIn job search link
- You get: Job title, company, location, salary, date posted and the job link
- Status: working, last tested 11 Nov 2026
- Needs: an Apify account (free is enough to try). No login to the site itself.

## Price per 1,000 jobs

US dollars, on each Apify plan. Apify's platform costs are included. Add-ons are charged only when switched on in the input.

| Charge | Free | Starter | Scale | Business |
|---|---:|---:|---:|---:|
| Job | $0.25 | $0.22 | $0.20 | $0.17 |
| Full job details (add-on): Description, seniority, job type and applicant count | $0.13 | $0.12 | $0.10 | $0.09 |
| Company details (add-on): Website, size, headquarters and industry of the company | $0.50 | $0.45 | $0.40 | $0.35 |

Apify's plans and a calculator: https://keklik.io/pricing.md

## Input

The run input is a JSON object with these keys:

- `urls` (array, optional): LinkedIn job search or job URLs. Paste the URL of a job search from linkedin.com/jobs (with your keywords, location and filters), or the URL of a single job posting (linkedin.com/jobs/view/...). One search URL gives up to 1,000 jobs.
- `searchTerms` (array, optional): Or: job titles or keywords. Job titles or keywords to search, such as "data analyst" or "nurse". Each one is its own search, in the location below.
- `location` (string, optional): Location. Where to search for the keywords above: a country, region or city, such as "United States", "London" or "Île-de-France".
- `datePosted` (string, optional, default "any", one of "any", "past24h", "pastWeek", "pastMonth"): Date posted. Only jobs posted in this window. A search URL that already has its own date filter keeps it.
- `workplaceTypes` (array, optional): Workplace. On-site, remote or hybrid. LinkedIn's logged-out search ignores this filter, so the scraper adds the words to the search keywords instead ("Remote accountant"); expect closer matches, not an exact filter.
- `jobTypes` (array, optional): Job type. Full-time, part-time, contract and so on. Added to the search keywords, like Workplace.
- `experienceLevels` (array, optional): Experience level. Internship to executive. Added to the search keywords, like Workplace.
- `easyApplyOnly` (boolean, optional, default false): Easy Apply only. Only jobs you can apply to on LinkedIn.
- `under10Applicants` (boolean, optional, default false): Fewer than 10 applicants. Only jobs with fewer than 10 applicants so far.
- `postedSince` (string, optional): Posted since. Only jobs posted since then: 12h, 3d or 2w back from the start of the run, or a date such as 2026-10-01. Use it for daily or weekly runs that only want new jobs.
- `excludeTitles` (array, optional): Skip job titles containing. Words that drop a job when its title contains them, such as "senior" or "intern". Not case-sensitive. Skipped jobs are free.
- `excludeCompanies` (array, optional): Skip companies. Company names to drop, written as LinkedIn shows them. Not case-sensitive. Skipped jobs are free.
- `jobDetails` (boolean, optional, default true): Full job details. Open each job's page for the full description, seniority, employment type, industries, applicant count, apply type, parsed salary and the job poster. Charged per job that gets them.
- `companyDetails` (boolean, optional, default false): Company details. Add the hiring company's website, industry, size, employee and follower counts, headquarters, founding year, type, specialties and description from its LinkedIn page. Charged per job that gets them.
- `maxJobsPerSearch` (integer, optional, default 1000): Max jobs per search. Stop each search after this many jobs. LinkedIn shows at most 1,000 jobs per search; to get more, split it into narrower searches (by location or keyword).
- `maxResults` (integer, optional): Max jobs in total. Stop the whole run after this many jobs. Leave empty for no limit.

Example input:

```json
{
  "searchTerms": [
    "sales representative",
    "accountant",
    "project manager",
    "customer service"
  ],
  "location": "United States",
  "maxJobsPerSearch": 300,
  "jobDetails": true,
  "companyDetails": true,
  "datePosted": "any"
}
```

## Output: one row per job

42 fields in 7 groups.

### Job

- `title`: Title. Job title.
- `job_id`: Job ID. LinkedIn's numeric job ID.
- `url`: Job URL. Link to the job posting on LinkedIn.
- `location`: Location. Job location, as LinkedIn shows it.
- `posted_at`: Posted on. Date the job was posted (YYYY-MM-DD).
- `posted_time_ago`: Posted. When the job was posted, as LinkedIn says it ("3 days ago").
- `benefits`: Highlight. Highlight under the job card, such as "Actively Hiring" or "Medical insurance".

### Company

- `title`: Title. Job title.
- `company_name`: Company. Hiring company, as LinkedIn shows it.
- `company_url`: Company page. The company's LinkedIn page.
- `company_logo`: Company logo. Company logo image URL.
- `company_id`: Company ID. LinkedIn's numeric company ID. Full job details or company details.

### Salary

- `title`: Title. Job title.
- `salary`: Salary. Salary as LinkedIn shows it, when the employer gives one.
- `salary_min`: Salary min. Lowest salary of the range. Full job details.
- `salary_max`: Salary max. Highest salary of the range. Full job details.
- `salary_currency`: Salary currency. Three-letter currency code, such as USD or GBP. Full job details.
- `salary_period`: Salary period. year, month, week, day or hour. Full job details.

### Full job details (add-on)

- `title`: Title. Job title.
- `description`: Description. Full job description as text, with paragraphs and bullet points kept. Full job details.
- `description_html`: Description (HTML). Full job description as HTML. Full job details.
- `seniority_level`: Seniority level. Seniority level, such as "Entry level" or "Mid-Senior level". Full job details.
- `employment_type`: Employment type. Employment type, such as "Full-time" or "Contract". Full job details.
- `industries`: Industries. Industries of the job. Full job details.
- `applicants_count`: Applicants. Number of applicants LinkedIn shows (a floor: "Over 200 applicants" gives 200). Full job details.
- `apply_type`: Apply type. easy_apply (apply on LinkedIn) or external (apply on the company site). Full job details.

### Job poster (add-on)

- `title`: Title. Job title.
- `poster_name`: Job poster. Name of the person who posted the job, when LinkedIn shows them. Full job details.
- `poster_title`: Job poster headline. The job poster's LinkedIn headline. Full job details.
- `poster_profile_url`: Job poster profile. The job poster's LinkedIn profile. Full job details.
- `poster_photo`: Job poster photo. The job poster's photo URL. Full job details.

### Company details (add-on)

- `title`: Title. Job title.
- `company_website`: Company website. The company's website. Company details.
- `company_industry`: Company industry. The company's industry. Company details.
- `company_size`: Company size. Company size band, such as "1,001-5,000 employees". Company details.
- `company_employees_count`: Employees on LinkedIn. Number of employees with a LinkedIn profile at the company. Company details.
- `company_followers_count`: Company followers. Followers of the company's LinkedIn page. Company details.
- `company_founded`: Founded. Year the company was founded. Company details.
- `company_headquarters`: Headquarters. The company's headquarters city and region. Company details.
- `company_type`: Company type. Such as "Public Company" or "Privately Held". Company details.
- `company_specialties`: Specialties. The company's specialties. Company details.
- `company_description`: Company description. The company's About text. Company details.
- `company_tagline`: Company tagline. The company's tagline. Company details.

### Search details

- `title`: Title. Job title.
- `search_keywords`: Search keywords. Keywords of the search that found the job, with any added filter words.
- `search_location`: Search location. Location of the search that found the job.
- `source_url`: Input. The search URL, job URL or keyword search the job came from.
- `scraping_time`: Scraped at. When the job was scraped (UTC, ISO 8601).

## How it works

1. Type the role and where. Or paste a LinkedIn job search with your filters already set.
2. Up to 1,000 jobs per search. That is the most LinkedIn shows. Split a big search by city or keyword for more, and a job found twice appears once.
3. Keep only the jobs you want. Filter by date posted, Easy Apply and applicant count, or leave out job titles and companies you don't want.
4. Download your list. As a spreadsheet, in Google Sheets, or into your ATS or CRM.

## Use cases

- Selling to companies that are hiring: Companies hiring for the roles you sell to, such as accountants or engineers, as a reason to reach out now.
- Salary and job market research: Salaries, seniority and locations across postings, to see what a role pays and where the demand is.
- Job boards and alerts: Fresh postings every day for a niche job board, or an alert you send to candidates.
- Watching competitors: The roles your competitors are hiring for, and where, as a sign of where they’re growing.

## Good to know

LinkedIn shows at most 1,000 jobs for one search, so split a big search by city or keyword. Salary is there only when the employer published it.

## Questions

### Is it legal to scrape LinkedIn jobs?

This scraper collects only job postings that LinkedIn shows publicly to visitors who are not logged in. Some fields, such as the job poster's name, are personal data, which laws such as the GDPR and CCPA protect. Make sure you have a lawful reason to collect and use it. If you are unsure, ask a lawyer.

### Do I need a LinkedIn account?

No. You don't need a LinkedIn account, a login or cookies, and the scraper never uses yours.

### How many jobs can I get from one search?

LinkedIn shows at most 1,000 jobs per search, logged in or not. To get more, split the search: one search per city instead of one per country, or one per keyword. Each search URL or keyword in the input is its own search, and a job found by two searches is saved once.

### Do all LinkedIn filters work?

Date posted, Easy Apply, Fewer than 10 applicants, company and location filters work as on LinkedIn. Workplace (remote, hybrid), Job type and Experience level don't: LinkedIn ignores them for logged-out visitors. The scraper adds their words to the search keywords instead, for example "Remote (Full-time OR Part-time) accountant", which brings closely matching jobs but is not an exact filter. Check employment_type and seniority_level in the results if you need to be strict. Sorting by "Most recent" is also ignored by LinkedIn; use Posted since or Date posted instead.

### What happens when a run fails?

The run's status message says why, and the log names each input that failed. If a mistake in the input stops the run before anything is scraped, the run ends without results and its status message says what to change. Either way the Actor sends us a short error report, so we can fix the cause even if you never open an issue: the Actor's build, the reason, the counts from the end-of-run summary, whether your Apify plan is free or paid and, for an unexpected error, where in our code it happened. Web addresses and @usernames are blanked out first. The report never includes your input, your account, the pages you scraped or your results. Every run, failed or not, also sends one usage line as it ends, so we can see which options people use, what runs cost us and how well the data is filled: how many of each charged event it used (for example 120 full details) and the price your plan paid for them; the run's platform cost by item and its resources (time, memory, proxy traffic); whether it stopped at your maximum cost or maximum items; how it was started (Console, API, schedule, saved task, and for API runs the kind of tool, such as Make, Zapier or the Apify client, never the tool's full identity); our scraper's own retry and timing counts; and for each output field, how many results had it filled (counts only, never the values). That never includes your input, your account, your IP address, the pages you scraped or your results either. If you need help with a run, open an issue on the Issues tab and attach the run, or email support@kekliktech.com with the run's link; the run's log ends with both.

## Run it

- In Apify Console: https://apify.com/keklik/linkedin-jobs-scraper
- With the Apify API: POST https://api.apify.com/v2/acts/keklik~linkedin-jobs-scraper/run-sync-get-dataset-items?token=APIFY_TOKEN with the input JSON as the body. It returns the rows.
- From an AI agent: connect the Apify MCP server (https://mcp.apify.com), add the Actor `keklik/linkedin-jobs-scraper` and call it with the input.
