# Workday Jobs Scraper & API: All Jobs Past the 2,000 Limit (`atesen-software/workday-jobs-scraper`) Actor

Get every open job from any Workday career site (myworkdayjobs.com), including boards with more than 2,000 jobs. Paste a careers URL, website or company name. No browser, login or proxy; pay per job saved.

- **URL**: https://apify.com/atesen-software/workday-jobs-scraper.md
- **Developed by:** [Atesen Software](https://apify.com/atesen-software) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 results

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

## Workday Jobs Scraper: every open job from any Workday career site

Paste a list of companies that hire through **Workday** (`*.myworkdayjobs.com`). For each one you get **every open job**, read live from Workday's public job API, in a clean normalised format. No browser, no proxy, no login, so it is fast and costs **$1 per 1,000 jobs**.

- 🚀 **Gets past Workday's 2,000-result limit.** Workday's job search never returns more than 2,000 jobs. This actor splits the search by job category (and further if needed), so you get **all** of them: NVIDIA lists 2,753 jobs and you get all 2,753.
- 🔎 **No need to know the exact URL.** Paste a Workday URL, `workday:intel` or just a company website like `adobe.com`. The data center (wd1, wd5, wd12…) and the main external career site are found automatically.
- 🧹 **Normalised fields**:
  - title, all locations and **ISO country codes**;
  - employment type (`full_time`…), workplace type and **salary min/max/currency** parsed from the description;
  - exact posting date, **closing date** (`validThrough`) and requisition ID;
  - job URL, apply URL, and the description as text and/or HTML.
- 🔔 **Monitoring mode**: returns only **new jobs since the last run**, plus free rows for **closed jobs**. Details are only loaded for new jobs, so daily checks are cheap and fast.
- ✅ **Never fails on a bad input**: each problem gets a free status row (`board_not_found`, `unknown_ats`, `invalid_input`, `duplicate`, `no_jobs`, `no_matching_jobs`, `no_new_jobs`, `rate_limited`, `limit_reached`).
- ➕ Also works for companies on **Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio**, with the same output format.

### Why this actor

| | **Workday Jobs Scraper** (this actor) | Workday job database APIs | Other Workday scrapers |
|---|---|---|---|
| Price | **$1 per 1,000 jobs** (down to $0.80 on higher plans) | about $2 per 1,000 jobs | about $1 per 1,000 jobs plus a start fee |
| Companies with more than 2,000 jobs | ✅ **All jobs** (facet splitting) | Depends on their crawl | Limited by the 2,000 cap |
| Input | Workday URL, `workday:<company>`, company website or name | Search their database | Exact Workday URL |
| Freshness | **Live** at run time | Provider's crawl schedule | Live |
| Normalised country, employment type, salary | ✅ | ✅ | Raw Workday fields |
| New-jobs-only monitoring and closed jobs | ✅ Built in, closed rows free | Date filters | ❌ |
| Problem rows instead of failed runs | ✅ Free | — | — |

### How to use it

1. Add companies, one per line:
   - `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`
   - `workday:intel`
   - `workday:salesforce.wd12/External_Career_Site`
   - `adobe.com`
2. Optionally filter by title keywords, location text, country, employment type, workplace type or posting date.
3. Click **Start** and download the jobs as Excel, CSV or JSON, or use the API.

#### Example input

```json
{
  "companies": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite", "workday:intel", "adobe.com"],
  "keywords": ["engineer", "data"],
  "countries": ["US", "DE"],
  "postedWithinDays": 14,
  "descriptionFormat": "text"
}
```

#### Monitor companies for new jobs (daily schedule)

```json
{
  "companies": ["workday:nvidia", "workday:salesforce", "workday:accenture"],
  "incrementalMode": true,
  "stateKey": "big-tech-workday",
  "reportClosedJobs": true
}
```

#### Example output (one job)

```json
{
  "type": "job",
  "title": "Product Legal Counsel",
  "company": "Adobe",
  "location": "San Jose / San Francisco / Austin / Seattle / Lehi / New York",
  "locations": ["San Jose", "San Francisco", "Austin", "Seattle", "Lehi", "New York"],
  "country": "US",
  "countries": ["US"],
  "employmentType": "full_time",
  "employmentTypeRaw": "Full time",
  "salaryMin": 159300,
  "salaryMax": 254500,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": "$159,300 - $254,500",
  "salarySource": "description",
  "postedAt": "2026-10-19T00:00:00.000Z",
  "validThrough": null,
  "url": "https://adobe.wd5.myworkdayjobs.com/external_experienced/job/San-Jose/Legal-Counsel_R172273",
  "applyUrl": "https://adobe.wd5.myworkdayjobs.com/external_experienced/job/San-Jose/Legal-Counsel_R172273/apply",
  "jobId": "Legal-Counsel_R172273",
  "requisitionId": "R172273",
  "ats": "workday",
  "board": "adobe.wd5/external_experienced",
  "descriptionText": "The Opportunity\nWe are seeking a hardworking, inquisitive, and collaborative attorney…",
  "input": "adobe.com",
  "scrapedAt": "2026-10-20T02:27:53.007Z"
}
```

Each company also gets one free **board** row with these fields: `status`, `company`, `board`, `boardUrl`, `detectedBy`, `jobsOnBoard`, `jobsMatchingFilters` and `jobsReturned`. `detectedBy` is one of `board_url`, `explicit`, `website` or `name_match`. In monitoring mode the row also has `closedJobs`. `jobsMatchingFilters` is a lower bound when the run stopped early because of a job limit.

### Pricing

Pay per event:

- **Job**: $0.001 ($1 per 1,000 jobs) on the Free and Bronze plans, $0.0009 on Silver, $0.0008 on Gold and higher.
- **Free**: board rows, closed-job rows, problem rows, and jobs removed by your filters.
- A tiny actor start fee set by Apify ($0.00005).

### Tips

- **Speed:** Workday needs one request per job for the description, exact date and all locations. That is about 400 jobs per minute (NVIDIA's 2,753 jobs with descriptions took about 7 minutes).
  - Set `descriptionFormat: "none"` with no location, country or date filters to list 20 jobs per request (title, URL, requisition ID and an approximate date only).
  - Title keyword filters run before any detail request.
- **Several career sites:** some tenants have several (e.g. Salesforce: External_Career_Site, Futureforce_NewGradRoles). `workday:<tenant>` picks the main external one. Paste a specific site's URL to get that one.
- **No department field:** Workday's public API has no department or team per job, so the department filter does not apply to Workday jobs.
- **Rate limits:** a few tenants (e.g. Accenture) throttle requests hard. The actor backs off, returns what it could list, and marks the board `truncated` with a message. It never fails the run.
- **Duplicates:** Workday jobs are deduplicated by posting ID only. Same title and location usually means several real openings.
- **Memory:** 256 MB is enough; use 512 MB for tenants with many thousands of jobs.

### Is it legal?

This actor reads **public job postings** from the public Workday career-site API that companies use to show their jobs. It collects no personal data. Respect the companies' terms when republishing job ads.

# Actor input Schema

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

One per line. Any of: a Workday career site URL ("https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"), "workday:intel" (the career site is found automatically), a company website or careers page that links to Workday ("adobe.com"), or a company name. Companies on Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio work too.

## `startUrls` (type: `array`):

Same as Companies, in request-list format, if you already have URL lists from other actors.

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

Only jobs whose title contains at least one of these words (case-insensitive), e.g. "engineer", "data", "sales". Empty = all jobs.

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

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

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

Only jobs whose location contains one of these texts, e.g. "London", "Berlin", "remote".

## `countries` (type: `array`):

Only jobs in these countries: ISO codes or names ("US", "DE", "United Kingdom").

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

Only these workplace types. Jobs whose workplace type is not published (and not stated in the title or location) are excluded when this filter is set.

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

Only these (normalised) employment types. Jobs without a published employment type are excluded when this filter is set.

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

Only jobs whose department or team contains one of these texts, e.g. "Engineering".

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

Only jobs posted in the last N days (0 = any date).

## `incrementalMode` (type: `boolean`):

Remembers the jobs of each board between runs (under the state name below) and returns only jobs that are new. The first run returns all jobs. You pay only for new jobs.

## `stateKey` (type: `string`):

Use a different name for each separate watch list (e.g. "fintech-companies"). Stored in your key-value store "workday-jobs-state".

## `reportClosedJobs` (type: `boolean`):

In monitoring mode, also add a free row for each job that disappeared from a board since the last run.

## `descriptionFormat` (type: `string`):

Plain text (default), HTML, both, or none (faster, smaller output; SmartRecruiters and Workday then need no extra requests).

## `dedupeSimilarJobs` (type: `boolean`):

Some companies post the same job several times (same title and location). Keep only one.

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

Newest first (0 = no limit).

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

Stop after this many jobs (0 = no limit).

## Actor input object example

```json
{
  "companies": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "workday:intel",
    "adobe.com"
  ],
  "postedWithinDays": 0,
  "incrementalMode": false,
  "stateKey": "default",
  "reportClosedJobs": true,
  "descriptionFormat": "text",
  "dedupeSimilarJobs": true,
  "maxJobsPerCompany": 0,
  "maxJobs": 0
}
```

# Actor output Schema

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

No description

## `boards` (type: `string`):

No description

## `summary` (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": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "workday:intel",
        "adobe.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("atesen-software/workday-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 = { "companies": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "workday:intel",
        "adobe.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("atesen-software/workday-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 '{
  "companies": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "workday:intel",
    "adobe.com"
  ]
}' |
apify call atesen-software/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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