# Jobs API — Indeed, LinkedIn & career sites (`lergassy/jobs-api`) Actor

Job listings from Indeed (60+ countries), LinkedIn and company career sites (Greenhouse, Lever, Ashby, Workable, SmartRecruiters) in one schema: salary as numbers, remote flag, full description, apply link, company website, recruiter emails. No login, no API key.

- **URL**: https://apify.com/lergassy/jobs-api.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** Jobs, Lead generation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 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?

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

**Jobs API** returns job listings from **Indeed** (60+ country sites), **LinkedIn** and **company career sites** (Greenhouse, Lever, Ashby, Workable, SmartRecruiters) as one clean table. Every job carries the same fields whatever the source: title, company, company website, industry and size, location split into city, region and country, remote / hybrid / on-site, employment type, **salary as numbers** with currency and period, posting date, the full description, the apply link, skills, and the **recruiter emails and phone numbers** found in the posting. No login, no API key, no browser: 100 Indeed jobs with full descriptions are one request; 1,000 jobs take a couple of minutes.

![One run of Jobs API: Indeed and LinkedIn postings in the same columns, salary parsed into numbers.](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/jobs-api/jobs-api-output-table.png)

Type job titles and a location, pick the boards and filters, and click Start. Export as JSON, CSV or Excel, run it on a schedule for fresh postings, or call it from the API and AI agents.

### What is Jobs API?

It is a **job postings API** for people who need listings as data: job boards and aggregators, recruiters and sourcing teams, lead generation (companies that are hiring for X are buying Y), salary and labour-market research, alerts for job seekers, and AI agents asked "who is hiring Python developers in Berlin this week". Indeed and LinkedIn have no public job-search API; licensed feeds cost hundreds of dollars a month. This Actor reads the same data the boards' own apps and pages use.

What makes it different from a single-board scraper:

- **Three kinds of source, one schema.** Compare Indeed, LinkedIn and direct career-site postings in the same columns, deduplicated per source.
- **Numbers, not strings.** `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` are parsed from every source; `postedAt` is ISO 8601; `isRemote`, `workplaceType`, `employmentType` are normalised.
- **Contacts built in.** Emails and phones from the posting text, the company domain from its website or apply link, and — on request — general contacts from the company website. That is what turns a job list into a lead list.
- **Company data on Indeed rows:** website, industry, employee count, revenue band, description and logo, straight from the posting.

### What data does it return?

| Field | Example |
|---|---|
| `source`, `id`, `url`, `applyUrl` | indeed · 2e6243f5ef576267 · https://www.indeed.com/viewjob?jk=… · https://careers.spglobal.com/jobs/331257 |
| `title`, `company`, `companyUrl`, `companyLogo` | Software Engineering Lead · S\&P Global · https://www.indeed.com/cmp/S\&P-Global · … |
| `companyWebsite`, `companyDomain`, `companyIndustry`, `companySize`, `companyRevenue`, `companyDescription`, `companyAddress` | https://www.spglobal.com/en/ · spglobal.com · Information Technology · 10,000+ · more than $10B (USD) · … · New York, NY |
| `location`, `city`, `region`, `country`, `countryCode`, `postalCode` | New York, NY · New York · NY · United States · US · 10041 |
| `isRemote`, `workplaceType`, `employmentType`, `jobTypes`, `schedule` | false · hybrid · fulltime · \["fulltime"] · Monday to Friday |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText`, `salaryEstimated` | 93000 · 150000 · USD · year · "$93,000 - $150,000 a year" · false |
| `postedAt`, `listedAt`, `expired` | 2026-09-06T05:00:00.000Z · 2026-09-06T02:39:44.587Z · false |
| `description`, `descriptionHtml` | full text and HTML |
| `skills`, `attributes` | \["AI models", "Spring Boot", "Kotlin"] · every Indeed tag |
| LinkedIn: `seniority`, `jobFunction`, `industries`, `applicants`, `applicantsText`, `benefits` | Mid-Senior level · Information Technology · Software Development · null · "Be among the first 25 applicants" |
| Career sites: `board`, `department`, `experienceLevel` | stripe · Engineering · Senior |
| `emails`, `phones` | \["careers@coreweave.com"] · \["+14155552671"] |
| `companyEmails`, `companyPhones`, `companySocials` (website look-up) | \["info@acme.com"] · \["+1…"] · {linkedin, facebook, x…} |
| `query`, `queryLocation`, `scrapedAt` | python developer · New York, NY · … |

### How much does it cost?

Pricing is **pay per job row**; there is no browser, so platform usage is close to zero and error rows are free.

| Row | Price |
|---|---|
| Job (any source) | $0.003 — 1,000 jobs for $3 |
| Job that came with an email address | +$0.002 |

A week of "python developer" postings in New York on Indeed and LinkedIn is roughly 300 rows, under $1. Larger monthly plans get 10–30 % off.

### How to get job listings

1. Enter **Job titles or keywords** (one per line) and a **Location**; pick the **Indeed country** if it is not the US.
2. Choose **Sources** and, if you want direct postings, add **Career-site boards** (`greenhouse:stripe`, `https://jobs.lever.co/figma`).
3. Set the filters: posted within, remote / hybrid / on-site, job types, experience, radius, sort.
4. Keep **Extract emails and phones** on; switch on **Look up contacts on the company website** for a lead list.
5. Click **Start**; export, or read the dataset through the API.

### ⬇️ Input

```json
{
  "keywords": ["python developer", "data engineer"],
  "location": "New York, NY",
  "country": "us",
  "sources": ["indeed", "linkedin"],
  "maxJobsPerQuery": 200,
  "datePosted": "week",
  "remote": "any",
  "includeContacts": true
}
```

#### Remote jobs across a country, newest first

```json
{ "keywords": ["customer success manager"], "location": "United Kingdom", "country": "uk", "remote": "remote", "sortBy": "date", "datePosted": "3days" }
```

#### Company career sites only

```json
{ "sources": [], "boards": ["greenhouse:stripe", "ashby:openai", "https://jobs.lever.co/figma"], "boardKeywords": ["engineer", "designer"] }
```

#### A lead list of companies hiring, with contacts

```json
{ "keywords": ["salesforce administrator"], "location": "Texas", "sources": ["indeed"], "maxJobsPerQuery": 300, "enrichCompanyContacts": true, "maxCompaniesToEnrich": 100 }
```

#### Search URLs from the browser

```json
{ "startUrls": ["https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL", "https://www.linkedin.com/jobs/search?keywords=nurse&location=Chicago"] }
```

### ⬆️ Output

```json
{
  "type": "job",
  "source": "indeed",
  "id": "2e6243f5ef576267",
  "url": "https://www.indeed.com/viewjob?jk=2e6243f5ef576267",
  "applyUrl": "https://careers.spglobal.com/jobs/331257?lang=en-us",
  "title": "Software Engineering Lead",
  "company": "S&P Global",
  "companyWebsite": "https://www.spglobal.com/en/",
  "companyDomain": "spglobal.com",
  "companySize": "10,000+",
  "companyRevenue": "more than $10B (USD)",
  "location": "New York, NY",
  "city": "New York",
  "region": "NY",
  "country": "United States",
  "countryCode": "US",
  "isRemote": false,
  "workplaceType": "hybrid",
  "employmentType": "fulltime",
  "jobTypes": ["fulltime"],
  "salaryMin": 93000,
  "salaryMax": 150000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "postedAt": "2026-09-06T05:00:00.000Z",
  "description": "About the Role: S&P Dow Jones Indices is seeking a highly experienced…",
  "skills": ["AI models", "Spring Boot", "Agile product development", "Kotlin"],
  "emails": ["eeo.compliance@spglobal.com"],
  "phones": [],
  "query": "python developer",
  "queryLocation": "New York, NY",
  "scrapedAt": "2026-09-06T10:38:00.000Z"
}
```

A search or board that cannot be read arrives as a `type: "error"` row with the reason, never as a silently empty run.

### Use cases

#### Job boards and aggregators

Feed a niche board (nursing jobs in Texas, remote React jobs) from three sources with one schedule; dedupe on `source` + `id`.

#### Recruiting and sourcing

Find who is hiring for a role, in which city, with which salary band — and the recruiter's email when it is in the posting.

#### Lead generation

Companies hiring "Salesforce administrator" need Salesforce consultants. Run the keyword, switch on the website look-up, and export `company`, `companyDomain`, `companyEmails`.

#### Salary and market research

`salaryMin`/`salaryMax` with period and currency across thousands of postings; `skills` for demand analysis; `postedAt` for time series.

#### AI agents

An agent asked "find me remote data-engineer jobs posted this week paying over $150k" gets typed rows it can filter.

### Integrations and job postings API

Run it from the [Apify API](https://docs.apify.com/api/v2), the JavaScript and Python clients, a schedule, or a webhook, and push results to Google Sheets, Airtable, Slack, a CRM or a database through **n8n**, **Make** or **Zapier**. The [Apify MCP server](https://mcp.apify.com) exposes it to Claude, ChatGPT and other agents as a tool.

### 🤖 For AI Agents & LLM Apps

Compact reference for agents calling this Actor through the Apify MCP server or the Apify API (`lergassy/jobs-api`).

**Purpose:** job listings from Indeed, LinkedIn and company career sites for a job title and location, with salary numbers, remote flag, description, apply link, company website and recruiter contacts.

**Minimal input:**

```json
{ "keywords": ["python developer"], "location": "Berlin", "country": "de", "maxJobsPerQuery": 50 }
```

**Output:** rows with `type: "job"` — `source`, `title`, `company`, `companyWebsite`, `companyDomain`, `location`, `city`, `region`, `countryCode`, `isRemote`, `workplaceType`, `employmentType`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `postedAt`, `description`, `url`, `applyUrl`, `skills`, `emails`, `phones`; LinkedIn adds `seniority`, `jobFunction`, `industries`, `applicants`; career sites add `board`, `department`.

**Behaviors an agent should know:**

- `country` selects the Indeed site (`us`, `uk`, `ca`, `au`, `de`, `fr`, `in`…); `location` is free text as on the board. LinkedIn ignores `country`.
- `maxJobsPerQuery` is per keyword per source. Indeed returns up to 100 per request with full descriptions; LinkedIn returns 25 per page and one request per job for descriptions (`includeDescription`).
- Salary fields are null when the posting has none; `salaryEstimated: true` means Indeed's estimate rather than the employer's number.
- `postedAt` is the board's posting date (Indeed also gives `listedAt`, when it appeared on Indeed). `datePosted` filters at the source; `postedAfter` filters rows.
- `emails`/`phones` come from the posting text; `companyEmails`/`companyPhones` appear only with `enrichCompanyContacts`. They are public business contacts found on the posting or the company site.
- Career-site boards need the ATS slug (`greenhouse:stripe`) or board URL; unknown slugs return an `error` row.
- A datacenter proxy is on by default and is enough; a source that rate-limits returns an `error` row with `blocked: true`.

### ❓ FAQ

#### Does it need an Indeed or LinkedIn account?

No. Indeed is read through the public endpoint its mobile app uses; LinkedIn through its public guest job pages; career sites through their public board APIs.

#### How many jobs can I get?

Indeed: up to the number the site has for the query (thousands, 100 per request). LinkedIn: up to 1,000 per search, the same ceiling as the site. Career sites: the whole board.

#### Which countries?

Indeed: 60+ country sites via `country`. LinkedIn: worldwide by `location`. Career sites: wherever the company posts.

#### Are the emails verified?

They are extracted from public postings and websites, not guessed. Pair with the [Email & Phone Verifier](https://apify.com/lergassy/email-phone-verifier) to check deliverability before a campaign.

#### Is this legal?

The Actor reads public job postings without logging in and returns factual listing data and public business contacts. Respect the boards' terms and local law for outreach; this is not legal advice.

### Your feedback

Need another board (Glassdoor, ZipRecruiter, Workday) or a field? Open an issue in the **Issues** tab.

### You might also like

- [Website Contacts API](https://apify.com/lergassy/website-contacts-api) — emails, phones and social links from any website.
- [Email & Phone Verifier](https://apify.com/lergassy/email-phone-verifier) — check addresses and numbers before outreach.
- [US Business Filings](https://apify.com/lergassy/us-business-filings) — company registrations by state.

# Actor input Schema

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

One search per line: <code>python developer</code>, <code>registered nurse</code>, <code>marketing manager</code>. Boolean syntax the boards support works too (<code>"data engineer" -senior</code> on Indeed). Required unless you fill <b>Career-site boards</b> or <b>Start URLs</b> instead — a run with none of the three returns nothing.

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

City, state or country as you would type it on the board: <code>New York, NY</code>, <code>London</code>, <code>Remote</code>, <code>Germany</code>. Empty = the whole country. Must match <b>Indeed country</b> below: a location in Germany with country <code>us</code> searches Indeed US for a German city and returns zero jobs without an error.

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

Defaults to <code>us</code>, so set it whenever the location is outside the United States. Which Indeed site to search: <code>us</code>, <code>uk</code>, <code>ca</code>, <code>au</code>, <code>de</code>, <code>fr</code>, <code>in</code>, <code>nl</code>, <code>es</code>, <code>it</code>, <code>sg</code>, <code>ae</code>, <code>mx</code>, <code>br</code>… (60+ countries). LinkedIn searches worldwide by location.

## `sources` (type: `array`):

Boards to search with the keywords. Career sites are added through <b>Career-site boards</b> below.

## `maxJobsPerQuery` (type: `integer`):

Cap per keyword per source (and per career-site board). Indeed pages 100 jobs per request; LinkedIn 25.

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

Indeed and LinkedIn date filter (LinkedIn has no 3-day option; it uses a week).

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

Remote is a board filter on Indeed and LinkedIn; hybrid and on-site are LinkedIn filters and a check on the rows elsewhere.

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

Empty = all.

## `experience` (type: `array`):

LinkedIn's seniority filter. Empty = all.

## `radius` (type: `integer`):

Distance around the location.

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

Order in which the boards return jobs; the first N are taken.

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

Indeed: only jobs that can be applied to on Indeed itself.

## `postedAfter` (type: `string`):

<code>YYYY-MM-DD</code>; rows with an older posting date are dropped.

## `boards` (type: `array`):

Company job boards to pull in full: <code>greenhouse:stripe</code>, <code>lever:figma</code>, <code>ashby:openai</code>, <code>workable:acme</code>, <code>smartrecruiters:Bosch</code>, or the board URL (<code>https://jobs.lever.co/figma</code>). Filter with the keywords below.

## `boardKeywords` (type: `array`):

Case-insensitive; empty = every job on the board.

## `startUrls` (type: `array`):

Indeed or LinkedIn job-search URLs copied from the browser, or career-site board URLs — each becomes a search.

## `includeDescription` (type: `boolean`):

Opens each LinkedIn job page for the description, seniority, employment type, function, industries, applicants and apply link (one request per job). Indeed and career sites include descriptions already.

## `includeContacts` (type: `boolean`):

Recruiter and HR emails and phone numbers found in the job description, plus the company domain from its website or apply link.

## `enrichCompanyContacts` (type: `boolean`):

For jobs with a known company domain, open the home page and a contact page to collect general emails, phones and social links (2–4 requests per company, cached within the run).

## `maxCompaniesToEnrich` (type: `integer`):

Cap for the website look-up above.

## `maxItems` (type: `integer`):

Stop after this many rows.

## `concurrency` (type: `integer`):

How many searches run at once.

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

Apify datacenter proxies work for all sources. Switch to Residential only if rate-limit error rows appear.

## Actor input object example

```json
{
  "keywords": [
    "python developer"
  ],
  "location": "New York, NY",
  "country": "us",
  "sources": [
    "indeed"
  ],
  "maxJobsPerQuery": 25,
  "datePosted": "week",
  "remote": "any",
  "radius": 25,
  "sortBy": "relevance",
  "easyApplyOnly": false,
  "includeDescription": true,
  "includeContacts": true,
  "enrichCompanyContacts": false,
  "maxCompaniesToEnrich": 50,
  "maxItems": 20000,
  "concurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `rows` (type: `string`):

One row per job: source, title, company, company website and size, location, remote/hybrid, job type, salary as numbers, posting date, description, apply link, skills, emails and phones found in the posting.

# 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": [
        "python developer"
    ],
    "location": "New York, NY",
    "sources": [
        "indeed"
    ],
    "maxJobsPerQuery": 25,
    "datePosted": "week",
    "remote": "any",
    "includeDescription": false,
    "includeContacts": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/jobs-api").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": ["python developer"],
    "location": "New York, NY",
    "sources": ["indeed"],
    "maxJobsPerQuery": 25,
    "datePosted": "week",
    "remote": "any",
    "includeDescription": False,
    "includeContacts": False,
}

# Run the Actor and wait for it to finish
run = client.actor("lergassy/jobs-api").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": [
    "python developer"
  ],
  "location": "New York, NY",
  "sources": [
    "indeed"
  ],
  "maxJobsPerQuery": 25,
  "datePosted": "week",
  "remote": "any",
  "includeDescription": false,
  "includeContacts": false
}' |
apify call lergassy/jobs-api --silent --output-dataset

```

## MCP server setup

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

```

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/jXcdet2wseEN8xo4s/builds/QxF095XQ3VFijM2Bq/openapi.json
