# Workday Scraper — Corporate Career Pages, Any Company (`unfenced-group/workday-scraper`) Actor

Extract job listings from Workday-powered corporate career pages worldwide. Titles, locations, departments, job IDs & full descriptions. Fortune 500 & enterprise coverage. $1.50/1,000 results.

- **URL**: https://apify.com/unfenced-group/workday-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 4 total users, 2 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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/platform/actors/running/actors-in-store#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 Scraper

![workday-scraper](https://api.apify.com/v2/key-value-stores/lJlifu6C8YQfZMPKE/records/workday-scraper)

Collect job listings from any company that uses the Workday ATS platform — all in one run. Add any `myworkdayjobs.com` URL to scrape any company instantly. Comes pre-loaded with **23 verified open companies** across Tech, Pharma, Finance, and more. No API key, no registration, no browser required.

***

### Why this scraper?

#### 🌍 23 verified open companies pre-loaded

Intel, Pfizer, Novartis, Medtronic, PayPal, CrowdStrike, Zoom, NXP Semiconductors, Workday Inc, Labcorp, IQVIA, Amgen, Regeneron, Bristol Myers Squibb, Takeda, AstraZeneca, Leidos, CACI International, Unisys, Choice Hotels, Calix, Zealand Pharma, and more — ready to scrape without any configuration.

> **Note:** Many large corporations (Shell, Adidas, Goldman Sachs, BASF, etc.) use protected Workday instances that require a browser session. These cannot be scraped via the public API. The scraper detects them automatically and skips to the next company.

#### 🔗 Add any company instantly

Paste any `myworkdayjobs.com` URL from a company career site and the scraper extracts jobs automatically. Works with any Workday tenant worldwide.

#### 🔍 Keyword + location search

Filter listings by job title keywords and location across all selected companies in a single run.

#### 📄 Full job descriptions included

Retrieves complete job descriptions in HTML, plain text, and Markdown. Also extracts contract type (full time / part time), ISO country code, and salary ranges when present in the description.

#### 💰 Salary extraction

For companies that publish pay ranges in their job descriptions (e.g. PayPal, Zealand Pharma, Labcorp), `salaryMin`, `salaryMax`, `currency`, and `salaryPeriod` are automatically extracted from the HTML.

#### ♻️ Cross-run deduplication

Enable **Skip reposts** to track which jobs were already seen across previous runs (90-day memory). Avoid processing the same listing twice in scheduled pipelines.

#### ⚡ Lightweight and fast

Pure API calls — no browser, no proxy. A run across 10 companies with 50 jobs each completes in under 3 minutes.

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `startUrls` | Array | `[]` | Workday career site URLs to scrape. Any page from a company's Workday site works. Leave empty to use the pre-seeded company list. |
| `companies` | Array | `[]` | Filter the pre-seeded list by company name (e.g. `["Philips", "Shell"]`). Leave empty to scrape all 23 companies. |
| `searchQuery` | String | `""` | Keyword filter (e.g. `"software engineer"`). Leave empty for all jobs. |
| `location` | String | `""` | Location filter (e.g. `"Amsterdam"`). Combined with the search query. |
| `maxResults` | Integer | `100` | Maximum jobs to collect per company. Lower this when scraping all 23 companies to manage run time. |
| `fetchDetails` | Boolean | `true` | Fetch the full job description from each listing's detail page. Disable to collect list-level data faster. |
| `daysOld` | Integer | — | Only return jobs posted within this many days. Leave empty for all available jobs. |
| `skipReposts` | Boolean | `false` | Skip listings already seen in previous runs (cross-run deduplication). |

***

### Output schema

#### Always present

| Field | Type | Description |
|---|---|---|
| `id` | `string\|null` | Workday job requisition ID (e.g. `"R18929"`, `"REQ-10077296"`) |
| `jobReqId` | `string\|null` | Same as `id` — explicit requisition ID field |
| `url` | `string` | Direct link to the job on the company's career site |
| `title` | `string\|null` | Job title |
| `company` | `string` | Company name |
| `companyWebsite` | `string` | Company Workday career site URL |
| `city` | `string\|null` | City extracted from Workday's structured location data |
| `country` | `string\|null` | Country name from Workday's structured location API |
| `countryCode` | `string\|null` | ISO 3166-1 alpha-2 country code (e.g. `"US"`, `"GB"`, `"NL"`) |
| `locationText` | `string\|null` | Raw location string as returned by Workday |
| `remote` | `boolean` | `true` if "remote" appears in the location text |
| `salaryMin` | `number\|null` | Minimum salary when found in job description |
| `salaryMax` | `number\|null` | Maximum salary when found in job description |
| `salaryText` | `string\|null` | Raw salary snippet extracted from description (e.g. `"$160,500.00 - $238,700.00 Annually"`) |
| `salaryPeriod` | `string\|null` | Pay period: `"annual"`, `"monthly"`, or `"hourly"` |
| `currency` | `string\|null` | Currency code (e.g. `"USD"`, `"GBP"`) when salary is present |
| `publishDate` | `string\|null` | Publication date (`YYYY-MM-DD`) — sourced from Workday's `startDate` field |
| `publishDateISO` | `string\|null` | Publication date (ISO 8601) |
| `isRepost` | `boolean` | `true` if seen in a previous run |
| `originalPublishDate` | `string\|null` | Date first seen (when `isRepost: true`) |
| `source` | `string` | Workday tenant domain |
| `careerSite` | `string` | Career site identifier within the tenant |
| `scrapedAt` | `string` | ISO 8601 timestamp of this run |
| `contentHash` | `string` | 16-character MD5 of id + title + location |

#### With `fetchDetails: true`

| Field | Type | Description |
|---|---|---|
| `descriptionHtml` | `string\|null` | Full job description as HTML |
| `descriptionText` | `string\|null` | Plain text version of the description |
| `descriptionMarkdown` | `string\|null` | Markdown version of the description |
| `summary` | `string\|null` | First 300 characters of the description |
| `contractType` | `string\|null` | Employment type (e.g. `"Full Time"`, `"Part Time"`) |
| `canApply` | `boolean\|null` | Whether the application portal is currently open |

#### Example output

```json
{
    "id": "R0134771",
    "jobReqId": "R0134771",
    "url": "https://paypal.wd1.myworkdayjobs.com/Jobs/job/Chicago.../Staff-Data-Scientist_R0134771-1",
    "title": "Staff Data Scientist",
    "company": "PayPal",
    "companyWebsite": "https://paypal.wd1.myworkdayjobs.com/en-US/External",
    "city": "Chicago",
    "country": "United States",
    "countryCode": "US",
    "locationText": "Chicago, Illinois, United States of America",
    "remote": false,
    "salaryMin": 160500,
    "salaryMax": 238700,
    "salaryText": "$160,500.00 - $238,700.00 Annually",
    "salaryPeriod": "annual",
    "currency": "USD",
    "contractType": "Full Time",
    "canApply": true,
    "descriptionHtml": "<p>We are looking for...</p>",
    "descriptionText": "We are looking for...",
    "descriptionMarkdown": "We are looking for...",
    "summary": "We are looking for a Staff Data Scientist to join our team…",
    "publishDate": "2026-05-06",
    "publishDateISO": "2026-05-06T00:00:00.000Z",
    "isRepost": false,
    "originalPublishDate": null,
    "source": "paypal.wd1.myworkdayjobs.com",
    "careerSite": "Jobs",
    "scrapedAt": "2026-05-06T10:00:00.000Z",
    "contentHash": "a3f1c2d4e5b67890"
}
```

***

### Examples

**Search for software engineering roles across all pre-seeded companies**

```json
{
    "searchQuery": "software engineer",
    "maxResults": 50,
    "fetchDetails": true
}
```

**Scrape a specific company by pasting their Workday URL**

```json
{
    "startUrls": [
        { "url": "https://yourcompany.wd3.myworkdayjobs.com/en-US/ExternalCareers" }
    ],
    "searchQuery": "data analyst",
    "maxResults": 200
}
```

**Daily feed — only new jobs posted today, skip already-seen listings**

```json
{
    "companies": ["Novartis", "Pfizer", "Amgen"],
    "daysOld": 1,
    "skipReposts": true,
    "fetchDetails": true
}
```

**Collect all jobs without descriptions for a fast overview**

```json
{
    "companies": ["Intel", "Leidos", "PayPal"],
    "maxResults": 500,
    "fetchDetails": false
}
```

***

### 💰 Pricing

**$1.5 per 1,000 results** — you only pay for successfully retrieved listings.
Failed retries and filtered reposts are never charged.

| Results | Cost |
|---|---|
| 100 | ~$0.15 |
| 1,000 | ~$1.5 |
| 10,000 | ~$15 |
| 100,000 | ~$150 |

> Flat-rate alternatives typically charge $10–$30/month regardless of usage. At $1.5/1k this is the most affordable real-time Workday scraper on Apify.

Use the **Max results per company** cap to control spend precisely.

***

### Performance

| Scope | Approx. time |
|---|---|
| 1 company, 50 jobs, with descriptions | ~30 seconds |
| 10 companies, 50 jobs each | ~4 minutes |
| All 23 companies, 20 jobs each | ~10 minutes |
| Single company, full catalogue (500+ jobs) | ~8 minutes |

***

### Known limitations

- **Salary data:** Not part of Workday's structured API. Extracted on a best-effort basis from HTML description text. Available for companies that embed pay ranges in their postings (PayPal, Zealand Pharma, Labcorp, and others).
- **Gated listings:** Some companies configure their Workday instance to require login for certain roles. These listings are not accessible and are skipped automatically.
- **Company catalogue changes:** Companies occasionally change their Workday tenant ID or career site name. Add the updated URL via `startUrls` if a pre-seeded company stops returning results.
- **Location precision:** `city` is extracted from Workday's structured `jobRequisitionLocation` field. For some companies this may include office-level detail (e.g. building names) rather than just the city.

***

### Technical details

- **Source:** myworkdayjobs.com — Workday ATS platform used by thousands of companies worldwide
- **Architecture:** Pure REST API — POST `/wday/cxs/{tenant}/{careerSite}/jobs` for search, GET for detail pages
- **Date accuracy:** Uses Workday's native `startDate` ISO field (no fuzzy "Posted X days ago" parsing)
- **Location accuracy:** Uses Workday's structured `jobRequisitionLocation` including ISO `alpha2Code` country codes
- **Memory:** 512 MB
- **Repost storage:** KeyValueStore `workday-job-dedup`, 90-day TTL
- **Retry:** Automatic retry on network errors, exponential backoff, 3 attempts per request

***

### Additional services

Need a custom actor, additional filters, scheduled runs, or integration support?.nl]\(mailto:info@unfencedgroup.nl) — we build on request.

***

### Related scrapers

Other scrapers in our **Jobs — Finance & Specialist** collection:

- [eFinancialCareers Scraper](https://apify.com/unfenced-group/efinancialcareers-scraper)
- [TheLadders.Com Job Scraper](https://apify.com/unfenced-group/theladders-scraper)
- [Freelancer.com Scraper](https://apify.com/unfenced-group/freelancercom-scraper)
- [TheHub.io Scraper](https://apify.com/unfenced-group/thehub-io-scraper)

***

### Run it on a schedule

This actor is built for repeat use. Set it to run daily, weekly, or hourly, and the data keeps flowing without you touching it.

- **Schedule runs** — open the actor, go to Schedules, and pick a cadence. Each run only charges you for the results it returns.
- **Connect it to your stack** — push results straight to Google Sheets, Slack, a webhook, or your database using Apify Integrations. No glue code needed.
- **Pull results via API** — every run writes a clean dataset you can fetch with one API call, ready for whatever you build on top of it.

Set it once and it runs on its own.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

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

One or more Workday career site URLs (e.g. https://philips.wd3.myworkdayjobs.com/en-US/PhilipsExternalCareerSite). Any page from a company's Workday career site works. Leave empty to use the built-in list of 55+ pre-seeded companies.

## `companies` (type: `array`):

Filter the built-in company list by name (case-insensitive substring match). Example: \["Philips", "Shell"]. Leave empty to scrape all pre-seeded companies. Has no effect when startUrls are provided.

## `searchQuery` (type: `string`):

Keyword(s) to filter jobs by title or description. Example: "software engineer". Leave empty to return all jobs.

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

Location to include in the search query. Example: "Amsterdam". Combined with the search query.

## `fetchDetails` (type: `boolean`):

Fetch the complete job description from each job's detail endpoint. Adds one extra API call per job but provides full description, contract type, and job family. Disable to speed up large runs.

## `daysOld` (type: `integer`):

Only return jobs posted within this many days. Leave empty to return all available jobs.

## `skipReposts` (type: `boolean`):

Skip job listings already seen in previous runs of this actor (cross-run deduplication, 90-day memory).

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

Maximum total number of job listings to collect across all companies. Defaults to 100.

## Actor input object example

```json
{
  "startUrls": [],
  "companies": [],
  "searchQuery": "developer",
  "location": "",
  "fetchDetails": false,
  "skipReposts": false,
  "maxItems": 100
}
```

# 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 = {
    "searchQuery": "developer",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/workday-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 = {
    "searchQuery": "developer",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/workday-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "developer",
  "maxItems": 100
}' |
apify call unfenced-group/workday-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=unfenced-group/workday-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/7bni9qodeeHmIUmk8/builds/iry1W4tMgbD64S4q8/openapi.json
