# Workday Jobs Scraper – Any Company Career Site, Full Details (`nourishing_courier/workday-jobs-scraper`) Actor

Workday Jobs Scraper for any myworkdayjobs.com career site. Paste company URLs and get title, location, remote type, time type, posted date, job req ID, full description and apply link as flat rows. Search, date and location filters. No login, no proxy. Pay only per job delivered.

- **URL**: https://apify.com/nourishing\_courier/workday-jobs-scraper.md
- **Developed by:** [Ani Björkström](https://apify.com/nourishing_courier) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 job delivereds

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 Company Career Site, Full Details

**Workday Jobs Scraper** pulls every open job from any company career site that runs on Workday (the `myworkdayjobs.com` pages used by NVIDIA, Salesforce, Adobe, Intel, Target, Capital One, Pfizer and thousands of other employers) and returns one clean, flat row per job. Paste the career-site URL you see in your browser, and you get the **job title, job req ID, location and every additional location, country, remote type, time type, posted date, full description and a direct apply link**. **No login, no API key, no proxy**: it reads the same public JSON the career site itself loads. You **pay only per job delivered**; sites that return nothing cost nothing.

Workday is the ATS behind a large share of Fortune 500 hiring, and jobs often appear there before they reach LinkedIn or Indeed. This myworkdayjobs scraper turns company career pages into a structured job postings data feed for recruiters, job boards, sales teams tracking hiring signals, and AI/RAG builders.

### What you get

One flat, camelCase row per job (only `additionalLocations` is a list), ready for CSV, Google Sheets, n8n and LLM prompts.

| Field | Description |
|---|---|
| `jobId` | The employer's job requisition ID (`JR2020087`, `R172124`) |
| `title` | Job title |
| `company` | Company name (`NVIDIA`, `Capital One`), from a built-in list, the site's title or the tenant id |
| `careerSite` | The career site the job came from |
| `location` | Primary location as the employer writes it (`US, CA, Santa Clara`, `Netherlands - Amsterdam`) |
| `additionalLocations` | Every other location the same posting covers (`["Illinois - Chicago", "Texas - Dallas"]`) |
| `country`, `countryCode` | Country of the primary location and its ISO alpha-2 code (`United States of America`, `US`) |
| `remoteType` | Workday's remote/hybrid label when the employer sets it (`Office - Flexible`, `Remote`, `Hybrid`), otherwise `null` |
| `timeType` | `Full time` / `Part time` |
| `postedOn` | Workday's label, unchanged (`Posted Today`, `Posted 3 Days Ago`, `Posted 30+ Days Ago`) |
| `postedAtApprox` | ISO date: exact posting date with details on, else computed from `postedOn` (`null` for "30+") |
| `startDate`, `endDate` | Posting start date, and the closing date when the employer sets one |
| `hiringOrganization` | Hiring legal entity (`100 Salesforce, Inc.`) |
| `description` | Full job description as readable plain text with paragraphs and `- ` bullets |
| `descriptionHtml` | The same description with the original HTML |
| `url` | Public job page on the career site |
| `applyUrl` | Direct link to the Workday application form (`<url>/apply`); `null` if applications are closed |
| `tenant` | Workday tenant id (`nvidia`), a stable company key |
| `searchText` | The keyword search that found the job, if any |
| `scrapedAt` | ISO 8601 UTC timestamp of the run |

With **Fetch full job details** off you get listing fields only (`title`, `location`, `postedOn`, `postedAtApprox`, `jobId`, `url`, `applyUrl`), several times faster.

### Input

The only thing you need is the career-site URL. Open the company's job list, copy the address bar, paste it in:

```json
{
  "careerSiteUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
    "https://adobe.wd5.myworkdayjobs.com/de-DE/external_experienced"
  ],
  "searchText": "data",
  "postedWithinDays": 7,
  "locationsFilter": ["Germany", "Remote"],
  "maxJobsPerSite": 200,
  "fetchJobDetails": true
}
```

The Workday Jobs Scraper accepts `<company>.wd<N>.myworkdayjobs.com/<site>` URLs with or without a locale (`/en-US/`, `/de-DE/`), `wd<N>.myworkdaysite.com/recruiting/<company>/<site>` URLs, **filtered search URLs** from your browser (`?q=` becomes the keyword, `locations`, `jobFamilyGroup` etc. are passed to Workday as filters) and **single job URLs** (`.../job/...`, fetched with full details).

| Option | What it does |
|---|---|
| **Search keywords** | Workday's own keyword search on every site (`data`, `SAP`, `product manager`). |
| **Maximum jobs per site** | 1 to 5,000 (default 50); sites capped at 2,000 per search are split automatically. |
| **Posted within (days)** | Keep jobs posted in the last N days; 0 = any date. |
| **Locations** | Keep jobs in any of these places. If the site's own location filter has a match (`Germany` → "Germany, Munich", "Germany, Berlin") Workday applies it; otherwise text-matched against `location`, `additionalLocations`, `country`. |
| **Fetch full job details** | On (default): description, req ID, all locations, country, remote/time type, exact date. Off: listing rows only. |

### Example Workday career site URLs (all verified returning jobs on 2026-09-30)

- NVIDIA: `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`
- Salesforce: `https://salesforce.wd12.myworkdayjobs.com/External_Career_Site`
- Adobe: `https://adobe.wd5.myworkdayjobs.com/external_experienced`
- Intel: `https://intel.wd1.myworkdayjobs.com/External`
- Mastercard: `https://mastercard.wd1.myworkdayjobs.com/CorporateCareers`
- Target: `https://target.wd5.myworkdayjobs.com/targetcareers`
- Capital One: `https://capitalone.wd12.myworkdayjobs.com/Capital_One`
- Pfizer: `https://pfizer.wd1.myworkdayjobs.com/PfizerCareers`
- Disney: `https://disney.wd5.myworkdayjobs.com/disneycareer`
- Workday: `https://workday.wd5.myworkdayjobs.com/Workday`
- Nike: `https://nike.wd1.myworkdayjobs.com/nke`
- CrowdStrike: `https://crowdstrike.wd5.myworkdayjobs.com/crowdstrikecareers`
- AstraZeneca: `https://astrazeneca.wd3.myworkdayjobs.com/Careers`
- Novartis: `https://novartis.wd3.myworkdayjobs.com/Novartis_Careers`
- Bristol Myers Squibb: `https://bristolmyerssquibb.wd5.myworkdayjobs.com/BMS`
- CVS Health: `https://cvshealth.wd1.myworkdayjobs.com/CVS_Health_Careers`

The site id after the domain is case-sensitive, so copy it from the browser. A wrong one gives an explanatory error row, never a silent empty result.

### Use cases

- **Recruiter sourcing**: watch target companies' Workday pages daily ("data" roles in Germany, last 2 days) and act before jobs hit the boards.
- **Job board aggregation**: fill a niche board from the source ATS; `tenant` + `jobId` de-duplicates and `applyUrl` goes straight to the employer's form.
- **Hiring signals for sales**: five new Snowflake or Salesforce admin roles is a buying signal. Group by `company` and `title` and route to your CRM.
- **Investors, researchers, talent intelligence**: track competitors' hiring by company, country and remote policy over time.
- **AI agents and RAG**: plain-text `description` and flat rows drop into a vector store, LLM prompt or MCP tool result as-is.
- **Job seekers**: a daily run over your 20 dream employers, pushed to Slack or email.

### Pricing

Pay per event: one `job` event per job row delivered. Empty sites, wrong URLs and error rows are free. No feature gating: details on or off, every filter and URL type cost the same per job.

### Integrations

Every Workday Jobs Scraper run's dataset is available as JSON, CSV, Excel or XML through the Apify API as soon as the run finishes, and it works with every Apify integration: **n8n, Make, Zapier, Google Sheets, Slack, webhooks, MCP** and the Python / JavaScript SDKs.

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("nourishing_courier/workday-jobs-scraper").call(run_input={
    "careerSiteUrls": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
    "searchText": "data",
    "postedWithinDays": 7,
    "maxJobsPerSite": 100,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["jobId"], job["title"], job["location"], job["url"])
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('nourishing_courier/workday-jobs-scraper').call({
    careerSiteUrls: ['https://salesforce.wd12.myworkdayjobs.com/External_Career_Site'],
    locationsFilter: ['Remote'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map(j => `${j.title} (${j.location})`));
```

**curl**

```bash
curl -X POST "https://api.apify.com/v2/acts/nourishing_courier~workday-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>&format=csv" \
  -H "Content-Type: application/json" \
  -d '{"careerSiteUrls": ["https://intel.wd1.myworkdayjobs.com/External"], "maxJobsPerSite": 100}'
```

In **n8n** or **Make**, add the Apify node / module with actor `nourishing_courier/workday-jobs-scraper`, pass the JSON input above, and read the dataset items in the next step. Through the **Apify MCP server**, an AI agent can call the Workday Jobs Scraper as a tool to answer "which of these 20 companies opened data engineering roles in Berlin this week?".

For keyword searches across all employers, pair it with our [LinkedIn Jobs Scraper](https://apify.com/nourishing_courier/linkedin-jobs-scraper).

### Limits, fair use and legality

- **Public data only.** The Workday Jobs Scraper reads the public job listings Workday serves to any visitor of a company's career site. No login, no candidate data, nothing behind an account.
- **2,000 jobs per search.** Most Workday sites stop one search at 2,000 results (some, like CVS Health, page through all 19,000+). Above that the actor splits the site by one of its own filters (usually job category) and merges without duplicates: 2,648 unique NVIDIA jobs in one run. Without a suitable filter the log says so and it stops at 2,000.
- **Date filter.** Workday only says "30+ Days Ago" after a month, so windows over 30 days use the exact posting date from details; with details off those jobs are kept.
- **Text location matching** needs details for jobs listed as "3 Locations"; with details off they are left out.
- **Rate limits.** Workday may answer bursts with HTTP 429. The actor backs off exponentially, honours `Retry-After` and slows all workers; lower **Parallel requests** if warnings persist.
- **Custom domains.** If a careers page lives on the company's own domain, paste the underlying `myworkdayjobs.com` URL (visible after clicking a job).
- Use the data responsibly and respect each employer's terms if you republish postings.

### FAQ

#### How do I scrape jobs from a Workday career site?

Paste the company's Workday URL (for example `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`) into **Workday career site URLs** and start the run. The Workday Jobs Scraper returns every job with title, location, posted date, req ID, full description and apply link.

#### Is there a Workday careers API I can use?

Workday has no official public jobs API; each career site loads jobs from an internal JSON endpoint. The Workday Jobs Scraper wraps it as a clean Workday careers API: call it over the Apify API, get JSON or CSV back.

#### Do I need a Workday login, API key or proxy?

No. It reads the public data the career site shows anonymous visitors, without a proxy.

#### How do I find a company's Workday career site URL?

Go to the company's careers page and click "Search jobs" or any job. If the address bar shows `myworkdayjobs.com` or `myworkdaysite.com`, copy it. The list above has 16 verified examples.

#### Can I scrape company career pages in bulk?

Yes. The Workday Jobs Scraper takes any number of URLs, one per line, runs them in parallel and tags every row with `company` and `tenant`.

#### Can I get only new jobs from the last few days?

Set **Posted within (days)**, for example 1 for today and yesterday. Schedule the run daily and de-duplicate on `url` or `tenant` + `jobId`.

#### Can an AI agent use the Workday Jobs Scraper through MCP?

Yes. The Apify MCP server exposes this actor as a tool, and the flat JSON rows come back as the tool result, ready for the model.

#### What happens if a URL is wrong?

You get one row with an `error` explaining the problem (wrong site id, not a Workday URL, job no longer posted). Error rows are free, and a run that delivers no jobs at all fails so a scheduled workflow notices.

# Actor input Schema

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

One URL per line, copied from the browser's address bar on the company's Workday job list, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. Localised URLs (/en-US/, /de-DE/), filtered search URLs (?q=...\&locations=...) and single job URLs (/job/...) all work, as do wd<N>.myworkdaysite.com/recruiting/<company>/<site> URLs.

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

Optional. Workday's own keyword search on every site, e.g. data, product manager, SAP. Leave empty for all jobs. A ?q= in a pasted URL wins for that URL.

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

Cap per career site. Workday serves at most 2,000 jobs per search; above that the actor splits the site by a facet such as job category automatically.

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

Keep only jobs posted in the last N days, from Workday's 'Posted Today / Yesterday / N Days Ago' label (and the exact posting date when details are on). 0 = any date.

## `locationsFilter` (type: `array`):

Optional. Keep jobs in any of these places, e.g. Germany, London, Remote. When a site's own location filter has a matching entry it is applied by Workday itself; otherwise the text is matched against each job's location, additional locations and country.

## `fetchJobDetails` (type: `boolean`):

On: opens every job for the full description, job req ID, country, all locations, remote type, time type and exact posting date. Off: listing-only rows (title, location text, posted label, URL) in a fraction of the time.

## `concurrency` (type: `integer`):

How many requests run at once across all sites. Lower it if the log shows rate-limit (429) warnings.

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

Optional. Workday career sites answer datacenter requests without a proxy; enable one only if you run very large jobs and start seeing rate limits.

## Actor input object example

```json
{
  "careerSiteUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "searchText": "",
  "maxJobsPerSite": 50,
  "postedWithinDays": 0,
  "locationsFilter": [],
  "fetchJobDetails": true,
  "concurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every job with title, location, posted date, job req ID, full description and apply link.

## `jobsCsv` (type: `string`):

The same records as a spreadsheet-ready CSV file.

## `consoleView` (type: `string`):

Open the run's dataset in Apify Console.

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

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

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

```

## MCP server setup

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