# Workday Jobs Scraper — Any Company's Careers Site (`axery/workday-jobs-scraper`) Actor

Scrape open jobs from any company's Workday careers site: title, full location list, department, full description. No login, no API key.

- **URL**: https://apify.com/axery/workday-jobs-scraper.md
- **Developed by:** [Axery](https://apify.com/axery) (community)
- **Categories:** Jobs, Automation, News
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.21 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Workday Job Board Scraper

Scrapes open jobs from any company's Workday careers site — title, full location list, department, full description. No login, no API key.

Thousands of enterprises run their careers site on Workday (NVIDIA, Salesforce, and many more), all reachable through the same public JSON API the site's own frontend calls. Useful for talent-market research, competitor hiring tracking, and sales lead generation from which teams a company is actively scaling.

### What makes this different

**Multi-location jobs are actually resolved.** Workday's list endpoint collapses a job posted to five offices into the string `"5 Locations"`, with no way to expand it there — the real list only exists on the per-job detail endpoint. This Actor fetches it and gives you the genuine site list in `locations`, not a placeholder you'd have to re-query for yourself.

**Page-size traps are handled invisibly.** Workday hard-caps its page size at 20 and returns a bare, unhelpful HTTP 400 for anything larger — no error message pointing at the actual cause. This Actor paginates at the size Workday actually accepts and you never see the 400.

**Tenant shard discovery.** Workday splits companies across `wd1`–`wd12+` hosts, and the shard isn't guessable from the company name. This Actor probes for the right one automatically, so you only need the tenant id and site id from the company's own careers URL — not which numbered shard they happen to sit on.

**A wrong site id fails with the actual cause.** Workday returns the identical generic error for "wrong site" and "wrong shard host," which would otherwise send a naive client cycling through all twelve hosts for no reason. This Actor recognizes Workday's specific "site not found" response and reports it immediately with the exact URL to check.

### Input

| Field | Type | Notes |
|---|---|---|
| `tenant` | string | From the careers URL, before `.wdN.myworkdayjobs.com`. |
| `site` | string | The path segment after the domain. |
| `searchText` | string | Optional filter, same as the site's own search box. |
| `includeDetail` | boolean | Full description + resolved locations, one extra request per job. |
| `maxItems` | integer | `0` = every match. |
| `wdHost` | string | Advanced: skip shard auto-detection. |
| `incremental` | boolean | Only jobs not seen in previous runs. |
| `proxyConfiguration` | object | Not normally needed. |

#### Finding tenant and site

From a URL like `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`: `tenant` is `nvidia`, `site` is `NVIDIAExternalCareerSite`. Not every company uses Workday, and a wrong site id fails clearly for that run rather than returning something silently empty.

#### The cost of full detail

With `includeDetail` on, this Actor makes one request per job in addition to the list pages — that's what recovers the description and the resolved location list, which the list endpoint alone cannot provide. For a very large board, consider `maxItems` or `searchText` to scope the pull, or turn detail off for a fast title/location-only pass.

### Output

```json
{
  "job_id": "myworkdayjobs.com:Director--Rack-Scale-Software-Architecture_JR2012499",
  "title": "Director, Rack Scale Software Architecture",
  "location": "5 Locations",
  "locations": ["US, CA, Santa Clara", "US, TX, Austin", "..."],
  "time_type": "Full time",
  "hiring_organization": "NVIDIA Corporation",
  "posted_label": "Posted 30+ Days Ago",
  "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/..."
}
```

Each run also writes a `RUN_COVERAGE` record to the key-value store with what was requested, what came back, and any failure — so a partial run is visible rather than silent.

### Local development

```bash
pip install -r requirements.txt
python test_local.py nvidia NVIDIAExternalCareerSite --max 25 --out sample_output.json
python test_local.py salesforce External_Career_Site --search python --no-detail
```

`sample_output.json` is real output from a live run against NVIDIA's board.

# Actor input Schema

## `tenant` (type: `string`):

The company's Workday tenant id, taken from its careers URL: the part before `.wdN.myworkdayjobs.com`. E.g. `nvidia` from `nvidia.wd5.myworkdayjobs.com/...`.

## `site` (type: `string`):

The career-site path segment right after the domain, e.g. `NVIDIAExternalCareerSite` from `nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`.

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

Filter to jobs matching this text, the same as typing into the site's own search box. Leave blank for every open job.

## `includeDetail` (type: `boolean`):

Fetch the full description and complete location list per job (one extra request per job). Turn off for a faster, lighter run when you only need titles and requisition IDs.

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

Cap on jobs returned. `0` returns every match.

## `wdHost` (type: `string`):

Advanced: the `wdN` shard from the company's URL (e.g. `wd5`), to skip auto-detection. Leave blank - the Actor finds it automatically.

## `incremental` (type: `boolean`):

Remember job IDs between runs and return only jobs not seen before.

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

Not normally needed - this is the same public API the company's own careers site calls.

## Actor input object example

```json
{
  "tenant": "nvidia",
  "site": "NVIDIAExternalCareerSite",
  "includeDetail": true,
  "maxItems": 25,
  "incremental": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per job: title, full location list, department, description, and requisition IDs.

# 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 = {
    "tenant": "nvidia",
    "site": "NVIDIAExternalCareerSite",
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("axery/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 = {
    "tenant": "nvidia",
    "site": "NVIDIAExternalCareerSite",
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("axery/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 '{
  "tenant": "nvidia",
  "site": "NVIDIAExternalCareerSite",
  "maxItems": 25
}' |
apify call axery/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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