# LinkedIn Jobs Scraper: Full Details, Salaries & New-Job Monitor (`stratumics/linkedin-jobs-scraper`) Actor

Scrape LinkedIn jobs with full descriptions, salary ranges, seniority, job type and applicant counts. No login. Get only new jobs on a schedule and go past the 1,000-result limit.

- **URL**: https://apify.com/stratumics/linkedin-jobs-scraper.md
- **Developed by:** [Stratum ICS](https://apify.com/stratumics) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 job with full details

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** collects job postings from [LinkedIn Jobs](https://www.linkedin.com/jobs/) and saves each one as a clean row: title, company, location, posting date, full description, salary range, seniority, employment type, industries, applicant count and the job link. Use it as a **LinkedIn jobs API** with no LinkedIn account, and schedule it to return **only new jobs** on every run.

Type keywords and a location, or paste LinkedIn job search URLs from your browser. The scraper pages through the results, opens every job page for the details, removes duplicates across your searches, and saves the jobs to a dataset you can download as JSON, CSV or Excel, or read through the API.

### Why use this LinkedIn Jobs Scraper?

- **Only new jobs on every scheduled run.** Turn on "Only new jobs", give the monitor a name and schedule the Actor. Each run returns postings you have not received before. Jobs it skips are not charged.
- **Filters that really filter.** LinkedIn's public job search no longer applies the job type, experience level and workplace filters, so a search for part-time work comes back full of full-time jobs. This scraper checks those values on every job page and saves only the jobs that match. In one test, 23 of 33 results for a part-time search URL were not part-time; none of them were saved or charged.
- **More salaries.** You get LinkedIn's pay range when it shows one, and otherwise the first pay range written in the description, parsed into minimum, maximum, currency and period. In a test of 180 US and UK jobs, LinkedIn's own pay box covered 9% of jobs and the descriptions brought salary coverage to 36%.
- **Past the 1,000-result limit.** LinkedIn stops every search at 1,000 results. Ask for more and the scraper splits the search by state or region and by posting date, then merges the results without duplicates.
- **Low price, no subscription.** You pay per job saved, with no monthly rental. Jobs a monitor skips are free, so frequent monitoring stays cheap.
- **No login, no cookies.** It reads the job pages LinkedIn shows to logged-out visitors, so no account is put at risk.
- **Everything Apify adds:** scheduling, an API, integrations with Zapier, Make, n8n and Google Sheets, proxy rotation, and run monitoring.

### What data can you get from LinkedIn jobs?

| Field | What it holds |
|---|---|
| `jobId`, `url` | LinkedIn job ID and link |
| `title` | Job title |
| `companyName`, `companyUrl`, `companyLogo` | Hiring company, its LinkedIn page and logo |
| `location` | Job location as LinkedIn shows it |
| `workplaceType` | Remote, Hybrid or On-site, when the posting states it |
| `postedAt`, `postedTimeAgo` | Posting date (YYYY-MM-DD) and LinkedIn's "2 days ago" text |
| `salary` | Pay range text, `min`, `max`, `currency`, `period` and `source` |
| `employmentType` | Full-time, Part-time, Contract, Temporary, Internship and so on |
| `seniorityLevel` | Entry level, Associate, Mid-Senior level, Director and so on |
| `industries` | Industries LinkedIn lists for the job |
| `applicantsCount`, `applicantsText` | Applicant number and LinkedIn's applicant line |
| `applyType`, `applyUrl` | Easy Apply or the employer's site, and where to apply |
| `insights` | Badges such as "Actively Hiring" or "Be an early applicant" |
| `descriptionText` | Full description as plain text with line breaks |
| `descriptionHtml` | Full description as HTML (optional) |
| `jobPosterName`, `jobPosterTitle`, `jobPosterProfileUrl` | Who posted the job, when shown (optional) |
| `searchKeywords`, `searchLocation`, `searchUrl` | Which of your searches found the job |
| `scrapedAt` | When the job was scraped |

### How to scrape LinkedIn jobs

1. Open the Actor and go to the **Input** tab.
2. Under **Job searches**, add one row per search: keywords such as "registered nurse" and a location such as "Texas, United States". Or paste LinkedIn search URLs under **LinkedIn URLs**.
3. Pick any filters: date posted, job type, experience level, workplace, Easy Apply, fewer than 10 applicants, company IDs or distance.
4. Set **Max jobs per search**. Above 1,000, keep "Get past LinkedIn's 1,000-result limit" on.
5. Click **Start** and watch the jobs appear in the **Output** tab.
6. Download the results as JSON, CSV, Excel or HTML, or connect them to another tool.

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

This Actor uses pay-per-event pricing. You pay **$0.50 per 1,000 jobs with full details** ($0.0005 per job) and **$0.20 per 1,000 jobs** when "Full job details" is off. Each run also has a start fee of $0.0005 (a twentieth of a cent). Jobs removed by your filters, duplicates and jobs a monitor has already seen are not charged. Platform usage is included.

Larger Apify plans pay less automatically: jobs with full details cost $0.45 per 1,000 on Scale and $0.40 on Business.

Worked examples:

- **1,000 jobs with full descriptions cost about $0.50.**
- A daily monitor that returns 40 new jobs a day costs about $0.62 a month.
- Apify's free plan includes $5 of monthly credit, enough for about 10,000 jobs with details.

You can also set a maximum cost per run in the run options. The scraper stops as soon as that budget is used, and you are never charged beyond it.

### Input

See the **Input** tab for every option. A typical input:

```json
{
    "searches": [
        { "keywords": "registered nurse", "location": "Texas, United States" },
        { "keywords": "data analyst", "location": "London, England, United Kingdom" }
    ],
    "datePosted": "past-week",
    "jobTypes": ["full-time"],
    "maxJobsPerSearch": 200,
    "fetchJobDetails": true
}
```

Keyword searches use the filters in the form. A pasted LinkedIn search URL keeps the filters inside the URL instead, and the scraper still checks its job type, experience and workplace filters on every job page.

#### Monitor LinkedIn for new jobs on a schedule

1. Create a task with your searches, set **Date posted** to "Past 24 hours", turn on **Only new jobs** and give the monitor a name such as `nurses-texas`.
2. In Apify Console open **Schedules**, create a schedule (for example `0 7 * * *` for every day at 07:00), and add the task.
3. Every run now returns only jobs it has not returned before. Connect the dataset to Google Sheets, Slack or email to get the new jobs where you work.

```json
{
    "searches": [{ "keywords": "registered nurse", "location": "Texas, United States" }],
    "datePosted": "past-24h",
    "onlyNewJobs": true,
    "monitorName": "nurses-texas",
    "maxJobsPerSearch": 500
}
```

The monitor remembers up to 100,000 job IDs in a named storage on your account. The first run returns everything that matches; later runs return only new postings. Use a different monitor name for each task.

#### How the 1,000-result limit is handled

LinkedIn shows at most 1,000 results for any one search. When a search reaches that limit and you asked for more, the scraper runs it again in slices:

- **By region**, when the location is one of 14 supported countries: United States, Canada, United Kingdom, India, Germany, France, Australia, Netherlands, Spain, Italy, Brazil, Mexico, Poland and United Arab Emirates. Each state, province or region is its own search with its own 1,000 results.
- **By posting date**, for cities and for regions that are still too large: past hour, 6 hours, 12 hours, day, 2 days, 3 days, 5 days, week, 2 weeks and month.

Duplicates between slices are removed before saving, so you only pay for unique jobs. The **RUN_SUMMARY** record of each run tells you whether a search reached the limit and how many slices it used.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Two jobs from a real run, with the descriptions shortened:

```json
[
    {
        "jobId": "4479602490",
        "title": "Software Engineer III, Full Stack - Global Servicing Technology",
        "companyName": "American Express",
        "companyUrl": "https://www.linkedin.com/company/american-express",
        "companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQGRhsociEn4gQ/company-logo_100_100/company-logo_100_100/0/1631367875582?e=2147483647&v=beta&t=bk_i8KnJwZyUrbBXvWK0NMb6W3nPq64rupEGTrKvxYU",
        "location": "Sunrise, FL",
        "workplaceType": "Hybrid",
        "postedAt": "2026-10-17",
        "postedTimeAgo": "22 hours ago",
        "url": "https://www.linkedin.com/jobs/view/4479602490",
        "applyUrl": null,
        "applyType": "EXTERNAL",
        "salary": {
            "text": "$103,750.00/yr - $174,750.00/yr",
            "min": 103750,
            "max": 174750,
            "currency": "USD",
            "period": "YEAR",
            "source": "linkedin"
        },
        "employmentType": "Full-time",
        "seniorityLevel": "Not Applicable",
        "jobFunction": null,
        "industries": "Financial Services",
        "applicantsCount": 37,
        "applicantsText": "37 applicants",
        "insights": [
            "Actively Hiring"
        ],
        "descriptionText": "Job Description\n\nJoining Amex Tech means discovering and shaping your contribution to something big. Here, you can work alongside talented tech teams and build a unique career with the Powerful Backing of American Express. With a range of ...",
        "searchKeywords": "software engineer",
        "searchLocation": "United States",
        "searchUrl": null,
        "scrapedAt": "2026-10-18T00:04:11.998Z"
    },
    {
        "jobId": "4471688471",
        "title": "Registered Nurse (RN) - Day",
        "companyName": "Baylor Scott & White Institute for Rehabilitation",
        "companyUrl": "https://www.linkedin.com/company/bswrehab",
        "companyLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQHCr2cTPFurhg/company-logo_100_100/company-logo_100_100/0/1681746337203/bswrehab_logo?e=2147483647&v=beta&t=dvtg70QbHPovigpR-NXHLnhCKY6fxvg847bE9GT6WxU",
        "location": "Fort Worth, TX",
        "workplaceType": null,
        "postedAt": "2026-09-24",
        "postedTimeAgo": "3 weeks ago",
        "url": "https://www.linkedin.com/jobs/view/4471688471",
        "applyUrl": "https://www.linkedin.com/jobs/view/4471688471",
        "applyType": "EASY_APPLY",
        "salary": {
            "text": "$39.38 - $53.00 per hour",
            "min": 39.38,
            "max": 53,
            "currency": "USD",
            "period": "HOUR",
            "source": "description"
        },
        "employmentType": "Full-time",
        "seniorityLevel": "Not Applicable",
        "jobFunction": null,
        "industries": "Hospitals and Health Care",
        "applicantsCount": 25,
        "applicantsText": "Be among the first 25 applicants",
        "insights": [
            "Be an early applicant"
        ],
        "descriptionText": "Baylor Scott & White Institute for Rehabilitation\n\nJoint venture with Select Medical\n\nRegistered Nurse (RN)\n\nFort Worth, TX\n\nDay Shift\n\nHours: 6:45 a.m. - 7:15 p.m.\n\nCompensation Depends Upon Candidate’s Years Of Experience\n\nHourly Pay ...",
        "searchKeywords": "registered nurse",
        "searchLocation": "Texas, United States",
        "searchUrl": null,
        "scrapedAt": "2026-10-18T00:02:38.916Z"
    }
]
```

### Tips for better results

- **Remote jobs:** pick "Remote" under Workplace. LinkedIn hides the workplace label from logged-out visitors, so the scraper reads it from the title, location and description and leaves out jobs that never say. Many remote postings put "Remote" in the title, so adding "remote" to your keywords can bring more of them into the results.
- **Narrow searches work better** than one very wide one. LinkedIn's search matches loosely, so the last pages of a broad search often drift away from your keywords.
- **Faster lists:** turn off "Full job details" to get title, company, location, date and link several times faster, at a lower price.
- **Many searches in one run:** add them all; each gets its own limit and duplicates across searches are removed.
- **Check the summary:** the RUN_SUMMARY record in the run's storage lists, for each search, jobs saved, jobs filtered out, jobs skipped as already seen and pages read.

### Integrations and API

- **API:** start a run and get the jobs back in one call with `POST https://api.apify.com/v2/acts/stratumics~linkedin-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>`. See the **API** tab for every endpoint.
- **Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("stratumics/linkedin-jobs-scraper").call(
    run_input={"searches": [{"keywords": "data analyst", "location": "United States"}], "maxJobsPerSearch": 100}
)
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["companyName"], job["salary"])
```

- **JavaScript:**

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

const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('stratumics/linkedin-jobs-scraper').call({
    searches: [{ keywords: 'data analyst', location: 'United States' }],
    maxJobsPerSearch: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

- **No-code tools:** send new jobs to Google Sheets, Airtable, Slack or email with the Apify integrations for **Zapier**, **Make** and **n8n**, or with a webhook when a run finishes.
- **AI agents:** connect the [Apify MCP server](https://mcp.apify.com) to your agent and it can search LinkedIn jobs with this Actor as a tool, with the input schema discovered automatically.

### FAQ

#### Do I need a LinkedIn account?

No. The scraper reads the public job pages LinkedIn shows to anyone who is not logged in. You do not share any login or cookies.

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

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

Job postings are published by employers to be seen. The only personal data this Actor can collect is the name, headline and profile link of the person who posted a job, and only when you turn on "Include the job poster".

#### Why are some fields empty?

LinkedIn shows less to logged-out visitors than to members. The job function and the employer's external application link are hidden from them, so `jobFunction` is usually empty and `applyUrl` is filled only for Easy Apply jobs. `workplaceType` is filled only when the posting says remote, hybrid or on-site, and `salary` only when there is a pay range to read. Fields LinkedIn does not show are `null`, never made up.

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

Usually the search has fewer matching jobs, your filters removed some, or the monitor skipped jobs it had already returned. The RUN_SUMMARY record shows which. Searches stop at LinkedIn's 1,000-result limit when splitting is turned off.

#### How fast is it?

Speed depends on how many proxy IPs your Apify plan has, because LinkedIn limits requests per IP address. In platform tests with Apify's shared datacenter proxy, 100 jobs with full details took between 30 seconds and 3.5 minutes. Jobs without full details come several times faster (about six times in a local test), because one search page lists 10 to 25 jobs while full details need one page per job.

#### What happens when LinkedIn rate-limits the scraper?

LinkedIn answers too many requests from one IP address with an error. The scraper waits, switches to another proxy IP and tries again, and it slows itself down while the errors continue. You are never charged for retries.

#### How does "Only new jobs" decide what is new?

A job is new when this monitor has never returned its LinkedIn job ID. When an employer reposts a job, LinkedIn usually gives it a new ID, so it comes back as new.

#### Where can I report a problem or ask for a feature?

Open an issue in the **Issues** tab. Include the run ID so the run can be checked.

### Other tools from this developer

### Other tools from Stratum ICS

- [App Store Reviews Scraper](https://apify.com/stratumics/app-store-reviews-scraper): Get Apple App Store reviews with star ratings, titles, text, app versions, helpful votes and developer replies, well past Apple's 500-review limit, for any country, plus app ratings.
- [Google Maps Scraper](https://apify.com/stratumics/google-maps-scraper): Get the businesses on Google Maps for any search and area: name, address, phone, website, rating, review count, opening hours, plus emails and social profiles.
- [Google News Scraper](https://apify.com/stratumics/google-news-scraper): Get Google News articles with real publisher URLs (not Google redirects), source, date, image, author and optional full text.
- [Google Play Reviews Scraper](https://apify.com/stratumics/google-play-reviews-scraper): Get Google Play reviews with star ratings, text, app versions, thumbs-up counts, developer replies and feature ratings in any language, plus app details with installs and star histogram.
- [Google Trends Scraper](https://apify.com/stratumics/google-trends-scraper): Get Google Trends data as JSON, CSV or Excel: interest over time, interest by region and city, related queries, and trending searches by country.
- [Telegram Channel Scraper](https://apify.com/stratumics/telegram-channel-scraper): Get messages from public Telegram channels with views, dates, media, reactions, polls and forwards, plus channel info with exact subscriber counts.
- [Website Contact Scraper](https://apify.com/stratumics/website-contact-scraper): Turn a list of websites into one row per company with verified emails, formatted phone numbers, social profiles (LinkedIn, Facebook, Instagram, X), address and contact page.
- [YouTube Scraper](https://apify.com/stratumics/youtube-scraper): Get YouTube videos from searches, channels, playlists and links with exact views, likes, comment counts, dates and tags, plus channel profiles and comments.

# Actor input Schema

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

Each search is keywords plus a location, typed the way you would type them on LinkedIn. Every search runs on its own and returns up to "Max jobs per search" jobs. Keywords can be a job title, a skill or a company name. Leave keywords empty to get every job in a location.

## `startUrls` (type: `array`):

Optional. Paste LinkedIn job search URLs from your browser, or links to single job postings. A pasted search keeps every filter in its URL, so the filters below apply only to the keyword searches above.

## `datePosted` (type: `string`):

Only jobs posted within this time. Use "Past 24 hours" or "Past hour" for scheduled monitoring runs.

## `jobTypes` (type: `array`):

Keep only these employment types. Checked against each job page, so only matching jobs are saved and charged.

## `experienceLevels` (type: `array`):

Keep only these seniority levels. Checked against each job page. Jobs marked "Not Applicable" on LinkedIn are left out when this filter is on.

## `workplaceTypes` (type: `array`):

Keep only on-site, remote or hybrid jobs. LinkedIn hides this label from logged-out visitors, so the scraper reads it from the job title, location and description; jobs that never say are left out when this filter is on. Tip: also add "remote" to your keywords.

## `easyApplyOnly` (type: `boolean`):

Only jobs you can apply to on LinkedIn with Easy Apply.

## `under10Applicants` (type: `boolean`):

Only jobs that LinkedIn shows with fewer than 10 applicants so far.

## `companyIds` (type: `array`):

Only jobs from these companies. Use LinkedIn's numeric company ID, which is the f_C value in a LinkedIn job search URL filtered by that company (for example 1441 for Google).

## `distanceMiles` (type: `string`):

Search radius around a city location, in miles.

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

Most jobs to save for each search or pasted search URL. LinkedIn shows at most 1,000 results per search; above that, turn on the option below.

## `splitWideSearches` (type: `boolean`):

When a search reaches 1,000 results and you asked for more, run it again in slices (by state or region for supported countries, then by posting date) and merge the results without duplicates.

## `fetchJobDetails` (type: `boolean`):

Open each job page for the full description, seniority, employment type, industries, applicant count, salary and apply type. Turn off for a faster, cheaper list with title, company, location, date and link only.

## `includeDescriptionHtml` (type: `boolean`):

Also save the description with its original formatting as HTML, in descriptionHtml. The plain-text description is always included.

## `includeJobPoster` (type: `boolean`):

Add the name, headline and profile link of the person who posted the job, when LinkedIn shows them. This is personal data, so only turn it on if you have a legitimate reason to process it.

## `onlyNewJobs` (type: `boolean`):

Remember every job this monitor returns and skip it in later runs, so each scheduled run returns only new postings. Skipped jobs are not charged.

## `monitorName` (type: `string`):

Name of the memory used by "Only new jobs". Use a different name for each saved task or schedule, for example "nurses-texas". Letters, digits and hyphens are kept.

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

Upper limit for requests running at once. The scraper slows down by itself when LinkedIn rate-limits, so the default suits most runs.

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

LinkedIn limits requests per IP address. Apify datacenter proxies rotate IPs and are enough for this Actor.

## Actor input object example

```json
{
  "searches": [
    {
      "keywords": "data analyst",
      "location": "United States"
    }
  ],
  "startUrls": [],
  "datePosted": "any",
  "jobTypes": [],
  "experienceLevels": [],
  "workplaceTypes": [],
  "easyApplyOnly": false,
  "under10Applicants": false,
  "companyIds": [],
  "distanceMiles": "any",
  "maxJobsPerSearch": 100,
  "splitWideSearches": true,
  "fetchJobDetails": true,
  "includeDescriptionHtml": false,
  "includeJobPoster": false,
  "onlyNewJobs": false,
  "monitorName": "default",
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Dataset with one item per LinkedIn job

## `runSummary` (type: `string`):

Jobs saved per search, rate limits seen, and whether a search reached LinkedIn's 1,000-result limit

# 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"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("stratumics/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",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("stratumics/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"
    }
  ]
}' |
apify call stratumics/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stratumics/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/dsa5DfHmWbETL9Ye0/builds/nQCNqa2Zb1leyDgNT/openapi.json
