# Career Site Jobs Scraper - Greenhouse, Lever, Workday & more (`dataspace/career-site-jobs-scraper`) Actor

Get every open job from company career pages on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio and Breezy in one unified format: title, department, location, remote, salary, date, description and apply link.

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

## Pricing

from $1.80 / 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 Scraper — Greenhouse, Lever, Ashby, Workday & more

Get **every open job** straight from company career pages — **Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio and Breezy HR** — in **one unified format**. Paste the career page URLs, and the Actor detects the platform automatically and returns title, department, location, remote/hybrid, employment type, **salary** (when published), posting date, **full description** and the apply link.

The data comes directly from each company's public job board feed: fresh, complete and without duplicates from job aggregators. No browser, no login, no API keys.

### What can you do with it?

- **Job boards & aggregators** — backfill and refresh listings from the source, with the original description and apply link.
- **Recruiting & sales intelligence** — see who is hiring for what, where and how fast (hiring = buying intent).
- **Talent market & salary research** — track roles, locations, remote share and pay ranges across companies.
- **AI job matching** — clean plain-text descriptions ready for embeddings and LLMs.
- **Job alerts** — schedule daily runs with *Monitor mode* to get only the new openings.

### Supported career sites

| Platform | Example URL |
|---|---|
| Greenhouse | `https://job-boards.greenhouse.io/airbnb` |
| Lever | `https://jobs.lever.co/spotify` |
| Ashby | `https://jobs.ashbyhq.com/openai` |
| Workday | `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` |
| SmartRecruiters | `https://careers.smartrecruiters.com/BoschGroup` |
| Workable | `https://apply.workable.com/huggingface` |
| Recruitee | `https://bunq.recruitee.com` |
| Personio | `https://personio.jobs.personio.de` |
| Breezy HR | `https://company.breezy.hr` |

Short form works too: `lever:spotify`, `greenhouse:stripe`, `ashby:openai`.

### What data do you get?

One result per job, same fields for every platform:

| Field | Example |
|---|---|
| `company`, `ats`, `jobId` | OpenAI, ashby, 240d459b-… |
| `title`, `department`, `team` | Research Engineer, Research, Research |
| `location`, `locations` | the location text as the company wrote it (all locations as a list) |
| `city`, `region`, `countryCode`, `country` | **parsed and standardized** for every platform: San Francisco · California · US · United States |
| `workplaceType`, `isRemote` | remote / hybrid / onsite |
| `employmentType` | FULL_TIME, PART_TIME, CONTRACT, INTERN, TEMPORARY (+ original value) |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval`, `salaryText` | 250000, 445000, USD, year, "$250K - $445K" — from the platform's pay field or, when the company only writes it in the job description, **read from the description** |
| `postedAt`, `updatedAt` | 2025-04-05T00:03:20Z |
| `url`, `applyUrl` | job page and application link |
| `description` (+ optional `descriptionHtml`) | full job description as clean text |
| `requisitionId`, `careerPage` | internal requisition number, the board URL |

Fields a platform does not publish are `null` (e.g. Breezy HR publishes no description in its feed). Salaries are filled from Greenhouse pay ranges, Lever/Ashby salary fields, or salary ranges written in the description.

#### Example output (real result, shortened)

```json
{
  "company": "OpenAI",
  "ats": "ashby",
  "title": "Research Engineer",
  "department": "Research",
  "location": "San Francisco",
  "country": "United States",
  "employmentType": "FULL_TIME",
  "salaryMin": 250000,
  "salaryMax": 445000,
  "salaryCurrency": "USD",
  "salaryInterval": "year",
  "salaryText": "$250K - $445K",
  "postedAt": "2025-04-05T00:03:20Z",
  "url": "https://jobs.ashbyhq.com/openai/240d459b-696d-43eb-8497-fab3e56ecd9b",
  "applyUrl": "https://jobs.ashbyhq.com/openai/240d459b-696d-43eb-8497-fab3e56ecd9b/application",
  "description": "By applying to this role, you will be considered for Research Engineer roles across all teams at OpenAI. …"
}
```

### How to use

1. Paste one or more **career page URLs** (any mix of supported platforms).
2. Optionally filter by **title keywords**, **excluded words**, **location**, **remote only** or **posted within N days**.
3. Click **Start** and export as JSON, CSV, Excel, or via API.

#### Example input

```json
{
  "careerPages": ["https://boards.greenhouse.io/stripe", "https://jobs.lever.co/palantir", "https://jobs.ashbyhq.com/openai"],
  "titleKeywords": ["engineer", "data"],
  "excludeTitleKeywords": ["intern"],
  "locationKeywords": ["London", "remote"],
  "postedWithinDays": 30,
  "maxJobsPerCompany": 500
}
```

In our tests, 7 companies (Stripe, Palantir, OpenAI, NVIDIA, Bosch, Hugging Face, bunq) returned 1,741 matching jobs with full descriptions in about 2.5 minutes.

### Pricing

Pay per result: **$1.80 per 1,000 jobs**, plus a tiny start fee of $0.00005 per run. Platform usage (compute and proxies) is included — you are not charged anything else. Full descriptions are included.

| Example | Cost |
|---|---|
| one company with 300 open jobs | $0.54 |
| 10,000 jobs from 50 companies | $18 |

Set a maximum cost for a run and the Actor stops when it is reached.

### Tips

- **Monitor mode** remembers the jobs returned for each company, so scheduled runs return only new openings.
- For Workday, paste the URL of the career site (it contains the site name, e.g. `…myworkdayjobs.com/NVIDIAExternalCareerSite`).
- Filters are applied before descriptions are fetched, so filtered runs are faster and cheaper.

### FAQ

**Is this legal?** The Actor reads the public job board feeds that companies publish so their jobs can be found and shared. It does not log in and does not collect personal data — recruiter names and recruiting e-mail addresses present in some feeds are deliberately left out.

**Can I use it from my app or AI agent?** Yes — through the Apify API, Python/JavaScript clients, Zapier, Make, or as a tool for AI agents via Apify MCP.

**Need another platform?** Open an issue on the Issues tab — new platforms are added on request.

### More scrapers by dataspace

- [Greenhouse Jobs Scraper](https://apify.com/dataspace/greenhouse-jobs-scraper) — search 3,400+ company job boards at once
- [Workday Jobs Scraper](https://apify.com/dataspace/workday-jobs-scraper) — search 3,100+ Workday career sites
- [Ashby Jobs Scraper](https://apify.com/dataspace/ashby-jobs-scraper) and [Lever Jobs Scraper](https://apify.com/dataspace/lever-jobs-scraper)
- [SEEK Jobs Scraper](https://apify.com/dataspace/seek-jobs-scraper) — jobs in Australia and New Zealand

**Like it?** If this Actor saves you time, please leave a review on the Reviews tab — it helps others find it. Found a problem? Open an issue and it will be fixed quickly.

### Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio, Breezy HR or any employer. All names are trademarks of their respective owners and are mentioned only to describe the publicly available data sources. It collects only publicly available job postings — without logging in, without solving CAPTCHAs and without collecting personal data. Job descriptions belong to the respective employers. You are responsible for making sure that your use of the data complies with applicable laws (including copyright and data protection laws such as GDPR) and with the terms of the source websites.

City, region and country names are standardized with [GeoNames](https://www.geonames.org) data, licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).

# Actor input Schema

## `careerPages` (type: `array`):

One company per line: the URL of its job board. Supported: <b>Greenhouse</b> (job-boards.greenhouse.io/airbnb), <b>Lever</b> (jobs.lever.co/spotify), <b>Ashby</b> (jobs.ashbyhq.com/openai), <b>Workday</b> (nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite), <b>SmartRecruiters</b> (careers.smartrecruiters.com/BoschGroup), <b>Workable</b> (apply.workable.com/huggingface), <b>Recruitee</b> (bunq.recruitee.com), <b>Personio</b> (personio.jobs.personio.de), <b>Breezy HR</b> (company.breezy.hr). Short form also works: <code>lever:spotify</code>.

## `titleKeywords` (type: `array`):

Only jobs whose title contains at least one of these words, e.g. <code>engineer</code>, <code>data</code>, <code>sales</code>. Leave empty for all jobs.

## `excludeTitleKeywords` (type: `array`):

Skip jobs whose title contains any of these words, e.g. <code>intern</code>, <code>senior</code>.

## `locationKeywords` (type: `array`):

Only jobs in these places: city, country or country code, e.g. <code>London</code>, <code>Germany</code>, <code>US</code>, <code>remote</code>.

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

Only jobs marked as remote by the company.

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

Only jobs published in the last N days (leave empty for all).

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

Maximum number of jobs returned per company (after filters).

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

Full job description as clean plain text (great for AI matching and analysis).

## `includeDescriptionHtml` (type: `boolean`):

Adds the original formatted description (HTML) — useful for job boards that re-publish jobs.

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

Return only jobs that were not returned by previous runs for the same company. Schedule the Actor (e.g. daily) to get new openings only. Seen jobs are remembered in the key-value store <code>career-site-jobs-monitor</code> in your account.

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

Job boards are requested directly; a proxy IP is used automatically only if a request fails.

## Actor input object example

```json
{
  "careerPages": [
    "https://jobs.ashbyhq.com/openai",
    "https://job-boards.greenhouse.io/airbnb"
  ],
  "remoteOnly": false,
  "maxJobsPerCompany": 50,
  "includeDescription": true,
  "includeDescriptionHtml": false,
  "onlyNewJobs": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One item per job opening in a unified format across all supported career sites.

## `allFields` (type: `string`):

Every job with all fields, including the full 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 = {
    "careerPages": [
        "https://jobs.ashbyhq.com/openai",
        "https://job-boards.greenhouse.io/airbnb"
    ],
    "maxJobsPerCompany": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspace/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 = {
    "careerPages": [
        "https://jobs.ashbyhq.com/openai",
        "https://job-boards.greenhouse.io/airbnb",
    ],
    "maxJobsPerCompany": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("dataspace/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 '{
  "careerPages": [
    "https://jobs.ashbyhq.com/openai",
    "https://job-boards.greenhouse.io/airbnb"
  ],
  "maxJobsPerCompany": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call dataspace/career-site-jobs-scraper --silent --output-dataset

```

## MCP server setup

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