# Workday Jobs Scraper - Any myworkdayjobs.com Career Site (`teddythebuilder/workday-jobs-scraper`) Actor

Scrape job postings from any company's Workday career site (myworkdayjobs.com): title, locations, country, remote, posted date, salary range, description, apply link. Search, filters, multiple companies per run, new and removed jobs monitor. Export JSON/CSV or call via API/MCP.

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

## Pricing

from $0.83 / 1,000 job returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 collects **job postings from any company's Workday career site**: the `myworkdayjobs.com` and `myworkdaysite.com` pages that thousands of large employers use (NVIDIA, Salesforce, Adobe, Mastercard, HP, Wells Fargo, Workday itself and many more). Paste one or more career-site URLs and get every open job in one clean schema: title, requisition ID, all locations, country, remote flag, time type, posted date, closing date, the **salary range** from the description, the full description and the apply link.

It reads the same JSON endpoints the career site's own search page uses, so there is no browser, no login and no proxy. A run with 20 jobs takes about 15 seconds. Search with Workday's own search box, filter by title, location, remote, salary and posting date, read many companies in one run, and switch on **monitor mode** to get only new jobs and the jobs that were removed (filled or closed) since your last run.

### Why use Workday Jobs Scraper?

- **Any Workday employer.** Works with every public Workday career site: `https://<company>.wd1…wd12.myworkdayjobs.com/<site>` and `https://wdN.myworkdaysite.com/recruiting/<company>/<site>`.
- **Paste a filtered URL.** Filtered the career site by job category, country or job type in your browser? Paste that URL: its filters are applied as they are.
- **Many companies per run.** One list of career sites, one dataset, one schema. Set a per-company cap so one big employer doesn't use the whole budget.
- **Salary ranges.** Pay ranges written in the description ("The base salary range is 184,000 USD - 287,500 USD", "$105,050 to $161,800 USD", "$45.50 - $60.00 per hour") become `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod`.
- **Monitor new and removed jobs.** `onlyNew` remembers what you already received; `reportRemoved` adds a row for every job that disappeared from the site, a simple signal that a role was filled or closed.
- **Fast and cheap.** $1.50 per 1,000 jobs. Errors, info rows and already-seen jobs are free.

### What data can you extract?

| Field | Example | Description |
|---|---|---|
| `id` | `nvidia/NVIDIAExternalCareerSite:Senior-Full-Stack-Software-Engineer_JR2014108` | Stable ID: company, site and job slug |
| `company` | `NVIDIA` | Company (from the career site's name) |
| `title` | `Senior Full-Stack Software Engineer` | Job title |
| `jobReqId` | `JR2014108` | Requisition ID |
| `location` | `US, WA, Seattle` | Main location |
| `locations` | `["US, WA, Seattle", "US, CA, Santa Clara"]` | All locations of the posting |
| `country` / `countryCode` | `United States of America` / `US` | Country of the main location |
| `remote` | `false` | A location or the remote type says remote |
| `remoteType` | `null` | Workday's remote type, when the employer sets it |
| `timeType` | `Full time` | Full time / Part time |
| `postedOn` | `Posted Today` | Workday's posted text |
| `postedDate` | `2026-10-28` | Posting start date |
| `daysAgo` | `0` | Days since posting (30+ shown as 31) |
| `closingDate` | `2026-11-01` | Closing date, when the employer sets one |
| `salaryMin` / `salaryMax` | `152000` / `241500` | Pay range from the description |
| `salaryCurrency` / `salaryPeriod` | `USD` / `year` | Currency and period (year, month or hour) |
| `salaryText` | `152,000 USD - 241,500 USD` | The range as written |
| `url` | `https://nvidia.wd5.myworkdayjobs.com/…_JR2014108` | Job page |
| `applyUrl` | `…_JR2014108/apply` | Apply page |
| `hiringOrganization` | `2100 NVIDIA USA` | Hiring legal entity, as Workday reports it |
| `careerSite` / `workdayTenant` / `workdaySite` | `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` / `nvidia` / `NVIDIAExternalCareerSite` | Where the job came from |
| `description` | `NVIDIA has been transforming computer graphics…` | Full description as plain text |
| `changeType` | `new` / `removed` | Monitor mode only |
| `scrapedAt` | `2026-10-28T20:22:57Z` | Run time |

### How to use Workday Jobs Scraper (step by step)

1. Click **Try for free**.
2. Open the company's careers page and click through to its job search. If the address contains `myworkdayjobs.com` or `myworkdaysite.com`, copy it into **Workday career site URLs**. Add as many companies as you like.
3. Optional: type a **Search text** (`data engineer`), add **Title keywords**, **Locations** (`london`, `germany`), set **Posted within (days)**, or switch on **Remote only** or **Only jobs with a salary range**.
4. Set **Max jobs** (and **Max jobs per career site**) and click **Start**.
5. Open the **Jobs** view or export to CSV, Excel or JSON. For a daily feed, switch on **Only new jobs** (and **Report removed jobs**) and add a schedule.

**How do I find a company's Workday URL?** Go to the company's own "Careers" page and click "Search jobs" or "View all jobs". Workday sites look like `https://acme.wd5.myworkdayjobs.com/en-US/External`; the `en-US` part is optional.

### Input example

```json
{
  "careerSiteUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
    "https://wd5.myworkdaysite.com/recruiting/hp/ExternalCareerSite"
  ],
  "searchText": "data",
  "locations": ["united kingdom", "london", "ireland"],
  "postedWithinDays": 14,
  "maxResultsPerSite": 50,
  "maxResults": 150,
  "onlyNew": true,
  "reportRemoved": true,
  "watchName": "data-jobs-uk-ie"
}
```

### Output example

```json
{
  "id": "nvidia/NVIDIAExternalCareerSite:Senior-Full-Stack-Software-Engineer_JR2014108",
  "company": "NVIDIA",
  "title": "Senior Full-Stack Software Engineer",
  "jobReqId": "JR2014108",
  "location": "US, WA, Seattle",
  "locations": ["US, WA, Seattle", "US, CA, Santa Clara"],
  "country": "United States of America",
  "countryCode": "US",
  "remote": false,
  "remoteType": null,
  "timeType": "Full time",
  "postedOn": "Posted Today",
  "postedDate": "2026-10-28",
  "daysAgo": 0,
  "closingDate": null,
  "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-WA-Seattle/Senior-Full-Stack-Software-Engineer_JR2014108",
  "applyUrl": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-WA-Seattle/Senior-Full-Stack-Software-Engineer_JR2014108/apply",
  "hiringOrganization": "2100 NVIDIA USA",
  "careerSite": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
  "workdayTenant": "nvidia",
  "workdaySite": "NVIDIAExternalCareerSite",
  "salaryMin": 152000,
  "salaryMax": 241500,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": "152,000 USD - 241,500 USD",
  "description": "NVIDIA has been transforming computer graphics, PC gaming, and accelerated computing for more than 30 years…",
  "changeType": null,
  "scrapedAt": "2026-10-28T20:22:57Z"
}
```

In monitor mode a removed job looks like `{"id": "…:Program-Manager_R171637", "changeType": "removed", "jobSlug": "Program-Manager_R171637", "company": "Adobe", "careerSite": "…"}`.

### How much does it cost?

Workday Jobs Scraper uses pay-per-event pricing.

| Event | Price (Free plan) | When it is charged |
|---|---|---|
| Actor start | $0.0005 | Once per run |
| Job returned | $0.0015 ($1.50 per 1,000) | One job (or one removed-job row in monitor mode) in the dataset |

Info rows (a URL that is not a Workday site, a site that could not be read, no matches) and jobs skipped as already seen in monitor mode are **free**. Paid Apify plans get Store discounts (Bronze −15%, Silver −30%, Gold and up −45%).

Worked examples (Free plan prices):

- **All 885 open jobs of one large employer:** ≈ **$1.33**.
- **A daily "new jobs" feed for 20 companies** with `onlyNew` (about 60 new jobs a day): ≈ $0.09 per day, **about $2.70 per month**.
- **A weekly salary snapshot** of 500 US engineering jobs with `withSalaryOnly`: ≈ **$0.75** per run.

The Apify Free plan includes monthly platform credit, which covers runs like these.

### Use cases

- **Job boards and aggregators.** Fill a niche job board with fresh roles from the employers your audience wants, all in one format.
- **Recruiters and staffing agencies.** Watch target accounts: which teams are hiring, where, and at what pay. Removed jobs show which roles were filled.
- **Sales and market intelligence.** Hiring is a buying signal. Track new roles that mention your product category ("Snowflake", "SAP", "cybersecurity") at enterprise accounts.
- **Salary benchmarking.** US pay-transparency laws mean many Workday postings carry a range. Compare ranges by role, level and location.
- **Job seekers.** A daily spreadsheet or email of new jobs at your dream companies, filtered by location and title.
- **AI agents.** Let an assistant answer "which of these 30 companies opened data-engineering roles in London this week?" with structured data.

### Use with AI agents, MCP and the API

```bash
curl -X POST "https://api.apify.com/v2/acts/teddythebuilder~workday-jobs-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"careerSiteUrls":["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],"searchText":"python","maxResults":50}'
```

Python with `apify-client`:

```python
from apify_client import ApifyClient

client = ApifyClient("<TOKEN>")
run = client.actor("teddythebuilder/workday-jobs-scraper").call(run_input={
    "careerSiteUrls": [
        "https://adobe.wd5.myworkdayjobs.com/external_experienced",
        "https://mastercard.wd1.myworkdayjobs.com/CorporateCareers",
    ],
    "titleKeywords": ["engineer", "scientist"],
    "withSalaryOnly": True,
    "maxResults": 200,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job.get("company"), "-", job.get("title"), job.get("salaryMin"), job.get("salaryCurrency"), job.get("url"))
```

**MCP:** available as a tool in the Apify MCP server (`https://mcp.apify.com`) for Claude, ChatGPT, Cursor and other MCP clients.

### Integrations

Send new jobs to Slack, Discord, Telegram, Google Sheets, Airtable, Notion, email, Make, Zapier, n8n or a webhook after each scheduled run.

### Data source and legality

The data comes from the employers' **public Workday career sites**, the pages they publish so that anyone can find and apply for their jobs. The actor calls the same JSON endpoints that the career site's own search page uses (`/wday/cxs/<company>/<site>/jobs` and the job pages); the career hosts' robots.txt allows these site paths. It sends a clear user agent, reads politely (a few requests at a time with short pauses, backing off on HTTP 429) and does not log in, bypass any protection or use proxies.

The output contains **job and company information only**. Workday's public job endpoints don't expose recruiters' names or contact details, and none are added. If you republish jobs, link to the original posting (`url`) so applicants apply on the employer's site.

### FAQ

**Which companies use Workday?**
Many large and mid-size employers: technology, banking, retail, healthcare, universities and public bodies. If the careers search page address contains `myworkdayjobs.com` or `myworkdaysite.com`, this actor can read it.

**Why do I get at most 2,000 jobs from one site?**
Workday's search stops paging at 2,000 postings per query. For larger employers, add a **Search text**, paste a filtered URL (for example by country or job category) or run several filtered URLs. The log tells you when a site has more than 2,000 jobs.

**Is the search the same as on the website?**
Yes. **Search text** is sent to Workday's own search, and filters in a pasted URL (the part after `?`) are applied the same way. Title keywords, locations, remote, salary and date filters are applied on top.

**How exact is the posted date?**
`postedDate` is the posting's start date from Workday. `daysAgo` comes from Workday's "Posted N Days Ago" text, where older jobs are just "30+ Days Ago" (shown as 31).

**Why is the salary missing?**
Many postings, especially outside the US, don't state a range. The actor only reads ranges with an explicit currency. Turn on **Only jobs with a salary range** to keep only those.

**How does removed-job detection work?**
With **Only new jobs** and **Report removed jobs** on, the actor saves the full list of jobs per career site. Next run, jobs that are no longer listed are returned once with `changeType: "removed"`. It needs a complete read of the site, so it works when your search returns fewer than 2,000 jobs.

**How is "remote" decided?**
A job counts as remote when one of its locations, its title or Workday's remote type says "remote" (for example "US, Remote" or "USA Remote"). Employers that mark remote work only in the description text are not detected.

**Why does a run with remote, salary or location filters take longer?**
These filters need each posting's page, and on a big site most postings don't match. The actor skips postings whose single listed location already rules them out, but a large employer can still take a few minutes. Add a **Search text** or paste a filtered URL (for example the site's own "Remote" location filter) to make it fast.

**Can I skip opening every posting?**
Yes: turn off **Open each job posting** for a fast list (title, location text, posted text, URL). Location, remote and salary filters need the posting, so they switch it back on.

**A site returned an error.**
The run continues with the other sites and adds a free info row. "HTTP 422" means the company or site name in the URL doesn't exist on that Workday host; open the URL in a browser to check it.

**Questions or bugs?**
Open an issue on the actor page. We reply within 24 hours. If the actor helps you, a rating on the Store page helps others find it.

### Related actors

- [Career Site Jobs API - Greenhouse, Lever, Ashby & Workable](https://apify.com/teddythebuilder/career-site-jobs-api): every open role from startup and scale-up job boards.
- [Remote Jobs API](https://apify.com/teddythebuilder/remote-jobs-api): remote jobs from Remote OK, Jobicy, Arbeitnow and Working Nomads in one schema.
- [Hacker News Scraper - Who Is Hiring Jobs](https://apify.com/teddythebuilder/hacker-news-scraper): the monthly HN "Who is hiring?" thread as structured jobs.
- [Website Contact Scraper](https://apify.com/teddythebuilder/website-contact-scraper): company emails, phones and social profiles for the hiring companies.

### Changelog and support

- **1.0 (October 2026):** first release. Any myworkdayjobs.com / myworkdaysite.com career site, filtered search URLs and single job URLs; search, title, location, remote, salary and date filters; salary ranges from descriptions; monitor mode with new and removed jobs.

Questions or feature requests? Open an issue on the actor page. We reply within 24 hours.

# Actor input Schema

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

One or more Workday career sites, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite or https://wd1.myworkdaysite.com/recruiting/wf/WellsFargoJobs. You can paste a filtered search URL (its filters are applied) or a single job URL.

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

Workday's own job search (title and description), e.g. data engineer. Same as typing into the career site's search box. Empty = all jobs.

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

Keep jobs whose title contains any of these words, e.g. engineer, analyst. Empty = any title.

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

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

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

Keep jobs where any location or the country contains one of these words, e.g. london, germany, CA. Empty = any location.

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

Only jobs posted in the last N days (from Workday's 'Posted N Days Ago'; 30+ counts as 31). 0 = no limit.

## `maxResults` (type: `integer`):

Maximum jobs to return across all career sites. You pay per job returned.

## `maxResultsPerSite` (type: `integer`):

Cap per career site, so one big employer doesn't use the whole budget. Empty = same as Max jobs.

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

Keep only jobs with a remote location or remote type.

## `withSalaryOnly` (type: `boolean`):

Keep only jobs whose description states a pay range (common for US, Canadian and EU postings with pay-transparency rules).

## `includeDetails` (type: `boolean`):

Read each job's page for the description, all locations, country, time type, start and closing date and the salary range. Turn off for a faster list with title, location text, posted date and URL only.

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

Return the full description as plain text.

## `includeDescriptionHtml` (type: `boolean`):

Also return the original HTML description.

## `onlyNew` (type: `boolean`):

Return only jobs this monitor has not returned before (state is kept per watch name and career site). Schedule the Actor daily to get new postings only.

## `reportRemoved` (type: `boolean`):

With monitor mode: also return a row with changeType 'removed' for each job that was on the career site last run and is gone now (filled or closed). Works when the site has fewer than 2,000 open jobs for your search.

## `watchName` (type: `string`):

Name of this monitor. Use different names for different searches so their 'already seen' lists stay apart.

## Actor input object example

```json
{
  "careerSiteUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://workday.wd5.myworkdayjobs.com/Workday"
  ],
  "searchText": "",
  "titleKeywords": [],
  "excludeKeywords": [],
  "locations": [],
  "postedWithinDays": 30,
  "maxResults": 50,
  "remoteOnly": false,
  "withSalaryOnly": false,
  "includeDetails": true,
  "includeDescription": true,
  "includeDescriptionHtml": false,
  "onlyNew": false,
  "reportRemoved": false,
  "watchName": "default"
}
```

# 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 = {
    "careerSiteUrls": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "https://workday.wd5.myworkdayjobs.com/Workday"
    ],
    "postedWithinDays": 30,
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("teddythebuilder/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://workday.wd5.myworkdayjobs.com/Workday",
    ],
    "postedWithinDays": 30,
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("teddythebuilder/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://workday.wd5.myworkdayjobs.com/Workday"
  ],
  "postedWithinDays": 30,
  "maxResults": 50
}' |
apify call teddythebuilder/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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