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

Scrape every open job from any Workday career site (myworkdayjobs.com): title, location, remote type, posted date, job ID, URL and full description. Paste career-site URLs, filter by keyword, location, remote and date. Only-new-jobs mode for daily monitoring. No login, no proxy.

- **URL**: https://apify.com/capable_coach/workday-jobs-scraper.md
- **Developed by:** [jules imbert](https://apify.com/capable_coach) (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.60 / 1,000 job postings

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

## Workday Jobs Scraper: scrape any myworkdayjobs.com career site

**Workday Jobs Scraper** extracts every open job from company career sites hosted on **Workday** (`*.myworkdayjobs.com`, `myworkdaysite.com`). Paste one or more career-site URLs, optionally add a keyword, location, remote or date filter, and get clean JSON/CSV/Excel with **title, location(s), country, remote type, time type, exact posted date, requisition ID, job URL, apply URL and the full description**.

It reads the same public JSON that the Workday career page loads in your browser. There's no login, no cookies, no browser and no proxy, so runs are fast and cheap. Large employers such as NVIDIA, Salesforce, Adobe and Workday itself publish their jobs this way.

### What you can do with it

- **Job boards and aggregators**: feed your site with fresh postings from large Workday employers.
- **Sales and lead generation**: find companies hiring for roles your product sells to (e.g. "Data Engineer", "SOC Analyst").
- **Recruiters and talent intelligence**: track competitors' hiring by location, team and seniority, every day.
- **Job seekers**: watch your target companies and get only new jobs with `onlyNewSinceLastRun`.
- **Labour-market research**: count openings by country, remote type or keyword across many companies.
- **AI agents**: call it through the Apify MCP server or API to answer "what is NVIDIA hiring for in Germany?".

### How to scrape Workday jobs

1. Open the company's careers page and copy the URL of the Workday job list, e.g. `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`. The `wdN` part and the site name differ per company, so copy them as they are.
2. Paste one URL per line in **Workday career site URLs**.
3. Optionally set **Search keywords** (Workday's own search), title/location filters, **Remote only** or **Posted within N days**.
4. Click **Start** and download the dataset (JSON, CSV, Excel), or call the Actor from the API, Make, Zapier or n8n.

#### Input example

```json
{
  "startUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
    "https://workday.wd5.myworkdayjobs.com/Workday"
  ],
  "searchText": "engineer",
  "locationKeywords": ["Germany", "Remote"],
  "postedWithinDays": 7,
  "maxJobsPerSite": 100,
  "includeDescription": true
}
```

| Field | What it does |
|---|---|
| `startUrls` | Workday career-site URLs. Locale prefixes (`/en-US/`), job URLs and `?q=` searches are accepted. |
| `searchText` | Sent to Workday's search, like typing in the career page. |
| `titleKeywords` / `excludeTitleKeywords` | Keep or drop jobs by words in the title. |
| `locationKeywords` | Match location, additional locations, country or remote type. Jobs shown as "3 Locations" are checked on their detail page. |
| `remoteOnly` | Only jobs marked Remote (or with "remote" in location/title). |
| `postedWithinDays` | Based on Workday's "Posted N Days Ago" label. |
| `includeDescription` | One extra request per job for full description, exact posted date, time type, country and hiring entity. |
| `maxJobsPerSite` / `maxJobs` | Caps per site and per run. |
| `onlyNewSinceLastRun` + `stateKey` | Return only jobs not delivered in previous runs. |
| `requestDelayMs`, `maxConcurrency` | Politeness settings (defaults: 300 ms between requests per site, 3 sites in parallel). |

### Output

One item per job:

```json
{
  "jobId": "JR365782",
  "workdayJobId": "450e3b48aeb9100158f4a2b967d10000",
  "title": "Senior Solution Engineer",
  "company": "salesforce",
  "hiringOrganization": "400 salesforce.com sarl",
  "location": "Switzerland - Zurich",
  "locations": ["Switzerland - Zurich", "Switzerland - Lausanne"],
  "country": "Switzerland",
  "countryCode": "CH",
  "remoteType": "Office - Based",
  "isRemote": false,
  "timeType": "Full time",
  "postedOn": "Posted Today",
  "postedDate": "2026-10-28",
  "postedDateIsApprox": false,
  "url": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/Switzerland---Zurich/Senior-Solution-Engineer_JR365782",
  "applyUrl": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/Switzerland---Zurich/Senior-Solution-Engineer_JR365782/apply",
  "tenant": "salesforce",
  "site": "External_Career_Site",
  "careerSiteUrl": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
  "descriptionText": "To get the best candidate experience, please consider applying for a maximum of 3 roles…",
  "sourceInput": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
  "scrapedAt": "2026-10-28T11:02:09.893Z"
}
```

- `postedDate` is the exact date from the job page when descriptions are on. Without descriptions it is computed from "Posted N Days Ago" and `postedDateIsApprox` is `true` ("30+ days" becomes the date 30 days ago).
- `company` is the Workday tenant name from the URL; `hiringOrganization` is the legal entity Workday shows on the job (when descriptions are on).
- The key-value store also has a **SITES** report (open jobs per site, jobs delivered, errors) and **RUN_STATS**.

### Pricing (pay per event)

| Apify plan | Per job | Per 1,000 |
|---|---|---|
| Free | $0.001 | $1.00 |
| Starter (Bronze) | $0.0009 | $0.90 |
| Scale (Silver) | $0.00075 | $0.75 |
| Business (Gold) and above | $0.0006 | $0.60 |

Plus **$0.001 per run start**. Discounts apply automatically on paid Apify plans.

So 1,000 jobs cost about **$1.00**. Platform usage is included. Jobs removed by your filters and sites that fail are not charged. Set **Maximum cost per run** to cap spending; the Actor stops cleanly when it is reached.

### Integrations and API

- **API**: run the Actor and read results over HTTP or with the Apify Python and JavaScript clients (see the **API** tab for ready-made code).
- **Schedules**: run it daily or weekly from Apify schedules.
- **Integrations**: send results to Google Sheets, Slack, e-mail, Airtable or a webhook, or connect it to Make, Zapier or n8n.
- **AI agents**: available as a tool through the Apify MCP server.

### FAQ

**Which companies use Workday?** Many large enterprises: if the careers page URL (or the page you land on after clicking "See jobs") contains `myworkdayjobs.com`, this Actor can read it.

**Do I need a Workday account, an API key or proxies?** No. The Actor uses the public endpoints the career page itself calls, with retries and polite delays.

**Why does a site show 2,000 open jobs?** Workday displays 2,000 as the total for very large sites. The Actor keeps paging past that number until the list ends or your caps are reached. Use `searchText` or filters to narrow big sites.

**Can I monitor new jobs every day?** Yes: save a task with `onlyNewSinceLastRun: true`, schedule it daily and connect Slack, e-mail, Google Sheets or a webhook.

**Greenhouse, Lever, Ashby?** Use the sister Actor [ATS Jobs Scraper](https://apify.com/capable_coach/ats-jobs-scraper).

**Is it legal?** The Actor only reads job postings that employers publish publicly for candidates, without logging in, and it collects no candidate data. Respect each site's terms and use the data responsibly. Not affiliated with Workday, Inc.

### Other Actors by the same developer

- [ATS Jobs Scraper](https://apify.com/capable_coach/ats-jobs-scraper): Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Personio.
- [French Jobs Scraper (Emploi France)](https://apify.com/capable_coach/emploi-france-aggregator): open-licence French job offers.
- [Google Trends Scraper](https://apify.com/capable_coach/google-trends-scraper): interest over time, regions, related queries.

# Actor input Schema

## `startUrls` (type: `array`):

One Workday career site per line, as you see it in your browser, e.g. <code>https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite</code>. Locale prefixes (<code>/en-US/</code>), job URLs and <code>?q=</code> searches are accepted. <code>myworkdaysite.com/recruiting/\<tenant>/\<site></code> URLs also work.

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

Sent to Workday's own search box, exactly like typing in the career page (searches title and description). Leave empty to get all jobs. Overrides any <code>?q=</code> in the URLs.

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

Keep only jobs whose title contains at least one of these words (case and accent insensitive).

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

Drop jobs whose title contains any of these words, e.g. <code>intern</code>, <code>principal</code>.

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

Keep only jobs whose location, additional locations, country or remote type contains one of these, e.g. <code>Germany</code>, <code>London</code>, <code>Remote</code>. Jobs listed as "N Locations" are checked on their detail page.

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

Keep only jobs marked Remote by Workday or with "remote" in the location/title.

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

Uses Workday's "Posted N Days Ago" label. 0 = no date filter.

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

Fetch each job's detail page for the full description, exact posted date, time type, country and hiring entity. One extra request per job; turn off for a faster title/location-only list.

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

Also return the original HTML description.

## `maxJobsPerSite` (type: `integer`):

Stop after this many jobs per site (after filters).

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

Overall cap for the run. 0 = no cap (Maximum cost per run still applies).

## `onlyNewSinceLastRun` (type: `boolean`):

Remember jobs already delivered (in a named key-value store) and return only new ones. Ideal with a daily schedule.

## `stateKey` (type: `string`):

Name of the memory used by "Only new jobs". Use a different key per saved task. Leave empty to use the shared default memory. Stored encrypted.

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

How many career sites are read at the same time (each site is read politely, max 2 requests in parallel).

## `requestDelayMs` (type: `integer`):

Pause between two requests to the same career site. Keeps the load on Workday low.

## Actor input object example

```json
{
  "startUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
    "https://workday.wd5.myworkdayjobs.com/Workday"
  ],
  "searchText": "engineer",
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "includeDescriptionHtml": false,
  "maxJobsPerSite": 20,
  "maxJobs": 0,
  "onlyNewSinceLastRun": false,
  "maxConcurrency": 3,
  "requestDelayMs": 300
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `overview` (type: `string`):

No description

## `sites` (type: `string`):

No description

## `runStats` (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 = {
    "startUrls": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
        "https://workday.wd5.myworkdayjobs.com/Workday"
    ],
    "searchText": "engineer",
    "maxJobsPerSite": 20
};

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

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

```

## MCP server setup

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