# Workday Jobs API (`jobscrawler/workday-jobs-api`) Actor

Extract live Workday jobs and full descriptions directly from public career-board APIs. Search by keyword and location; no external API key required for direct mode.

- **URL**: https://apify.com/jobscrawler/workday-jobs-api.md
- **Developed by:** [Jobs Scraper](https://apify.com/jobscrawler) (community)
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 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?

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

### What does Workday Jobs API do?

Collect **live Workday job listings** and full descriptions directly from public employer career-board APIs. Supply Workday career URLs, search by keyword, and filter by location. Direct mode needs no third-party API key. The default input uses [Adobe's public career board](https://adobe.wd5.myworkdayjobs.com/external_experienced).

The existing Fantastic.jobs integration remains available by selecting that data source and supplying your own key. Both modes fetch live API responses. Sample mode is rejected; failed requests never produce fabricated jobs.

### Why use Workday Jobs API?

- Retrieve job IDs, titles, employers, locations, dates, employment types, original links, and descriptions.
- Search employer boards using the same public CXS endpoints as their career sites.
- Continue pagination after location filtering to reach later matches.
- Schedule runs, use the Apify API, connect integrations, and export datasets.
- Inspect source endpoints, request counts, and detail failures in SOURCE_METADATA.

### What data can it extract?

| Field | Description |
| --- | --- |
| recordId, jobId | Board-qualified unique record ID and source requisition ID |
| jobTitle, companyName | Published title and employer name, or board tenant when no employer name is supplied |
| location, locations, country | Primary/additional locations and published country |
| description, descriptionHtml | Plain text and original HTML description |
| jobType, postedDate | Published employment type and source posting date |
| jobUrl, applyUrl, sourceUrl | Public job/application page and API endpoint |
| extractionStatus, dataMode | full or listing_only; live API provenance |
| rawData | Source fields after recursive removal of null values |

Optional fields such as salary stay empty when the source does not publish them. They are not inferred.

### How to scrape Workday jobs

1. Open Input and keep **Public Workday API (no key)** selected.
2. Enter the complete employer career-board URL, including its site path.
3. Optionally add a keyword and location. Leave them empty for a broad search.
4. Set maxItems and start the Actor. Download the dataset as JSON, HTML, CSV, or Excel.

Supported formats include https://tenant.wd5.myworkdayjobs.com/en-US/site and https://wd5.myworkdaysite.com/recruiting/tenant/site. A Workday CXS jobs endpoint is also accepted. Other sites and authenticated application portals are not supported.

### Input

```json
{
  "dataSource": "workday",
  "startUrls": [{"url": "https://adobe.wd5.myworkdayjobs.com/external_experienced"}],
  "keyword": "Engineer",
  "location": "",
  "maxItems": 10,
  "maxPages": 50,
  "maxConcurrency": 3,
  "requestTimeoutSecs": 45
}
```

maxItems limits matching jobs across boards. maxPages limits pages per board; each requests up to 20 listings. location searches primary/additional locations and country, case-insensitively. appliedFacets accepts the selected board's own facet IDs. The runtime accepts searchQuery or query as aliases for keyword.

For Fantastic.jobs, select dataSource: "fantastic" and supply fantasticJobsApiKey through the secret input field or FANTASTIC_JOBS_API_KEY. Existing time-window, description-format, organization, enrichment, and advanced-filter options apply to that provider. They do not alter direct Workday searches. Selecting Fantastic.jobs without credentials fails explicitly.

### Output and diagnostics

Every record identifies its source. RUN_SUMMARY reports the live data mode and output count. SOURCE_METADATA reports per-board pages, listed jobs, matches, errors, and detail failures. If a detail request fails, its real listing can be retained with extractionStatus: "listing_only" and an empty description. If every board request fails, the run fails and stores ERROR_DIAGNOSTIC. A successful search with no matches reports no_results.

### Pricing

Result events cost **$1.99 per 1,000 output items**, plus Apify platform usage. Any Actor Start event is listed on the Pricing tab. Fantastic.jobs usage, when selected, depends on your own provider subscription.

### Local development

Install locked dependencies with npm ci. Run apify run --input-file test/live-default.json for a live default-input test or apify run --input-file test/live-filtered.json for another employer and keyword/location test. Inspect the local dataset and run node dataset-validator.js. Unit tests run with node --test test/workday.test.js.

Local storage is separate from Apify cloud storage. Deploy and run on Apify to verify production behavior.

### Tips and support

Restrictive filters can legitimately return zero jobs. If a board moves, update its start URL. A page-limit warning in source metadata means more matches may exist beyond the limit. Keep detail concurrency modest and respect employer rate limits and terms. Public listings can change or disappear during a run. Use the Issues tab for support and the API tab for programmatic access.

# Changelog

This Actor's version history is a separate document: https://apify.com/jobscrawler/workday-jobs-api/changelog.md

# Actor input Schema

## `dataSource` (type: `string`):

Direct Workday is the default. Fantastic.jobs remains available as an explicit keyed option. Neither mode uses sample data.

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

Public myworkdayjobs.com or myworkdaysite.com/recruiting/tenant/site URLs. Used in direct Workday mode. Include the career-site path.

## `fantasticJobsApiKey` (type: `string`):

Required only when Live data source is Fantastic.jobs. Not required for direct Workday. Never written to logs or datasets.

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

Workday search text, or a title filter in Fantastic.jobs mode. Leave empty to return the board's available jobs.

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

Case-insensitive location filter including additional locations and country. Direct mode continues through pages until the result limit or page limit is reached.

## `organization` (type: `string`):

Exact organization-name filter for Fantastic.jobs mode. In direct mode choose organizations through their career-board URLs.

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

Maximum matching live jobs to output across all boards.

## `maxPages` (type: `integer`):

Each public Workday API page contains up to 20 listings. Caps requests when location filtering needs multiple pages.

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

Bounded parallel requests for full Workday job descriptions.

## `appliedFacets` (type: `object`):

Optional board-specific facet IDs, mapping facet names to arrays of string IDs. Leave empty for the whole board.

## `timeRange` (type: `string`):

Fantastic.jobs mode only: active-job time window. Direct Workday returns current listings from the selected boards.

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

HTML retains the richest original description payload.

## `includeCompanyDetails` (type: `boolean`):

Request public company and LinkedIn enrichment fields.

## `includeBetaFields` (type: `boolean`):

Request structured locations and occupation classifications.

## `advancedFilters` (type: `object`):

Additional documented Fantastic.jobs query parameters.

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

Per-request timeout in seconds.

## Actor input object example

```json
{
  "dataSource": "workday",
  "startUrls": [
    {
      "url": "https://adobe.wd5.myworkdayjobs.com/external_experienced"
    }
  ],
  "keyword": "",
  "location": "",
  "organization": "",
  "maxItems": 10,
  "maxPages": 50,
  "maxConcurrency": 3,
  "appliedFacets": {},
  "timeRange": "7d",
  "descriptionFormat": "html",
  "includeCompanyDetails": true,
  "includeBetaFields": true,
  "advancedFilters": {},
  "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"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jobscrawler/workday-jobs-api").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" }] }

# Run the Actor and wait for it to finish
run = client.actor("jobscrawler/workday-jobs-api").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"
    }
  ]
}' |
apify call jobscrawler/workday-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jobscrawler/workday-jobs-api"
        }
    }
}
```

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/gjmyNfS9OczMKSLpf/builds/nkZxvBePueEr3jeTK/openapi.json
