# Workday Jobs Scraper (`praise-most-high/workday-jobs-scraper`) Actor

Workday Jobs Scraper extracts job postings from any company career site hosted on myworkdayjobs.com. One row per posting: title, company, location, posted date, job ID, URL and full description text. Filter by keyword, location and posting age. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/praise-most-high/workday-jobs-scraper.md
- **Developed by:** [angel nguyen](https://apify.com/praise-most-high) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job posting returneds

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 extracts job postings from any company career site hosted on myworkdayjobs.com and returns one row per posting: title, company, location, posted date, job ID, URL and the full description as plain text. Give it a career-site URL or a tenant name, and filter by keyword, location and posting age.

### What does Workday Jobs Scraper do?

Thousands of employers run their careers page on Workday. Each one is a separate site with its own address, so collecting postings across companies means opening every site by hand. This Actor reads the same public job search the career site itself uses and writes every posting to one dataset.

- **Input:** one or more career-site URLs such as `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`, or a bare tenant name such as `adobe`.
- **Output:** one row per job posting with 19 fields, including the full description text.
- **Filters:** keyword, location and "posted within N days".
- **No login, no API key, no proxy setup.** The Actor reads public pages only.

It was run on Apify against four employers on 2026-10-02 (NVIDIA, Adobe, Mastercard and Salesforce). Each run returned real postings, and the title, job ID and posted date of the checked rows matched the employer's own posting page.

### What Workday jobs data can you extract?

| Field | What it holds | Example from a real run |
|---|---|---|
| `title` | Job title | Senior Compiler Engineer, Agentic Compiler Systems |
| `company` | Hiring organization named on the posting. This is often a legal entity. | 2100 NVIDIA USA |
| `tenant` | The employer's Workday tenant name | nvidia |
| `careerSite` | The career site the posting came from | NVIDIAExternalCareerSite |
| `jobId` | The employer's requisition ID | JR2026138 |
| `jobPostingId` | Workday's posting identifier | Senior-Compiler-Engineer--Agentic-Compiler-Systems\_JR2026138-1 |
| `location` | Primary location | US, CA, Santa Clara |
| `additionalLocations` | Other locations for the same posting | \["US, TX, Austin", "US, TX, Remote"] |
| `country` | Country of the posting | United States of America |
| `remoteType` | Remote or office label, when the employer publishes one | Remote Customer-Based |
| `timeType` | Full time or part time | Full time |
| `postedDate` | Posting date, ISO format | 2026-09-17 |
| `postedText` | The site's own relative date | Posted 14 Days Ago |
| `closingDate` | Closing date, when the employer publishes one | 2026-10-09 |
| `url` | Public link to the posting | https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/... |
| `descriptionText` | Full job description as plain text | We are looking for an outstanding Senior Compiler Engineer... |
| `descriptionHtml` | Original description HTML (optional, off by default) | `<p>We are looking for...</p>` |
| `canApply` | Whether the posting accepts applications | true |
| `scrapedAt` | When the row was read | 2026-10-02T05:20:11.838Z |

A field the employer does not publish is `null`. The Actor never fills a gap with a guess. In the four test runs `closingDate` was empty on 19 of 20 postings and `remoteType` on 15 of 20, because most employers do not publish them.

### How to scrape Workday jobs

1. Open the employer's careers page and copy the address. It looks like `https://<company>.wd5.myworkdayjobs.com/<SiteName>`.
2. Paste it into **Workday career sites**. Add more sites if you want several employers in one run.
3. Optionally set a keyword, a location and a maximum posting age.
4. Set **Maximum postings**. This is also your cost ceiling.
5. Start the run and download the dataset as JSON, CSV or Excel, or read it from the Apify API.

If you only know the company's tenant name, enter that instead of a URL. The Actor finds the tenant's host and reads every public career site that host lists in its `robots.txt`.

### How much does it cost to scrape Workday jobs?

**$0.002 per job posting delivered, which is $2.00 per 1,000 postings.** Starting a run costs $0.00001.

| Postings delivered | Cost |
|---|---|
| 100 | $0.20 |
| 1,000 | $2.00 |
| 10,000 | $20.00 |

You pay only for postings written to the dataset. A site that cannot be reached, a tenant name that does not resolve, or a search with no matching posting costs nothing beyond the start fee. In the test run with a tenant name that does not exist, the charge for postings was zero.

The price is the same on every Apify plan. If you set a maximum charge for the run, the Actor stops when that limit is reached and says so in the log.

### Input example

```json
{
    "sites": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
    "keyword": "compiler",
    "maxItems": 5
}
```

| Field | Type | What it does |
|---|---|---|
| `sites` | list of strings, required | Career-site URLs or tenant names |
| `keyword` | string | Sent to the site's own search box |
| `location` | string | A country, a city or `Remote`. Matched against the site's own location filters first. If the site has no filter with that name, it is matched against each posting's location text. |
| `postedWithinDays` | integer | Keeps postings whose posting date is at most this many days old |
| `maxItems` | integer, default 100 | Stops the run after this many postings across all sites |
| `includeDescriptionHtml` | boolean, default false | Adds the original HTML next to the plain text |

### Output example

This is a row from the run with the input above, on 2026-10-02. The description is shortened here; the dataset holds the full text.

```json
{
    "title": "Senior Compiler Engineer, Agentic Compiler Systems",
    "company": "2100 NVIDIA USA",
    "tenant": "nvidia",
    "careerSite": "NVIDIAExternalCareerSite",
    "jobId": "JR2026138",
    "jobPostingId": "Senior-Compiler-Engineer--Agentic-Compiler-Systems_JR2026138-1",
    "location": "US, CA, Santa Clara",
    "additionalLocations": ["US, TX, Austin", "US, TX, Remote", "US, OR, Remote", "US, CA, Remote", "US, WA, Redmond"],
    "country": "United States of America",
    "remoteType": null,
    "timeType": "Full time",
    "postedDate": "2026-09-17",
    "postedText": "Posted 14 Days Ago",
    "closingDate": null,
    "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Senior-Compiler-Engineer--Agentic-Compiler-Systems_JR2026138-1",
    "descriptionText": "We are looking for an outstanding Senior Compiler Engineer to help build the next generation of intelligent compiler technologies for NVIDIA's accelerated computing stack. ...",
    "descriptionHtml": null,
    "canApply": true,
    "scrapedAt": "2026-10-02T05:20:11.838Z"
}
```

Each run also writes an `OUTPUT` record to the key-value store. It lists every site, how many postings the site reported, how many were delivered, which location filter was applied, and the reason for any site that was skipped.

### Limits you should know

- **2,000 postings per search.** Workday serves at most 2,000 postings for one search on one site. On a larger site, run several searches with different keywords or locations. The log warns you when a site reports 2,000.
- **Maximum postings applies to the whole run.** With several sites and a low limit, the first site can use the whole limit. Raise the limit or run one site per run.
- **Tenant names.** A bare tenant name is tried on 21 known Workday hosts. If none answers, the entry is skipped at no charge. Use the full URL in that case.
- **Location text.** Location names differ between employers. `Canada` on one site is `Ontario - Remote` on another. The `OUTPUT` record shows which of the site's own filter values matched.
- **Posting date.** `postedDate` is the posting's start date as the employer publishes it.

### Is it legal to scrape Workday job postings?

The Actor reads job postings that employers publish for anyone to see, without logging in. Before reading a site it fetches that site's `robots.txt` and skips any career site the file disallows. It reads at most four postings at a time and does not collect applicant or account data. Job descriptions belong to the employers who wrote them, so check how you plan to reuse the text. If you are unsure whether your use is allowed, ask a lawyer.

### FAQ

**Can I run it on a schedule?** Yes. Use an Apify schedule with `postedWithinDays` set to your interval to collect new postings only.

**Does it work for any company?** It works for career sites on `myworkdayjobs.com`. It was tested on four employers. A company that hosts its careers page elsewhere is out of scope.

**Why is `company` a strange name like "2100 NVIDIA USA"?** That is the hiring organization as the employer entered it in Workday. Use `tenant` when you need a short, stable company key.

**A site returned nothing. Was I charged?** No. Only delivered postings are charged. The `OUTPUT` record states the reason.

### Related Actors

Other data Actors from the same publisher:

- [NPPES NPI Registry Lookup](https://apify.com/praise-most-high/nppes-npi-registry-lookup) - US healthcare provider records from the CMS registry
- [Shopify Store Product Scraper](https://apify.com/praise-most-high/shopify-store-product-catalog) - product catalogs from Shopify stores
- [App Store Price & Rating Monitor](https://apify.com/praise-most-high/app-store-intelligence) - price, rating and version of Apple App Store apps
- [Skool Community Stats Scraper](https://apify.com/praise-most-high/skool-community-stats-scraper) - member and pricing stats for Skool communities

# Actor input Schema

## `sites` (type: `array`):

One or more Workday career-site URLs, for example https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. A bare tenant name such as nvidia also works: the Actor finds the tenant host and reads every public career site that host lists in its robots.txt. A site whose robots.txt disallows it is skipped and costs nothing.

## `keyword` (type: `string`):

Passed to the career site's own search box, so results match what the site itself returns for this text. Leave blank for every posting.

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

A country, city or the word Remote. Matched against the site's own location filters first; when the site has no filter with that name, it is matched against each posting's location text instead.

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

Keep only postings whose posting date is at most this many days old. Leave blank for any age.

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

The run stops after delivering this many postings across all sites, so this is also your cost ceiling: postings x $0.002. Workday serves at most 2,000 postings per search, so use a keyword or location to reach more on a very large site.

## `includeDescriptionHtml` (type: `boolean`):

Every row carries the description as plain text. Turn this on to also get the original HTML in descriptionHtml.

## Actor input object example

```json
{
  "sites": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "keyword": "software engineer",
  "location": "Canada",
  "postedWithinDays": 7,
  "maxItems": 20,
  "includeDescriptionHtml": false
}
```

# Actor output Schema

## `postings` (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 = {
    "sites": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("praise-most-high/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 = {
    "sites": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
    "maxItems": 20,
}

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

```

## MCP server setup

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