# Indeed + LinkedIn (`canadesk/indeed-linkedin`) Actor

Find Indeed and LinkedIn job listings by title and location. Collect job links, companies, posting dates, salary information and available descriptions with single or bulk searches.

- **URL**: https://apify.com/canadesk/indeed-linkedin.md
- **Developed by:** [Canadesk Support](https://apify.com/canadesk) (community)
- **Categories:** Social media, Lead generation, SEO tools
- **Features:** Full permissions
- **Stats:** 356 total users, 3 monthly users, 94.6% runs succeeded, 19 bookmarks
- **User rating**: 2.01 out of 5 stars

## Pricing

from $1.25 / 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.

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

Collect job listings from **Indeed and LinkedIn**. Search one job title and city or provide lists of titles and cities, then download structured results.

### Features

| **Process** | **What you get** |
| :--- | :--- |
| Indeed jobs | Available job titles, companies, locations, dates, descriptions, salaries and application links |
| LinkedIn jobs | Public job cards with titles, companies, locations, links and any displayed salary snippets |
| Search filters | Source-supported country, distance, job type, remote-work and posting-age filters |

LinkedIn collection does not include full job descriptions or detailed company profiles. Field and filter availability differ by source.

### Quick start

Enter a job title and city, select Indeed, LinkedIn or both, and run the Actor.

```json
{
  "title": "software engineer",
  "city": "Atlanta",
  "country": "USA",
  "engines": "3",
  "jobtype": "fulltime",
  "remote": "No",
  "last": "all",
  "distance": "50",
  "max": 40,
  "proxy": { "useApifyProxy": true }
}
```

Use `engines: "1"` for Indeed, `"2"` for LinkedIn or `"3"` for both. For bulk searches, provide `titles` and/or `cities` lists. Lists override the corresponding single value; each title is searched in each city, up to 100 combinations.

`max` limits real jobs per source and title/city pair. `maxResults` optionally limits the total real jobs across the run. Duplicate source job IDs are removed across searches. The same job listed separately on Indeed and LinkedIn can appear once from each source.

### Results

Each job is a separate row. Fields include `id`, `site`, `job_url`, `title`, `company`, `location`, `date_posted`, `description`, salary fields and available company details. Posting dates use Unix milliseconds. Unknown or unavailable values are `null`. Salary ranges with known hourly, daily, weekly or monthly units are converted to annual amounts when both bounds are available.

During pay-per-event pricing, real jobs have `rowType: "result"`; minimum-charge padding has `rowType: "placeholder"`. Placeholder rows contain no job data. The run summary shows actual job counts, errors and any limits reached.

### Pricing

See the Pricing tab for the active rate and any scheduled changes. The pay-per-event rate is **$1.25 per 1,000 unique jobs + $0.01 per start**, including platform usage. Each valid pay-per-event run with at least one search input includes a shared minimum charge of 100 unique job units across all sources and searches. Results above 100 are charged individually at the listed event rate. The minimum also applies when fewer jobs are returned, no matches are found.

When fewer than 100 real jobs are returned, clearly marked placeholder rows fill the difference and contain no scraped job data; filter them out when exporting. For example, 10 jobs produce 10 job rows and 90 placeholders. Each separate run has its own minimum, including scheduled or API runs. Platform usage is included. Smaller result limits do not reduce the PPE minimum charge. Set a maximum run budget of at least **$0.14**.

### Tips and limitations

- Apify proxy is selected by default for reliable cloud searches. You can disable it to try direct requests. If a source blocks your search, try another proxy. Residential proxies are used only if you select them.
- Remote flags use source labels and text hints; they can include hybrid jobs or mentions of remote work.
- Results depend on the source's public listings and search behavior; filters are requests to the source, not a guarantee of exact matches.
- Country selects the Indeed region. For LinkedIn, include the region or country in the city/location value when needed.
- Available results may be fewer than requested. LinkedIn public searches are limited to approximately the first 1,000 listings per search.
- If one source is unavailable, jobs from the other source can still be returned. Blocked searches are reported in the run summary; all-blocked runs return labeled placeholders with “Try another proxy”.
- Large runs stop when the result, spending, time or transfer limit is reached. No sign-in credentials are required.

### Support

Open an issue with your run URL and search settings. Do not share passwords or proxy credentials.

#### Unsuccessful lookups

Where listed in the Pricing tab, a handled lookup problem that prevents a run from returning any real results produces one clear error record and a single $0.02 unsuccessful-lookup fee, in addition to any listed start fee.

# Actor input Schema

## `engines` (type: `string`):

No description

## `titles` (type: `array`):

Optional list. Overrides the single job title. Each title is searched in every selected city.

## `title` (type: `string`):

E.g., Architect

## `cities` (type: `array`):

Optional list. Overrides the single city. Up to 100 title/city combinations per run.

## `city` (type: `string`):

E.g., Atlanta.

## `country` (type: `string`):

No description

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

Optional shared limit across all searches and sources. Placeholders do not count toward this limit.

## `max` (type: `integer`):

Maximum real jobs for each source and title/city pair. Does not reduce the shared 100-unit minimum.

## `jobtype` (type: `string`):

No description

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

No description

## `remote` (type: `string`):

No description

## `last` (type: `string`):

No description

## `delay` (type: `integer`):

Seconds between pages. A larger delay can reduce rate limiting.

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

Apify proxy is recommended for reliable cloud searches. Disable it to try direct requests. Residential proxies are only used if you select them.

## Actor input object example

```json
{
  "engines": "1",
  "title": "software engineer",
  "city": "Atlanta",
  "country": "USA",
  "max": 40,
  "jobtype": "fulltime",
  "distance": "15",
  "remote": "No",
  "last": "all",
  "delay": 3,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "title": "software engineer",
    "city": "Atlanta",
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("canadesk/indeed-linkedin").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 = {
    "title": "software engineer",
    "city": "Atlanta",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("canadesk/indeed-linkedin").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 '{
  "title": "software engineer",
  "city": "Atlanta",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call canadesk/indeed-linkedin --silent --output-dataset

```

## MCP server setup

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

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/9eTAaHrnHrljnL3Tg/builds/tzcaY7UXRL957NkKi/openapi.json
