# Workday Jobs Scraper | Any Company Career Site (`automatic/workday-jobs-scraper`) Actor

Scrape open jobs from any Workday career site (myworkdayjobs.com): title, locations, posting date, link, plus optional descriptions, job family, time type and salary. Up to 20 companies per run. Export JSON, CSV or Excel. $0.75 per 1,000 jobs.

- **URL**: https://apify.com/automatic/workday-jobs-scraper.md
- **Developed by:** [Philip Kirkbride](https://apify.com/automatic) (community)
- **Categories:** Jobs
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 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

Collect open jobs from Workday career sites into one downloadable table. Give it the career site of any employer that hires through Workday (addresses ending in `myworkdayjobs.com`) and it returns each open job with its title, locations, posting date and link, plus the full description and job details when you ask for them.

It suits recruiters and sourcers tracking openings at target companies, analysts comparing hiring across employers, and anyone who wants a job alert for a company that has no public feed.

### What you get

- One row per open job, from one to twenty career sites in a single run.
- Title, employer, locations, remote type, time type, posting date and the public job link.
- A plain-text description and job details when `includeDetails` is on.
- Per-site results in the run summary, so a site that returns nothing is named.
- Up to 5,000 jobs per site.

### How to run it

1. Paste the career site address, for example `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`. Use the site's front page, not a single job page.
2. Optionally add search words such as `software engineer`, or filters the site offers.
3. Set how many jobs per site (default 50) and turn on details if you need descriptions.

The Console form is filled in with the NVIDIA career site, 50 jobs, no details. That run takes a few seconds and costs about **$0.0425** (a $0.005 start plus 50 jobs at $0.00075).

```json
{
  "careerSiteUrls": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
  "searchText": "software engineer",
  "maxItems": 100,
  "includeDetails": true
}
```

### Cost

You pay $0.005 when the run starts and $0.00075 for each job saved to the dataset. Descriptions and job details carry no separate charge.

| Run | Jobs | Cost |
|---|---|---|
| Console default, one site | 50 | $0.0425 |
| Three sites, 50 each | 150 | $0.1175 |
| One site with details | 500 | $0.38 |

Only delivered rows are charged, so a site with no matching jobs adds nothing to the bill.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `careerSiteUrls` | list of 1 to 20 addresses | NVIDIA career site | Workday career site front pages, ending in `myworkdayjobs.com`. |
| `searchText` | text | empty | Optional search words. Empty collects all open jobs. |
| `filters` | object | `{}` | Site filters as filter name → exact labels, for example `{"timeType": ["Full time"]}`. |
| `maxItems` | whole number, 1 to 5000 | `50` | Jobs to collect per site. |
| `includeDetails` | true/false | `false` | Collect the description and job details for each job. |

Each employer publishes its own filters. A filter name or label the site does not offer stops that site with a message naming it, and the other sites carry on.

### Output example

Every row has the same fields:

| Field | Meaning |
|---|---|
| `jobId` | The employer's requisition ID. |
| `company` | Hiring organization, with details on. |
| `title` | Job title as published. |
| `locations` | All listed locations; a summary such as `3 Locations` when the list does not name them. |
| `remoteType` | Work arrangement as published, with details on. |
| `timeType` | For example Full time, with details on. |
| `postedDate` | Calendar date when the site says "Posted Today", "Posted Yesterday" or "Posted N Days Ago". |
| `postedDateRaw` | The site's own wording, kept as published. |
| `url` | Public job page. |
| `descriptionText` | Plain-text description, with details on. |
| `jobFamily` | Job family or category, with details on. |
| `salaryText` | Pay when the posting states it plainly, with details on. |
| `observedAt` | When the job was collected (UTC). |

Example row (details on, description shortened):

```json
{
  "jobId": "JR2028995",
  "company": "2100 NVIDIA USA",
  "title": "Technical Product Marketing MBA Intern, AI Infrastructure - Summer 2027",
  "locations": [
    "US, CA, Santa Clara"
  ],
  "remoteType": null,
  "timeType": "Full time",
  "postedDate": "2026-11-03",
  "postedDateRaw": "Posted Today",
  "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Technical-Product-Marketing-MBA-Intern--AI-Infrastructure---Summer-2027_JR2028995",
  "descriptionText": "We are looking for an MBA Intern to join NVIDIA’s AI Infrastructure product marketing team! You will work with product, marketing, and sales teams to translate accelerated computing technologies into clear messaging, compelling content, and business value for customers. What you’ll be doing: Researching customer needs, market trends, and competitive offerings across AI infrastructure, training, inference, and accelerated computing.",
  "jobFamily": null,
  "salaryText": null,
  "observedAt": "2026-11-03T02:28:00+00:00"
}
```

Export the dataset as JSON, CSV or Excel, or read it with the Apify API.

### FAQ

**Why are company, time type, description and salary empty?**
They come from each job's page, so they are filled only with `includeDetails` on. The job list itself carries titles, locations and posting dates.

**Why is `postedDate` empty for some rows?**
Workday says "Posted 30+ Days Ago" for older jobs. That is not a date, so `postedDate` stays empty and `postedDateRaw` keeps the wording.

**Why is `salaryText` empty when the job clearly pays?**
It is filled only when the posting states pay plainly. Many employers publish no salary at all.

**Why do some locations say "3 Locations"?**
The job list sometimes summarises multiple locations without naming them. The label is kept as published rather than invented.

**Why did one site deliver nothing?**
The run summary lists each site's status. A site with no matching jobs is `no_results`; a problem on one site does not stop the others.

**Can I collect from several employers?**
Yes, up to 20 career sites in one run. Each site counts toward its own `maxItems`.

**Will I see the same job twice?**
Within a run, jobs are deduplicated per site by requisition ID. Across runs, an open job appears again; use the job link or `jobId` plus company as your unique key.

**Can I run it on a schedule?**
Yes. Daily runs with details off are fast; keep the `jobId` values you have seen to build a job alert.

### Limitations

- Only Workday career sites (addresses ending in `myworkdayjobs.com`) are covered. Other career-site platforms are not.
- Workday shows at most about 2,000 jobs for one search, so a site returns up to 2,000 jobs per run. Use narrower search words or filters for very large employers.
- Details are slower because each job's page is collected on its own. If a run reaches its time limit, you keep every job collected so far and the run message says why it stopped.

### Privacy

Public job postings are returned as published, including employer-provided names, business contacts and application instructions. Descriptions are converted to plain text.

### Pricing

Pay per event: $0.005 per run start and $0.00075 per delivered job. The start charge is per GB of memory, rounded up; the default 512 MB run is one start.

# Actor input Schema

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

Enter one or more public Workday career site front pages, for example https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. Addresses end in myworkdayjobs.com; do not paste a single job page.

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

Optional search words, for example software engineer. Leave empty to search all jobs on each career site.

## `filters` (type: `object`):

Map site facet names to arrays of exact displayed labels, such as timeType: \["Full time"]. Only values offered by each site are accepted.

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

Enter the maximum number of jobs to collect per career site, from 1 to 5000. If omitted, 50 jobs per site are collected.

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

Enable to fetch full job details, including available descriptions and other job fields. If omitted or disabled, only search results are collected.

## Actor input object example

```json
{
  "careerSiteUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "searchText": "",
  "filters": {},
  "maxItems": 50,
  "includeDetails": false
}
```

# 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 = {
    "careerSiteUrls": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "searchText": "",
    "filters": {},
    "maxItems": 50,
    "includeDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("automatic/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"],
    "searchText": "",
    "filters": {},
    "maxItems": 50,
    "includeDetails": False,
}

# Run the Actor and wait for it to finish
run = client.actor("automatic/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"
  ],
  "searchText": "",
  "filters": {},
  "maxItems": 50,
  "includeDetails": false
}' |
apify call automatic/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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