# Workday Jobs Scraper: Search Any myworkdayjobs Site (`santiagomv/workday-jobs`) Actor

Scrape jobs from any Workday careers site (myworkdayjobs.com). Keyword search and Workday's own filters (country, category, job type) by name, so you get past the 2,000-job limit. Full descriptions, all locations, exact dates, parsed salary ranges. Only-new-jobs mode for alerts.

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

## Pricing

$1.00 / 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: search any myworkdayjobs.com careers site

Scrape open jobs from any **Workday** careers site (`*.myworkdayjobs.com`): NVIDIA, Adobe, Salesforce, Walmart, banks, hospitals, universities and thousands of other employers that hire through Workday.

Paste a careers-site URL, optionally add **search keywords** and **Workday's own filters** (country, location type, job category, job type), and get one clean row per job with the full description, every location, the country, the exact posting date and a **parsed salary range**.

It reads the same public JSON API the careers site itself uses, so there is no browser, no proxy and no login. Runs are fast and cheap.

### Why this one

- **Server-side search and filters, by name.** Type `Canada`, `Remote` or `Engineering` the way the site shows them. The actor looks up Workday's internal filter IDs for you, and Workday does the filtering.
- **Gets past the 2,000-job limit.** Workday lists at most 2,000 results per search. Split a large site into several search queries or filters, and the results are merged and de-duplicated.
- **Salary parsed into numbers.** Pay ranges in the description (`$120,700 - $238,600 annually`, `168,000 USD - 270,250 USD`) become `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod`, with the original sentence in `salaryText`.
- **Exact dates.** Workday's list says "Posted 30+ Days Ago". Each job's own page has the real date, and that's what you get in `postedAt`.
- **Only new jobs** for alerts: scheduled runs return just the postings you haven't received yet, and you don't pay again for old ones.

### What you can use it for

- **Job alerts** for specific companies, roles or countries (schedule it daily with **Only new jobs**).
- **Job boards and aggregators** that need fresh listings from large employers.
- **Salary and hiring research**: who is hiring for what, where, and at what pay.
- **Sales and recruiting intelligence**: track hiring at target accounts.
- **AI agents and RAG**: descriptions come as clean plain text.

### Input

| Field | Example | Notes |
|---|---|---|
| Workday careers sites | `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` | Any page of the site works, including a job link or a URL with `/en-US/`. Add as many sites as you like. |
| Search queries | `machine learning`, `data engineer` | Workday's own keyword search (title, description, skills). Leave empty to get every job. |
| Workday filters | `United States`, `Remote`, `Engineering` | Values exactly as the site's filter menu shows them. Same filter = OR, different filters = AND. |
| Title must contain any of / must not contain | `engineer` / `intern` | Checked on the job title after the search. |
| Posted within (days) | `7` | Uses the exact posting date. |
| Only new jobs | on | Remembers returned jobs per site, queries and filters in a named key-value store. |
| Job description | Plain text / + HTML / none | |
| Max jobs | `500` | Your run's maximum cost limit is always respected too. |

**Finding a company's Workday URL:** open the company's careers page and click any job. If the address contains `myworkdayjobs.com`, copy it. You can also search Google for `site:myworkdayjobs.com <company name>`.

**Finding filter names:** each run saves every filter value each site offers, with job counts, to `AVAILABLE_FILTERS` in the run's key-value store (also linked in the run's Output tab). Filter names differ between sites (for example `United States` on one and `United States of America` on another). A value a site doesn't have is skipped with a warning. If none of your filters exist on a site, that site returns no jobs.

### Output

One row per job (real example, description shortened):

```json
{
  "id": "Principal-Scientist---Data-Pipeline-Engineer_R170588",
  "jobReqId": "R170588",
  "title": "Principal Scientist - Data Pipeline Engineer",
  "company": "adobe",
  "site": "adobe.wd5/external_experienced",
  "location": "San Jose; Seattle; San Francisco",
  "locations": ["San Jose", "Seattle", "San Francisco"],
  "country": "United States of America",
  "countryCode": "US",
  "remoteType": null,
  "isRemote": null,
  "timeType": "Full time",
  "postedAt": "2026-10-09T00:00:00.000Z",
  "postedOnText": "Posted 12 Days Ago",
  "validThrough": null,
  "url": "https://adobe.wd5.myworkdayjobs.com/external_experienced/job/San-Jose/Principal-Scientist---Data-Pipeline-Engineer_R170588",
  "applyUrl": "https://adobe.wd5.myworkdayjobs.com/external_experienced/job/San-Jose/Principal-Scientist---Data-Pipeline-Engineer_R170588/apply",
  "hiringOrganization": "ADUS-Adobe Inc.",
  "salaryMin": 206300,
  "salaryMax": 388000,
  "salaryCurrency": "USD",
  "salaryPeriod": "YEAR",
  "salaryText": "... The U.S. pay range for this position is $206,300 - $388,000 annually. ...",
  "description": "ABOUT THE ROLE\n\nWe're looking for a Principal ML Engineer to drive down cost per asset ...",
  "scrapedAt": "2026-10-22T06:05:45.376Z"
}
```

Fields a site doesn't publish are `null`. When a description lists several ranges in one currency (by level or by state), `salaryMin` and `salaryMax` span all of them. Salary parsing reads free text, so check `salaryText` when precision matters.

Sites that can't be read don't stop the run. They're listed in the `FAILURES` record of the key-value store.

### Code examples

Python, Node.js, cURL and n8n examples for this and our other job actors: https://github.com/SantiagoMV42/linkedin-jobs-scraper

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("santiagomv/workday-jobs").call(run_input={
    "sites": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
    "searchQueries": ["machine learning"],
    "filters": ["Remote"],
    "postedWithinDays": 7,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["location"], job["salaryMin"], job["url"])
```

### Pricing

**$1 per 1,000 jobs saved.** Sites with no matching jobs, failed sites, retries and (with **Only new jobs**) jobs you already have are free.

### FAQ

**Is there a limit per site?** Workday returns at most 2,000 jobs per search. If a search has more, the run log says so. Add search queries or filters (for example, one per country) to get the rest.

**How fast is it?** A few seconds per 100 jobs. Each job needs one request for its details. Sites are scraped in parallel (3 by default).

**Do I need a Workday account or proxies?** No. It reads publicly listed jobs only.

**Does it work for other ATSs?** This actor is Workday-only. For Greenhouse, Lever, Ashby, Workable, SmartRecruiters and more in one schema, use [Career Site Jobs](https://apify.com/santiagomv/ats-jobs).

**Is this allowed?** The actor reads only publicly listed job postings through the endpoints the careers site itself calls, at a modest request rate. You're responsible for how you use the data, including any personal data and the terms of the sites you collect from.

This actor is not affiliated with, endorsed by or sponsored by Workday, Inc. or any employer whose jobs it collects. Workday is a trademark of Workday, Inc.

# Actor input Schema

## `sites` (type: `array`):

Careers-site URLs on myworkdayjobs.com, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. Any page of the site works, including a job link or a URL with /en-US/.

## `searchQueries` (type: `array`):

Keywords searched by Workday itself (title, description, skills), one search per line. Results are merged and de-duplicated. Leave empty to get every job (Workday lists at most 2,000 per search).

## `filters` (type: `array`):

Filter values exactly as the site shows them in its filter menu, e.g. 'Canada', 'Remote', 'Engineering', 'Full time'. Values in the same filter are OR, different filters are AND. Run once to see every value a site offers in AVAILABLE_FILTERS in the key-value store.

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

Case-insensitive, checked after the search. Leave empty to keep all titles.

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

Case-insensitive, e.g. 'intern', 'director'.

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

0 = any date. Uses the exact posting date from each job page.

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

For scheduled runs: save only jobs this actor hasn't returned before for the same site, queries and filters (remembered in a named key-value store). Jobs you already received are skipped and cost nothing.

## `stateStoreName` (type: `string`):

Named key-value store that remembers returned jobs. Use a different name per schedule to keep histories separate.

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

Salary, dates and locations are filled in either way.

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

Stop after saving this many jobs in total. 0 = no limit.

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

How many careers sites to scrape at the same time.

## Actor input object example

```json
{
  "sites": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "searchQueries": [
    "machine learning"
  ],
  "filters": [],
  "titleKeywords": [],
  "excludeTitleKeywords": [],
  "postedWithinDays": 0,
  "onlyNewJobs": false,
  "stateStoreName": "workday-jobs-seen",
  "descriptionFormat": "text",
  "maxJobs": 0,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

All jobs saved in this run, as a table.

## `filters` (type: `string`):

Every filter value each site offers, with job counts.

# 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 = {
    "sites": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "searchQueries": [
        "machine learning"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("santiagomv/workday-jobs").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 = {
    "sites": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
    "searchQueries": ["machine learning"],
}

# Run the Actor and wait for it to finish
run = client.actor("santiagomv/workday-jobs").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 '{
  "sites": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "searchQueries": [
    "machine learning"
  ]
}' |
apify call santiagomv/workday-jobs --silent --output-dataset

```

## MCP server setup

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

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/XHdal3dYhexWiD4NW/builds/WV1Ts0I4XFYtQYYKV/openapi.json
