# Workday Jobs Scraper & New Job Alerts (`mikirag3/workday-jobs-monitor`) Actor

Scrape every open job from any Workday career site (myworkdayjobs.com), including boards over 2,000 jobs. Schedule it to get only new or closed postings. Full descriptions, filters, no proxy, no login.

- **URL**: https://apify.com/mikirag3/workday-jobs-monitor.md
- **Developed by:** [Mikirag3](https://apify.com/mikirag3) (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 job 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

### What does Workday Jobs Scraper do?

**Workday Jobs Scraper** extracts every open job from any company career site hosted on **Workday** (`myworkdayjobs.com`): title, locations, publication date, employment type, job ID, links and the full description. Paste one or more Workday career-site URLs, click **Start**, and download the jobs as JSON, CSV, Excel or HTML.

Turn on **monitoring mode** and schedule it daily or hourly: each run returns **only the jobs posted since the last run**, and optionally the jobs that were **closed**. That makes it a ready-made **Workday new job alert** for Slack, email, Google Sheets or a webhook.

- ✅ **Any Workday career site**: `wd1`, `wd3`, `wd5`, `wd12`… and any site name.
- ✅ **Large boards over 2,000 jobs**: Workday search stops at 2,000 listings. The Actor splits the search with the site's own filters and verifies that it got the whole board.
- ✅ **New and closed jobs** in monitoring mode, so unchanged jobs are never charged twice.
- ✅ **Full details**: description as clean text, publication date, all locations, employment type.
- ✅ **No proxy, no browser, no login**: fast HTTP requests to the public endpoints used by the career site itself.
- ✅ **Never silently partial**: if a board cannot be read completely, the run reports an error for that site instead of returning a partial list as complete.

### Who uses it?

- **Job seekers and job alert services**: get a message the morning a target company opens a role.
- **Recruiters and staffing agencies**: watch client and competitor hiring across dozens of Workday sites.
- **Sales and RevOps teams**: hiring is a buying signal. Ten new data engineering roles at a Fortune 500 company is a lead.
- **Investors and analysts**: track hiring velocity and headcount plans at public companies, most of which use Workday.
- **Job boards and aggregators**: structured listings straight from the source, deduplicated by job ID.

### How to scrape Workday jobs

1. Click **Try for free**.
2. In **Workday career sites**, paste the career-site URLs, one per line, for example:
   - `https://intel.wd1.myworkdayjobs.com/External`
   - `https://adobe.wd5.myworkdayjobs.com/en-US/external_experienced`
   - `https://salesforce.wd12.myworkdayjobs.com/External_Career_Site`
3. Optionally add filters: job title keywords, words to exclude, locations, remote only, posted within the last N days.
4. Click **Start**.

**Finding the URL:** open the company's careers page, click any job, and copy the address up to the site name. In `https://intel.wd1.myworkdayjobs.com/en-US/External/job/...` the career site is `https://intel.wd1.myworkdayjobs.com/External`. Some companies have several Workday sites (for example experienced hires and university); add each one you want.

### Workday new job alerts (monitoring mode)

1. Turn on **Only new jobs since the last run**.
2. Give the watch list a **Monitor name**, for example `fortune500-data-roles`.
3. Save the input as a **task** and add a **schedule**, for example every day at 7:00.
4. Connect the task to **Slack**, **email**, **Google Sheets**, **Make**, **Zapier**, **n8n** or a **webhook** through Apify integrations.

The first run returns all current jobs (or none, if you turn off **Return existing jobs on the first run**) and remembers them. Every later run returns only new postings. Turn on **Also report closed jobs** to get a `removed` record when a posting disappears. Jobs that were not delivered (for example because the run hit your cost limit) are not marked as seen, so they come in the next run.

### Input example

```json
{
  "companies": [
    "https://intel.wd1.myworkdayjobs.com/External",
    "https://adobe.wd5.myworkdayjobs.com/en-US/external_experienced"
  ],
  "keywords": ["data engineer", "machine learning"],
  "excludeKeywords": ["intern"],
  "locations": ["San Jose", "Remote"],
  "includeDescription": true,
  "onlyNewJobs": true,
  "monitorName": "data-roles",
  "reportRemovedJobs": true
}
```

### Output example

```json
{
  "type": "job",
  "ats": "workday",
  "companySlug": "adobe/external_experienced",
  "companyName": "Adobe",
  "jobId": "R171875-1",
  "title": "Staff Security Data Engineer",
  "location": "San Jose",
  "allLocations": ["San Jose", "San Francisco"],
  "isRemote": false,
  "employmentType": "Full time",
  "postedAt": "2026-09-28T00:00:00+00:00",
  "url": "https://adobe.wd5.myworkdayjobs.com/external_experienced/job/San-Jose/Staff-Security-Data-Engineer_R171875-1",
  "applyUrl": "https://adobe.wd5.myworkdayjobs.com/external_experienced/job/San-Jose/Staff-Security-Data-Engineer_R171875-1",
  "description": "About the role\n\nAdobe's Security Data Platform team builds and operates a petabyte-scale security data lakehouse...",
  "isNew": true,
  "firstSeenAt": "2026-10-11T07:30:00+00:00",
  "scrapedAt": "2026-10-11T07:30:00+00:00"
}
```

Closed jobs (monitoring mode with **Also report closed jobs**):

```json
{ "type": "removed", "ats": "workday", "companyName": "Adobe", "jobId": "R160001", "title": "Senior Product Manager", "location": "Seattle", "url": "https://adobe.wd5.myworkdayjobs.com/external_experienced/job/...", "firstSeenAt": "2026-09-01T07:00:00+00:00", "removedDetectedAt": "2026-10-11T07:30:00+00:00" }
```

A run summary (career sites checked, not found, errors, jobs returned) is saved in the key-value store under `OUTPUT`.

### Data fields

| Field | Description |
|---|---|
| `type` | `job` for an open position, `removed` for a closed one (monitoring mode) |
| `companySlug`, `companyName` | Workday `tenant/site` and company display name |
| `jobId`, `title` | Workday requisition ID and job title |
| `location`, `allLocations` | Main location and every listed location |
| `isRemote` | Remote flag, based on Workday labels and location text |
| `employmentType` | Full time, part time, contract… when published |
| `postedAt` | Publication date (ISO 8601, UTC) |
| `url`, `applyUrl` | Job page and application page |
| `description` | Full job description as plain text |
| `isNew`, `firstSeenAt` | Monitoring mode: whether the job is new, and when the Actor first saw it |

`department`, `team` and `salary` are included when a site publishes them in a structured field; most Workday sites do not, so they are often `null`. Values are never guessed from description text.

### How much does it cost to scrape Workday?

Pay-per-event pricing, you only pay for results:

- **Career site checked**: $0.001 per site per run.
- **Job result**: $0.001 per job, i.e. **$1 per 1,000 jobs**.

Example: a first full snapshot of Intel, Adobe and Salesforce (about 2,500 jobs) costs about $2.50. After that, a daily monitoring run on the same three sites costs $0.003 plus $0.001 per new job. Unchanged jobs are free. You can cap any run with Apify's **maximum cost per run**; the Actor stops cleanly and keeps undelivered jobs for the next run.

### Speed

- **Listing only** (Include job descriptions off): from a few seconds for small boards to a couple of minutes for boards with thousands of jobs.
- **With descriptions**: one extra request per job. Title filters (**Job title must contain** / **Exclude titles containing**) skip detail requests for jobs they discard, and monitoring mode skips jobs already seen, so scheduled runs stay fast. A first run on a board with thousands of jobs and no title filter can take tens of minutes.

### FAQ

**Can I use just the company name?** No. Workday URLs contain a tenant, a data-center number (`wd1`, `wd5`…) and a site name that cannot be guessed reliably, so paste the career-site URL once and reuse it in a saved task.

**Does it work with custom career domains?** Only when the jobs are served from a `myworkdayjobs.com` address. Click a job on the company's site and check the address bar.

**Do I need a Workday account, API key or proxy?** No. The Actor reads the public listings that anyone can see on the career site. It does not log in or apply to jobs. Review the site's terms and your intended use of the data.

**A site failed or was not found.** Check that the URL includes the site name. Workday site configurations vary and its public endpoints can change; the error is reported in the run summary rather than treated as "all jobs closed".

**Need Greenhouse, Lever, Ashby, Personio, Recruitee, Teamtailor or BambooHR too?** Use our [Jobs Scraper for 8 ATS platforms](https://apify.com/mikirag3/ats-jobs-monitor), which returns all of them in the same format.

**Found a problem or need a feature?** Open an issue in the **Issues** tab.

# Actor input Schema

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

Complete public Workday career-site URLs on myworkdayjobs.com, one per line, e.g. https://intel.wd1.myworkdayjobs.com/External or https://adobe.wd5.myworkdayjobs.com/en-US/external_experienced. Open the company's careers page, click any job and copy the address up to the site name. Each URL is one career site; a company name alone is not enough.

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

Keep only jobs whose title contains at least one of these words. Case-insensitive. Leave empty for all jobs.

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

Drop jobs whose title contains any of these words, e.g. 'intern', 'senior'.

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

Keep only jobs located in one of these places, e.g. 'London', 'Germany', 'Remote'.

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

Keep only jobs in matching departments or teams, e.g. Engineering or Sales. Jobs with no published department or team will not match this filter.

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

Keep only jobs marked as remote by the company (or with 'remote' in the location).

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

Keep jobs published within the last N days. Requires Include job descriptions (Workday publishes exact dates only on job pages). Leave empty for no limit.

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

Monitoring mode. The Actor remembers which jobs it has already seen and returns only new postings. Perfect for a daily or hourly schedule.

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

Keeps separate memories for different watch lists. Use a different name for each schedule that tracks a different list of companies.

## `reportRemovedJobs` (type: `boolean`):

In monitoring mode, also return a 'removed' record for every job that disappeared from a career page since the last run.

## `emitExistingOnFirstRun` (type: `boolean`):

In monitoring mode, the first run for a company returns all of its current jobs. Turn off to only start a baseline and get truly new jobs from the next run onwards.

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

Fetch each job's detail page to add the full description, publication date, locations, employment type and other details. Monitoring mode skips details for jobs already seen, and title filters skip details for discarded jobs. Turn off for a fast listing-only run (title, link, location summary).

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

Return at most this many matching open jobs per company, newest first when dates are available. This limits output, not the number of requests needed to read a board. Closed-job records are additional. Leave empty for no limit.

## Actor input object example

```json
{
  "companies": [
    "https://adobe.wd5.myworkdayjobs.com/external_experienced"
  ],
  "keywords": [
    "engineer"
  ],
  "remoteOnly": false,
  "onlyNewJobs": false,
  "monitorName": "default",
  "reportRemovedJobs": false,
  "emitExistingOnFirstRun": true,
  "includeDescription": true
}
```

# Actor output Schema

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

Open (and, in monitoring mode, closed) jobs returned by this run.

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

Companies checked, not found, errors and number of jobs returned.

# 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://adobe.wd5.myworkdayjobs.com/external_experienced"
    ],
    "keywords": [
        "engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mikirag3/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://adobe.wd5.myworkdayjobs.com/external_experienced"],
    "keywords": ["engineer"],
}

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

```

## MCP server setup

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