# ATS Jobs Search API: 500K Jobs, Greenhouse, Lever, Ashby (`lx112/career-site-jobs-search`) Actor

Search 500,000+ open jobs from about 20,000 companies' own career sites (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee) by title, location, remote and posting date. Refreshed daily, results in seconds, no proxies. Only-new-jobs mode for alerts.

- **URL**: https://apify.com/lx112/career-site-jobs-search.md
- **Developed by:** [leo xing](https://apify.com/lx112) (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 $2.00 / 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

## Career Site Jobs Search: Greenhouse, Lever, Ashby, Workable and more

Search **over 500,000 open jobs from about 20,000 companies at once**, straight from the job boards
they run on their own applicant tracking system (ATS): **Greenhouse, Lever, Ashby, Workable,
SmartRecruiters and Recruitee**. A job scraper and job search API in one: no scraping runs to wait
for, no proxies. Filter by job title, location, remote and posting date, and get clean, normalized
results: company, title, department, location, remote flag, salary when published, posting date and
the apply link.

- **Real jobs from the source.** Every job comes from a company's own career site, not from an
  aggregator, so there are no reposts, expired listings or recruiter spam.
- **Refreshed every day.** All boards are re-read daily; each result says when (`snapshotAt`).
- **Fast and cheap.** A search over the whole index takes seconds. You pay per job returned, nothing
  for the search itself.
- **Only new jobs.** Schedule it daily with *Only jobs new since my last run* and get just the
  openings posted since the last run: job alerts, hiring signals, a feed for your job board.
- **Descriptions on request**, read live from each company's board.

### Who uses this

- **Sales and lead gen:** find companies hiring for roles that signal they need your product
  ("data engineer", "SOC analyst", "Salesforce admin") and reach them while the budget is fresh.
- **Recruiters and job seekers:** every matching opening across companies, newest first.
- **Job boards and newsletters:** a clean, daily, de-duplicated feed by niche or location.
- **Market research and AI agents:** hiring trends by role, location and company.

### Input

| Field | Example | Notes |
|---|---|---|
| Job title contains any of | `data engineer`, `account executive` | Whole words or phrases, case-insensitive |
| Job title contains none of | `intern`, `senior` | |
| Location contains any of | `London`, `Germany`, `remote` | Matches the location and country text |
| Remote only | `true` | |
| Posted within (days) | `7` | Jobs without a posting date are left out |
| Only these companies | `stripe`, `openai` | Optional |
| Only these job-board systems | Greenhouse, Ashby | Optional |
| Only jobs new since my last run | `false` | Remembers earlier runs of the same search in your account |
| Include job descriptions | `false` | Plain text, read live |
| Max jobs | `500` | Newest first |

With no filters at all, the run returns a sample: engineering jobs posted in the last day.

### Output

One item per job:

```json
{
  "company": "Airbnb",
  "ats": "greenhouse",
  "board": "airbnb",
  "jobId": "8274152",
  "title": "Software Engineer, Payments",
  "department": null,
  "employmentType": null,
  "location": "Remote, USA",
  "country": null,
  "remote": true,
  "workplaceType": null,
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryInterval": null,
  "postedAt": "2026-10-21T20:01:47.000Z",
  "url": "https://careers.airbnb.com/positions/8274152?gh_jid=8274152",
  "applyUrl": "https://careers.airbnb.com/positions/8274152?gh_jid=8274152",
  "snapshotAt": "2026-10-24T03:00:00Z"
}
```

The run's `SUMMARY` record shows the snapshot used, how many jobs were searched, how many matched and
how many were returned.

### Pricing

Pay per job returned: **$0.002 per job ($2 per 1,000)**. Searches that match nothing cost nothing
beyond Apify's small start fee.

### Need one company's jobs right away?

[Company Jobs Tracker](https://apify.com/lx112/company-jobs-tracker) reads any list of companies
live, including Workday, BambooHR, Personio and Teamtailor boards.

### Notes

- Coverage is the public job boards on the six systems above that we know about; it grows as new
  boards are found. Companies on Workday, iCIMS and other systems aren't included yet.
- Salary appears only where the company publishes it in its ATS (common on Ashby and Lever).
- The data is the companies' own public job postings.

# Actor input Schema

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

Whole words or phrases, case-insensitive, e.g. "data engineer", "account executive". Leave empty for every job (use other filters then).

## `excludeTitles` (type: `array`):

Drop jobs whose title contains any of these, e.g. "intern", "senior".

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

Keep jobs whose location or country contains one of these (case-insensitive), e.g. "London", "Germany", "New York".

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

Keep only jobs marked remote, or whose location or workplace type says remote.

## `postedWithinDays` (type: `integer`):

Keep only jobs first published in the last N days. Jobs without a posting date are dropped when this is set.

## `companies` (type: `array`):

Optional: company names or job-board slugs (e.g. "stripe", "openai"). Leave empty to search every company.

## `ats` (type: `array`):

Optional: limit the search to some applicant tracking systems.

## `onlyNewJobs` (type: `boolean`):

Remembers the jobs this search returned before (in a key-value store in your account) and returns only new ones. Ideal with a daily schedule.

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

Adds the full description as plain text, read live from each company's job board. Slower: one request per company in the results.

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

The run stops after this many jobs (newest first).

## Actor input object example

```json
{
  "titles": [
    "data engineer"
  ],
  "locations": [
    "remote",
    "united states"
  ],
  "remoteOnly": false,
  "onlyNewJobs": false,
  "includeDescription": false,
  "maxItems": 500
}
```

# Actor output Schema

## `results` (type: `string`):

Open jobs matching the search, one item per job, newest first.

## `summary` (type: `string`):

Snapshot date, how many jobs and companies were searched, and how many matched.

# 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 = {
    "titles": [
        "data engineer"
    ],
    "locations": [
        "remote",
        "united states"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lx112/career-site-jobs-search").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 = {
    "titles": ["data engineer"],
    "locations": [
        "remote",
        "united states",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("lx112/career-site-jobs-search").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 '{
  "titles": [
    "data engineer"
  ],
  "locations": [
    "remote",
    "united states"
  ]
}' |
apify call lx112/career-site-jobs-search --silent --output-dataset

```

## MCP server setup

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

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/7QAMjytVFtgQsriN9/builds/1nIwGF5Ohvbvp7RvE/openapi.json
