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

Open jobs from any company's Workday careers site in one clean format: title, location, posted date, requisition ID and apply link. Filter by keyword, location and date, or get only jobs added since your last run.

- **URL**: https://apify.com/leezx/workday-jobs-scraper.md
- **Developed by:** [Leo Lee](https://apify.com/leezx) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 jobs

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 (New-Jobs Alerts)

Get the open jobs of any company that hires through **Workday**, in one clean format. Every job comes back with the same fields: title, company, location, posted date, job requisition ID and apply link. Turn on descriptions to also get the full text, the exact posting date and a pay range when the posting states one.

It reads the public job feed that every Workday careers site uses for its own pages. No login, no browser, no proxy.

### Use this Actor when you want to

- **Build a job feed or job board** from a list of employers.
- **Watch target employers for new roles**. Turn on "Only jobs not seen in earlier runs" and put it on a schedule.
- **Find who is hiring** for a skill or in a city. Many large banks, retailers, chip makers, hospitals and universities use Workday.
- **Feed an AI agent or spreadsheet** with fresh, structured job data.

### How to use it

1. Open the company's careers page and copy its link from the address bar. It contains `myworkdayjobs.com`, for example `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`. A link to a single job on that site works too.
2. Paste the links into **Careers-site links**. Optionally add search words and filters.
3. Run. Download the results as JSON, CSV or Excel, or call the Actor from the API.

A company name alone does not work, because Workday sites have no standard address. The link is needed.

Filters run before billing, so you only pay for jobs that match.

#### Example: engineering jobs posted in the last 7 days

```json
{
    "companies": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
    "titleKeywords": ["engineer"],
    "postedWithinDays": 7,
    "maxItems": 200
}
```

#### Example: daily new-jobs feed for one city

```json
{
    "companies": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
    "locationKeywords": ["santa clara"],
    "onlyNewSinceLastRun": true,
    "stateKey": "nvidia-santa-clara",
    "includeDescription": true
}
```

The first run returns everything that matches. Each later run with the same `stateKey` returns only jobs that were not returned before.

### Output

One job looks like this, with "Include the job description" switched on (made-up values, not a real posting):

```json
{
    "id": "workday:exampleco:External:R-12345",
    "platform": "workday",
    "company": "Exampleco",
    "companySlug": "exampleco",
    "employer": "Example Co Inc",
    "site": "External",
    "jobReqId": "R-12345",
    "title": "Backend Engineer, Payments",
    "location": "Austin, Texas, United States",
    "otherLocations": [],
    "workplaceType": null,
    "employmentType": "full_time",
    "employmentTypeRaw": "Full time",
    "postedText": "Posted 3 Days Ago",
    "postedAt": "2026-10-26",
    "postedAtSource": "detail",
    "salaryMin": 150000,
    "salaryMax": 210000,
    "salaryCurrency": "USD",
    "salaryInterval": "year",
    "salarySource": "description",
    "salaryText": "$150,000 - $210,000 USD",
    "jobUrl": "https://exampleco.wd5.myworkdayjobs.com/External/job/Austin/Backend-Engineer-Payments_R-12345",
    "applyUrl": "https://exampleco.wd5.myworkdayjobs.com/External/job/Austin/Backend-Engineer-Payments_R-12345/apply",
    "scrapedAt": "2026-10-29T12:00:00.000Z"
}
```

Newest jobs come first where Workday gives a date. `description` (text) or `descriptionHtml` is added when you turn on "Include the job description". Employment type, workplace type and pay are filled in only when the job page is read (descriptions on) or the posting says so.

### Good to know

- **Dates:** Workday's list only says things like "Posted 3 Days Ago". The Actor turns exact ones into a date (`postedAtSource: "list"`). "Posted 30+ Days Ago" has no date. With descriptions on, or with "Posted within the last (days)" set, the Actor opens the job page and uses the exact date (`postedAtSource: "detail"`).
- **Locations:** Workday shows "2 Locations" for jobs in several places. When you filter by location, the Actor opens those jobs to check every location.
- **Large employers:** Workday returns at most 2,000 jobs per search. At very large employers, add search words (a city or a role) to reach the rest.
- **Pay:** Found only when the posting text states a range. It is a best-effort read (`salarySource: "description"`), so check the posting.
- **Company name:** `company` is made from the careers-site address (`nvidia` becomes "Nvidia"), so it is the same in every run. Use `companySlug` as the stable key. With descriptions on, `employer` also holds the legal hiring entity Workday lists for the job (for example "2100 NVIDIA USA"); without descriptions it is `null`.
- **Links that do not work:** a link that is not a Workday careers site is skipped with a warning. A site that is not found is counted in the run summary (key `SUMMARY`) and costs nothing.

### Pricing

You pay per job returned (see the pricing box on this page). A job you filter out is never billed. Set "Maximum jobs to return" to cap your spend. If you also set a maximum cost per run in the run options, the Actor stops returning jobs when that limit is reached and says so in the run summary. In "only jobs not seen in earlier runs" mode, the jobs it held back are not remembered, so they come back on your next run.

### About the data

Job data is read as-is from the companies' public Workday careers sites. It may be incomplete or out of date. Check a job on the company's site before relying on it. The Actor returns only what companies publish for job seekers and does not collect any personal data on purpose; job descriptions are the company's own text.

This Actor is not affiliated with or endorsed by Workday, Inc. or any employer. Workday is a trademark of its owner and is used here only to say which careers sites are supported.

Found a bug or a careers site that does not work? Open an issue on this Actor's page and include the link.

### Changelog

- **1.0** First release: Workday careers sites, filters, exact dates, pay ranges, new-jobs mode.

# Actor input Schema

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

Open the company's careers page and copy its link from the address bar. It contains <code>myworkdayjobs.com</code>, for example <code>https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite</code>. A link to a single job on that site works too.

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

Workday's own search box, applied before anything is downloaded. Use it to reach past the first 2,000 jobs at big employers, for example a city or a role.

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

Keep a job if its title contains at least one of these words or phrases. Not case sensitive. Leave empty for all jobs.

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

Drop any job whose title contains one of these, for example <code>intern</code> or <code>manager</code>.

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

For example <code>kuala lumpur</code>, <code>germany</code>, <code>remote</code>. Jobs shown as "2 Locations" are opened to check all of their locations.

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

Keep only jobs posted in the last N days. 0 means any date. Workday's list only shows rough dates, so job pages are opened for jobs it cannot place.

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

Opens every job page and adds the full description, exact posting date, employment type, all locations and a pay range when the text states one. Slower on big runs. The price per job stays the same.

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

Used only when the description is included.

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

The first run returns everything that matches. Later runs with the same name below return only jobs that were not returned before. Good for daily or weekly schedules.

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

Use a different name for each saved search so their memory stays separate. Only used with the option above.

## `maxItems` (type: `integer`):

Newest jobs come first where Workday gives a date. Set this to control your spend.

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

0 means no limit per company.

## Actor input object example

```json
{
  "companies": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://adobe.wd5.myworkdayjobs.com/external_experienced",
    "https://workday.wd5.myworkdayjobs.com/Workday"
  ],
  "postedWithinDays": 0,
  "includeDescription": false,
  "descriptionFormat": "text",
  "onlyNewSinceLastRun": false,
  "stateKey": "default",
  "maxItems": 10,
  "maxJobsPerCompany": 0
}
```

# Actor output Schema

## `results` (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 = {
    "companies": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "https://adobe.wd5.myworkdayjobs.com/external_experienced",
        "https://workday.wd5.myworkdayjobs.com/Workday"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("leezx/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 = {
    "companies": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "https://adobe.wd5.myworkdayjobs.com/external_experienced",
        "https://workday.wd5.myworkdayjobs.com/Workday",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("leezx/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 '{
  "companies": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://adobe.wd5.myworkdayjobs.com/external_experienced",
    "https://workday.wd5.myworkdayjobs.com/Workday"
  ],
  "maxItems": 10
}' |
apify call leezx/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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