# Career Site Jobs Scraper: Workday, Greenhouse, Lever, Ashby (`artsiom_k/career-site-jobs-scraper`) Actor

Search 860,000+ jobs straight from 14,000+ company career sites (Workday, Greenhouse, Ashby, Lever, Workable) by keyword, country, remote, salary and date. Add any company by name or board URL. New-job tracking, optional full descriptions.

- **URL**: https://apify.com/artsiom_k/career-site-jobs-scraper.md
- **Developed by:** [Artsiom Kunitsyn](https://apify.com/artsiom_k) (community)
- **Categories:** Jobs, Lead generation
- **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?

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 Scraper: Workday, Greenhouse, Lever, Ashby

Search **860,000+ open jobs from 14,000+ company career sites** in one run: every job posted on
Workday, Greenhouse, Ashby and Lever job boards we track, refreshed every day, plus any company you name.
Workday is where most large employers (Fortune 500, hospitals, universities, governments) post their jobs.
Filter by job title, country, city, remote/hybrid, salary and posting date, and get one clean table
with the same fields whatever platform the company uses.

These are jobs straight from the employer's applicant tracking system (ATS), so they are fresher and
less duplicated than job aggregators: no reposts, no expired listings, a direct apply link.

For recruiters and sourcing teams, sales teams tracking which companies are hiring (and for what),
job boards and newsletters that list tech/startup jobs, and labour-market researchers.

### What you get (one row per job)

| Field | Example |
|---|---|
| `title`, `department` | `Staff Software Engineer, Data`, `Engineering` |
| `company_name`, `company` (board slug), `ats` | `Ramp`, `ramp`, `ashby` (Workday: `nvidia.wd5/NVIDIAExternalCareerSite`) |
| `location`, `locations`, `countries` | `New York, NY (HQ)`, all listed locations, `["US", "CA"]` |
| `remote`, `workplace_type`, `employment_type` | `true`, `hybrid`, `full_time` |
| `salary_min`, `salary_max`, `salary_currency`, `salary_period`, `salary_text` | `211400`, `290600`, `USD`, `year`, `$211.4K – $290.6K` |
| `posted_at` | `2026-10-17T07:28:44Z` |
| `url`, `apply_url` | the job page and its application form |
| `first_seen`, `last_seen` | when our daily index first saw the job, and last confirmed it open |
| `description_html`, `description_text` | full description (when **Include full job descriptions** is on) |
| `change_type` | `new`, `changed`, `unchanged`, or `delisted` (closed since your last run) |

### How to use it

- **Newest 50 software engineer jobs** (the default): just run it.
- **Remote data jobs in Europe**: Keywords `data engineer`, `data scientist`, `analytics engineer`;
  Locations `Germany`, `Netherlands`, `Spain`, `Remote`; Workplace type `Remote`.
- **Every open job at a list of companies**: put company names or board URLs in **Companies**
  (`Airbnb`, `https://jobs.ashbyhq.com/ramp`, `https://jobs.lever.co/palantir`,
  `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`, `https://apply.workable.com/1global`)
  and clear **Max results**. Companies we don't track yet are read live from their board in the same run.
- **Jobs with a published salary**: turn on **Only jobs with a salary** (Ashby and Lever boards
  publish pay ranges most often, and US pay-transparency states require them).
- **Daily new-job alerts**: schedule the same search with **Max results** cleared. With `mode: auto`,
  each run returns only jobs that are new or changed since the last run, plus jobs that closed
  (`change_type: "delisted"`).
- **Hiring signals for sales**: Keywords such as `head of sales`, `SDR`, `security engineer` show which
  companies are building a team right now; `first_seen` tells you since when.

### Input

| Field | What it does |
|---|---|
| `keywords` | Job-title words or phrases (whole words, case-insensitive). Empty = every job. |
| `excludeKeywords` | Skip titles containing these (e.g. `senior`, `intern`). |
| `locations` | Countries (`United States`, `UK`, `DE`), US states (`California`), cities (`Berlin`) or `Remote`. |
| `workplaceTypes` | Remote, hybrid and/or on-site. |
| `employmentTypes` | Full-time, part-time, contract, internship... |
| `postedWithinDays` | Only jobs posted in the last N days. |
| `onlyWithSalary` | Only jobs with a stated pay range. |
| `companies` | Names, board URLs or `ats:slug`. Empty = every company. |
| `ats` | Only Workday, Greenhouse, Ashby, Lever and/or Workable. |
| `includeDescription` | Full job descriptions, fetched live (slower). |
| `maxItems` | Row cap, 50 by default, newest jobs first. Clear it for every match. |
| `mode` | `auto`, `full` or `incremental` (see above). |

### Good to know

- Results come newest first. A search over the whole index takes seconds; full descriptions add
  about a second per company.
- `countries` uses the board's own country when it gives one and otherwise reads the location text.
  A location like "Remote" or "EMEA" has no country, so a country filter leaves it out; add `Remote`
  to your locations to include remote jobs.
- Greenhouse and Workday boards rarely state salary in their job lists, so **Only jobs with a salary**
  keeps mostly Ashby and Lever jobs. Greenhouse rarely states employment type either.
- Workday jobs: a company's name is taken from its career site (or its hiring entity), and a company
  we don't track yet needs its board URL in **Companies** (a name alone can't be matched to a Workday
  site). A job first seen today may show its country from the location text and a date from "Posted N
  Days Ago" until the next daily refresh adds the exact posting date.
- Workable companies are fetched live when you name them in **Companies**; they are not part of the
  daily index.
- Two-letter location codes that are also US states (`CA`, `DE`, `IN`) match both: `CA` returns
  California and Canada jobs. Write `Canada` or `California` to be precise.
- No proxy, login or API key needed.

### Related jobs data scrapers

- [USAJobs Scraper](https://apify.com/artsiom_k/usajobs-scraper) — US federal government jobs with agency, grade, salary and hiring path.
- [GovernmentJobs Scraper](https://apify.com/artsiom_k/governmentjobs-scraper) — US state, county and city government jobs from GovernmentJobs.com.
- [US Teaching Jobs Scraper](https://apify.com/artsiom_k/us-teaching-jobs-scraper) — K-12 school jobs from SchoolSpring and EdJoin with salary, district and contacts.
- [Idealist Scraper](https://apify.com/artsiom_k/idealist-scraper) — nonprofit jobs, volunteer opportunities and the nonprofit organization directory.

# Actor input Schema

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

Jobs whose title contains any of these words or phrases (whole words, case-insensitive), e.g. data engineer, product manager, nurse. Leave empty for every job.

## `excludeKeywords` (type: `array`):

Skip jobs whose title contains any of these, e.g. senior, intern, manager.

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

Countries (United States, Germany, UK, DE), US states (California), cities (Berlin, New York) or Remote. A job matches if any of its locations matches any entry. Leave empty for anywhere.

## `workplaceTypes` (type: `array`):

Only these workplace types. Jobs whose board doesn't say are left out when this is set.

## `employmentTypes` (type: `array`):

Only these employment types. Greenhouse boards rarely say, so their jobs are left out when this is set.

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

Only jobs posted in the last N days. Leave empty for any date.

## `onlyWithSalary` (type: `boolean`):

Only jobs whose posting states a pay range (mostly Ashby and Lever boards; Workday and Greenhouse job lists rarely carry pay).

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

Only these companies: names (Airbnb), board URLs (https://jobs.ashbyhq.com/ramp, https://boards.greenhouse.io/airbnb, https://jobs.lever.co/palantir, https://apply.workable.com/1global, https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite) or ats:slug. Workday companies not yet indexed need their board URL. Companies not yet indexed are fetched live from their board. Leave empty to search every company.

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

Only jobs from these career-site platforms. Leave empty for all.

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

Fetch each returned job's full description (HTML and plain text) live from its board. Slower.

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

Newest jobs first. Clear it to get every matching job.

## `mode` (type: `string`):

Incremental returns only jobs that are new or changed since your last run with the same filters, plus closed jobs as change_type "delisted" (when Max results is cleared). Auto = incremental once a previous uncapped run exists, otherwise full.

## Actor input object example

```json
{
  "keywords": [
    "software engineer"
  ],
  "onlyWithSalary": false,
  "includeDescription": false,
  "maxItems": 50,
  "mode": "auto"
}
```

# 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 = {
    "keywords": [
        "software engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("artsiom_k/career-site-jobs-scraper").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": ["software engineer"] }

# Run the Actor and wait for it to finish
run = client.actor("artsiom_k/career-site-jobs-scraper").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": [
    "software engineer"
  ]
}' |
apify call artsiom_k/career-site-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

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/2bRMU2MTghEGbTlM6/builds/wl6iI4dKxhmNWKYSt/openapi.json
