# Workday Jobs Scraper (`santamaria-automations/workday-jobs-scraper`) Actor

Scrape jobs from any Workday job site (myworkdayjobs.com): title, company, location, employment type, posting date, apply URL, salary where stated and full description. Filter by keyword, location and date. Pay per result.

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

## Pricing

Pay per event

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

Get the open jobs of any company that hires through [Workday](https://www.workday.com). Paste the URL of a Workday job site (`https://{company}.wd5.myworkdayjobs.com/{site}`) and receive title, location, employment type, posting date, apply URL, salary where the posting states one, and the full job description. No login, no API key. Fast, with clean rows.

Workday is the job system of most large enterprises (NVIDIA, Salesforce, Mastercard, Cisco and thousands more). The actor reads the same public job search that the career site itself uses, so the data is live at run time.

### What you can do with it

- Pull the open roles of large employers for recruiting research and lead generation.
- Watch hiring at specific companies: run it on a schedule with `postedWithinDays` and `sortBy: newest`.
- Search a whole Workday job site by keyword and location; the search is done by Workday itself, so only matching jobs are paged.
- Build job alerts and datasets from Workday career sites.

### Two ways to run it

A run is in exactly one mode, decided from your input and written to the run log.

| Your input | Mode | What happens |
|------------|------|--------------|
| `companies` (with or without `keywords`) | **Company mode** | Reads exactly the Workday job sites you list. `keywords` only filter their jobs. |
| `keywords` and no `companies` | **Keyword search** | Searches the jobs of many companies at once, from a built-in list of 3,662 Workday job sites, biggest hirers first. |
| nothing (`{}`) | Company mode | Reads four sample job sites. |

Keyword search answers "which large employers are hiring a data engineer in Germany right now" without knowing the companies in advance. It sends your keyword to each company's own Workday search (one search per keyword and company), matches the job title, and reads the full posting only for the jobs it keeps. Rows are pushed as the companies are scanned, so you see results early. Use `countries`, `location`, `postedWithinDays` and `maxCompanies` to narrow it and `maxResults` to stop early. Each search reads the first page of Workday's results per keyword, so a company with many matches contributes its best matches rather than all of them; use company mode with its job site URL for a full list. The built-in list is verified live when it is generated and refreshed with each release.

Every row has the same fields in both modes, and duplicates are removed before anything is charged.

### Input

| Field | Description |
|-------|-------------|
| `companies` | Company mode. Workday job site URLs. Strings, `{"url": "..."}` objects, a single string, or several separated by commas or new lines. Empty (and no keywords) = four sample job sites. |
| `keywords` | Keep only jobs whose title matches at least one keyword (also sent to Workday's own search). With no `companies` it starts keyword search. |
| `location` | Keep only jobs in this city, region or country (`Berlin`, `Germany`, `DE`). |
| `includeRemoteWithoutRegion` | boolean | Only with a country filter: also keep remote jobs that state no country or region (they may not be open to applicants in that country). | `false` |
| `countries` | Keyword search only. ISO-2 codes such as `["DE", "CH"]`: skips companies known not to hire there and keeps only jobs in these countries (jobs whose country cannot be determined are left out). |
| `maxCompanies` | Keyword search only. How many job sites of the built-in list are scanned, biggest hirers first. Default 500. |
| `postedWithinDays` | Drop jobs older than this many days. Workday publishes relative dates ("Posted 3 Days Ago"), read at day resolution. |
| `sortBy` | `newest` (default) or `relevance` (Workday's own order). |
| `maxJobsPerCompany` | Cap per job site, counted after the filters. `0` = all. Default 50. |
| `maxResults` | Cap for the whole run. The run stops cleanly when it is reached. `0` = no limit. Default 100. |
| `includeDescription` | Include the full description HTML (one extra request per returned job). Default `true`. |

Remote jobs under a country filter: a country filter is the `location` input when it is a country (`Germany`, `DE`). A remote job is kept when its text names that country (`Remote - Germany`, `Remote (DE)`, `Germany (Remote)`), names a region that contains it (EMEA, Europe, EU, DACH for DE/AT/CH, Americas or North America for US/CA, LATAM, APAC, UK & Ireland) or says it is open worldwide (`Worldwide`, `Anywhere`, `Global`). A remote job that names another country or a region without your country is dropped. A job that says only `Remote` (also `Remote OK`, `Fully remote`, or a remote flag with no place) does not state where it can be filled from, so it is left out by default and not charged; the run status says how many were left out. Turn on `includeRemoteWithoutRegion` to keep them anyway (they may not be open to applicants in your country). Jobs with a physical place are judged by that place as before.

#### Example: keyword search

```json
{
  "keywords": ["data engineer", "product manager"],
  "countries": ["DE", "CH"],
  "postedWithinDays": 14,
  "maxResults": 100
}
```

#### Example: job site URLs

```json
{
  "companies": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    { "url": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site" }
  ],
  "keywords": ["engineer"],
  "location": "United States",
  "postedWithinDays": 7,
  "sortBy": "newest",
  "maxJobsPerCompany": 25
}
```

#### Example: one string with several sites

```json
{
  "companies": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, https://cisco.wd5.myworkdayjobs.com/Cisco_Careers",
  "maxResults": 40
}
```

A Workday job site cannot be guessed from a company name, so the full URL is needed. Open the company's careers page, click a job, and copy the part of the address up to the job site name. The URL of a single posting (with `/job/...`) is reduced to its job site. Only Workday sites are read: a URL of another job system is skipped with a log line and is never charged. For Greenhouse, Lever and Ashby use the [Greenhouse, Lever & Ashby Jobs Scraper](https://apify.com/santamaria-automations/greenhouse-lever-ashby-jobs-scraper), and for 40 more systems use [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper).

### Output

One dataset row per job. Duplicates are removed before anything is charged, so the number of rows is the number of results you pay for.

```json
{
  "id": "workday-72bdf9ec-JR2015832",
  "ats_job_id": "JR2015832",
  "title": "Senior Software Engineer, Platform Engineering",
  "company": "NVIDIA USA",
  "ats_platform": "workday",
  "location": "US, CA, Santa Clara",
  "city": "Santa Clara",
  "country": "US",
  "employment_type": "Full-time",
  "remote": false,
  "description": "<p>NVIDIA has been transforming computer graphics ...</p>",
  "apply_url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Senior-Software-Engineer--Platform-Engineering_JR2015832/apply",
  "job_url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Senior-Software-Engineer--Platform-Engineering_JR2015832",
  "language": "en",
  "created_at": "2026-10-20",
  "posted_at_text": "Posted Today",
  "salary_text": "168,000 USD - 270,250 USD",
  "salary_min": 168000,
  "salary_max": 270250,
  "salary_currency": "USD",
  "salary_source": "stated",
  "hiring_organization": "NVIDIA USA",
  "scraped_at": "2026-10-21T04:37:32Z"
}
```

Workday only publishes relative dates, so `created_at` is a day and `posted_at_text` keeps Workday's original wording. Postings older than 30 days are shown by Workday as "Posted 30+ Days Ago". `salary_*` fields are filled only when the posting states a salary; they are never estimated.

### Pricing

Pay per result. You pay the platform start fee per run and then only for the jobs you receive. Filtered-out and duplicate jobs are never charged.

| Event | When | Price |
|---|---|---|
| `job-result` | one job from company mode (you list the companies) | $0.001 |
| `job-result-keyword-search` | one job from keyword search across companies | $0.001 |

The pricing box on the actor page always shows the current rates.

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client, such as Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

**Example prompts once connected:**

> "Use `workday-jobs-scraper` to list the newest 30 engineering jobs at NVIDIA (https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite). Return title, location and apply URL."

> "Use `workday-jobs-scraper` on the Cisco and Salesforce Workday sites and show which roles are in Germany."

> "Use `workday-jobs-scraper` keyword search for `data engineer` in Switzerland, posted in the last 14 days, and return the 30 newest with company and apply URL."

Configure the MCP server with the Workday Jobs Scraper preconfigured at `mcp.apify.com?tools=santamaria-automations/workday-jobs-scraper`:

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=santamaria-automations/workday-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}
```

See the auto-generated API tab on the actor page for language-specific examples (cURL, JavaScript, Python, and more).

### FAQ

**Do I need an API key or a Workday account?**
No. The actor reads the public job search of the career site.

**Which companies does keyword search cover?**
A built-in list of 3,662 Workday job sites of employers, built from our company directory and public lists of Workday career sites, and checked live (the job search answered and had at least one open job) when the list was generated. It is not every Workday customer. If a company you need is missing, pass its job site URL in `companies` instead.

**Why is a full URL required?**
A Workday job site is made of a company name, a data center number (`wd1`, `wd5`, `wd12`) and a site name that differ per company. They cannot be derived from the company name.

**How long does a run take?**
Listing is quick. With `includeDescription` on, every returned job needs one more request, so a run of 100 jobs takes about a minute. Switch descriptions off for the fastest run.

**What if a job site is not found?**
The run continues with the other sites. The run status line names the site and the reason (for example `board_not_found`), and nothing is charged for it.

**Why did I get fewer jobs than `maxJobsPerCompany`?**
The caps apply after your filters, and a job site can simply have fewer matching jobs. Sites are read in the order you list them, and the run stops once `maxResults` is reached.

### Related actors

- [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper): the same engine for 40+ job systems (SmartRecruiters, Personio, Workable, SuccessFactors and more).
- [Greenhouse, Lever & Ashby Jobs Scraper](https://apify.com/santamaria-automations/greenhouse-lever-ashby-jobs-scraper): jobs of any Greenhouse, Lever or Ashby board.
- [Website Job Extractor](https://apify.com/santamaria-automations/website-job-extractor): any company website to its careers page, job system and jobs.
- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-http-scraper): Indeed job listings in 60+ countries.
- [Glassdoor Scraper](https://apify.com/santamaria-automations/glassdoor-scraper): Glassdoor jobs with employer ratings and salary estimates.

### Support

- **Questions or issues?** Email contact@nanoscrape.com, we typically reply within 6 hours, or open a ticket in the Issues tab on the actor page.
- **Need a scraper for a job board we don't cover yet?** Email contact@nanoscrape.com with the target site and your rough usage volume.

# Actor input Schema

## `companies` (type: `array`):

COMPANY MODE. Workday job site URLs such as https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, as strings or as {"url": "..."} objects (a single string, or several separated by commas or new lines, also works). A URL of one job posting is reduced to its job site. URLs of other job systems are skipped with a log line and are never charged. With no companies and no keywords the actor runs four sample job sites (an empty input does this too). With keywords and no companies it runs KEYWORD SEARCH instead (see Keywords). If you give both companies and keywords, it reads only your companies and the keywords filter their jobs.

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

Return only jobs whose TITLE matches at least one of these words or phrases (OR). Case and accents are ignored. A keyword of 4 or more characters matches anywhere inside the title; a keyword of 3 or fewer characters (for example QA, PM) must match as a whole word. Example: \["engineer", "manager"]. KEYWORD SEARCH MODE: when you give keywords and leave Companies empty, the actor searches the jobs of many companies at once, from a built-in list of 3,662 companies that use Workday, biggest hirers first (see Max Companies). With no keywords and no companies, it runs the four sample job sites.

## `location` (type: `string`):

Optional. Return only jobs in this city, region or country, for example "London", "Germany" or "DE". Country names and ISO codes match in both directions. In keyword search mode it filters the jobs found at every company.

## `includeRemoteWithoutRegion` (type: `boolean`):

Only matters when you filter by country (the Location input is a country, or a query carries a country). Off (default): a remote job counts for the country only when it names it ("Remote - Germany"), names a region that contains it (EMEA, Europe, EU, DACH, Americas, APAC) or is open worldwide. Remote jobs that say only "Remote" are left out and are not charged. On: those jobs are kept too, but they may not be open to applicants in the chosen country.

## `countries` (type: `array`):

Only used by keyword search (keywords given, no companies). ISO 3166-1 alpha-2 codes such as \["DE", "CH"]. Skips companies of the built-in list that are known not to hire in these countries, and returns only jobs located in these countries (jobs whose country cannot be determined are left out). Ignored when you list companies.

## `maxCompanies` (type: `integer`):

Only used by keyword search. How many companies of the built-in list (3,662 in total) are scanned, biggest hirers first (by open jobs). A smaller number is faster; the run also stops as soon as Max Results is reached.

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

Optional. Drop jobs posted more than this many days ago. Jobs without a posting date are kept.

## `sortBy` (type: `string`):

"newest" returns the most recently posted jobs of each company first, so maxJobsPerCompany keeps the newest ones. "relevance" keeps the site's own order. In company mode, companies are read in the order you list them. In keyword search mode, rows are pushed as each company is scanned (biggest hirers first) and are ordered newest first within each company.

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

Maximum number of jobs returned per company, counted after the filters (filtered-out jobs are never returned or charged). 0 = all jobs. In keyword search mode this also limits how many matching jobs one company can contribute, so no single company fills the result.

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

Maximum number of jobs returned in total across all companies. The run stops cleanly once it is reached. 0 = no limit.

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

Include the full job description (HTML) in the output. Switch off for a smaller, faster run.

## Actor input object example

```json
{
  "keywords": [
    "data engineer"
  ],
  "includeRemoteWithoutRegion": false,
  "maxCompanies": 500,
  "sortBy": "newest",
  "maxJobsPerCompany": 10,
  "maxResults": 50,
  "includeDescription": true
}
```

# Actor output Schema

## `items` (type: `string`):

Job listings from Workday job sites

# 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 = {
    "keywords": [
        "data engineer"
    ],
    "maxJobsPerCompany": 10,
    "maxResults": 50,
    "includeDescription": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/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 = {
    "keywords": ["data engineer"],
    "maxJobsPerCompany": 10,
    "maxResults": 50,
    "includeDescription": True,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/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 '{
  "keywords": [
    "data engineer"
  ],
  "maxJobsPerCompany": 10,
  "maxResults": 50,
  "includeDescription": true
}' |
apify call santamaria-automations/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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