# LinkedIn Job Monitor (`brawny_quartile/linkedin-jobs-scraper---custom`) Actor

LinkedIn job scraper that monitors job postings and extracts company data. Searches by location, role, and keywords to discover companies actively hiring. Retrieves company LinkedIn URLs, websites, employee count, industry, and firmographic data.

- **URL**: https://apify.com/brawny\_quartile/linkedin-jobs-scraper---custom.md
- **Developed by:** [Jarryd Hennequin](https://apify.com/brawny_quartile) (community)
- **Categories:** Lead generation, Automation, Jobs
- **Stats:** 36 total users, 0 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 results

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/platform/actors/running/actors-in-store#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

## LinkedIn Jobs Scraper - Custom

Extract LinkedIn job postings with company profile links, perfect for recruitment, lead generation, and market research. This Actor provides comprehensive job data including titles, companies, locations, and direct LinkedIn company URLs.

### ✨ Features

- **Complete Job Data**: Extracts job titles, company names, locations, and posting dates
- **Company Profile Links**: Automatically generates LinkedIn company profile URLs
- **Anti-Detection**: Built-in proxy rotation and rate limiting to avoid blocking
- **Australian Optimised**: Configured for Australian job market with local proxy support
- **Flexible Filtering**: Multiple contract types, remote work options, and date filters
- **Duplicate Prevention**: Intelligent deduplication to ensure unique results
- **High Success Rate**: Advanced selectors handle different LinkedIn layouts

### 🎯 Use Cases

#### Recruitment & HR

- **Talent Sourcing**: Find candidates by identifying companies hiring for similar roles
- **Market Analysis**: Analyse hiring trends and salary ranges in specific locations
- **Competitor Research**: Monitor what roles your competitors are hiring for

#### Sales & Lead Generation

- **Prospect Identification**: Find companies actively hiring (indicating growth)
- **Account Research**: Gather company information for outreach campaigns
- **Market Intelligence**: Identify expanding companies in target industries

#### Job Seekers

- **Job Aggregation**: Collect opportunities from multiple companies efficiently
- **Company Research**: Get direct links to company profiles for applications
- **Market Trends**: Track job posting patterns and requirements

### 📊 Input Parameters

| Parameter | Type | Required | Description | Default |
|-----------|------|----------|-------------|---------|
| `query` | String | ✅ | Job title or keywords to search for | "Engineer" |
| `location` | String | ✅ | Geographic location for job search | "Australia" |
| `maxResults` | Integer | ❌ | Maximum number of jobs to extract (1-100) | 25 |
| `contractType` | Array | ❌ | Employment types: F=Full-time, P=Part-time, C=Contract, T=Temporary, I=Internship | \["F"] |
| `remote` | Array | ❌ | Work arrangements: 1=Remote, 2=On-site, 3=Hybrid | \["1"] |
| `timeInterval` | String | ❌ | Posting recency: ANY, r86400 (24h), r604800 (week), r2592000 (month) | "ANY" |
| `slowMo` | Integer | ❌ | Delay between requests in milliseconds (500-5000) | 1000 |

#### Example Input

```json
{
  "query": "Software Engineer",
  "location": "Sydney, Australia",
  "maxResults": 50,
  "contractType": ["F", "C"],
  "remote": ["1", "3"],
  "timeInterval": "r604800",
  "slowMo": 2000
}
```

### 📋 Output Format

Each job result contains the following fields:

```json
{
  "id": "3823456789",
  "title": "Senior Software Engineer",
  "company": "TechCorp Australia",
  "companyLink": "https://www.linkedin.com/company/techcorp-australia",
  "location": "Sydney, NSW",
  "link": "https://www.linkedin.com/jobs/view/3823456789",
  "timePosted": "1 week ago",
  "query": "Software Engineer",
  "remote": "Remote/Hybrid",
  "contractType": "Full-time",
  "scrapedAt": "2025-06-20T10:30:00.000Z"
}
```

#### Field Descriptions

- **id**: Unique LinkedIn job identifier
- **title**: Job position title
- **company**: Company name
- **companyLink**: Direct LinkedIn company profile URL
- **location**: Job location (city, state/region)
- **link**: Direct LinkedIn job posting URL
- **timePosted**: When the job was posted (relative time)
- **query**: Original search query used
- **remote**: Work arrangement type
- **contractType**: Employment type
- **scrapedAt**: ISO timestamp when data was extracted

### 💰 Pricing & Usage Costs

#### Pay Per Result Model

- **Cost**: $0.0015 per successfully extracted job
- **Platform Usage**: Additional ~$0.001 per job for compute resources
- **Total**: Approximately **$0.0025 per job result**

#### Example Costs

| Jobs Extracted | Actor Fee | Platform Cost | Total Cost |
|----------------|-----------|---------------|------------|
| 25 jobs | $0.04 | $0.03 | **$0.07** |
| 50 jobs | $0.08 | $0.05 | **$0.13** |
| 100 jobs | $0.15 | $0.10 | **$0.25** |

*Platform costs may vary based on proxy usage and processing time*

### 🚀 Quick Start

#### 1. Basic Job Search

```json
{
  "query": "Marketing Manager",
  "location": "Melbourne, Australia",
  "maxResults": 30
}
```

#### 2. Remote Developer Roles

```json
{
  "query": "Python Developer",
  "location": "Australia",
  "maxResults": 50,
  "remote": ["1"],
  "timeInterval": "r604800"
}
```

#### 3. Contract Opportunities

```json
{
  "query": "Data Analyst",
  "location": "Brisbane, Australia",
  "contractType": ["C", "T"],
  "maxResults": 25
}
```

### ⚙️ Configuration Tips

#### Optimal Performance

- **maxResults**: Start with 25-50 for testing, increase gradually
- **slowMo**: Use 2000ms+ for larger batches to avoid rate limiting
- **location**: Be specific (e.g., "Sydney, NSW" vs "Australia")

#### Rate Limiting

- The Actor includes built-in delays and proxy rotation
- Larger requests (50+ jobs) automatically use longer delays
- Sessions are rotated to prevent blocking

#### Search Quality

- Use specific job titles for better results ("Software Engineer" vs "Engineer")
- Include relevant skills in query ("React Developer", "Sales Manager")
- Experiment with different location formats

### 🔧 Advanced Features

#### Proxy Configuration

- **Residential Proxies**: Automatically enabled for better success rates
- **Australian Proxies**: Matches search location for consistency
- **Session Rotation**: Prevents detection with smart session management

#### Error Handling

- **Automatic Retries**: Failed requests are retried up to 3 times
- **Session Recovery**: Bad sessions are automatically replaced
- **Graceful Degradation**: Continues processing even if some jobs fail

#### Data Quality

- **Deduplication**: Removes duplicate job listings automatically
- **Data Cleaning**: Strips unwanted text and formatting
- **Validation**: Skips incomplete or invalid job data

### ❓ FAQ & Troubleshooting

#### Q: Why am I getting fewer results than expected?

**A**: LinkedIn may be rate limiting or the search criteria might be too specific. Try:

- Increasing the `slowMo` parameter to 3000-5000ms
- Using broader search terms
- Checking if the location is spelled correctly

#### Q: Some company links show "N/A"

**A**: This happens when:

- Company profiles are private or don't exist
- The company name contains special characters
- LinkedIn's structure has changed

#### Q: The Actor stops working suddenly

**A**: This usually indicates LinkedIn detection. Solutions:

- Wait 10-15 minutes before trying again
- Increase delay settings
- Use more specific, smaller searches

#### Q: How accurate are the job postings?

**A**: The Actor extracts publicly available data with ~95% accuracy. Occasionally:

- Some fields might be missing if LinkedIn changes layouts
- Company links are generated and may not always be exact
- Premium/hidden jobs won't be captured

### 🔒 Legal & Compliance

#### Responsible Usage

- **Public Data Only**: Extracts only publicly visible job postings
- **Rate Limiting**: Respects LinkedIn's servers with built-in delays
- **No Personal Data**: Doesn't collect applicant or user information
- **Commercial Use**: Suitable for legitimate business purposes

#### Disclaimer

This Actor extracts publicly available job postings for legitimate business purposes including recruitment, research, and lead generation. Users are responsible for complying with LinkedIn's Terms of Service and applicable laws. Always use responsibly and respect rate limits.

### 📞 Support

For technical support, feature requests, or questions:

1. **Check the FAQ** above for common issues
2. **Contact Support** through the Apify Console
3. **Join Discord** for community help: [Apify Discord](https://discord.com/invite/jyEM2PRvMU)

#### Reporting Issues

When reporting problems, please include:

- Input parameters used
- Error messages received
- Expected vs actual results
- Approximate time when the issue occurred

***

**Start extracting LinkedIn job data today! 🚀**

*Built with ❤️ for the recruitment and sales community*

# Actor input Schema

## `query` (type: `string`):

Job title or keywords to search for

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

Location to search for jobs

## `maxResults` (type: `integer`):

Maximum number of jobs to scrape

## `contractType` (type: `array`):

Type of employment (F=Full-time, P=Part-time, C=Contract, T=Temporary, I=Internship)

## `remote` (type: `array`):

Remote work options (1=Remote, 2=On-site, 3=Hybrid)

## `timeInterval` (type: `string`):

How recently the job was posted

## `slowMo` (type: `integer`):

Delay between requests to avoid rate limiting

## Actor input object example

```json
{
  "query": "Software Engineer",
  "location": "Sydney, Australia",
  "maxResults": 25,
  "contractType": [
    "F"
  ],
  "remote": [
    "1"
  ],
  "timeInterval": "ANY",
  "slowMo": 1000
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("brawny_quartile/linkedin-jobs-scraper---custom").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 = {}

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

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

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

```

## CLI example

```bash
echo '{}' |
apify call brawny_quartile/linkedin-jobs-scraper---custom --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=brawny_quartile/linkedin-jobs-scraper---custom",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/52AFojASUH8QIdThc/builds/GuhpAex2tch4iJm9f/openapi.json
