# Workday Jobs Scraper — Any Company's Workday Career Site (`viridian_layout_ea2/workday-jobs-scraper`) Actor

Scrape every open role from any Workday career site (myworkdayjobs.com): NVIDIA, Salesforce, TJX and thousands more. Gets past Workday's hidden 2,000-job limit. Reads the site's public JSON API, no browser or proxies.

- **URL**: https://apify.com/viridian\_layout\_ea2/workday-jobs-scraper.md
- **Developed by:** [Dave Hughes](https://apify.com/viridian_layout_ea2) (community)
- **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.

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

Get every open role from any company's **Workday career site** (`*.myworkdayjobs.com`,
`*.myworkdaysite.com`) as clean, structured data. Workday runs hiring for most of the
Fortune 500, including NVIDIA, Salesforce, TJX, Walmart and thousands more.

Paste a career site URL, or use the built-in list of **4,100+ verified Workday career
sites across 1,785 companies**, found through Common Crawl and each checked against the
live site.

> **Need startups too?** Most startups and scale-ups hire through Greenhouse, Ashby or
> Lever rather than Workday. Our [Greenhouse / Ashby / Lever Job Scraper](https://apify.com/viridian_layout_ea2/company-career-site-jobs)
> covers 3,500+ of them, with the **same output fields**, so the two datasets combine
> directly.
>
> **Want everything in one search?** Our [Career Site Jobs API](https://apify.com/viridian_layout_ea2/career-site-jobs-api)
> searches 900,000+ roles across Workday, Greenhouse, Ashby and Lever at once. The jobs
> are collected daily, so results come back in 10–20 seconds.

### Why this one

**It gets past Workday's hidden 2,000-job limit.** Many Workday sites never report more
than 2,000 results, and asking for results past 2,000 silently returns page one again. A
scraper that trusts the count misses jobs and gets duplicates, with no error. NVIDIA
reports 2,000 open roles and actually has 2,650.

When a site is capped like this, the Actor splits the search by job category (and by
location when a category is still too big) until every slice is under the limit. Then it
merges the slices and removes duplicates. Sites that report their real count are read
straight through. In testing on 26 Sep 2026 it returned **2,650 of NVIDIA's 2,650** roles
(14 seconds) and **all 11,357 of TJX's** (34 seconds), each exactly once.

- **Reads JSON, not HTML.** It calls the same public API the career site's own page
  uses. There's no browser, no proxy and no markup to break.
- **Job categories included.** Workday's own job family ("Engineering", "Sales") is
  returned as `department` whenever the site's categories cover every job. The Actor
  never drops a job to get a label.
- **Multi-location roles are handled properly.** The list view only says "5 Locations",
  so the Actor fetches all of them, and location filters match against every one.
- **Exact posting dates.** The list view only says "Posted 30+ Days Ago"; the Actor
  returns the real date.
- **Pay only for what you get.** Filters run before charging, so filtered-out roles are
  never billed.

### Pricing

**$1.50 per 1,000 jobs** ($0.0015 per job), plus Apify's standard $0.00005 run-start fee.
Platform usage is included, so you are not billed for compute separately.

You pay only for jobs actually delivered to your dataset:

- **`maxJobs`** is a hard cap per run. The default of 1,000 costs at most $1.50.
- **Apify's maximum cost per run** also works: if the limit is reached mid-run, the
  Actor stops cleanly and keeps everything delivered so far.
- Filters run before charging, so filtered-out roles are never billed.

### Input

| Field | What it does |
|---|---|
| `careerSiteUrls` | Any page on a Workday career site: the jobs page, or a single job. |
| `useCuratedList` | Also fetch from our registry of verified Workday career sites. |
| `companyKeywords` | Narrow the registry, e.g. `["bank", "health"]`. |
| `searchText` | Workday's own search box, run on each site. Fastest way to narrow a big employer. |
| `titleKeywords` / `locationKeywords` | Case-insensitive "contains" filters. |
| `remoteOnly` | Only roles whose location or workplace label says remote. |
| `postedWithinDays` | Only recent roles. |
| `includeDescription` | Adds the description, exact date, employment type, country and every location. Turn off for a faster run. |
| `maxJobs` / `maxJobsPerCompany` | Caps on results, and your main cost control. |

### Output

| Field | Description |
|---|---|
| `id` | Stable id: `workday:{company}:{requisitionId}` |
| `title` | Role title |
| `companyName` | The company's name, e.g. "Morgan Stanley" |
| `company` / `companySlug` | The company's Workday id, e.g. `ms` (stable, good for filtering and joins) |
| `careerSite` | Which of the company's career sites it came from |
| `location` / `additionalLocations` | Primary location and every other listed location |
| `country` | Country of the primary location |
| `remote` | A location or the workplace label says remote |
| `workplaceType` | The company's own label, verbatim: "Remote", "Hybrid", "Office - Flexible"… |
| `department` | Workday job family / category (null when the site's categories don't cover every job) |
| `postedAt` | ISO date |
| `postedOnText` | Workday's own label, e.g. "Posted 3 Days Ago" |
| `employmentType` | "Full time", "Part time"… |
| `jobReqId` | The company's requisition number |
| `url` | Apply link on the company's own career site |
| `description` | Plain-text description (optional) |

The field names match our [Greenhouse / Ashby / Lever jobs Actor](https://apify.com/viridian_layout_ea2/company-career-site-jobs),
so the two datasets can be combined.

### Examples

**Every engineering role at NVIDIA posted in the last week**

```json
{
  "careerSiteUrls": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
  "titleKeywords": ["engineer"],
  "postedWithinDays": 7
}
```

**Remote data roles across the built-in list, titles and links only**

```json
{ "useCuratedList": true, "searchText": "data", "remoteOnly": true, "includeDescription": false, "maxJobs": 2000 }
```

**Nursing jobs in Texas at hospital systems in the list**

```json
{ "useCuratedList": true, "companyKeywords": ["health", "hospital"], "titleKeywords": ["nurse", "rn"], "locationKeywords": ["TX", "Texas"] }
```

### Notes

- Career sites that are unreachable or have no matching roles are skipped. One bad site
  never sinks a run, and the run's `SUMMARY` record lists what happened to each site.
- Some companies run several Workday career sites (Salesforce runs nine, including Slack
  and Tableau). A role listed on more than one of them is returned once.
- `companyName` is filled in for all 1,785 companies in the built-in list. For a career site outside the list it falls back to the Workday id.

# Actor input Schema

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

Paste any page from a company's Workday career site — the main jobs page or a single job. Both myworkdayjobs.com and myworkdaysite.com addresses work.

## `useCuratedList` (type: `boolean`):

Also fetch from our registry of verified Workday career sites, discovered from Common Crawl and checked against the live API. Combine with the filters below and a sensible Maximum jobs.

## `companyKeywords` (type: `array`):

Only use built-in list companies whose name contains one of these, e.g. "Morgan Stanley", "bank", "health". Ignored unless the built-in list is on.

## `searchText` (type: `string`):

Runs Workday's own search on each site, exactly like typing into the site's search box. The fastest way to narrow a big employer.

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

Only roles whose title contains one of these (case-insensitive), e.g. "engineer", "nurse".

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

Only roles where any listed location contains one of these (case-insensitive), e.g. "Texas", "London". Multi-location roles are checked against every location.

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

Only roles whose location or the company's workplace label says remote.

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

Only roles posted in the last N days.

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

Adds the description, exact posting date, employment type, country and every location. Turn off for a faster run with titles, locations and links only.

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

Hard cap on results for the whole run. This is your main cost control — you are charged per job returned.

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

Optional cap per career site, so one huge employer does not use up the whole run.

## Actor input object example

```json
{
  "careerSiteUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
  ],
  "useCuratedList": false,
  "companyKeywords": [],
  "titleKeywords": [],
  "locationKeywords": [],
  "remoteOnly": false,
  "includeDescription": true,
  "maxJobs": 1000
}
```

# Actor output Schema

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

Every job delivered, one record each: title, company, locations, category, posting date, apply URL, and (optionally) the description.

## `summary` (type: `string`):

Jobs returned, what happened on each career site, why the run stopped, and any coverage warnings.

# 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://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("viridian_layout_ea2/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 = { "careerSiteUrls": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
    ] }

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

```

## MCP server setup

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