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

Scrape every job from any company's Workday career site (myworkdayjobs.com): title, location, remote type, full/part time, posting date, req ID and full description. Keyword search, location filters and new-jobs-only monitoring.

- **URL**: https://apify.com/birchwood-data/workday-jobs-scraper.md
- **Developed by:** [Birchwood Data](https://apify.com/birchwood-data) (community)
- **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: Any myworkdayjobs.com Career Site

Get **every open job from any company that hires through Workday**, the career site behind thousands of employers including NVIDIA, Salesforce, Adobe and many Fortune 500 companies. Paste the career site URL to get clean, structured job data: title, location(s), country, remote/hybrid type, full/part time, posting date, requisition ID, hiring entity, apply link and the **full job description**.

It uses the same public JSON endpoint that the Workday career page loads in your browser. There's no browser, no login and no cookies, so runs are fast and cheap.

### What can this Workday job scraper do?

- 🏢 **Any Workday tenant**: `https://<company>.wd1…wd12.myworkdayjobs.com/<Site>` and `myworkdaysite.com/recruiting/<company>/<Site>` URLs, with or without a language prefix like `/en-US/`.
- 🔍 **Keyword search**, the same as the site's own search box (`data engineer`, `nurse`, `sales`…).
- 📍 **Location filter** (any of: `United States`, `Remote`, `London`…) checked against *all* the job's locations and its country.
- 🗓️ **Posted within N days**, plus a normalized `postedDate` derived from Workday's "Posted 3 Days Ago".
- 🔔 **Monitoring mode** (`onlyNewJobs`): schedule it daily and get only the jobs that appeared since the last run. That's ideal for alerts, Slack/Zapier/Make/n8n workflows and job-board feeds.
- ⚡ **Fast list mode**: turn off details to get title, location and URL for thousands of jobs in seconds.

#### Pairs with ATS Job Scraper

Companies on **Greenhouse, Lever, Ashby, SmartRecruiters or Recruitee**? Use our [ATS Job Scraper](https://apify.com/birchwood-data/ats-job-scraper). Both Actors output the same core fields (`title`, `location`, `url`, `postedDate`, `descriptionText`, `changeStatus`), so you can merge them into one job feed.

### Example use cases

- **Job boards and aggregators:** pull fresh postings straight from employers' Workday sites. These are original postings, not reposts.
- **Recruiting and sourcing:** watch target companies and get only new roles every morning (`onlyNewJobs` + a daily schedule).
- **Sales intelligence:** hiring for "Salesforce admin" or "data engineer" is a buying signal. Turn new roles into lead alerts.
- **Labor-market research:** track headcount demand by location, remote type and function across Fortune 500 employers.
- **AI agents and RAG:** give an LLM up-to-date job descriptions through the Apify API or MCP server.
- **No-code automations:** connect to Make, Zapier, n8n, Google Sheets, Slack or webhooks with no code.

### Input

| Field | Description |
|---|---|
| `careerSiteUrls` | **Required.** Workday career site URLs, one per line |
| `searchText` | Keywords (optional) |
| `locationKeywords` | Keep jobs whose location/country contains any of these |
| `excludeTitleKeywords` | Drop titles containing any of these (e.g. `Intern`) |
| `postedWithinDays` | Only recent postings (0 = any) |
| `onlyNewJobs` | Return only jobs not seen in previous runs |
| `includeDetails` | Full description, all locations, country, remote type, time type (default on) |
| `descriptionFormat` | `text`, `html` or `both` |
| `maxJobsPerSite` / `maxJobs` | Limits (0 = no limit) |

Example:

```json
{
  "careerSiteUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
  ],
  "searchText": "data",
  "locationKeywords": ["United States"],
  "postedWithinDays": 7
}
```

**How to find the URL:** open the company's careers page, click any job, and copy the address up to the site name, e.g. `https://adobe.wd5.myworkdayjobs.com/external_experienced`.

### What Workday job data can you extract?

One dataset item per job. Here's a real example from a test run, with the description shortened:

```json
{
  "id": "workday:salesforce:External_Career_Site:JR365398",
  "tenant": "salesforce",
  "careerSite": "External_Career_Site",
  "companyName": "428 Salesforce UK Limited",
  "jobReqId": "JR365398",
  "title": "Migration Delivery Lead - Marketing Cloud",
  "location": "United Kingdom - London",
  "additionalLocations": [],
  "country": "United Kingdom",
  "remoteType": "Office - Flexible",
  "timeType": "Full time",
  "postedOn": "Posted Today",
  "postedDate": "2026-10-26",
  "startDate": "2026-10-26",
  "url": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/United-Kingdom---London/Migration-Delivery-Lead---Marketing-Cloud_JR365398",
  "applyUrl": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/United-Kingdom---London/Migration-Delivery-Lead---Marketing-Cloud_JR365398/apply",
  "descriptionText": "To get the best candidate experience, please consider applying for a maximum of 3 roles within 12 months to ensure you a...",
  "changeStatus": null,
  "sourceSite": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
  "scrapedAt": "2026-10-26T13:44:21.713599Z"
}
```

See `sample_output.json` for more examples. Download as JSON, CSV, Excel or HTML, or read through the Apify API. A `RUN_SUMMARY` record in the key-value store lists jobs listed, fetched and saved per site, plus any URLs that failed.

### Pricing

**Pay per event: you pay only for jobs saved to the dataset.** Failed sites, filtered-out jobs and duplicates are free. Set *Max cost per run* in the run options and the Actor stops cleanly when it hits that limit. The current price is shown on the Pricing tab.

### Notes & limits

- Workday's search returns at most about 2,000 results per query. For bigger employers, narrow it with `searchText` or run several keyword queries.
- `postedDate` is approximate ("Posted 30+ Days Ago" gives `null`); `startDate` is the posting date Workday reports.
- With a location filter and details on, the Actor checks each job's full location list, so it can read more pages before reaching `maxJobsPerSite`.
- Some fields (`remoteType`, `companyName`) are only present if the employer fills them in.

### Is it legal?

This Actor reads only publicly listed job postings, which employers publish so they can be found. It collects no personal data. Always use the data in line with applicable laws and the sites' terms.

### FAQ

**Does it need a proxy?** Usually not.
**Can I scrape many companies at once?** Yes. Add as many career site URLs as you like.
**Integrations?** Use Apify schedules, webhooks, Zapier, Make, n8n, Google Sheets, or the API/MCP for AI agents.

### Other Actors by Birchwood Data

Our Actors are built to chain together: **find companies → find their job boards → scrape every job → screenshot or structure the results.**

| Actor | What it does |
| --- | --- |
| [ATS Job Scraper](https://apify.com/birchwood-data/ats-job-scraper) | Jobs from Greenhouse, Lever, Ashby, SmartRecruiters and Recruitee career pages, with salary, remote flag and new/removed-job tracking. |
| [Y Combinator Scraper](https://apify.com/birchwood-data/yc-companies-scraper) | The full YC startup directory with an optional job-board finder. Its `atsBoardUrl` output feeds straight into the two job scrapers. |
| [Website Screenshot API](https://apify.com/birchwood-data/website-screenshot-api) | Bulk full-page or mobile screenshots of any URL, e.g. company websites from the YC list or career pages you monitor. |
| [Text to JSON](https://apify.com/birchwood-data/text-to-data) | Turn job descriptions, emails or PDFs into JSON matching your own schema. For example, pull skills or tech stack out of `descriptionText`. |

**Example pipeline:** Y Combinator Scraper (`onlyHiring`, `detectCareersPage`) → feed the `atsBoardUrl` values into ATS Job Scraper or Workday Jobs Scraper → schedule daily with `onlyNewJobs` → send new jobs to Slack, Google Sheets or your ATS via Apify integrations.

### Support

Found a bug or need a feature? Open an issue on the **Issues** tab and we will get back to you as soon as possible.

# Actor input Schema

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

One Workday career site per line, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite (language prefixes like /en-US/ are fine). Open the company's 'Careers' page, click any job and copy the URL up to the site name.

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

Same as the search box on the career site, e.g. 'data engineer'. Leave empty for all jobs.

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

Keep only jobs whose location (or additional locations) contains any of these, e.g. 'United States', 'Remote', 'London'.

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

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

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

Keep only jobs Workday marks as posted within N days ('Posted Today', 'Posted 3 Days Ago'...). 0 = no limit.

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

Remembers jobs already seen (named key-value store in your account) and returns only jobs that appeared since the previous run. The first run returns everything.

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

Fetch each job's detail page: full description, all locations, country, remote type, time type and start date. Turn off for a faster title/location/URL-only list.

## `descriptionFormat` (type: `string`):

Plain text, HTML, or both.

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

0 = no limit.

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

0 = no limit.

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

How many job detail pages to fetch at the same time.

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

Optional. Workday career sites are public and normally need no proxy.

## Actor input object example

```json
{
  "careerSiteUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "postedWithinDays": 0,
  "onlyNewJobs": false,
  "includeDetails": true,
  "descriptionFormat": "text",
  "maxJobsPerSite": 20,
  "maxJobs": 0,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped Workday job postings.

## `runSummary` (type: `string`):

Jobs listed / fetched / saved per career site, plus inputs that could not be loaded.

# 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"
    ],
    "maxJobsPerSite": 20
};

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

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

```

## MCP server setup

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