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

Direct Workday CXS search and job-detail API extraction from public career sites.

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

## Pricing

from $1.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Jobs Scraper

### Overview

Direct Workday CXS search and job-detail API extraction from public career sites. This folder is a complete, standalone Apify Actor. Its layout intentionally follows the workspace’s `jobright-scraper`: source code lives under `src/`, platform definitions live under `.actor/`, the container is defined by `Dockerfile`, and the dataset can be checked with `dataset-validator.js`. It does not import code from another scraper folder, so it can be pushed, built, scheduled, or versioned independently.

The live extraction path is the public Workday career page or structured board endpoint supplied in `startUrls`. No account credential is required for the configured public source. Credentials are sent only in the relevant request header. The Actor never prints them, stores them in the dataset, or writes them to diagnostics.

### Extraction design

The Actor prefers structured public data. It normalizes source records into a stable job/profile contract and also retains every upstream field inside `rawData`. Null and undefined source values are removed recursively. Normalized fields use empty strings, empty arrays, or empty objects when an optional value is not published, so dataset records contain no JSON `null` values. This is deliberate: an empty value means “not supplied by the source,” not an invented fact.

For job records, the output can include identifiers, title, company, all locations, salary range and unit, employment type, workplace mode, dates, description text and HTML, responsibilities, requirements, benefits, skills, taxonomy, education, language, visa information, application links, recruiter data, organization enrichment, funding, classifications, and structured geocoding. Source-specific fields that do not have a normalized column remain available in `rawData`.

### Inputs

The full machine-readable input contract is in `.actor/input_schema.json`. Every Actor defaults to a maximum of ten results and enforces a minimum request of ten. Depending on this source, useful fields include search terms, location, time window, start URLs, concurrency, richer-description toggles, and secret credentials. Advanced filters are passed only as documented primitive query parameters; the Actor does not execute arbitrary code from input.

### Local development and verification

Install dependencies and run a ten-record smoke test:

```bash
npm install
apify run --purge --input '{"sampleMode":true,"maxItems":10}'
npm run validate:data
```

A source-live example is:

```bash
apify run --purge --input '{"startUrls":[{"url":"https://adobe.wd5.myworkdayjobs.com/external_experienced"}],"maxItems":10}'
npm run validate:data
```

The optional `sampleMode` uses Fantastic.jobs’ official ATS sample only to prove that the standalone normalization, schema, storage, and validator pipeline works. It is intentionally labelled `official_sample`; it is not a live test of this platform.

After each run, inspect `storage/datasets/default` for records and `storage/key_value_stores/default/RUN_SUMMARY.json` for machine-readable status. `SOURCE_METADATA` records the provider, source counts, and mode. A failure creates a sanitized `ERROR_DIAGNOSTIC`; it never creates fake fallback jobs or silently converts an access error into `no_results`.

### Production behavior

Push this folder as its own Actor with `apify push`. Configure secrets in Apify’s encrypted input or environment settings, not in source files. The output schema exposes direct links to the dataset, run summary, and diagnostic store. Deduplication uses a stable source ID or canonical URL. HTTP requests use bounded timeouts and limited retry with backoff for temporary network or rate-limit failures.

The Actor reads public job or profile information only. Availability and field completeness depend on what the upstream source publishes at run time. Empty optional fields are preserved honestly; values are never guessed. Respect the source’s terms, applicable privacy rules, API plan limits, and retention requirements when scheduling or redistributing output.

### Source identity

- Standalone actor: `workday-jobs-scraper`
- Original catalog reference ID: `Wr6SdZJXrPkf7WJb2`
- Provider mode: `direct`
- Source/platform: `Workday`
- Record type: `job`
- Default output request: `10`

# Actor input Schema

## `startUrls` (type: `array`):

Public Workday career pages or board URLs to extract.

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

Optional case-insensitive title or description filter.

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

Optional case-insensitive location filter.

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

Maximum records to output. The runtime enforces a minimum of ten.

## `maxConcurrency` (type: `integer`):

Maximum concurrent public detail-page requests.

## `sampleMode` (type: `boolean`):

Use Fantastic.jobs' public official ATS sample solely to validate this Actor's shared output contract. It does not test the configured platform live.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://adobe.wd5.myworkdayjobs.com/external_experienced"
    },
    {
      "url": "https://avnet.wd1.myworkdayjobs.com/External"
    }
  ],
  "keyword": "",
  "location": "",
  "maxItems": 10,
  "maxConcurrency": 5,
  "sampleMode": false,
  "requestTimeoutSecs": 45
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing normalized non-null records plus complete cleaned rawData.

## `runSummary` (type: `string`):

Machine-readable status, data provenance mode, counts, timing, and null validation.

## `files` (type: `string`):

Key-value store containing source metadata and any sanitized error diagnostic.

# 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 = {
    "startUrls": [
        {
            "url": "https://adobe.wd5.myworkdayjobs.com/external_experienced"
        },
        {
            "url": "https://avnet.wd1.myworkdayjobs.com/External"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jobscrawler/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 = { "startUrls": [
        { "url": "https://adobe.wd5.myworkdayjobs.com/external_experienced" },
        { "url": "https://avnet.wd1.myworkdayjobs.com/External" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("jobscrawler/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 '{
  "startUrls": [
    {
      "url": "https://adobe.wd5.myworkdayjobs.com/external_experienced"
    },
    {
      "url": "https://avnet.wd1.myworkdayjobs.com/External"
    }
  ]
}' |
apify call jobscrawler/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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