# LinkedIn Jobs Scraper: Beyond the 1000 Limit, No Login (`charitable_trousseau/linkedin-jobs-scraper`) Actor

LinkedIn job postings by keyword, location, company or search URL, with no login or cookies. Goes past LinkedIn's 1,000-jobs-per-search limit by dividing large searches and reports the coverage it reached. Title, company, location, date, optional full description and details. No personal data.

- **URL**: https://apify.com/charitable_trousseau/linkedin-jobs-scraper.md
- **Developed by:** [Charitable Trousseau](https://apify.com/charitable_trousseau) (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.35 / 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: Beyond the 1000 Limit, No Login

Get LinkedIn job postings for any keyword and place, for a list of companies, or for a LinkedIn job search URL. No login, no cookies, no LinkedIn account: only the pages LinkedIn shows to visitors who are not signed in.

LinkedIn hands out about 1,000 jobs per search, however many it counts. This scraper divides a larger search by state or region, city, company and date, reads each part, and merges the results without duplicates. Every run reports what it found against LinkedIn's own count.

It collects job and company data only. Recruiter and "hiring team" names and profile links are never collected.

### What you can do with it

- Follow hiring for a job title in a country or city: schedule a run with **Date posted** set to the last 24 hours.
- Watch what a list of companies is hiring for with the **Companies** input.
- Collect a large set of postings for a keyword, past the 1,000 a single LinkedIn search hands out.
- Skills and seniority analysis on full descriptions, `seniorityLevel` and `employmentType` (details optional).

### What you get

One record per job, never the same job twice in a search:

- **Job:** `jobId`, `title`, `url`, `location`, `postedDate`, `postedText` ("2 days ago"), `badge` (LinkedIn's note on the card, such as "Actively Hiring" or "Be an early applicant")
- **Company:** `companyName`, `companyUrl` (its LinkedIn page)
- **Pay, when LinkedIn shows it:** `salaryText` (for example `$90,000.00/yr - $140,000.00/yr`). On the result list alone almost no job shows pay; with details on, 24% of jobs in our 500-job test run did.
- **Workplace:** `workplaceType` (Remote, Hybrid or On-site) only when the job's title or location says so, which is rare (1% to 4% of jobs in our runs). LinkedIn does not show visitors its own workplace label.
- **With details switched on:** `description` (full text, plain), `seniorityLevel`, `employmentType`, `industries`, `applicantsText` ("Over 200 applicants"), `applyType` (Easy Apply or Company website), `applyUrl`, `companyId`, `acceptingApplications`, `detailsFetched`
- **Other:** `search` (which keyword or URL produced it), `scrapedAt`

```json
{
    "jobId": "4444613232",
    "title": "Enterprise Data Analyst",
    "companyName": "Husch Blackwell",
    "companyUrl": "https://www.linkedin.com/company/husch-blackwell",
    "location": "Austin, TX",
    "postedDate": "2026-09-26",
    "postedText": "1 week ago",
    "salaryText": null,
    "badge": null,
    "workplaceType": null,
    "url": "https://www.linkedin.com/jobs/view/enterprise-data-analyst-at-husch-blackwell-4444613232",
    "applyUrl": "https://www.linkedin.com/jobs/view/enterprise-data-analyst-at-husch-blackwell-4444613232",
    "applyType": "Company website",
    "description": "Husch Blackwell LLP is a full-service litigation and business law firm with multiple locations across the United States...",
    "seniorityLevel": "Not Applicable",
    "employmentType": "Full-time",
    "jobFunction": null,
    "industries": "Law Practice",
    "applicantsText": "Over 200 applicants",
    "companyId": "162725",
    "acceptingApplications": true,
    "detailsFetched": true,
    "search": "data analyst in Austin, Texas, United States",
    "scrapedAt": "2026-10-08T16:28:55.614Z"
}
```

### Input

- **Keywords** — one search per line. Leave empty to get every job in a place or at the companies you list. If you give no keyword, location, company or search URL (for example an API call with an empty input), the example search `data analyst` in `Austin, Texas, United States` runs.
- **Location** — a country, a state or region, or a city, written as on LinkedIn: `United States`, `Texas, United States`, `Austin, Texas, United States`. Empty searches worldwide.
- **Date posted** — last hour, 24 hours, 3, 7, 14 or 30 days.
- **Distance** — miles around a city (0 is the city itself).
- **Companies** — LinkedIn company page addresses, the last part of one (`microsoft`), or numeric IDs.
- **Title must contain / must not contain** — keeps or drops jobs by words in the title. Jobs dropped are not charged.
- **Job type, Experience level** — see "Filters LinkedIn no longer applies" below.
- **Easy Apply only, Under 10 applicants only**
- **LinkedIn job search URLs** — paste the address of a `linkedin.com/jobs/search` results page.
- **Maximum jobs per keyword or URL** — default 100. You are never charged for more.
- **Go past LinkedIn's 1,000-job limit** — on by default; only matters when your maximum is above 1,000.
- **Stop at LinkedIn's count** — off by default; see below.
- **Include job details and full description** — off by default.

```json
{
    "keywords": ["data engineer"],
    "location": "United States",
    "datePosted": "604800",
    "titleIncludes": ["data engineer"],
    "maxJobsPerSearch": 5000,
    "includeDescriptions": true
}
```

### FAQ

#### How do I get more than 1,000 jobs from a LinkedIn job search?

Set **Maximum jobs per keyword or URL** above 1,000 and leave **Go past LinkedIn's 1,000-job limit** on. The scraper divides the search by state or region, city, company and date, reads each part and merges the results without duplicates. Jobs from the narrower searches are increasingly loose matches; use **Title must contain** for a tight list. The measured runs are under "What we measured".

#### Does it need a LinkedIn account or cookies?

No. It reads only the pages LinkedIn shows to visitors who are not signed in.

#### Can I filter LinkedIn jobs by remote, salary or sort order?

No. LinkedIn ignores those filters for visitors who are not signed in and shows nothing to check them against. To look for remote jobs, put "remote" in your keywords and use **Title must contain**. Job type and experience level are checked on each posting's own page; date posted, company, distance, Easy Apply and under 10 applicants are applied by LinkedIn.

#### Does it collect recruiter names or profiles?

No. It collects job posting and company data only. Recruiter and "hiring team" names and profile links are never collected.

#### How much does it cost?

$0.50 per 1,000 jobs on Apify's Free plan, plus $0.50 per 1,000 jobs with details when you ask for details or use the job type or experience filters, and a start fee of $0.00005 per run. Paid Apify plans pay less: Bronze 10%, Silver 20% and Gold 30% less. Runs that fail or return nothing cost nothing.

### How many jobs you can get: read this first

Three facts about LinkedIn's public job search, all measured in October 2026:

1. **A search hands out about 1,000 jobs.** Requests past position 1,000 are refused, and many searches stop earlier (we saw 860 to 1,000).
2. **LinkedIn's count for a search stops near 12,000.** "Data engineer", "nurse" and "project manager in California" all count about 11,900 in the United States, although far more jobs match.
3. **A narrower search returns jobs the wider one leaves out.** The 50 states searched one by one return several times the jobs LinkedIn counts for the whole country. The extra jobs are increasingly loose matches: in a search for "data engineer", 97% of the first 1,000 jobs have "data engineer" in the title, against 33% of the first 12,000.

So the scraper reads your search as LinkedIn lists it (the best-ranked 1,000), then divides it: a worldwide search by country, a country by state or region, a state by city, and whatever is still too large by the companies LinkedIn offers as a filter and by date posted. The places come from the locations of the jobs already found. All parts are read side by side from their best-ranked jobs down, so whatever your maximum is, you get the top of every part. Jobs from a narrower search are dropped if their location is not in the place that search was for, and the date filter is checked on every job.

A search ends when your maximum is reached, or when the narrower searches stop bringing new jobs. With **Stop at LinkedIn's count** on, it ends once as many jobs are found as LinkedIn counts.

#### What we measured

Seven searches, each with the maximum out of the way. Run on 8 October 2026.

With **Stop at LinkedIn's count** on:

| Search | LinkedIn's count | Jobs saved | Requests | Run time | Check 1: best-ranked jobs found again | Check 2: recent matching-title jobs found |
|---|---|---|---|---|---|---|
| actuary, Columbus, Ohio | 365 | 392 | 60 | 7 s | 69% of 305 | 12 of 12 |
| data analyst, Austin, Texas | 2,860 | 2,471 | 703 | 53 s | 96% of 801 | 3 of 3 |
| registered nurse, Chicago, Illinois | 3,577 | 3,645 | 344 | 22 s | 98% of 839 | 84 of 145 (58%) |
| marketing manager, Germany | 6,175 | 6,277 | 1,264 | 142 s | 94% of 918 | 111 of 122 (91%) |
| software engineer, United Kingdom | 11,723 | 11,122 | 1,840 | 178 s | 99.8% of 995 | 26 of 26 |
| data engineer, United States | 11,937 | 12,418 | 1,256 | 126 s | 94% of 1,000 | 33 of 40 (83%) |
| nurse, United States | 11,940 | 12,058 | 1,142 | 102 s | 89% of 989 | 74 of 602 (12%) |

With the default settings (no stop at LinkedIn's count):

| Search | LinkedIn's count | Jobs saved | Requests | Run time | Check 1 | Check 2 |
|---|---|---|---|---|---|---|
| data analyst, Austin, Texas | 2,786 | 2,431 | 500 | 47 s | 96% of 783 | 3 of 3 |
| registered nurse, Chicago, Illinois | 3,577 | 5,545 | 738 | 63 s | 99% of 830 | 121 of 135 (90%) |
| marketing manager, Germany | 6,174 | 6,975 | 1,433 | 133 s | 95% of 957 | 112 of 122 (92%) |
| data engineer, United States | 11,937 | 92,957 | 18,437 | 26 min | 100% of 1,000 | 40 of 40 |

The actuary and United Kingdom searches end the same way in both settings. "Nurse" in the United States was not run with the default settings.

How to read the two checks. Neither depends on LinkedIn's count, which is not a true total.

- **Check 1** takes the jobs LinkedIn's own list for the search handed out (up to 1,000, its best-ranked) and asks how many of them the divided searches found again by themselves. It says how well dividing reaches the jobs that match your keywords best. Every run computes it and stores it in the `COVERAGE` record.
- **Check 2** is stricter. Just before each run we fetched a complete list of the jobs posted in the last hour (countries) or day (cities) for the same search, and counted how many of those with the keyword in their title were in the big run. It says how much of everything that matches a run holds, including jobs far down LinkedIn's ranking.

What the numbers say:

- **With the default settings, 90% or more of the recent jobs with the keyword in their title were in the run** in the four searches measured, at the price of many loosely related jobs in the largest one: of the 92,957 jobs saved for "data engineer", 5% have "data engineer" in the title.
- **Stopping at LinkedIn's count gives a shorter, better-ranked list, and misses more.** It held 83% to 100% of the recent matching-title jobs for specific job titles, 58% for nurses in Chicago and 12% for "nurse" in the whole United States, a search with far more than 12,000 matching jobs (about 600 with "nurse" in the title were posted in a single hour). For keywords that broad, leave the setting off and raise your maximum, or run one search per state.
- **A big city is the weak case for the count.** A city cannot be divided by place, only by its surrounding towns, companies and date. "Data analyst" in Austin gave 2,431 of the 2,786 LinkedIn counts (87%).
- **More jobs than LinkedIn counts is normal** (see fact 3). If you want only close matches from a large run, use **Title must contain**.
- A search under 1,000 jobs can come up short on a plain read, because LinkedIn's pages repeat some jobs and skip others. The scraper then divides it anyway, which is why the actuary run saved more than a plain read's 305.

### Filters LinkedIn no longer applies

Since LinkedIn moved its public job search to "AI-powered search", it ignores the job type, experience level, workplace type, salary and sort-order filters for visitors who are not signed in: the same jobs come back with and without them (we tested each one).

What this scraper does about it:

- **Job type and experience level are checked on each posting's own page.** Every job returned states one of the types or levels you chose. This needs the posting's page, so jobs returned with these filters are charged as jobs with details, and runs take longer when few jobs pass. Note that about 80% of postings state "Not Applicable" as seniority level; those never pass an experience filter.
- **Workplace type, salary and sort order cannot be filtered**, because LinkedIn shows visitors nothing to check them against. To look for remote jobs, put "remote" in your keywords and use **Title must contain**. A pasted URL that carries these filters runs without them, and the log says so.
- **Date posted, company, distance, Easy Apply and under 10 applicants are still applied by LinkedIn.** In our test runs every job returned satisfied them (see "Checked on real runs").

### Job details and descriptions

With **Include job details and full description** on, each posting's page is read. In our 500-job test run all 500 came back with a description, seniority level and employment type; 99% with industries and a company ID; 24% with pay. A job whose page cannot be read is still returned, with `detailsFetched: false`.

LinkedIn does not show visitors the employer's own application address, so `applyUrl` is the LinkedIn posting, where the Apply button is; `applyType` says whether that button applies on LinkedIn (Easy Apply) or leads to the company's website. `jobFunction` is kept for the day LinkedIn shows it again; today it is empty.

### Speed

From our runs on Apify, 16 requests at a time:

- 100 jobs (the default input): 4 seconds.
- 12,000 jobs without details: about 2 minutes (100 to 180 seconds across four runs).
- 48,000 jobs without details: about 10 minutes; 93,000 jobs: 26 minutes.
- 500 jobs with details: 50 seconds; 800 with details: 53 to 74 seconds.

### Pricing

You pay per job saved, and per job with details when you ask for details or use the job type or experience filters. Duplicates are never saved, so never charged. Jobs dropped by a filter are not charged. Runs that fail or return nothing cost nothing.

### Reliability

Requests are made the way Chrome makes them and go through datacenter proxies, changing address after every refusal. A request LinkedIn refuses four times from datacenter addresses is retried through residential proxies; if half of recent requests are refused, the run uses residential proxies for two minutes before going back. LinkedIn's sign-in page, rate-limit answers (429, 999) and empty answers in the middle of a search are recognised and retried.

Measured: with 12, 16 and 24 requests at a time LinkedIn refused 1% to 5% of requests, which were repeated from another address; at 48 it refused 8%. The scraper runs 16 at a time. None of the 85 runs made while building this scraper failed.

If a search cannot be opened at all, the run says so in its status message and still returns the jobs of the other searches.

### Checked on real runs

- **Ten searches of 100 jobs in ten countries** (United States, United Kingdom, Germany, Canada, Australia, France, India, United Arab Emirates, Brazil, Japan): all ten returned 100 jobs.
- **Each filter once, with every returned job checked against it:** date posted, last 24 hours (300 of 300 jobs inside the window) and last 7 days (300 of 300); distance 0 (200 of 200 in the city itself); companies (200 of 200 at the two companies asked for); under 10 applicants (100 of 100 carry LinkedIn's early-applicant note); Easy Apply (99 of 100 pages say Easy Apply, one does not say); job type (40 of 40); experience level (40 of 40); title must contain and must not contain (1,500 of 1,500); a pasted URL with a date and a job type filter (60 of 60).

### Limits

- LinkedIn's public search is loose: beyond the best-ranked results, jobs are only related to your keywords. Use **Title must contain** for a tight list.
- Coverage of very broad searches in large countries, and of large single cities, is partial; see the numbers above.
- Workplace type, salary and sort order cannot be filtered; the employer's own application address and LinkedIn's workplace label are not available without signing in.
- Pay is missing where LinkedIn shows none (most postings).
- `postedDate` is a date without a time.
- Counts are per search; the same job can appear under two keywords.
- LinkedIn changes its public pages from time to time. Every run stores a `COVERAGE` record, so a drop shows up at once.

### Notes

This scraper collects job posting and company data only, from pages LinkedIn shows to everyone. It does not log in and does not collect names, profiles or contact details of recruiters or other people.

Each run stores a `COVERAGE` record in its key-value store: per search, LinkedIn's count, jobs found and saved, the check on the divided searches, requests made, why it stopped, and how many new jobs each kind of narrowing brought.

### Related scrapers

- [Coles Australia Grocery Price Scraper](https://apify.com/charitable_trousseau/coles-au-product-scraper): products, prices and specials from coles.com.au
- [AliExpress Product Search Scraper](https://apify.com/charitable_trousseau/aliexpress-search-scraper): search results by keyword with prices, discounts and units sold
- [eBay Active Listings & Auctions Search Scraper](https://apify.com/charitable_trousseau/ebay-search-scraper): active listings and auctions on five eBay sites
- [Apple App Store Scraper](https://apify.com/charitable_trousseau/app-store-scraper): iOS top charts, search results and app details
- [Zillow ZIP Code Search Scraper](https://apify.com/charitable_trousseau/zillow-search-scraper): homes for sale, rentals and recently sold homes
- [Tripadvisor Places Scraper](https://apify.com/charitable_trousseau/tripadvisor-listings-scraper): hotels, restaurants and things to do for any place
- [Google Maps Places Scraper](https://apify.com/charitable_trousseau/google-maps-places-scraper): business listings across a whole city, postcode or radius
- [Indeed Jobs Scraper](https://apify.com/charitable_trousseau/indeed-jobs-scraper): job listings on 12 Indeed country sites, descriptions optional
- [Glassdoor Jobs Scraper](https://apify.com/charitable_trousseau/glassdoor-jobs-scraper): job listings with salary ranges and employer ratings
- [Google Trends Scraper](https://apify.com/charitable_trousseau/google-trends-scraper): interest over time, interest by region, rising queries and trending searches

# Actor input Schema

## `keywords` (type: `array`):

Job titles, skills or anything else you would type into LinkedIn's job search, one per line. Each line is a separate search. Leave empty to get every job in the location or at the companies below. If the keywords, location, companies and search URLs are all empty, the example search data analyst in Austin, Texas, United States runs.

## `location` (type: `string`):

Country, state or region, or city, as you would type it on LinkedIn, e.g. United States, Texas, United States or Austin, Texas, United States. Applies to the keywords above. Leave empty to search worldwide.

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

Only jobs posted within this time. Applied by LinkedIn and checked again on every job returned.

## `distance` (type: `string`):

How far around a city to search. LinkedIn uses 25 miles when nothing is chosen. Has no effect on countries and states.

## `companies` (type: `array`):

Only jobs at these companies. Give each company's LinkedIn page address (https://www.linkedin.com/company/microsoft), the last part of it (microsoft) or its numeric LinkedIn ID.

## `titleIncludes` (type: `array`):

Keep only jobs whose title contains at least one of these words or phrases (capital letters do not matter), e.g. data engineer. Useful on large searches: beyond the first thousand results LinkedIn's own matches get looser. Jobs left out are not charged.

## `titleExcludes` (type: `array`):

Leave out jobs whose title contains any of these words or phrases, e.g. senior, intern. Jobs left out are not charged.

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

Only jobs of these types. LinkedIn's public search no longer applies this filter itself, so the scraper reads each posting's page and keeps only the ones that state one of these types. Every job returned is checked. Because the page is read anyway, jobs returned with this filter are charged as jobs with details.

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

Only jobs at these seniority levels. Checked on each posting's page in the same way as job type, and charged the same way.

## `easyApply` (type: `boolean`):

Only jobs that can be applied to on LinkedIn itself.

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

Only jobs LinkedIn marks as having fewer than 10 applicants.

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

Paste the address of a linkedin.com/jobs/search results page. Keywords, location, distance, date posted, company, Easy Apply and under 10 applicants are taken from it; job type and experience level are checked on each posting. The fields above do not apply to these.

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

The scraper stops a search when it has saved this many jobs. You are never charged for more. The best-ranked jobs come first.

## `splitLargeSearches` (type: `boolean`):

LinkedIn hands out about 1,000 jobs per search. With this on, a search that counts more is divided by state or region, city, company and date, and the parts are merged without duplicates. Only matters when your maximum is above 1,000.

## `stopAtLinkedInCount` (type: `boolean`):

LinkedIn's count for a search stops near 12,000 however many jobs match, and searches divided by place also return matches the count leaves out, many of them only loosely related to your keywords. By default a search goes on until your maximum is reached or the divided searches bring nothing new. Switch this on to end a search once as many jobs are found as LinkedIn counts for it: you then get the best-ranked jobs of every state, region and city and fewer loose matches.

## `includeDescriptions` (type: `boolean`):

Reads each posting's page and adds the full description, seniority level, employment type, job function, industries, number of applicants and, where LinkedIn shows it, the employer's own application link. Charged per job on top of the job itself.

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

Leave as it is: datacenter proxies are used, and residential ones only for requests LinkedIn refuses from them. Choose a proxy group here only if you want every request to go through it.

## Actor input object example

```json
{
  "keywords": [
    "data analyst"
  ],
  "location": "Austin, Texas, United States",
  "datePosted": "",
  "distance": "",
  "easyApply": false,
  "under10Applicants": false,
  "maxJobsPerSearch": 100,
  "splitLargeSearches": true,
  "stopAtLinkedInCount": false,
  "includeDescriptions": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All jobs saved by the run.

## `coverage` (type: `string`):

Per search: LinkedIn's count, jobs found, the check on the divided searches, requests made and why the search stopped.

# 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 = {
    "keywords": [
        "data analyst"
    ],
    "location": "Austin, Texas, United States",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("charitable_trousseau/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 = {
    "keywords": ["data analyst"],
    "location": "Austin, Texas, United States",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("charitable_trousseau/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 '{
  "keywords": [
    "data analyst"
  ],
  "location": "Austin, Texas, United States",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call charitable_trousseau/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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