# Career Site Jobs Search: Workday, Greenhouse, Lever +5 (`scrapemint/ats-jobs-search`) Actor

Search jobs straight from company career sites: Workday, Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee and Personio in one query. Live at run time, not a stale database. Full description, salary, remote flag, posted date, apply link. Schedule it for new-job alerts. No key, no proxy.

- **URL**: https://apify.com/scrapemint/ats-jobs-search.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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: Workday, Greenhouse, Lever +5

Search jobs straight from company career sites. One query runs across 10,435 companies' job boards on the eight applicant tracking systems most employers hire through: **Workday, Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee and Personio**. Every row comes back in one clean shape: company, title, location, remote flag, posted date, full description, salary where the posting states one, and the apply link.

It reads the boards live, at run time. A job closed this morning is gone, and one posted an hour ago is there. No login, no API key, no proxy.

### What you can do

- **Search the market:** `data engineer`, posted in the last 7 days, remote, and get matches from every company in the directories.
- **Watch a list of companies:** names, career-site URLs on any supported ATS, or tokens like `greenhouse:stripe`. The actor finds which ATS each one uses.
- **Get alerts:** schedule it daily with `onlyNew`, and each run returns only jobs earlier runs have not. A run with nothing new returns nothing and costs nothing.

### Coverage

| Platform | Companies in the directory | Notes |
|---|---|---|
| Greenhouse | 3,135 | Full description per posting, publish date |
| Ashby | 2,707 | Structured salary where the company publishes it |
| Personio | 1,582 | Strong in Germany and Europe |
| Workday | 1,522 | Large enterprises; reads past the 2,000-job cap |
| SmartRecruiters | 942 | Server-side keyword search |
| Lever | 248 | Structured salary where published |
| Workable | 167 | Remote and workplace type flags |
| Recruitee | 132 | Structured salary where published |

The directories are built from the public web crawl and checked live. A company that is not in them can always be read by name or career-site URL.

### Why this one

- **Live, not a stored copy.** Aggregator databases go stale; this reads each board when you run it.
- **Matches that mean what you typed.** Workday's and SmartRecruiters' own search is loose: "data engineer" also returns operations managers. By default every keyword word must start a word in the title ("engineer" matches "Engineering"). Turn on `matchDescription` to match skills inside the description too.
- **Salary as numbers.** `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod`, from the ATS's own pay field where it has one (Ashby, Lever, Recruitee), otherwise parsed from pay-transparency text in the description.
- **Workday without the 2,000 cap.** Workday's listing stops at 2,000 jobs; big employers are split by Workday's own filters so every job is read once.
- **One row shape across eight systems.** No per-ATS field mapping on your side.

### Input

| Field | What it does |
|---|---|
| `searchText` | Title words, e.g. `product designer`. |
| `strictKeyword` | Every keyword word must be in the title (default on). |
| `matchDescription` | Also accept jobs whose description has every keyword word. |
| `postedWithinDays` | Only jobs posted in the last N days. |
| `locations` | Keep jobs whose location contains one of these, e.g. `London`, `Germany`, `Remote`. |
| `remoteOnly` | Only jobs marked remote. |
| `platforms` | Limit to some of the eight ATSes. |
| `companies` | Limit to these companies (names, URLs or `ats:token`). Empty searches everyone in the directories, which needs a keyword or `postedWithinDays`. |
| `includeDescription` | Full description (default). Off: no description, half the price. |
| `onlyNew` | Only jobs not returned by an earlier run of the same search. |
| `maxJobsPerCompany`, `maxJobs` | Caps, newest jobs first. |

### Example input

Remote data engineering jobs posted this week, anywhere:

```json
{
  "searchText": "data engineer",
  "postedWithinDays": 7,
  "remoteOnly": true,
  "maxJobs": 300
}
```

A daily alert for new design jobs at a list of companies, whatever ATS each uses:

```json
{
  "searchText": "designer",
  "companies": ["stripe", "ramp", "nvidia", "https://jobs.lever.co/palantir", "huggingface"],
  "onlyNew": true
}
```

### Example output

```json
{
  "ats": "ashby",
  "company": "Ramp",
  "title": "Partner Development Representative",
  "jobId": "b55447c0-4adc-42eb-9ca2-f88fd44e0e5b",
  "department": "Sales",
  "location": "New York, NY (HQ)",
  "country": "USA",
  "remote": true,
  "workplaceType": "Hybrid",
  "employmentType": "FullTime",
  "postedAt": "2026-09-30T22:45:28.341Z",
  "postedDaysAgo": 0,
  "salaryMin": 110000,
  "salaryMax": 120000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": "$110K – $120K • Offers Equity • Offers Commission • Total OTE with 70/30 split",
  "description": "…",
  "url": "https://jobs.ashbyhq.com/ramp/b55447c0-4adc-42eb-9ca2-f88fd44e0e5b",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/b55447c0-4adc-42eb-9ca2-f88fd44e0e5b/application",
  "atsBoard": "ramp"
}
```

The run's `SUMMARY` record shows boards read, jobs listed and returned per platform, and anything in `companies` that could not be resolved.

### Uses

- Job boards and job-alert products fed from employers' own postings, with no reposts
- Recruiting: every opening for a role across the market, or at a target list
- Sales signals: who is hiring for the role your product serves, with the description to qualify it
- Labor-market and pay research by title, location and company

### Pricing

- **$0.004** per job with full description (default)
- **$0.002** per job without description (`includeDescription` off)

No start fee, and a run that returns no jobs is free. Runs are plain JSON calls with no proxy, so platform usage stays low even when a search covers thousands of boards. A search across every company reads over 10,000 boards and is capped at about 10 minutes; any boards not reached in that time are counted in the run summary. Listing companies or platforms makes a run take seconds.

### Notes

- Posted dates are the ATS's own: first published on Greenhouse, created on Lever, published on Ashby, Workable and Recruitee, released on SmartRecruiters. Workday shows only "Posted 3 Days Ago" in its listing, so `postedDaysAgo` comes from that, and `postedAt` from the posting's start date when descriptions are on.
- For one company on Workday, [Workday Jobs Scraper](https://apify.com/scrapemint/workday-jobs-scraper) has more Workday-specific options; for a fixed list of Greenhouse, Lever, Ashby and SmartRecruiters companies, see [Greenhouse, Lever & Ashby Jobs Scraper](https://apify.com/scrapemint/company-job-openings-scraper).

# Actor input Schema

## `searchText` (type: `string`):

Job title words, e.g. data engineer, product designer, nurse. With no companies listed, the search runs across every company in the directories.

## `strictKeyword` (type: `boolean`):

On: keep a job only when every word of the keyword starts a word in its title ("engineer" matches Engineering). Off: take each ATS's own matches, which are loose on Workday and SmartRecruiters.

## `matchDescription` (type: `boolean`):

Keep a job whose description has every keyword word even when its title does not, e.g. a skill like Python or Kubernetes. Slower on Greenhouse, Workday, SmartRecruiters and Workable, which need one extra call per job.

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

Only jobs posted in the last N days. 0 for any age.

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

Keep jobs whose location contains one of these, e.g. New York, Germany, London, Remote.

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

Only jobs marked remote.

## `platforms` (type: `array`):

Limit to some of: workday, greenhouse, lever, ashby, smartrecruiters, workable, recruitee, personio. Empty for all eight.

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

Limit the search to these companies: names (stripe, nvidia), career-site URLs on any supported ATS, or tokens like greenhouse:stripe. Empty searches every company in the directories.

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

On: each job's full description, plus salary parsed from it where the ATS has no salary field. Off: no description, half the price.

## `onlyNew` (type: `boolean`):

On: each run returns only jobs earlier runs with the same search have not. For alerts on a schedule.

## `maxJobsPerCompany` (type: `integer`):

Newest first. Keeps one big employer from filling the run.

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

Stop the run after this many jobs.

## Actor input object example

```json
{
  "searchText": "data engineer",
  "strictKeyword": true,
  "matchDescription": false,
  "postedWithinDays": 7,
  "locations": [],
  "remoteOnly": false,
  "platforms": [],
  "companies": [],
  "includeDescription": true,
  "onlyNew": false,
  "maxJobsPerCompany": 10,
  "maxJobs": 100
}
```

# Actor output Schema

## `jobs` (type: `string`):

ATS, company, title, department, location, country, remote, workplace type, employment type, posted date, salary min/max/currency/period, description, URL and apply URL.

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

Boards read, jobs listed and returned per platform, companies that matched, and any input that could not be resolved.

# 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 = {
    "searchText": "data engineer",
    "postedWithinDays": 7,
    "maxJobsPerCompany": 10,
    "maxJobs": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/ats-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 = {
    "searchText": "data engineer",
    "postedWithinDays": 7,
    "maxJobsPerCompany": 10,
    "maxJobs": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/ats-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 '{
  "searchText": "data engineer",
  "postedWithinDays": 7,
  "maxJobsPerCompany": 10,
  "maxJobs": 100
}' |
apify call scrapemint/ats-jobs-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapemint/ats-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/JTEq4eHwiXQlSTaT8/builds/V8D3SSKkbJB24Wtfr/openapi.json
