# Workday Jobs Scraper: Export Jobs from Any Workday Site (`pulsedata/workday-jobs-scraper`) Actor

Scrape all open jobs from any Workday career site (myworkdayjobs.com): title, location, remote flag, employment type, posting date, full description and apply URL. No API key and no login. $2.00 per 1,000 jobs.

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

## Pricing

$2.00 / 1,000 job scrapeds

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: Export Jobs from Any Workday Site

Workday Jobs Scraper exports every open job from one or more Workday career sites (`<company>.wdN.myworkdayjobs.com`) as JSON, CSV or Excel. You give it the career site URL, and it pages through the site's job search and opens each job to return the title, primary and additional locations, time type, requisition ID, posting date, full description and apply URL. It costs $2.00 per 1,000 jobs, so a 500-job site costs about $1.00.

### Features

- **Scrape Workday job postings** from any public `myworkdayjobs.com` career site, with no login.
- **Export myworkdayjobs.com jobs to CSV, JSON or Excel.**
- **Get the Workday requisition ID** (`atsJobId`, for example `JR2020549`) for each job, so you can match postings across runs.
- **Scrape large enterprise career sites.** The actor pages through Workday's job search 20 jobs at a time, up to 20,000 jobs per site.
- **Get full Workday job descriptions** with all additional locations and the full-time or part-time flag.
- **Filter Workday jobs by keyword, location, remote and posting date.**
- **Monitor new Workday postings** on a schedule with `postedWithinDays`.

### Use cases

- **Job aggregation for large employers:** many Fortune 500 companies, banks, hospitals and universities run their careers site on Workday. Pull them into one feed.
- **Recruiting and competitive hiring intelligence:** track how many roles a competitor opens per location and how fast requisitions are filled and removed.
- **Workforce and market research:** count openings by location and job title across a set of enterprises.
- **Lead generation:** an enterprise opening a batch of "SAP" or "Cloud Security" roles is a signal for vendors in that space.

### Input

```json
{
  "startUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://examplecorp.wd1.myworkdayjobs.com/en-US/External"
  ],
  "keywords": ["software", "engineer"],
  "locations": ["Santa Clara", "Germany"],
  "remoteOnly": false,
  "postedWithinDays": 14,
  "includeDescription": true,
  "maxJobsPerCompany": 0
}
```

| Field | Type | Default | What it does |
|---|---|---|---|
| `startUrls` | array of strings | (required) | Workday career site URLs, one per line. |
| `keywords` | array | `[]` | Keep only jobs whose title contains one of these words (case-insensitive). |
| `locations` | array | `[]` | Keep only jobs whose location or additional locations contain one of these strings. |
| `remoteOnly` | boolean | `false` | Keep only jobs that Workday gives a remote type, or whose location mentions remote. |
| `postedWithinDays` | integer | `0` | Keep only jobs posted in the last N days. 0 means no limit. Jobs without a date are kept. |
| `includeDescription` | boolean | `true` | Open each job to get the description and details. This costs one extra request per job. |
| `maxJobsPerCompany` | integer | `0` | Stop after this many jobs per site. 0 means no limit. See the FAQ for how it interacts with filters. |
| `proxyConfiguration` | object | `{ "useApifyProxy": false }` | Optional Apify Proxy. |

**Accepted Workday URL formats:**

- `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`
- `https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite` (locale prefixes are accepted)
- `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/...` (a single job URL; the whole site is read)
- `nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` (without `https://`)
- `https://company.com/careers` (a page whose HTML links to a `myworkdayjobs.com` site)

Workday has no short board name. The URL carries three parts the actor needs: the tenant (`nvidia`), the data center host (`wd5`) and the site name (`NVIDIAExternalCareerSite`). A tenant can run several career sites, for example one external and one for internal candidates, so copy the URL from the browser address bar of the site you want.

### Output

One item per job:

```json
{
  "title": "Senior Software Engineer, PyTorch - Deep Learning",
  "company": "nvidia",
  "location": "US, CA, Santa Clara",
  "locations": ["US, CA, Santa Clara", "US, WA, Redmond"],
  "country": null,
  "remote": false,
  "workplaceType": null,
  "department": null,
  "team": null,
  "employmentType": "Full time",
  "seniority": null,
  "salary": "184,000 USD - 287,500 USD",
  "postedAt": "2026-09-24T00:00:00.000Z",
  "updatedAt": null,
  "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Senior-Software-Engineer--PyTorch---Deep-Learning_JR2020549",
  "applyUrl": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Senior-Software-Engineer--PyTorch---Deep-Learning_JR2020549",
  "descriptionHtml": "<p>NVIDIA is seeking…</p>",
  "descriptionText": "NVIDIA is seeking…",
  "ats": "workday",
  "atsJobId": "JR2020549",
  "sourceUrl": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
  "scrapedAt": "2026-09-25T08:40:17.000Z"
}
```

What Workday exposes, and how it maps:

- `company` is the Workday tenant from the URL (for example `nvidia`).
- `location` is Workday's primary location text, and `locations` adds every additional location.
- `employmentType` is Workday's time type (`Full time`, `Part time`).
- `postedAt` is the job's posting start date from the detail page.
- `atsJobId` is the requisition ID, and `applyUrl` is Workday's external URL for the job.
- `remote` is `true` when Workday sets any remote type on the job (companies use values such as "Remote" or "Hybrid"), or when the location mentions remote.
- The actor does not read a salary, department, team or country field from Workday, so `department`, `team`, `country` and `workplaceType` are always `null`. `salary` is filled only when a pay range appears in the first 4,000 characters of the description text; postings that put the range further down leave it `null`.

**With `includeDescription` off** the actor reads only the search result list. That is much faster, but you get fewer fields: `location` can read "2 Locations" for multi-location jobs, `employmentType` and `salary` are `null`, `applyUrl` equals `url`, and `postedAt` is a date estimated from Workday's "Posted 3 Days Ago" label (jobs labelled "Posted 30+ Days Ago" have no date).

If a career site URL is wrong or unreachable, the dataset gets one row with `sourceUrl` and an `error` message. Error rows are not charged.

### Pricing

Pay per event: **$0.002 per job** saved to the dataset ($2.00 per 1,000 jobs). There is no start fee.

Worked example: a large Workday site with 3,000 open jobs costs $6.00 for a full export. Ten enterprise sites with 800 jobs each cost $16.00. With `keywords: ["engineer"]` you might keep a quarter of them (2,000 jobs, $4.00). Jobs removed by filters and error rows are not charged.

### FAQ

**Do I need a Workday login or API key?**
No. The actor uses the same public job search requests the Workday career site makes in your browser.

**Why is a large site slow?**
With `includeDescription` on, every job needs its own detail request, so a 5,000-job site means 5,000 extra requests. Turn descriptions off when you only need titles, locations and links.

**How does `maxJobsPerCompany` work with filters?**
On Workday the actor stops fetching once it has that many jobs, and the filters then run on those jobs. With a cap of 200 and `keywords: ["engineer"]` you get the engineering jobs among the first 200 listed, which can be fewer than 200. For an exact count of filtered jobs, leave the cap at 0.

**What can it not do?**
It only reads public `myworkdayjobs.com` sites. Internal career sites that need a Workday sign-in, `myworkdaysite.com` URLs and other enterprise ATS (such as SuccessFactors, Taleo or iCIMS) are not supported. It does not render JavaScript on a company's own careers page, so paste the Workday URL directly when auto-detection does not find it.

**Do I need proxies?**
Normally no. The actor backs off and retries on HTTP 429 and server errors. Enable `proxyConfiguration` if a very large site starts rate limiting you.

**How do I export, schedule or automate it?**
Download results as JSON, CSV, Excel, XML or HTML, start runs through the Apify API or SDKs, schedule them in Apify Console, or connect the actor to Google Sheets, Make, Zapier or n8n.

### Related actors

- [Career Page Jobs Scraper (12 ATS)](https://apify.com/pulsedata/career-page-jobs-scraper): multi-ATS version that auto-detects Workday alongside 11 other systems.
- [Greenhouse Jobs Scraper](https://apify.com/pulsedata/greenhouse-jobs-scraper): for tech companies on Greenhouse.
- [Lever Jobs Scraper](https://apify.com/pulsedata/lever-jobs-scraper): for Lever boards, with published salary ranges.
- [Ashby Jobs Scraper](https://apify.com/pulsedata/ashby-jobs-scraper): for startups on Ashby.
- [Website Tech Stack Detector](https://apify.com/pulsedata/website-tech-stack-detector): add each employer's website technologies to your hiring data.

# Actor input Schema

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

Workday career site URLs such as `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`. Locale prefixes like `/en-US/` are accepted. A company's own careers page works too when it redirects to a Workday site.

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

Only keep jobs whose title contains at least one of these words/phrases (case-insensitive). Leave empty for all jobs.

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

Only keep jobs whose location contains one of these strings (e.g. `Berlin`, `Germany`, `Remote`, `United States`).

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

Keep only jobs flagged as remote by the ATS or whose location mentions remote.

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

Only jobs posted or updated within the last N days. Jobs whose ATS publishes no date are kept. 0 = no limit.

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

Return the full description (HTML + plain text). For Workday, SmartRecruiters, BambooHR, Workable and Breezy this requires one extra request per job.

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

Maximum jobs returned per career page, counted after the keyword, location, remote and date filters (0 = no limit).

## `proxyConfiguration` (type: `object`):

Optional. ATS APIs are public and rarely block; enable Apify Proxy only if you hit rate limits.

## Actor input object example

```json
{
  "startUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "keywords": [],
  "locations": [],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "maxJobsPerCompany": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Results stored in the default dataset (JSON/CSV/Excel via the dataset API).

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pulsedata/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"] }

# Run the Actor and wait for it to finish
run = client.actor("pulsedata/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"
  ]
}' |
apify call pulsedata/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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