# LinkedIn Jobs Scraper + Apollo Enrichment (`goc_706/my-actor`) Actor

Scrape LinkedIn job listings and automatically enrich company data + find decision makers via Apollo.io. No login required. Outputs job details, company profiles, and contacts in Google Sheets-ready format.

- **URL**: https://apify.com/goc\_706/my-actor.md
- **Developed by:** [Minkesh Patel](https://apify.com/goc_706) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 33 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 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/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

## LinkedIn Jobs Scraper + Apollo Enrichment

Scrape LinkedIn job listings from **search URLs** or **direct job page URLs** — no login, no cookies required. Automatically enriches company data and finds decision maker contacts via Apollo.io.

Built by **Minkesh Patel** | minkesh.patel@getoncrm.com | +917405042484

### ✨ Key Features

- **No login required** – uses LinkedIn's public guest API
- **Dual input modes** – bulk scrape from search URLs OR scrape specific job pages
- **Full job details** – title, company, location, salary, description, employment type, seniority, industry
- **Job poster info** – recruiter name, title, and LinkedIn URL (via secondary page fetch)
- **AI-ready summary** – each job includes a pre-formatted `jobSummary` field ready to paste into any AI tool
- **Google Sheets ready** – flat JSON, exportable as CSV in one click
- **Auto-deduplication** – no duplicate jobs even across multiple search pages
- **Pagination support** – automatically scrapes multiple pages to reach your `maxJobs` target
- **Location & filter aware** – respects location, remote/on-site, job type, date posted, and experience level filters from your search URL
- **Apollo company enrichment** – website, phone, employee count, industry, tech stack, and more
- **Apollo contact enrichment** – find decision makers by title at each company (FREE with Apollo key)

### 📋 Output Fields

| Field | Description |
|-------|-------------|
| `jobId` | LinkedIn job ID |
| `jobUrl` | Direct link to the job posting |
| `title` | Job title |
| `companyName` | Company name |
| `companyLinkedinUrl` | LinkedIn company page URL |
| `jobLocation` | Job location |
| `postedAt` | When the job was posted |
| `applicantsCount` | Number of applicants |
| `employmentType` | Full-time, Part-time, Contract, etc. |
| `seniorityLevel` | Entry, Mid, Senior, Director, etc. |
| `jobFunction` | Job function category |
| `industries` | Industry category |
| `salary` | Salary range (if listed) |
| `applyUrl` | External apply link |
| `jobPosterName` | Recruiter / hiring manager name |
| `jobPosterTitle` | Recruiter / hiring manager title |
| `jobPosterLinkedinUrl` | Recruiter LinkedIn profile URL |
| `descriptionText` | Full job description text |
| `jobSummary` | AI-ready pre-formatted summary |
| `apolloCompanyId` | Apollo.io company ID |
| `companyWebsite` | Company website |
| `companyPhone` | Company phone number |
| `companyEmployeeCount` | Number of employees |
| `companyIndustry` | Industry (from Apollo) |
| `companyCity` / `companyState` / `companyCountry` | Company location |
| `companyDescription` | Company description |
| `companyTwitterUrl` | Company Twitter/X URL |
| `companyFacebookUrl` | Company Facebook URL |
| `companyAnnualRevenue` | Annual revenue (from Apollo) |
| `companyTechStack` | Technologies used (from Apollo) |

### ⚙️ Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | — | One or more LinkedIn job search URLs. Apply all your filters in LinkedIn first, then copy the URL. |
| `directJobUrls` | array | — | Direct LinkedIn job page URLs to scrape specific postings. |
| `maxJobs` | integer | 25 | Maximum number of jobs to scrape. The actor paginates automatically (10 jobs per page) to reach this limit. |
| `scrapeJobDetails` | boolean | true | Fetch full job description and metadata. If disabled, only basic info is returned. |
| `includeJobSummary` | boolean | true | Add a pre-formatted `jobSummary` field to each result. |
| `apolloApiKey` | string | — | Your Apollo.io API key. Required for company and contact enrichment. |
| `enrichContacts` | boolean | false | Enable Apollo People Search to find decision makers at each company. **FREE** – no Apollo credits required. Requires `apolloApiKey` and `contactTitles` to be set. |
| `contactTitles` | array | — | Job titles to search for at each company (e.g. `["VP of Sales", "CTO", "Director of Engineering"]`). Required when `enrichContacts` is true. |
| `contactsPerCompany` | integer | 3 | Max contacts to find per company (1–10). |
| `enrichContactEmails` | boolean | false | Fetch verified email addresses for each contact. **Costs 1 Apollo credit per contact.** |
| `enrichContactPhones` | boolean | false | Fetch phone numbers for each contact. **Costs 1 Apollo credit per contact.** |
| `requestDelayMin` | integer | 3000 | Minimum delay between requests in ms (recommended: 3000+). |
| `requestDelayMax` | integer | 8000 | Maximum delay between requests in ms. |

### 🔍 How Location & Filters Work

The actor reads **all filter parameters directly from your search URL** — location, remote/on-site, job type, date posted, experience level, etc. are all passed through automatically.

**Best practice:** Go to [linkedin.com/jobs/search](https://www.linkedin.com/jobs/search/), apply all the filters you need using LinkedIn's UI, then copy the full URL and paste it into `searchUrls`.

Example URL with filters:

```
https://www.linkedin.com/jobs/search/?keywords=Salesforce+Revenue+Cloud&location=Texas&f_WT=2&f_JT=F&f_TPR=r2592000
```

- `location=Texas` → filters to Texas
- `f_WT=2` → Remote only
- `f_JT=F` → Full-time only
- `f_TPR=r2592000` → Posted in last 30 days

### 💡 Example API Payload

```json
{
  "searchUrls": [
    "https://www.linkedin.com/jobs/search/?keywords=Salesforce%20Revenue%20Cloud%20Developer&location=Texas&f_WT=2&f_JT=F&f_TPR=r2592000"
  ],
  "maxJobs": 25,
  "scrapeJobDetails": true,
  "includeJobSummary": true,
  "apolloApiKey": "YOUR_APOLLO_API_KEY",
  "enrichContacts": true,
  "contactTitles": ["VP of Sales", "CTO", "Director of Engineering", "Head of Salesforce"],
  "contactsPerCompany": 3,
  "enrichContactEmails": true,
  "enrichContactPhones": false,
  "requestDelayMin": 3000,
  "requestDelayMax": 8000
}
```

### 📝 Notes

- **Job poster fields** (`jobPosterName`, `jobPosterTitle`, `jobPosterLinkedinUrl`) are fetched from the full public job page. They may be empty if LinkedIn requires login to view the recruiter card for that posting.
- **Apollo People Search is FREE** — finding contacts does not consume Apollo credits. Only email enrichment (`enrichContactEmails`) and phone enrichment (`enrichContactPhones`) cost credits (1 credit per contact).
- **maxJobs** is now fully respected — the actor paginates through LinkedIn search results (10 per page) until it reaches your target or LinkedIn runs out of results.
- **Rate limiting** — keep `requestDelayMin` at 3000ms or higher to avoid being blocked by LinkedIn.
- Contacts are output to a **separate dataset** named `linkedin-contacts` for easy access.

# Actor input Schema

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

One or more LinkedIn job search URLs. Go to linkedin.com/jobs, apply your filters, then copy the full URL from the address bar.

## `directJobUrls` (type: `array`):

Direct LinkedIn job page URLs to scrape specific job postings.

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

Maximum number of jobs to scrape. Keep low (10-50) for daily runs. LinkedIn caps search results at 1,000 per search URL.

## `scrapeJobDetails` (type: `boolean`):

Fetch full job description and all metadata. If disabled, only basic info from search results is returned.

## `includeJobSummary` (type: `boolean`):

Adds a pre-formatted jobSummary field to each result — easy to paste into any AI tool for instant analysis.

## `apolloApiKey` (type: `string`):

Your Apollo.io API key. Required for company intelligence (revenue, tech stack, size) and contact lookup. CREDIT USAGE: 1 credit per company enriched. People Search is FREE. Get your key from apollo.io > Settings > API Keys.

## `enrichContacts` (type: `boolean`):

Enable Apollo People Search to find decision makers at each company. FREE - no Apollo credits required. Requires apolloApiKey and contactTitles to be set.

## `contactTitles` (type: `array`):

Job titles of decision makers to find at each company via Apollo. Examples: 'VP of Sales', 'CTO', 'Head of Revenue Operations'. Leave empty to return top contacts regardless of title. Apollo People Search is FREE — no credits consumed.

## `contactsPerCompany` (type: `integer`):

Maximum number of contacts to find per company. Each contact found via People Search costs 0 credits. Default: 3.

## `enrichContactEmails` (type: `boolean`):

WARNING: Costs 1 Apollo credit per contact email. Only enable if you need verified work emails. The run log will show you the estimated credit cost BEFORE enriching. Default: false (contact names and LinkedIn URLs are always free).

## `enrichContactPhones` (type: `boolean`):

WARNING: Costs 1 Apollo credit per contact phone number. Only enable if you need phone numbers for outreach. Default: false.

## `requestDelayMin` (type: `integer`):

Minimum milliseconds to wait between each LinkedIn request. Helps avoid rate limiting. Default: 3000ms (3 seconds).

## `requestDelayMax` (type: `integer`):

Maximum milliseconds to wait between each request. A random delay between min and max is used. Default: 8000ms (8 seconds).

## `notifyEmail` (type: `string`):

Receive an email when the run completes, including jobs scraped and Apollo credits used.

## `proxy` (type: `object`):

Proxy settings. Apify Residential Proxy strongly recommended to avoid LinkedIn blocking.

## Actor input object example

```json
{
  "maxJobs": 25,
  "scrapeJobDetails": true,
  "includeJobSummary": true,
  "enrichContacts": false,
  "contactsPerCompany": 3,
  "enrichContactEmails": false,
  "enrichContactPhones": false,
  "requestDelayMin": 3000,
  "requestDelayMax": 8000,
  "proxy": {
    "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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("goc_706/my-actor").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("goc_706/my-actor").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 '{}' |
apify call goc_706/my-actor --silent --output-dataset

```

## MCP server setup

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

```

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/Qvwpv3oVQYNaa6iqo/builds/MXWbTe4VhIsqAIfsO/openapi.json
