# Career Site Jobs API – Workday, Greenhouse, Lever, Ashby (`data_daemon/career-site-jobs-scraper`) Actor

$1 per 1,000 jobs | Jobs straight from company career sites on Workday, Greenhouse, Lever, Ashby and SmartRecruiters in one schema: title, location, remote, salary range, date, description, apply URL. Search your own company list, or across companies by title, place and date. Only-new mode.

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

## Pricing

from $0.70 / 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 API** collects job postings **straight from company career sites** on **Workday, Greenhouse, Lever, Ashby and SmartRecruiters** and returns them in **one schema**: title, locations, remote / hybrid / on-site, department, team, employment type, **salary range** (numbers, currency and period, when the employer publishes it), posting date, full description and apply URL. Put any number of companies from any of the five platforms into one run, or leave the list empty to **search across companies**: a built-in list of 10,556 public company boards is searched live for your title, location and posting window. An **only-new mode** turns it into a daily feed of new openings. No login, no proxy.

Run it in Apify Console, through the API, on a schedule, or from Google Sheets, Zapier, Make, n8n or an AI agent via the Apify MCP server.

### What does Career Site Jobs API do?

- **Search across companies:** no URLs needed. Give title keywords (`software engineer`), a location (`United States`) and a window (`24h`, `7d`), and the Actor searches 10,556 company boards on all five platforms.
- **Or paste careers URLs** such as `https://boards.greenhouse.io/airbnb`, `https://jobs.lever.co/palantir`, `https://jobs.ashbyhq.com/ramp`, `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` or `https://jobs.smartrecruiters.com/BoschGroup` (or short forms like `greenhouse:airbnb`).
- **Filter** by title keywords, location, workplace type and posting date. Filters run before anything is charged.
- **Get one schema** for every platform, so a list of 50 employers on five different applicant tracking systems becomes one table.
- **Big Workday sites:** Workday stops paging at 2,000 jobs; larger sites are split by job family automatically.
- **Only new jobs:** schedule it daily and each run returns only postings you have not received before (skipped jobs are free).

### Search jobs across companies (cross-company search)

Leave **Career site URLs** empty. The Actor then searches its built-in list of public company boards (5,341 on Greenhouse, 1,555 on Lever, 3,108 on Ashby, 340 Workday and 212 SmartRecruiters career sites, collected from open job lists on GitHub and checked on 5 November 2026 to answer with open jobs; ATS test, demo and sandbox boards and employees-only boards are left out) for jobs that match your filters.

```json
{
  "keywords": ["software engineer", "data engineer"],
  "excludeKeywords": ["intern"],
  "locations": ["United States", "Remote"],
  "postedWithinDays": 1,
  "platforms": ["greenhouse", "lever", "ashby"],
  "maxJobs": 500
}
```

- **Defaults:** jobs posted in the last **7 days**, at most **100 jobs**, a **240-second** search time limit (so a synchronous API call, which waits up to 5 minutes, gets its results; with **Also search the built-in company list** on, the limit covers your own URLs too). Raise `maxJobs` and `maxSearchSeconds` for bigger pulls.
- **Order:** the most active boards are searched first, platforms mixed, and one company gives at most a tenth of `maxJobs` (and at most `maxJobsPerSite`), so results mix employers. `maxCompanies` caps the number of boards; `platforms` limits the search to some of the five.
- **Cheap filters first:** titles, places and (on Greenhouse, SmartRecruiters and Workday) dates are checked on the job list; the job page is read only for matches. You pay only for jobs saved.
- **Mix both:** turn on **Also search the built-in company list** to search your own URLs and the list in one run.
- **Recall:** this is a live search of a list of about 10,600 employers, not a database of every career site on the web. Companies that are not on the list are found only when you add their URL. `RUN-SUMMARY` shows how many companies were searched and which ones matched.

### Compatible input field names

Code written for other career-site job APIs often sends `titleSearch`, `locationSearch`, `timeRange` and `limit`. This Actor reads those names too, so such code can call it without changing its input:

| You send | Read as | Notes |
|---|---|---|
| `titleSearch` | `keywords` | list of title phrases |
| `titleExclusionSearch` | `excludeKeywords` | |
| `locationSearch` | `locations` | list or a single string; country names match their cities and codes |
| `timeRange` | posting window | `1h`, `24h`, `7d`, `6m` (months) or any number with h / d / w / m / y |
| `datePostedAfter` | posting window | ISO date, e.g. `2026-11-01` |
| `limit` | `maxJobs` | |
| `ats` | `platforms` | `greenhouse`, `lever.co`, `ashby`, `workday`, `smartrecruiters`; other platforms are skipped with a warning |
| `aiWorkArrangementFilter` | `workplaceTypes` | `Remote OK` / `Remote Solely` -> remote, `Hybrid`, `On-site` |

When the input uses any of these names (`limit` alone does not count), each job also carries **compatible output keys**: `organization`, `date_posted`, `locations_derived`, `description_text`, `ai_work_arrangement`, `ai_salary_min_value`, `ai_salary_max_value`, `ai_salary_currency`, `ai_salary_unit_text` and `source` (copies of `company`, `postedAt`, `locations`, `description`, `workplaceType`, the salary fields and `platform`; nothing is AI-generated). Set `compatibleOutput` to `true` or `false` to choose yourself. Other filters of other APIs (AI taxonomies, experience levels, domain filters) are not supported and are ignored with a warning in the log.

```json
{
  "titleSearch": ["software engineer"],
  "locationSearch": ["United States"],
  "timeRange": "24h",
  "limit": 200,
  "ats": ["greenhouse", "lever.co", "ashby", "workday"]
}
```

### Why collect jobs from company career sites?

| Who | What for |
|---|---|
| Job boards and aggregators | Fresh, direct-from-employer postings for a list of companies, deduplicated by `id` |
| Sales and market intelligence | Which target accounts are hiring, for which teams, where, and at what pay: hiring as a buying signal |
| Recruiters and staffing firms | New openings at client and target companies every morning |
| HR and compensation analysts | Published salary ranges by title, company and location (pay-transparency data) |
| Job seekers and career tools | One feed of new roles at the companies you care about |

Career sites are the original source: postings appear there first, with the employer's own salary range and description, before they reach job boards.

### How to use it

1. Open the **Input** tab and paste career-site URLs (one per line), or clear the list to search across all companies in the built-in list.
2. Optionally add title keywords (`software engineer`, `account executive`), locations (`New York`, `Remote`) and a posting window.
3. Click **Start**. Download the results as JSON, CSV, Excel or XML, or read them through the API.
4. For a daily feed, turn on **Only new jobs since the last run**, save the input as a task and add a schedule.

#### Input example

```json
{
  "careerSiteUrls": [
    "https://boards.greenhouse.io/airbnb",
    "https://jobs.lever.co/palantir",
    "https://jobs.ashbyhq.com/ramp",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "keywords": ["engineer", "product manager"],
  "locations": ["United States", "Remote"],
  "postedWithinDays": 7,
  "maxJobsPerSite": 200
}
```

### Output example

A real row (description shortened):

```json
{
  "id": "ashby:ramp:34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "title": "Security Engineer, Cloud",
  "platform": "ashby",
  "company": "Ramp",
  "legalEntity": null,
  "careerSite": "https://jobs.ashbyhq.com/ramp",
  "requisitionId": null,
  "url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "locations": [
    "New York, NY (HQ)",
    "Remote (Canada)",
    "Remote (US)",
    "Miami, FL"
  ],
  "country": "USA",
  "workplaceType": "hybrid",
  "department": "Engineering",
  "team": "Backend",
  "employmentType": "Full-time",
  "experienceLevel": null,
  "salaryMin": 211400,
  "salaryMax": 290600,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": "$211.4K – $290.6K • Offers Equity",
  "postedAt": "2026-04-07T17:12:35.753Z",
  "postedText": null,
  "scrapedAt": "2026-11-04T09:17:50.939Z",
  "description": "About Ramp\nRamp is building the smart infrastructure for finance teams, embedded in the transaction flow of every dollar a business spends. We automate how over $275B in annualized spend flows in and out of 85,000+ compa ..."
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data fields

| Field | Description |
|---|---|
| `id`, `platform`, `company`, `jobId`, `requisitionId` | Stable id (`platform:company:jobId`), platform, company and the employer's own ids |
| `title`, `department`, `team`, `employmentType`, `experienceLevel` | Role details as the employer lists them |
| `locations`, `country`, `workplaceType` | Every listed location, country, remote / hybrid / onsite |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText` | Pay range when published (Ashby and Lever fields, Greenhouse pay-range blocks, ranges stated in the description) |
| `postedAt`, `postedText` | First published; Workday's relative text |
| `url`, `applyUrl`, `careerSite` | Job page, apply page and the career site you gave |
| `description`, `descriptionHtml` | Full description (text and HTML) |
| `legalEntity` | Workday: the legal entity posting the job |

### Which platforms are supported?

| Platform | Example URL | Salary source | Notes |
|---|---|---|---|
| Workday | `https://<company>.wd5.myworkdayjobs.com/<site>` | range stated in the description | sites over 2,000 jobs are split by job family |
| Greenhouse | `https://boards.greenhouse.io/<company>` | pay-range block | company name from the board |
| Lever | `https://jobs.lever.co/<company>` (EU: `jobs.eu.lever.co`) | salary field or description | workplace type, team, commitment |
| Ashby | `https://jobs.ashbyhq.com/<company>` | compensation field | department, team, remote flag |
| SmartRecruiters | `https://jobs.smartrecruiters.com/<company>` | rarely published | experience level, function |

Oracle Recruiting Cloud (Oracle Fusion HCM) career sites have their own Actor: [Oracle HCM Jobs Scraper](https://apify.com/data_daemon/oracle-hcm-jobs-scraper).

### How much does it cost?

Pay per event: **$1 per 1,000 jobs** plus **$0.001 per run**, full description included. Jobs left out by your filters, skipped in only-new mode or listed in `skipJobIds` are not charged. Higher Apify plans get the Store discount automatically.

| Run | Jobs | Cost |
|---|---:|---:|
| 4 companies, engineering roles | ~200 | about $0.20 |
| 50 companies, all open jobs | ~10,000 | about $10 |
| Daily only-new feed of 50 companies | ~300 new a day | about $0.30 a day |
| Cross-company search, default limit | 100 | about $0.10 |

Measured on 5 November 2026: a cross-company search for software engineers in the United States posted in the last 7 days returned 250 jobs from 67 companies in 8 seconds ($0.25 + $0.001). A narrow search (machine learning engineer, remote, last 24 hours) searched 7,105 companies in the 240-second limit and returned 6 jobs ($0.007). An empty input returned 100 jobs from 11 companies in 4 seconds.

Set **Maximum cost per run** in the run options to cap any run; the Actor stops cleanly and keeps what it saved.

### Tips

- Find a company's careers URL by opening its "Careers" page and following any job link: the address shows the platform (`myworkdayjobs.com`, `greenhouse.io`, `lever.co`, `ashbyhq.com`, `smartrecruiters.com`).
- `keywords` match titles by words in any order, with prefixes (`engineer` finds "Engineering Manager"); add several keywords for alternatives.
- Workday and SmartRecruiters read each job's page for the description; turn descriptions off for faster listing-only runs (the price is the same).
- The `RUN-SUMMARY` record lists each site's platform, company, listed, matched and saved counts and any error.

### FAQ

**Do I need accounts or API keys?** No. The Actor reads the same public job APIs that power the career sites.

**Does the cross-company search cover every company?** No. It searches the built-in list of about 10,600 boards live, at the time of your run. A company outside the list is covered when you paste its careers URL (with **Also search the built-in company list** on, you get both). A board that has closed since the list was checked is counted as unavailable in `RUN-SUMMARY` and costs nothing.

**A careers URL is not recognised?** Some companies put their own domain in front of the platform. Open a job and copy the platform URL from the address bar or the "Apply" link. If the company uses another platform, tell us on the **Issues** tab.

**Is this legal?** The Actor collects job postings employers publish for the public and no personal data. Check that your use complies with the laws and terms that apply to you.

### Python client on GitHub

[datadmon/career-site-jobs-scraper](https://github.com/datadmon/career-site-jobs-scraper): a tested Python script that runs this Actor and saves the results as JSON and CSV, with a real sample output, the field reference and a GitHub Actions recipe for a daily only-new feed.

### Related Actors by Daemon Data

- [Oracle HCM Jobs Scraper](https://apify.com/data_daemon/oracle-hcm-jobs-scraper) – jobs from any Oracle Recruiting Cloud career site (JPMorgan Chase, Marriott, Oracle...)
- [Welcome to the Jungle Jobs Scraper](https://apify.com/data_daemon/welcome-to-the-jungle-jobs-scraper) – European tech and startup jobs with salary and remote policy
- [India Jobs Feed](https://apify.com/data_daemon/india-jobs-feed) – ten Indian job boards in one search and one schema
- [Naukri Jobs Scraper](https://apify.com/data_daemon/naukri-jobs-scraper) – Naukri.com jobs with salary in LPA and a whole-board daily feed

More data tools: [Daemon Data on Apify](https://apify.com/data_daemon)

# Actor input Schema

## `careerSiteUrls` (type: `array`):

Company careers pages on Workday (`https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`), Greenhouse (`https://boards.greenhouse.io/airbnb`), Lever (`https://jobs.lever.co/palantir`), Ashby (`https://jobs.ashbyhq.com/ramp`) or SmartRecruiters (`https://jobs.smartrecruiters.com/BoschGroup`). Short forms like `greenhouse:airbnb` work too. **Leave empty to search every company in the built-in list** (cross-company search, see below).

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

Keep jobs whose title contains all words of any keyword (`data engineer`, `account executive`). Prefix match: `engineer` also matches "Engineering". Empty = all jobs.

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

Drop jobs whose title matches any of these (same matching as title keywords), e.g. `senior`, `intern`. Applied before anything is charged.

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

Keep jobs whose location or country contains any of these (`New York`, `London`, `Remote`). Country names also match the country's code and big cities, so `United States` finds "San Francisco, CA" and `India` finds "Bengaluru". Empty = everywhere.

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

Keep only these workplace types (as the employer states them). Empty = all.

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

Only jobs first published in the last N days. Empty = all open jobs (cross-company search: last 7 days).

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

On (default): the full job description as text and HTML. Workday and SmartRecruiters read each job page for it; the price is the same either way.

## `maxJobsPerSite` (type: `integer`):

Stop each career site after this many jobs. Workday sites with more than 2,000 jobs are split by job family automatically when you ask for more.

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

Stop the run after this many jobs in total. Empty = no limit for your own career sites, 100 for a cross-company search; 0 = no limit.

## `searchAllCompanies` (type: `boolean`):

On: search the built-in company list as well as the career-site URLs you gave. Off (default): the list is searched only when no URL is given.

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

Cross-company search only: search companies on these platforms. Empty = all five.

## `maxCompanies` (type: `integer`):

Cross-company search only: search at most this many companies from the list (most active boards first, platforms mixed). Empty or 0 = the whole list, within the time limit.

## `maxSearchSeconds` (type: `integer`):

Cross-company search: stop searching after this many seconds and finish with the jobs found. Default 240, so a synchronous API call (5-minute limit) gets its results; 0 = until the run timeout. With 'Also search the built-in company list' on, the limit covers your own URLs too.

## `compatibleOutput` (type: `boolean`):

Also write each job under the key names many existing career-site job API clients read: `organization`, `date_posted`, `locations_derived`, `description_text`, `ai_work_arrangement`, `ai_salary_min_value`, `ai_salary_max_value`, `ai_salary_currency`, `ai_salary_unit_text`, `source`. Empty = on when the input uses `titleSearch`, `locationSearch`, `timeRange`, `ats` or another field name of those clients (`limit` alone does not count), off otherwise.

## `onlyNewSinceLastRun` (type: `boolean`):

On: deliver only jobs an earlier run with the same `stateName` (or the same sites and filters) has not delivered; skip the rest without charging. Off (default): every matching job.

## `stateName` (type: `string`):

Optional name for the only-new memory, e.g. `fintech-companies-us`. Empty = derived from the sites and filters.

## `skipJobIds` (type: `array`):

`id` or `jobId` values you already have; skipped and not charged.

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

Optional, none by default. These platforms serve their public job APIs to datacenter IPs.

## Actor input object example

```json
{
  "careerSiteUrls": [
    "https://boards.greenhouse.io/airbnb",
    "https://jobs.lever.co/palantir",
    "https://jobs.ashbyhq.com/ramp",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "keywords": [],
  "excludeKeywords": [],
  "locations": [],
  "workplaceTypes": [],
  "includeDescription": true,
  "maxJobsPerSite": 50,
  "searchAllCompanies": false,
  "platforms": [],
  "maxSearchSeconds": 240,
  "onlyNewSinceLastRun": false,
  "skipJobIds": []
}
```

# Actor output Schema

## `dataset` (type: `string`):

Jobs as JSON items in the default dataset (also downloadable as CSV, Excel, XML).

## `runSummary` (type: `string`):

RUN-SUMMARY record: per-site platform, company, listed / matched / saved counts and errors, plus found, new, skipped and charged totals.

# 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 = {
    "careerSiteUrls": [
        "https://boards.greenhouse.io/airbnb",
        "https://jobs.lever.co/palantir",
        "https://jobs.ashbyhq.com/ramp",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_daemon/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 = { "careerSiteUrls": [
        "https://boards.greenhouse.io/airbnb",
        "https://jobs.lever.co/palantir",
        "https://jobs.ashbyhq.com/ramp",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("data_daemon/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 '{
  "careerSiteUrls": [
    "https://boards.greenhouse.io/airbnb",
    "https://jobs.lever.co/palantir",
    "https://jobs.ashbyhq.com/ramp",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ]
}' |
apify call data_daemon/career-site-jobs-scraper --silent --output-dataset

```

## MCP server setup

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