# Workday Jobs Scraper API + New Job Alerts (`piracema_labs/workday-jobs-monitor`) Actor

Scrape every open job from any company's Workday careers site: title, locations, remote, salary, job type, description and exact post date. Gets past Workday's 2,000-job search limit. Monitor mode returns only new jobs, and you pay only for those.

- **URL**: https://apify.com/piracema_labs/workday-jobs-monitor.md
- **Developed by:** [Piracema Labs](https://apify.com/piracema_labs) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $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 API + New Job Alerts

Get every open job from any company's **Workday** careers site: title, locations, remote status, **salary range** (when published), job type, requisition ID, **exact publish date**, apply link and full description.

Workday powers the careers pages of thousands of large employers, including NVIDIA, Salesforce, Adobe, Intel, Mastercard, Walmart and most of the Fortune 500.

Turn on **monitor mode** and schedule it daily. You get a feed of **only the jobs posted since the last run**, and you pay only for those.

### Why this Workday scraper

- **Gets past Workday's 2,000-job limit.** A Workday search stops at 2,000 results, so big employers like NVIDIA are silently cut off by simpler scrapers. This Actor splits large searches (for example by job category or location) and removes duplicates, so you get every job.
- **Exact publish dates.** Workday lists only "Posted 30+ Days Ago". The Actor opens each job and returns the real date.
- **Salary ranges as numbers.** US postings often include pay ranges such as "136,000 USD - 218,500 USD"; you get `salaryMin`, `salaryMax` and `salaryCurrency`.
- **Fast and cheap filtering.** Title, date and location filters are applied before job pages are opened, so focused runs finish quickly.
- **Same output format as our [Greenhouse, Lever & Ashby Jobs Scraper](https://apify.com/piracema_labs/ats-jobs-monitor)**, so you can combine startups and enterprises in one table.

### What can I use it for?

- **Job seekers and job boards:** collect fresh openings from target employers, filtered by role, location or remote.
- **Sales teams (hiring signals):** an enterprise hiring "Data Platform" or "Security" roles is likely buying related tools. Get alerted the day the job appears.
- **Recruiters and talent intelligence:** track which teams competitors are growing, and where.
- **Salary research:** collect published pay ranges by role and location.

### How to use it

1. Open the company's careers site and copy its address. It looks like `https://<company>.wd5.myworkdayjobs.com/<SiteName>`. Any page on the site works, including a single job link.
2. Paste one or more URLs into **Workday careers URLs**.
3. Optional filters: **title keywords**, **exclude keywords**, **locations**, **remote only**, **posted within N days**.
4. Click **Start**. Download results as JSON, CSV, Excel or HTML, or pull them through the API.

Supported URL formats:

- `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`
- `https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/...`
- `https://wd3.myworkdaysite.com/recruiting/<company>/<SiteName>`

Some companies have several careers sites (for example one for interns). Add each one you want.

#### Monitor mode: only new jobs

Turn on **Only new jobs** and give it a **Monitor name**, such as `fortune500-data-roles`, then add a [schedule](https://docs.apify.com/platform/schedules) (for example daily at 8:00).

- The first run returns all matching open jobs. This is your baseline.
- Each later run returns only jobs that weren't returned before, and only those are charged.
- Use different monitor names for different watch lists.

Send new jobs to **Slack**, **Google Sheets**, **email**, **Zapier** or **Make** with Apify [integrations](https://docs.apify.com/platform/integrations).

### Input example

```json
{
    "companies": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "https://adobe.wd5.myworkdayjobs.com/external_experienced"
    ],
    "keywords": ["engineer", "data"],
    "excludeKeywords": ["intern"],
    "locations": ["US", "Remote"],
    "postedWithinDays": 7,
    "onlyNewJobs": true,
    "monitorId": "enterprise-eng"
}
```

### Output example

```json
{
    "ats": "workday",
    "companySlug": "adobe",
    "companyName": "adobe",
    "jobId": "R171849",
    "title": "Threat Intelligence / Reverse Engineering Investigator",
    "department": null,
    "team": null,
    "employmentType": "Full time",
    "location": "San Jose",
    "allLocations": ["San Jose", "New York", "Austin"],
    "isRemote": false,
    "workplaceType": null,
    "salaryMin": 81500,
    "salaryMax": 189800,
    "salaryCurrency": "USD",
    "salaryInterval": "year",
    "salaryText": "$81,500 - $189,800",
    "url": "https://adobe.wd5.myworkdayjobs.com/external_experienced/job/San-Jose/Threat-Intelligence---Reverse-Engineering-Investigator_R171849",
    "applyUrl": "https://adobe.wd5.myworkdayjobs.com/external_experienced/job/San-Jose/Threat-Intelligence---Reverse-Engineering-Investigator_R171849/apply",
    "publishedAt": "2026-10-20T00:00:00.000Z",
    "updatedAt": null,
    "description": "The Threat Intelligence / Reverse Engineering Investigator identifies…",
    "scrapedAt": "2026-10-22T16:09:14.514Z"
}
```

| Field                             | Notes                                                                                                      |
| --------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| `companySlug`, `companyName`      | The company name from the Workday address, such as `nvidia`                                                |
| `jobId`                           | Workday requisition ID, such as `JR2012046`                                                                |
| `employmentType`                  | Workday's time type, such as `Full time`                                                                   |
| `allLocations`                    | Primary plus additional locations                                                                          |
| `isRemote`, `workplaceType`       | From Workday's remote type when the company sets it, otherwise from the location text                      |
| `salary*`                         | Extracted from the description when a range is written there; `null` otherwise                             |
| `publishedAt`                     | Exact publish date (ISO 8601)                                                                              |
| `department`, `team`, `updatedAt` | Workday job pages don't provide these, so they're always `null`. They exist to match our other jobs Actor. |

### Use it as an API

```bash
curl -X POST "https://api.apify.com/v2/acts/piracema_labs~workday-jobs-monitor/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"], "keywords": ["engineer"], "postedWithinDays": 7}'
```

Official Apify clients for [JavaScript](https://docs.apify.com/api/client/js) and [Python](https://docs.apify.com/api/client/python) work as well.

### How much does it cost?

You pay for the jobs saved to your results: **$1.00 per 1,000 jobs** ($0.001 per job), plus a tiny **$0.0005 start fee per run**. There are no proxy costs and no platform usage costs.

| Example                                                        | Jobs         | Cost         |
| -------------------------------------------------------------- | ------------ | ------------ |
| Engineering roles posted this week at 10 enterprises (one run) | ~300         | ~$0.30       |
| Daily monitor of 50 enterprises, ~40 new jobs/day              | ~1,200/month | ~$1.22/month |
| Full export of NVIDIA (one run)                                | ~2,700       | ~$2.70       |

You can set a maximum cost per run in the run options, and the Actor stops cleanly when it's reached.

### How long does a run take?

Workday answers slowly (about 2 seconds per request), so the Actor works in parallel while staying polite to each site. Filtered runs on a few companies take about a minute. A full export of a very large employer can take several minutes, because every job page is opened to get the exact date and description.

### Is it legal? Where does the data come from?

The Actor reads the same public job data that each company's Workday careers page shows to every visitor. No logins, no private data, no personal profiles. It checks each careers site's robots.txt and skips sites that disallow access.

### FAQ

**A company returns "no Workday careers site found".**
Check the URL: open the careers site in your browser and copy the address from the job search page. The part after `myworkdayjobs.com/` (ignoring `en-US/`) is the site name.

**Why are some salaries empty?**
Many companies publish pay ranges only for US roles, or not at all. Salary fields are filled only when the posting includes a range.

**Why are department and team empty?**
Workday doesn't include them on job pages. They're kept so this Actor's output matches our Greenhouse, Lever & Ashby Actor.

**Can I get jobs from Greenhouse, Lever or Ashby too?**
Yes, with our [Greenhouse, Lever & Ashby Jobs Scraper](https://apify.com/piracema_labs/ats-jobs-monitor). Both Actors return the same fields.

**Something broke or looks wrong?**
Open an issue on the Issues tab with a link to your run.

# Actor input Schema

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

Paste each company's Workday careers page, for example <code>https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite</code>. Any page on the site works, including a job link; language prefixes such as <code>/en-US/</code> are fine. <code>…myworkdaysite.com/recruiting/\<company>/\<site></code> URLs are supported too.

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

Keep only jobs whose title contains at least one of these words (case-insensitive). Leave empty to keep all jobs. Filtering happens before job pages are opened, so it also makes runs faster.

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

Drop jobs whose title contains any of these words, for example <code>intern</code> or <code>senior</code>.

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

Keep only jobs whose location contains one of these texts, such as <code>London</code>, <code>Germany</code>, <code>US, CA</code> or <code>Remote</code>. Leave empty for all locations.

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

Keep only jobs marked as remote.

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

Keep only jobs published in the last N days. 0 means any date.

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

Add the full job description as plain text. Turn off for smaller exports.

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

Remember which jobs earlier runs returned and output only jobs that are new since then. The first run returns every matching job as a baseline. Schedule the Actor daily to get a feed of fresh openings, and pay only for new jobs.

## `monitorId` (type: `string`):

Keeps separate memory for different watch lists. Use a different name for each schedule, such as <code>fortune500-data-roles</code>.

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

Stop after saving this many jobs. 0 means no limit.

## Actor input object example

```json
{
  "companies": [
    "https://workday.wd5.myworkdayjobs.com/Workday",
    "https://adobe.wd5.myworkdayjobs.com/external_experienced",
    "https://zendesk.wd1.myworkdayjobs.com/Zendesk"
  ],
  "keywords": [
    "engineer"
  ],
  "excludeKeywords": [],
  "locations": [],
  "remoteOnly": false,
  "postedWithinDays": 14,
  "includeDescription": true,
  "onlyNewJobs": false,
  "monitorId": "default",
  "maxJobs": 0
}
```

# 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": [
        "https://workday.wd5.myworkdayjobs.com/Workday",
        "https://adobe.wd5.myworkdayjobs.com/external_experienced",
        "https://zendesk.wd1.myworkdayjobs.com/Zendesk"
    ],
    "keywords": [
        "engineer"
    ],
    "postedWithinDays": 14
};

// Run the Actor and wait for it to finish
const run = await client.actor("piracema_labs/workday-jobs-monitor").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://workday.wd5.myworkdayjobs.com/Workday",
        "https://adobe.wd5.myworkdayjobs.com/external_experienced",
        "https://zendesk.wd1.myworkdayjobs.com/Zendesk",
    ],
    "keywords": ["engineer"],
    "postedWithinDays": 14,
}

# Run the Actor and wait for it to finish
run = client.actor("piracema_labs/workday-jobs-monitor").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://workday.wd5.myworkdayjobs.com/Workday",
    "https://adobe.wd5.myworkdayjobs.com/external_experienced",
    "https://zendesk.wd1.myworkdayjobs.com/Zendesk"
  ],
  "keywords": [
    "engineer"
  ],
  "postedWithinDays": 14
}' |
apify call piracema_labs/workday-jobs-monitor --silent --output-dataset

```

## MCP server setup

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

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/kFbnofeAriIswIgdQ/builds/JquKAZdKUXAdz43j9/openapi.json
