# LinkedIn Jobs Scraper - Job Listings, Salaries & Companies (`socialscrapers/linkedin-jobs-scraper`) Actor

LinkedIn jobs scraper for job listings and job postings: full job descriptions, salaries, seniority, applicants and company details. Search by keyword and location, with date, company, job type and remote filters, any number of jobs. Export or use the API. No login or cookies. $0.35 per 1,000 jobs.

- **URL**: https://apify.com/socialscrapers/linkedin-jobs-scraper.md
- **Developed by:** [Social Scrapers](https://apify.com/socialscrapers) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.28 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**LinkedIn Jobs Scraper** extracts LinkedIn job listings, also called job postings: titles, full job descriptions, salaries, seniority levels, employment types, industries, applicant counts and job posters, plus the hiring company's website, size and headquarters. Search by keyword and location, or paste LinkedIn search and job links. It works without a LinkedIn account, login or cookies, and costs **$0.35 per 1,000 jobs**.

### What does LinkedIn Jobs Scraper do?

LinkedIn Jobs Scraper turns LinkedIn's public job search into clean, structured data you can download or read through an API:

- 🔎 **Search by keywords and location**: run many job searches in one go, each with its own filters and job limit. Location can be a city, a state or region, a country, or worldwide.
- 🎛️ **Filters**: date posted (past hour, 24 hours, week, month, or any window you set), company (by name or LinkedIn company ID), job type, experience level, workplace (remote, hybrid, on-site), Easy Apply only and fewer than 10 applicants.
- 🔗 **Paste links**: LinkedIn job search URLs copied from your browser (every filter in them is kept) or links to single jobs.
- ♾️ **No 1,000-job ceiling**: LinkedIn shows about 1,000 results for one search. Ask for more, or for every job (`maxJobs: 0`), and the scraper splits the search by state or region, by city and by date posted on its own, then saves each job once.
- 📄 **Full job details**: description as HTML and plain text, seniority level, employment type, industries, applicants, salary with minimum, maximum, currency and period, apply type, whether the job still accepts applications, and the job poster when LinkedIn shows one.
- 🏢 **Company details** (optional): website, industry, company size, employees on LinkedIn, headquarters and full address, company type, year founded, specialties, followers and About text.
- 🎯 **Only jobs that mention your keywords** (optional): LinkedIn fills a search that has few matches with related jobs. Keep only jobs whose title, or title or description, names every word of your keywords; the others are never charged.
- 🧹 **No duplicates**: a job found by several searches is saved once, and you pay for it once.
- 💸 **Pay per job**: you pay only for jobs saved to your dataset. Set a maximum cost per run and it stops exactly there.

### What data can you extract from LinkedIn job postings?

| Data | Fields |
| --- | --- |
| Job | `id`, `link`, `title`, `location`, `postedAt` (YYYY-MM-DD), `postedAtRelative` ("3 days ago"), `isClosed` |
| Description | `descriptionHtml`, `descriptionText` |
| Job criteria | `seniorityLevel`, `employmentType`, `industries`, `jobFunction` |
| Salary | `salaryInfo` (as shown), `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` (HOUR, DAY, WEEK, MONTH or YEAR), `additionalCompensation` |
| Applicants | `applicantsCount`, `applicantsText`, `benefits` ("Actively Hiring", "Be an early applicant") |
| How to apply | `applyType` (`EASY_APPLY` or `EXTERNAL`), `applyUrl` |
| Hiring company | `companyName`, `companyId`, `companyLinkedinUrl`, `companyLogo` |
| Company details (option) | `companyWebsite`, `companyIndustry`, `companySize`, `companyEmployeesOnLinkedin`, `companyHeadquarters`, `companyAddress`, `companyType`, `companyFounded`, `companySpecialties`, `companyFollowers`, `companyDescription`, `companySlogan` |
| Job poster | `jobPosterName`, `jobPosterTitle`, `jobPosterProfileUrl`, `jobPosterPhoto` |
| Source | `searchKeywords`, `searchLocation`, `inputUrl`, `scrapedAt` |

Every job has the same 48 fields in the same order. Fields LinkedIn does not show for a job are `null` (or an empty list), so the data drops straight into spreadsheets, databases and AI pipelines.

### How to scrape LinkedIn jobs

1. Open LinkedIn Jobs Scraper in Apify Console and click **Try for free**.
2. Add one or more **searches** (keywords, location, filters), or paste LinkedIn **search URLs** or **job URLs**.
3. Set **Max jobs per search**: a number, or `0` for every job the search has.
4. Optional: turn on **Include company details**.
5. Click **Start**. Download the LinkedIn jobs as JSON, CSV, Excel, XML or HTML, or read them through the API.
6. To collect new jobs every day, save the input as a task and **schedule** it with `datePosted: "past24Hours"`.

### How much does it cost to scrape LinkedIn jobs?

**$0.35 per 1,000 jobs** saved to your dataset. Apify subscribers pay less: **Silver 10% off ($0.315 per 1,000), Gold 20% off ($0.28 per 1,000)**. Platform usage and proxies are included, and so are company details.

- Duplicates, jobs that no longer exist and jobs that don't match your job type or experience level filters are free.
- **Example:** 10,000 data analyst jobs in the United States, with descriptions: **$3.50** ($2.80 on Gold).
- **Example:** 500 new jobs every day for a month, about 15,000 jobs: **$5.25**.
- Apify's free plan includes monthly platform credit (currently $5), enough to try the scraper on about 14,000 jobs.

Set a **maximum cost per run** when you start it, and the scraper stops cleanly before the first job that would go over it.

### Input example

```json
{
    "searches": [
        {
            "keywords": "data analyst",
            "location": "United States",
            "datePosted": "pastWeek",
            "experienceLevels": ["entryLevel", "associate"],
            "maxJobs": 2000
        },
        {
            "keywords": "registered nurse",
            "location": "Texas, United States",
            "jobTypes": ["fullTime"],
            "maxJobs": 0
        },
        {
            "keywords": "product manager",
            "companies": ["Stripe"],
            "workplaceTypes": ["remote"]
        }
    ],
    "searchUrls": ["https://www.linkedin.com/jobs/search?keywords=accountant&location=London&f_TPR=r86400"],
    "jobUrls": ["https://www.linkedin.com/jobs/view/4484651478"],
    "includeDescription": true,
    "includeCompanyDetails": true
}
```

| Field | What it does |
| --- | --- |
| `searches` | A list of searches. Each one can have `keywords`, `location`, `datePosted` (`anyTime`, `pastMonth`, `pastWeek`, `past24Hours`, `pastHour`, or a window in seconds such as `r7200`), `companies` (names or LinkedIn company IDs), `jobTypes` (`fullTime`, `partTime`, `contract`, `temporary`, `internship`, `volunteer`, `other`), `experienceLevels` (`internship`, `entryLevel`, `associate`, `midSenior`, `director`, `executive`), `workplaceTypes` (`onSite`, `remote`, `hybrid`), `easyApply`, `under10Applicants` and `maxJobs`. |
| `searchUrls` | LinkedIn job search links copied from your browser. |
| `jobUrls` | Links to single LinkedIn jobs, or job IDs. |
| `maxJobsPerSearch` | Jobs to save per search URL, and per search without its own `maxJobs` (default 100, `0` for every job). |
| `includeDescription` | Open each job for its description and details (default on). Turn off for a faster list with the search-result fields only. |
| `includeCompanyDetails` | Add each hiring company's website, size, industry, headquarters and more (default off). Each company page is read once per run. |
| `keywordMatch` | `off` (default, LinkedIn's results as they are), `title` (every word of the keywords in the job title) or `titleOrDescription`. Jobs left out are not charged. |
| `filtersAsKeywords` | Add the job type, experience level and workplace you pick to the search words (default on, see Limits). |
| `proxyConfiguration` | Keep the default: Apify Proxy, with refused pages retried through residential IPs automatically. |

### Output example

A real job from a search for software engineers in London, trimmed:

```json
{
    "id": "4484651478",
    "link": "https://www.linkedin.com/jobs/view/4484651478",
    "title": "Backend GOLANG Software Engineers 100% remote in the UK",
    "companyName": "Huxley",
    "companyId": "7355",
    "companyLinkedinUrl": "https://uk.linkedin.com/company/huxley",
    "location": "City Of London, England, United Kingdom",
    "postedAt": "2026-11-03",
    "postedAtRelative": "5 days ago",
    "applicantsCount": 76,
    "applicantsText": "76 applicants",
    "salaryInfo": ["£69,000.00/yr", "£125,000.00/yr"],
    "salaryMin": 69000,
    "salaryMax": 125000,
    "salaryCurrency": "GBP",
    "salaryPeriod": "YEAR",
    "benefits": ["Actively Hiring"],
    "seniorityLevel": "Not Applicable",
    "employmentType": "Full-time",
    "jobFunction": null,
    "industries": "Technology, Information and Internet",
    "descriptionText": "Backend GOLANG Software Engineers 100% remote in the UK\n\nThis is a new and exclusive opportunity for a Backend GO Software Engineer ...",
    "applyType": "EXTERNAL",
    "applyUrl": null,
    "isClosed": false,
    "companyWebsite": "http://www.huxley.com",
    "companyIndustry": "Staffing and Recruiting",
    "companySize": "201-500 employees",
    "companyEmployeesOnLinkedin": 773,
    "companyHeadquarters": "London, England",
    "companyAddress": { "street": "55 Basinghall Street", "city": "London", "region": "England", "postalCode": "EC2V 5DX", "country": "GB" },
    "companyType": "Public Company",
    "companyFounded": 1995,
    "companySpecialties": ["Banking", "Engineering", "IT", "Financial Services"],
    "companyFollowers": 641278,
    "companySlogan": "Outpace tomorrow, together.",
    "searchKeywords": "software engineer",
    "searchLocation": "London",
    "inputUrl": "https://www.linkedin.com/jobs/search?keywords=software+engineer&location=London&f_TPR=r604800",
    "scrapedAt": "2026-11-08T11:12:45.436Z"
}
```

In Apify Console the results also open as tables: **Overview** (the main fields), **Details** (descriptions, salary, poster) and **Companies** (company details).

### Use cases

- 📋 **Job boards and job alerts**: feed fresh LinkedIn job postings into your job board, newsletter, Slack channel or spreadsheet every day.
- 🎯 **Lead generation**: find companies hiring for roles your product or service supports, with their website, size, industry and headquarters.
- 💰 **Salary research**: compare posted salary ranges by role, seniority, location and company.
- 📈 **Hiring signals and market research**: follow which companies are hiring, for what, where and how fast, and track demand for skills over time.
- 🧑‍💼 **Recruiting**: track open roles at competitors and see who posts them.

### Use it via API, Python, JavaScript and integrations

Run LinkedIn Jobs Scraper from your own code with the [Apify API](https://docs.apify.com/api/v2) and read the jobs from the run's dataset.

Python ([apify-client](https://docs.apify.com/api/client/python)):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("socialscrapers/linkedin-jobs-scraper").call(run_input={
    "searches": [{"keywords": "data analyst", "location": "United States", "datePosted": "past24Hours", "maxJobs": 500}],
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], "|", job["companyName"], "|", job["location"], "|", job["salaryInfo"])
```

JavaScript ([apify-client](https://docs.apify.com/api/client/js)):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('socialscrapers/linkedin-jobs-scraper').call({
    searches: [{ keywords: 'nurse', location: 'Texas, United States', maxJobs: 0 }],
    includeCompanyDetails: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`${items.length} jobs`);
```

- **No-code:** connect the scraper to Make, Zapier, n8n, Google Sheets, Slack, Airbyte and more through [Apify integrations](https://docs.apify.com/platform/integrations).
- **Webhooks and schedules:** run it every hour or day, and get notified or push the results when a run finishes.
- **AI agents:** let AI assistants and agents run it and read the jobs through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

### Limits

- **Public data only.** The scraper reads what LinkedIn shows to visitors who are not signed in.
- **External apply links** are shown by LinkedIn to signed-in members only, so `applyUrl` is empty for `EXTERNAL` jobs; `applyType` still tells you which kind of job it is.
- **Job function** is not shown on public job pages at the moment, so `jobFunction` is usually empty.
- **Remote, hybrid or on-site** is not stated on public job pages. LinkedIn's public search reads job type, experience level and workplace as words of the search, so the scraper adds them to your keywords and checks each job's employment type and seniority level on its page; workplace results follow LinkedIn's reading of the search.
- **Related jobs:** LinkedIn fills a search with few matching jobs with related ones, as on its website. Use `keywordMatch` to keep only jobs that mention your keywords.
- **Salaries, applicants and job posters** appear only when LinkedIn shows them for the job.
- **About 1,000 results per LinkedIn search.** Bigger searches are split automatically by location (states and regions of 12 countries, main cities of the busiest regions, countries for worldwide searches) and by date posted. Very broad searches can still leave out some older, lower-ranked jobs that LinkedIn never lists.
- `postedAt` is the exact day for jobs found by a search, and an estimate from "2 weeks ago" for jobs added by URL.
- **Share and short links work.** `lnkd.in/…` links are followed to the job or job search they open, job links with tracking parameters (`?trackingId=…`, `?refId=…`, `currentJobId=…`) are read as their job, and a job link given as a search URL (or a search link given as a job URL) is read as what it is. An unusable link is skipped with a warning; following a link is never charged.
- **A run with 0 results still succeeds when your input was fine.** When a job is no longer available, a company is not found, a short link is dead or a search matches nothing, the run ends as Succeeded with a status message naming each input and why, and nothing is charged. A run fails only when no input is usable at all, or when LinkedIn refuses every one of 3 or more inputs.

### FAQ

#### Is it legal to scrape LinkedIn jobs?

LinkedIn Jobs Scraper collects only job listings that LinkedIn shows publicly to any visitor, without logging in. Scraping public data is generally lawful, but rules differ by country and by use, and job posters' names are personal data under laws like the GDPR. You are responsible for how you use the data; ask a lawyer if you are unsure.

#### Do I need a LinkedIn account or cookies?

No. LinkedIn Jobs Scraper never logs in and needs no cookies, so no LinkedIn account is put at risk.

#### How many LinkedIn jobs can I scrape?

As many as LinkedIn lists for your searches. Set `maxJobs` to any number, or `0` for all of them; searches over LinkedIn's limit of about 1,000 results are split automatically.

#### Why did I get fewer jobs than I asked for?

The search had fewer results, some jobs were already found by another search in the run, some did not match your job type or experience level, or the run reached its maximum cost. The run log says which, for each search.

#### Why do some jobs not match my keywords?

LinkedIn shows related jobs after the matching ones when a search has few matches (a made-up word still lists thousands of jobs). Set `keywordMatch` to `title` or `titleOrDescription` to keep only jobs that mention every word of your keywords; the rest are skipped for free.

#### How do I get only new jobs every day?

Set `datePosted` to `past24Hours` (or `pastHour` for hourly runs) and schedule the scraper. Each run returns the jobs posted since the last one.

#### How do I filter by company?

Put the company name in `companies` and the scraper finds its LinkedIn company ID, as LinkedIn's company filter does. You can also give the ID itself: it's in every job's `companyId` field.

#### Can I limit how much a run costs?

Yes. Set the maximum cost per run when you start it: the scraper saves jobs until the next one would go over that amount, then stops.

### Other scrapers by Social Scrapers

| Scraper | What it gets |
| --- | --- |
| [Facebook Groups Scraper](https://apify.com/socialscrapers/facebook-groups-scraper) | Posts from public Facebook groups |
| [Facebook Profile Scraper](https://apify.com/socialscrapers/facebook-profile-scraper) | Public details of Facebook profiles and Pages |
| [Facebook Profile Posts Scraper](https://apify.com/socialscrapers/facebook-profile-posts-scraper) | Recent posts of Facebook profiles and Pages |
| [Facebook Ads Library Scraper](https://apify.com/socialscrapers/facebook-ads-library-scraper) | Ads from Meta's public Ad Library |
| [X (Twitter) Profile Scraper](https://apify.com/socialscrapers/x-profile-scraper) | X profiles: bio, followers, counts |
| [Quora Scraper](https://apify.com/socialscrapers/quora-scraper) | Quora questions, answers and profiles |
| [Reddit Scraper](https://apify.com/socialscrapers/reddit-scraper) | Reddit posts, comments, users and search |
| [Instagram Profile Scraper](https://apify.com/socialscrapers/instagram-profile-scraper) | Instagram profiles and their posts |
| [Instagram Post Scraper](https://apify.com/socialscrapers/instagram-post-scraper) | Instagram posts, reels and comments |
| [YouTube Scraper](https://apify.com/socialscrapers/youtube-scraper) | YouTube videos, channels, search and comments |
| [YouTube Transcript Scraper](https://apify.com/socialscrapers/youtube-transcript-scraper) | Transcripts and captions of YouTube videos |
| [Threads Scraper](https://apify.com/socialscrapers/threads-scraper) | Threads profiles, posts and replies |

# Actor input Schema

## `searches` (type: `array`):

One object per search. Fields (all optional):<br>• <code>keywords</code>: job title, skill or company, e.g. "data analyst"<br>• <code>location</code>: city, region or country, e.g. "London" or "Texas, United States" (default: Worldwide)<br>• <code>datePosted</code>: anyTime, pastMonth, pastWeek, past24Hours, pastHour, or any window in seconds such as "r7200" (the past 2 hours)<br>• <code>companies</code>: company names or LinkedIn company IDs, e.g. \["Stripe", "1441"]<br>• <code>jobTypes</code>: fullTime, partTime, contract, temporary, internship, volunteer, other<br>• <code>experienceLevels</code>: internship, entryLevel, associate, midSenior, director, executive<br>• <code>workplaceTypes</code>: onSite, remote, hybrid<br>• <code>easyApply</code>: true for Easy Apply jobs only<br>• <code>under10Applicants</code>: true for jobs with fewer than 10 applicants<br>• <code>maxJobs</code>: jobs to save from this search, 0 for all (default: Max jobs per search)

## `searchUrls` (type: `array`):

LinkedIn job search links copied from your browser (linkedin.com/jobs/search?...). Every filter in the link is used; lnkd.in short links to a search are followed. Example: https://www.linkedin.com/jobs/search?keywords=nurse\&location=Texas\&f_TPR=r86400

## `jobUrls` (type: `array`):

Links to single LinkedIn jobs (linkedin.com/jobs/view/..., with or without tracking parameters), lnkd.in short links to a job, or job IDs, e.g. https://www.linkedin.com/jobs/view/4000000000 or 4000000000.

## `maxJobsPerSearch` (type: `integer`):

Jobs to save from each search URL, and from each search without its own maxJobs. 0 saves every job LinkedIn has for the search. LinkedIn shows about 1,000 results per search; for more, the scraper automatically splits the search by state or region, city and date posted, and saves each job once.

## `includeDescription` (type: `boolean`):

Open every job's page for its full description, seniority level, employment type, industries, applicants, salary, apply type, job poster and whether it still accepts applications. Turn off for a faster list with the search-result fields only (title, company, location, date posted).

## `includeCompanyDetails` (type: `boolean`):

Add each hiring company's website, industry, size, employees on LinkedIn, headquarters and address, type, year founded, specialties, followers and About text. Each company page is read once per run, however many of its jobs you get.

## `keywordMatch` (type: `string`):

LinkedIn fills a search that has few matching jobs with related ones (even a made-up word lists thousands of jobs). Choose where every word of your keywords must appear: in the job title, or in the title or description. Jobs left out this way are not charged. Off keeps LinkedIn's results as they are.

## `filtersAsKeywords` (type: `boolean`):

LinkedIn's public job search treats job type, experience level and workplace (remote, hybrid, on-site) as words of the search rather than as filters. When on, the options you pick are added to your keywords, e.g. "Remote Entry level data analyst". Jobs are always checked against the employment type and seniority level on their page.

## `maxConcurrency` (type: `integer`):

How many LinkedIn pages are loaded at the same time, e.g. 20. Lower it if you see many refused requests in the log.

## `proxyConfiguration` (type: `object`):

By default Apify Proxy (datacenter IPs), and any page LinkedIn keeps refusing there is retried automatically through Apify's residential proxy. Choose RESIDENTIAL to use residential IPs for every request.

## Actor input object example

```json
{
  "searches": [
    {
      "keywords": "data analyst",
      "location": "United States",
      "datePosted": "pastWeek",
      "maxJobs": 25
    }
  ],
  "maxJobsPerSearch": 25,
  "includeDescription": true,
  "includeCompanyDetails": false,
  "keywordMatch": "off",
  "filtersAsKeywords": true,
  "maxConcurrency": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searches": [
        {
            "keywords": "data analyst",
            "location": "United States",
            "datePosted": "pastWeek",
            "maxJobs": 25
        }
    ],
    "maxJobsPerSearch": 25,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialscrapers/linkedin-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searches": [{
            "keywords": "data analyst",
            "location": "United States",
            "datePosted": "pastWeek",
            "maxJobs": 25,
        }],
    "maxJobsPerSearch": 25,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("socialscrapers/linkedin-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searches": [
    {
      "keywords": "data analyst",
      "location": "United States",
      "datePosted": "pastWeek",
      "maxJobs": 25
    }
  ],
  "maxJobsPerSearch": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call socialscrapers/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,socialscrapers/linkedin-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/v6acCykeFPCeo9KOU/builds/EefojAvRSq4qnqayq/openapi.json
