# LinkedIn Fresh Jobs Scraper (`schnellscrapers/linkedin-fresh-jobs-scraper`) Actor

Find fresh LinkedIn job postings by keyword, location, date, and company, returning job IDs, titles, employers, locations, workplace type, posting dates, logos, and direct URLs. Apply the posted-hours cutoff before writes for a lightweight cookieless public-page feed.

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

## Pricing

from $1.50 / 1,000 fresh jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does LinkedIn Fresh Jobs Scraper do?

LinkedIn Fresh Jobs Scraper collects public LinkedIn job postings and keeps the newest roles easy to route into a recruiting alert, job board, or hiring-intent workflow. Search by job keywords and locations, or paste a LinkedIn jobs search URL, then apply a visible posted-hours cutoff before records are written.

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

- Job identity — `jobId`, `title`, and a clean public `jobUrl`
- Hiring company — `companyName`, `companyUrl`, and `companyLogoUrl`
- Location and workplace — `location` and `workplaceType` when the source shows it or the search selected Remote
- Freshness — `postedDate`, `postedLabel`, and numeric `postedAgeHours`
- Run context — `searchQuery`, `sourceUrl`, `scrapedAt`, and the visible `isEasyApply` marker

The result is one flat record per unique job ID. Salary, full descriptions, applicant totals, and private recruiter profiles are outside this focused search-card feed.

### How to use LinkedIn Fresh Jobs Scraper

1. Open LinkedIn Fresh Jobs Scraper and enter job keywords such as `data engineer`.
2. Add one or more locations, or paste a public LinkedIn jobs search URL for native filters.
3. Select a source date window, set `postedWithinHours` to `24` for a daily alert, and choose a maximum job count.
4. Click Run. The actor deduplicates job IDs across searches and writes only records that pass the freshness and optional Easy Apply filters.
5. Open the Dataset tab and download JSON, CSV, or Excel, or read the dataset through the Apify API.

### How much does it cost?

LinkedIn Fresh Jobs Scraper uses pay-per-event pricing: `$0.0015` per emitted job, or `$1.50 / 1,000 jobs`, plus a `$0.003` actor-start event per run. The start event covers the fixed platform work even when a freshness filter writes zero records. There is no actor-specific free quota; Apify applies your account's standard credits and limits. Use `postedWithinHours`, `maxPages`, and `maxJobs` to keep scheduled feeds small.

### Input

Use `keywords` with `locations` for generated searches, or use `searchUrls` when you already configured LinkedIn filters. `datePosted` sets a source-side window, while `postedWithinHours` applies a second local cutoff to the visible relative age.

```json
{
  "keywords": ["data engineer"],
  "locations": ["United States"],
  "datePosted": "past24Hours",
  "postedWithinHours": 24,
  "remoteOnly": true,
  "sortBy": "date",
  "maxJobs": 25,
  "maxPages": 1
}
```

### Output

Each output row contains job identity, title, company, location, workplace, posting date, freshness age, and public URLs. Nullable fields remain `null` when a search card does not expose them.

```json
{
  "jobId": "4459042474",
  "title": "Data Engineer II",
  "companyName": "DriveWealth",
  "companyUrl": "https://www.linkedin.com/company/drivewealth",
  "companyLogoUrl": "https://media.licdn.com/dms/image/v2/D560BAQEgp99HhrE7yQ/company-logo_100_100/B56Z9HBYVVGQAM-/0/1783602972214/drivewealth_logo",
  "location": "New York, NY",
  "workplaceType": "remote",
  "postedDate": "2026-08-25",
  "postedLabel": "21 hours ago",
  "postedAgeHours": 21,
  "jobUrl": "https://www.linkedin.com/jobs/view/data-engineer-ii-at-drivewealth-4459042474",
  "searchQuery": "data engineer",
  "sourceUrl": "https://www.linkedin.com/jobs/search/?keywords=data%20engineer&location=United%20States&f_TPR=r86400&f_WT=2",
  "scrapedAt": "2026-08-26T18:00:00.000Z",
  "isEasyApply": null
}
```

### Integrations

Schedule the actor and send new job rows to Make, n8n, Zapier, Google Sheets, Slack, or a webhook. For custom workflows, trigger it with the [Apify API](https://docs.apify.com/api/v2) and consume the default dataset in Python or Node.js.

### Related actors

- [Greenhouse Jobs Scraper](https://apify.com/schnellscrapers/greenhouse-jobs-scraper) — collect structured roles from companies using Greenhouse.
- [Ashby Jobs Scraper](https://apify.com/schnellscrapers/ashby-jobs-scraper) — collect public roles from Ashby boards with board-level filters.
- [Indeed Jobs Scraper](https://apify.com/schnellscrapers/indeed-jobs-scraper) — broaden a job feed with Indeed search results.

### FAQ

#### How does LinkedIn Fresh Jobs Scraper work?

It reads the public LinkedIn jobs search page returned to logged-out visitors, extracts the structured search cards, normalizes their links and dates, deduplicates job IDs, and applies local freshness checks before writing.

#### Can I use LinkedIn Fresh Jobs Scraper as an API?

Yes. Start a run with the Apify API, then read the default dataset items endpoint from the run response. The same dataset can be exported as JSON, CSV, or Excel in the Apify Console.

#### Can I use LinkedIn Fresh Jobs Scraper in Python or Node.js?

Yes. Use the official `apify-client` package, pass the same JSON input shown above, and iterate over the run's default dataset.

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('schnellscrapers/linkedin-fresh-jobs-scraper').call({
  keywords: ['data engineer'],
  locations: ['United States'],
  postedWithinHours: 24,
  maxJobs: 25
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

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

This actor reads public job-posting cards and does not request a login or private profile data. Laws and platform rules vary by use case and location, so review the applicable requirements before using the output; this listing is not legal advice.

#### Does the actor fetch full job descriptions or salaries?

No. It stays on the search-card path so fresh job feeds use one lightweight request per page. Use the public `jobUrl` to open a posting separately when more detail is needed.

#### How can I build a daily new-job alert?

Schedule a run with `datePosted: "past24Hours"`, `postedWithinHours: 24`, and `sortBy: "date"`. Send the dataset to your alerting or ATS workflow and use `jobId` to deduplicate notifications.

### Your feedback

If a LinkedIn search layout changes or you need another business field, report it through the Issues tab on the actor page. Feature requests for additional job filters and output fields are welcome.

# Actor input Schema

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

Search job titles, skills, or hiring phrases such as "data engineer" or "sales development representative".

## `locations` (type: `array`):

Search cities, regions, countries, or "Remote". Each keyword is combined with each location.

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

Paste public LinkedIn jobs search URLs when you need native filters not shown here. URL filters are preserved and combined with the freshness settings below.

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

Apply LinkedIn's posted-date filter before parsing results. Use "Past 24 hours" for a daily feed.

## `postedWithinHours` (type: `integer`):

Keep only jobs whose visible age is within this many hours; set 0 to keep all parsed jobs. Example: 24 for a daily alert.

## `remoteOnly` (type: `boolean`):

Add LinkedIn's remote-work filter to each search.

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

Add LinkedIn's Easy Apply filter and keep cards that visibly carry the Easy Apply marker.

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

Add LinkedIn's under-10-applicants filter to each search URL.

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

Optional numeric LinkedIn company IDs to pass to the source filter, such as "1441" for Google.

## `sortBy` (type: `string`):

Choose relevance or newest-first ordering at LinkedIn. Newest-first is recommended for fresh posting alerts.

## `maxJobs` (type: `integer`):

Hard cap on unique job records written across all keyword, location, and URL searches.

## `maxPages` (type: `integer`):

Maximum public search pages requested for each search. Start with 1 for a low-cost fresh feed.

## `maxRequestRetries` (type: `integer`):

Retry count for a failed public search page before skipping that search.

## `dryRun` (type: `boolean`):

Match and validate jobs without writing dataset records. Logs report matched versus written counts.

## Actor input object example

```json
{
  "keywords": [
    "data engineer"
  ],
  "locations": [
    "United States"
  ],
  "searchUrls": [],
  "datePosted": "pastWeek",
  "postedWithinHours": 0,
  "remoteOnly": false,
  "easyApplyOnly": false,
  "under10Applicants": false,
  "companyIds": [],
  "sortBy": "date",
  "maxJobs": 100,
  "maxPages": 1,
  "maxRequestRetries": 2,
  "dryRun": false
}
```

# Actor output Schema

## `records` (type: `string`):

The default dataset contains jobId, title, companyName, location, postedDate, postedAgeHours, jobUrl, and source metadata.

# 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 engineer"
    ],
    "locations": [
        "United States"
    ],
    "searchUrls": [],
    "companyIds": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("schnellscrapers/linkedin-fresh-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 engineer"],
    "locations": ["United States"],
    "searchUrls": [],
    "companyIds": [],
}

# Run the Actor and wait for it to finish
run = client.actor("schnellscrapers/linkedin-fresh-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 engineer"
  ],
  "locations": [
    "United States"
  ],
  "searchUrls": [],
  "companyIds": []
}' |
apify call schnellscrapers/linkedin-fresh-jobs-scraper --silent --output-dataset

```

## MCP server setup

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