# Career Site Jobs API – Workday, Greenhouse, Lever ATS Jobs (`fast_data_asap/career-site-jobs-api`) Actor

Get every open job from company career sites (ATS) as clean JSON: give careers URLs, ats:slug or company names. Workday, Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Teamtailor, Recruitee, Personio. Only-new-jobs mode for daily alerts. $2 per 1,000 jobs.

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

## Pricing

from $1.50 / 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 – Workday, Greenhouse, Lever & more ATS

Career Site Jobs API gets every open job straight from company career sites and applicant tracking systems (ATS): give it careers-page URLs, `ats:slug` short forms or simply company names, and get one clean, de-duplicated JSON list of job postings – including **Workday** career sites, which most job APIs don't cover.

**$2 per 1,000 jobs. Pay only for results:** you are charged only for jobs returned. Companies that are not found, failed sites and "no new jobs" runs cost nothing.

### Supported ATS / career sites

| ATS | Input example | Auto-detect by name |
|---|---|---|
| **Workday** | `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`, `https://wd1.myworkdaysite.com/recruiting/wf/WellsFargoJobs` | URL only |
| **Greenhouse** | `https://boards.greenhouse.io/airbnb`, `greenhouse:stripe` | ✅ |
| **Lever** | `https://jobs.lever.co/palantir`, `lever:palantir` | ✅ |
| **Ashby** | `https://jobs.ashbyhq.com/notion`, `ashby:ramp` | ✅ |
| **SmartRecruiters** | `https://jobs.smartrecruiters.com/BoschGroup` | ✅ |
| **Workable** | `https://apply.workable.com/huggingface` | ✅ |
| **Teamtailor** | `https://tibber.teamtailor.com/jobs`, `https://jobs.tibber.com`, `teamtailor:tibber` | ✅ |
| **Recruitee** | `https://bunq.recruitee.com` | ✅ |
| **Personio** | `https://personio.jobs.personio.de`, `personio:personio` | ✅ |

#### Why this career site jobs API

- ✅ **9 ATS in one Actor** – Workday, Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Teamtailor, Recruitee, Personio – with one input format and one flat output schema
- ✅ **Workday jobs** for large enterprises (NVIDIA, Salesforce, Wells Fargo, …) via the public career-site endpoint – fully paginated; sites with more than 2,000 jobs are split automatically (up to 10,000 jobs per company and run)
- ✅ **Strong DACH & Nordics coverage**: Personio, Recruitee and Teamtailor career sites
- ✅ **Only new jobs (delta mode)** – remembers what it has seen and returns only new postings: perfect for daily new-job alerts, you pay only for the new ones
- ✅ **Auto-detection**: type `stripe` or `tibber` and the Actor finds the job board itself. Company careers pages (e.g. `https://jobs.tibber.com`) are scanned for embedded ATS boards
- ✅ **Direct from the employer** – fresh jobs, no stale reposts and no duplicates from job boards
- ✅ **Filters** for title keywords, locations, remote, departments and posting date
- ✅ **$2 per 1,000 jobs** – typical career-site job APIs charge around $12 per 1,000 jobs. Compact items, built for AI agents
- ✅ **Fast**: official public JSON/RSS feeds, no browser – a few companies in seconds

### What you get

| Field | Description |
|---|---|
| `title` | Job title |
| `company` | Company name |
| `ats` | Source ATS: `workday`, `greenhouse`, `lever`, `ashby`, `smartrecruiters`, `workable`, `teamtailor`, `recruitee`, `personio` |
| `location` | Location text as published (several offices separated by `\|`) |
| `remote` | `true` if the employer marks the job as fully remote (or "remote" is in location/title) |
| `department` | Department or team (not published by Workday) |
| `employmentType` | `Full-time`, `Part-time`, `Contract`, `Internship`, … |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | Salary range when the employer publishes it in the feed (common on Ashby, Lever, Recruitee) |
| `postedAt` | Publish date (ISO 8601, UTC). Workday gives day precision ("Posted 3 Days Ago"); older Workday jobs ("30+ days") have no date unless descriptions are on |
| `url`, `applyUrl` | Job page and application link on the employer's career site |
| `jobId` | The ATS job ID (stable – used by delta mode, also for your own tracking) |
| `description` | Plain-text job description, only with `includeDescription` |

No personal data: recruiter or hiring-manager names, e-mails and phone numbers are never output as fields.

A `SUMMARY` record in the key-value store lists, per company, which ATS boards were found, how many jobs are open, how many were new (delta mode) and how many were returned, plus all companies that were not found or failed.

### Inputs

- **Companies** (required): any mix of
  - Workday career-site URLs: open the company's job search on `*.myworkdayjobs.com` or `*.myworkdaysite.com` and paste the address, e.g. `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` (a job link from that site works too). Workday sites can't be guessed from a name.
  - other ATS careers URLs: `https://boards.greenhouse.io/airbnb`, `https://jobs.lever.co/palantir`, `https://jobs.ashbyhq.com/notion`, `https://apply.workable.com/huggingface`, `https://tibber.teamtailor.com/jobs`, `https://bunq.recruitee.com`, `https://personio.jobs.personio.de`, `https://jobs.smartrecruiters.com/ServiceNow`
  - short forms: `greenhouse:stripe`, `lever:palantir`, `ashby:ramp`, `smartrecruiters:BoschGroup`, `workable:huggingface`, `teamtailor:tibber`, `recruitee:bunq`, `personio:personio`
  - the company's own careers page: `https://www.notion.com/careers`, `https://jobs.tibber.com`
  - just a name or slug: `stripe`, `Hugging Face` – all guessable ATS are tried in parallel and the board with the most open jobs is used (other matches are listed in `SUMMARY`)
- **Job title keywords**: keep jobs whose title contains one of them, e.g. `engineer`, `sales`.
- **Locations**: text match on the location, e.g. `Berlin`, `United States`, `Remote`.
- **Remote jobs only**, **Departments**, **Posted within (days)**.
- **Max jobs per company**: newest first; `0` = all open jobs (Workday: up to 10,000, SmartRecruiters: up to 2,000 per company and run).
- **Include job descriptions**: adds plain text without HTML. For Workday it also adds all locations, employment type and the exact date (one extra request per job).
- **Only new jobs (delta mode)** + **Monitor name**: see below.

### Daily new-job alerts (only new jobs)

Turn on **Only new jobs** and schedule the Actor (e.g. daily at 7:00):

1. The first run returns all current jobs that match your filters – your baseline – and stores their job IDs per company in a named key-value store (`monitorName`, default `career-site-jobs-monitor`).
2. Every later run returns **only jobs that were not seen before**. You pay only for those.
3. Nothing new? You get one free `no_results` item and pay nothing.

Connect the run to Slack, e-mail, Google Sheets, Make, Zapier or n8n and you have a hiring-signal feed for your target accounts. Use a different `monitorName` per watch list. Jobs that were cut by `maxJobsPerCompany` stay "new" and are delivered on the next run.

### Example output

```json
{
  "title": "Senior Technical Program Manager",
  "company": "Ramp",
  "ats": "ashby",
  "location": "New York, NY (HQ)",
  "remote": false,
  "department": "Engineering",
  "employmentType": "Full-time",
  "salaryMin": 180000,
  "salaryMax": 250000,
  "salaryCurrency": "USD",
  "salaryPeriod": "yearly",
  "postedAt": "2026-10-16T18:04:33.419000+00:00",
  "url": "https://jobs.ashbyhq.com/ramp/8be55ffc-d512-4ef3-a14d-3a4cb29a60d4",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/8be55ffc-d512-4ef3-a14d-3a4cb29a60d4/application",
  "jobId": "8be55ffc-d512-4ef3-a14d-3a4cb29a60d4"
}
```

Workday example:

```json
{
  "title": "Senior Product Engineer",
  "company": "Nvidia",
  "ats": "workday",
  "location": "Thailand, Remote",
  "remote": true,
  "department": null,
  "employmentType": "Full-time",
  "postedAt": "2026-10-20T00:00:00+00:00",
  "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/Thailand-Remote/Senior-Product-Engineer_JR2027022",
  "jobId": "JR2027022"
}
```

Companies without a public job board appear as one item with `status: "not_found"`, sites that refuse the request (e.g. a blocked Workday site) as `status: "failed"` with the reason – both are free.

### Use cases

- **Daily new-job alerts / hiring signals**: watch 50 target accounts and get only the new openings every morning – recruiting agencies and sales teams reach out first.
- **Job aggregators and job boards**: fill your board with fresh, original postings directly from employers, including Workday enterprises.
- **Market and competitor analysis**: hiring trends by department, location, remote share and salary ranges across companies.
- **Job feed for AI agents**: let Claude, ChatGPT or your own agent check open roles at any company in seconds.

### How much does it cost?

| Jobs | Price |
|---|---|
| 100 | $0.20 |
| 1,000 | $2.00 |
| 10,000 | $20.00 |

No start fee, no charge for companies that are not found, failed or have no new jobs. With the Apify free plan's $5 monthly credit you can fetch about 2,500 jobs for free.

### FAQ

**How do I scrape Workday jobs?** Paste the Workday career-site URL (`https://<company>.wd<N>.myworkdayjobs.com/<site>`) into Companies. The Actor uses the same public JSON endpoint the career site itself uses, pages through all jobs – also beyond Workday's 2,000-results limit – and (optionally) loads each job's description. No login, no cookies. If a Workday site refuses automated requests, you get a free `failed` item instead of a broken run.

**Is there a Greenhouse API or Lever API for job postings?** Yes – both offer public job-board feeds, as do Ashby, SmartRecruiters, Workable, Teamtailor, Recruitee and Personio. This Actor wraps all of them in one input and one output format, so you don't have to build and maintain nine integrations.

**How do I get only new job postings every day?** Turn on **Only new jobs** and schedule the Actor. The first run is the baseline; after that you only receive (and pay for) postings that weren't there before.

**How do I find out which ATS a company uses?** Enter the company name or its careers page URL; the Actor detects the job board automatically and reports it in the `ats` field and in `SUMMARY`. Workday is the exception – paste the Workday URL.

**A company is "not_found" – why?** It may use an ATS that is not supported (e.g. iCIMS, Taleo, SuccessFactors, Softgarden), or its slug differs from its name. Open the company's careers page, click a job and paste that URL – or use the `ats:slug` form.

**Does it return salaries?** Yes, whenever the employer publishes them in the feed (Ashby and Lever often do, as required by US pay-transparency laws). Otherwise the salary fields are empty.

### Use it with Claude, ChatGPT and other AI agents

1. Add the Apify MCP server to your assistant (e.g. in Claude: Settings → Connectors → add `https://mcp.apify.com`, then sign in with Apify).
2. Ask in plain language. The assistant finds this Actor, runs it and works with the results. Runs usually finish in seconds, well within agent time limits.

Example prompts:

- "Which engineering roles are Stripe, Notion and NVIDIA (https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite) hiring for right now? Group them by location."
- "Check the careers pages of these 20 SaaS companies and list everyone hiring a Head of Sales in Germany, Austria or Switzerland."
- "Every morning, tell me which new product-manager jobs appeared at my 30 target accounts" (with a scheduled run and Only new jobs).

You can also run it via the Apify API, on a schedule, or connect it to Make, Zapier, n8n and Google Sheets.

#### Pay per call with x402 – no account needed

AI agents can run this Actor and pay per call with **x402** (USDC stablecoin payments over HTTP) through Apify's agentic payments – no Apify account or API key required. You pay the same pay-per-event prices listed above. Details: [Apify x402 integration](https://docs.apify.com/platform/integrations/x402).

### Notes

- Only publicly available job postings from the companies' official, public job-board feeds and career-site endpoints are read. No login, no cookies, no anti-bot circumvention.
- No personal data is collected as fields: recruiter names, e-mails and phone numbers are not included in the output (a job description may mention a contact if the employer wrote it into the posting text).
- Job postings belong to the employers. Make sure your use complies with the terms of the respective career sites and applicable law.

More Actors for data and AI agents: [fast_data_asap on Apify](https://apify.com/fast_data_asap)

# Actor input Schema

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

Companies to get open jobs from – one per line, any mix of:
• Workday career-site URLs: https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite (Workday must be given as URL – open the company's job search and copy the address)
• Other ATS careers URLs: https://boards.greenhouse.io/airbnb, https://jobs.lever.co/palantir, https://jobs.ashbyhq.com/notion, https://apply.workable.com/huggingface, https://tibber.teamtailor.com/jobs, https://bunq.recruitee.com, https://personio.jobs.personio.de, https://jobs.smartrecruiters.com/BoschGroup
• Short forms: greenhouse:stripe, lever:palantir, ashby:ramp, teamtailor:tibber, personio:personio
• A company's own careers page (https://jobs.tibber.com, https://stripe.com/jobs) – embedded job boards are detected
• Just a company name or slug (stripe, notion, tibber) – Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Personio and Teamtailor are tried automatically.

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

Keep only jobs whose title contains at least one of these words or phrases (case-insensitive), e.g. engineer, product manager, sales. Leave empty for all jobs.

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

Keep only jobs whose location text contains at least one of these, e.g. Berlin, London, United States, Remote. Leave empty for all locations.

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

Only return jobs marked as remote by the employer (or with 'remote' in location or title).

## `departments` (type: `array`):

Keep only jobs whose department/team contains one of these, e.g. Engineering, Sales, Marketing. Leave empty for all departments.

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

Only jobs published in the last N days. 0 = no limit. Jobs without a date are kept (Workday only says '30+ days' for older jobs – those are excluded when N < 30).

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

Upper limit of jobs returned per company (newest first, after filters). 0 = all open jobs (Workday: up to 10,000, SmartRecruiters: up to 2,000 per company and run).

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

Adds the full job description as plain text (HTML removed). For Workday and SmartRecruiters this needs one extra request per returned job (Workday then also fills all locations, employment type and the exact posting date). Off by default to keep items compact.

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

Daily new-job alerts: remembers the job IDs of every company in a named key-value store and returns only jobs that were not seen in earlier runs. The first run returns all current jobs (baseline); later runs return only new postings – you pay only for those. If nothing is new you get one free 'no_results' item. Schedule the Actor daily with the same input.

## `monitorName` (type: `string`):

Name of the key-value store that keeps the seen job IDs for 'Only new jobs'. Use a different name per watch list (e.g. sales-roles-dach) so separate monitors don't share their history. Letters, digits and dashes.

## `maxConcurrency` (type: `integer`):

How many ATS requests run at the same time. The default is fine for most runs.

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

Usually not needed: all sources are public job-board APIs.

## Actor input object example

```json
{
  "companies": [
    "stripe",
    "https://jobs.ashbyhq.com/notion",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "maxJobsPerCompany": 10,
  "includeDescription": false,
  "onlyNewJobs": false,
  "monitorName": "career-site-jobs-monitor",
  "maxConcurrency": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "companies": [
        "stripe",
        "https://jobs.ashbyhq.com/notion",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "maxJobsPerCompany": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("fast_data_asap/career-site-jobs-api").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 = {
    "companies": [
        "stripe",
        "https://jobs.ashbyhq.com/notion",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    ],
    "maxJobsPerCompany": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("fast_data_asap/career-site-jobs-api").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 '{
  "companies": [
    "stripe",
    "https://jobs.ashbyhq.com/notion",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "maxJobsPerCompany": 10
}' |
apify call fast_data_asap/career-site-jobs-api --silent --output-dataset

```

## MCP server setup

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

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/ZhceEDRMHjwcq0dwY/builds/NNY5rqbaikvckIOYi/openapi.json
