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

Scrape public job listings from any company's Workday career site. Paste career-page URLs and get structured jobs — title, req ID, location, remote type, posting date, apply URL, and full description. Bulk multi-company, keyword filter. Ideal for job boards, recruiting, and HR-tech pipelines.

- **URL**: https://apify.com/ratio\_tech/workday-scraper.md
- **Developed by:** [Marius Matulevicius](https://apify.com/ratio_tech) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 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.

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 Jobs Scraper — any company, to JSON

**Turn any company's Workday career site into clean JSON — every open role, full description, apply URL.** No login, no API key, no browser automation. Workday powers the careers pages of a huge share of the Fortune 500 — this Actor reads them all through the same public JSON the page itself uses.

```json
{
  "title": "Sr Machine Learning Engineer",
  "jobReqId": "R0132421",
  "location": "Chicago, Illinois, United States of America",
  "timeType": "Full time",
  "postedOn": "Posted Yesterday",
  "description": "<p>We are looking for a Senior ML Engineer...</p>",
  "jobUrl": "https://paypal.wd1.myworkdayjobs.com/jobs/job/.../R0132421-1",
  "applyUrl": "https://paypal.wd1.myworkdayjobs.com/..."
}
```

👉 **Try it now:** hit **Run** with the default input. It scrapes PayPal's Workday board and returns real jobs — with full descriptions — in seconds. Then paste in any company whose careers URL contains `myworkdayjobs.com`.

***

### Who this is for

- **Recruiters & sourcers** — pull a target company's entire req list into a sheet. Track competitor hiring, find hiring-signal accounts, monitor new openings.
- **Sales & lead-gen teams** — "who's hiring for X role" is a buying signal. Monitor a list of Workday companies and get a fresh feed of new postings every run.
- **Job boards & aggregators** — ingest structured postings (full HTML description, req ID, apply URL) from any Workday company without building and maintaining a scraper per site.
- **Labor-market researchers** — Workday's footprint across large enterprises makes it the best single source for enterprise hiring trends.
- **AI agents & data pipelines** — one tool call → structured job data. See the [agent note](#for-ai-agents) below.

***

### Why this one

| | This Actor | Typical job scraper |
|---|---|---|
| **Source** | Workday's public career JSON | HTML scraping (breaks often) |
| **Any company** | ✅ paste the career URL | often one hard-coded site |
| **Full description** | ✅ complete HTML per job | often listing fields only |
| **Bulk / multi-company** | ✅ many sites per run | usually one at a time |
| **Failed rows billed?** | ❌ never (unbilled errors dataset) | usually yes |
| **Login / API key** | Not needed | varies |

Because it reads the documented public JSON endpoint instead of scraping rendered markup, it's **fast and low-maintenance** — it doesn't break when Workday restyles a page.

***

### What you get, per job

`title` · `jobReqId` · `location` (+ additional locations) · `remoteType` · `timeType` · `postedOn` · `startDate` · `description` (full HTML) · `jobUrl` · `applyUrl`

Set `fetchFullDescription: false` for a faster, lighter run that returns just the listing fields. Full reference is in [Output](#output).

***

### Quick start

1. Open a company's "Careers" / "Search jobs" page.
2. If the address bar shows `something.myworkdayjobs.com/...`, that's the URL — paste it into `careerUrls`.
3. Run. Add more URLs to scrape several companies in one run.

```json
{
  "careerUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
  ],
  "maxJobsPerCompany": 200
}
```

#### Companies that use Workday

A large share of the Fortune 500. Try: PayPal, NVIDIA, Salesforce, Adobe, Bank of America. If a company's careers link contains `myworkdayjobs.com`, it works here.

***

### Example runs

Three common jobs-to-be-done — copy the input, paste it into the Actor, and run.

**1. Competitor hiring monitor**
Scrape several competitors' whole boards, then schedule it and dedupe on `jobReqId` between runs for a feed of newly-opened roles.

```json
{
  "careerUrls": [
    "https://paypal.wd1.myworkdayjobs.com/jobs",
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
  ],
  "fetchFullDescription": true,
  "maxJobsPerCompany": 1000
}
```

**2. "Who's hiring engineers" lead feed**
Filter server-side with `searchText`, then keep the listing fields for a fast, cheap run.

```json
{
  "careerUrls": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
  "searchText": "engineer",
  "fetchFullDescription": false,
  "maxJobsPerCompany": 500
}
```

**3. Full-detail job aggregation**
Ingest complete postings (full HTML description, exact location, apply URL) from several companies for a job board.

```json
{
  "careerUrls": [
    "https://adobe.wd5.myworkdayjobs.com/external_experienced",
    "https://paypal.wd1.myworkdayjobs.com/jobs"
  ],
  "fetchFullDescription": true,
  "maxJobsPerCompany": 1000
}
```

***

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `careerUrls` | `string[]` | `["https://paypal.wd1.myworkdayjobs.com/jobs"]` | Full Workday career-site URLs |
| `companies` | `object[]` | `[]` | Advanced fallback: `{tenant, pod, site}` entries for URLs that don't parse |
| `searchText` | `string` | `""` | Optional keyword filter (server-side) |
| `maxJobsPerCompany` | `integer` | `100` | Max jobs per site (1–5000) |
| `fetchFullDescription` | `boolean` | `true` | Fetch full detail per job (+1 request/job) vs listing fields only |
| `proxyConfiguration` | `object` | Apify datacenter | Proxy settings |

**How to find a career URL:** open a company's "Careers" / "Search jobs" page. If the address bar shows `something.myworkdayjobs.com/...`, that's the URL — paste it in.

***

### Output

Each run pushes one record per job to the default dataset:

```json
{
    "type": "job",
    "company": "paypal",
    "title": "Sr Machine Learning Engineer",
    "jobReqId": "R0132421",
    "location": "Chicago, Illinois, United States of America",
    "additionalLocations": ["San Jose, California, United States of America"],
    "remoteType": null,
    "timeType": "Full time",
    "postedOn": "Posted Yesterday",
    "startDate": "2026-07-10",
    "description": "<p>We are looking for a Senior ML Engineer...</p>",
    "jobUrl": "https://paypal.wd1.myworkdayjobs.com/jobs/job/Chicago-Illinois-United-States-of-America/Sr-Machine-Learning-Engineer_R0132421-1",
    "applyUrl": "https://paypal.wd1.myworkdayjobs.com/...",
    "scrapedAt": "2026-07-11T10:00:00.000Z"
}
```

When `fetchFullDescription` is `false`, the detail-only fields (`description`, `timeType`, `startDate`, `applyUrl`, exact `location`, `additionalLocations`) may be `null`/empty — the listing summary fields (`title`, `jobReqId`, `location` summary, `postedOn`, `jobUrl`) are always present. Export as **JSON, CSV, Excel, or via API**.

***

### Pricing

**Pay per result** — you're billed only for jobs successfully written to the dataset. Malformed inputs and failed fetches go to a separate **errors** dataset that is **not billed**. No monthly fee, no minimum.

Note: `fetchFullDescription: true` makes one extra request per job (more compute), but the result count — and therefore what you pay — is the same. Turn it off for faster, lighter runs when you only need listing fields.

***

### For AI agents

Call this tool when you need a company's open job postings and you have (or can build) its Workday career URL (e.g. `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`). Returns one structured record per job — title, req ID, location, remote type, posting date, apply URL, and full description. Optional keyword filter. Public data, no login. Not for applicant/candidate data.

***

### Proxy

Workday career-site JSON is a public endpoint with minimal anti-bot measures. **Datacenter proxies are sufficient.** Residential is not required.

***

### FAQ

**How do I scrape Workday jobs without an API key?**
You don't need one. Paste a company's public Workday career URL (`something.myworkdayjobs.com/...`) into `careerUrls` and run — the Actor reads Workday's public career-site JSON, the same data any visitor sees.

**Can I scrape multiple companies in one run?**
Yes. Pass several URLs in `careerUrls` and the Actor scrapes them all in a single run, one dataset record per job.

**How do I find a company's Workday career URL?**
Open the company's "Careers" / "Search jobs" page. If the address bar shows `*.myworkdayjobs.com/...`, that's the URL. If a URL doesn't parse, use the `companies` fallback with `{tenant, pod, site}`.

**Can I get only new jobs since my last run?**
Every record has `postedOn` and a stable `jobReqId` — dedupe on `jobReqId` between runs to get just the new postings. Schedule the Actor to build a rolling feed.

**Does it return the full job description?**
Yes, when `fetchFullDescription` is `true` (default) you get the full HTML description, exact locations, employment type, and apply URL. Set it to `false` for faster listing-only runs.

**What does it cost?**
Pay per result — you're billed only for jobs successfully written to the dataset. Failed fetches go to a separate, unbilled errors dataset.

**Is scraping Workday job listings legal?**
This Actor accesses only public job postings — no login, no candidate data. You are responsible for complying with each company's Terms and your local laws. See the notice above.

***

### Legal & compliance notice

This Actor scrapes **publicly available data only** — job postings any visitor can read on a company's Workday career site without logging in. Login-protected Workday instances are **not** accessed. Job-posting content (titles, descriptions, locations) is **company data, not personal data about candidates**.

**The user (buyer) bears sole responsibility** for how they use the data collected, including compliance with:

- Workday's and each company's Terms of Service
- Applicable data protection and employment laws in their jurisdiction

This tool is intended for legitimate use cases such as job aggregation, labor-market research, recruiting intelligence, and competitive hiring analysis. Misuse is the responsibility of the operator.

***

### Related Actors by Ratio Tech

Scraping jobs from other ATS platforms? We maintain a matching set — same output shape, same pay-per-result pricing:

- [SmartRecruiters Jobs Scraper](https://apify.com/ratio_tech/smartrecruiters-scraper) — public jobs from any SmartRecruiters career site
- [Ashby Jobs Scraper](https://apify.com/ratio_tech/ashby-scraper) — Ashby boards, **with compensation ranges**
- [Recruitee Jobs Scraper](https://apify.com/ratio_tech/recruitee-scraper) — public jobs from any Recruitee career site

# Actor input Schema

## `careerUrls` (type: `array`):

Full Workday career-site URLs to scrape. Copy the URL from a company's careers page — e.g. 'https://paypal.wd1.myworkdayjobs.com/jobs' or 'https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite'. The tenant, pod, and site slug are parsed from each URL.

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

Structured company entries, for career sites whose URL doesn't parse cleanly. Each item needs 'tenant', 'pod', and 'site'. Most users should use 'careerUrls' instead.

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

Optional keyword to filter jobs server-side (Workday's own search). Leave empty to return all jobs. Example: 'engineer'.

## `maxJobsPerCompany` (type: `integer`):

Maximum number of jobs to return for each career site.

## `fetchFullDescription` (type: `boolean`):

When enabled, fetch each job's full detail (description, exact location, start date, apply URL) with an extra request per job. Disable for a faster, cheaper run that returns only listing fields (title, req ID, location summary, posting date).

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

Apify Proxy settings. Datacenter proxies are sufficient — Workday career JSON is a public endpoint with minimal anti-bot measures.

## Actor input object example

```json
{
  "careerUrls": [
    "https://paypal.wd1.myworkdayjobs.com/jobs"
  ],
  "companies": [],
  "searchText": "",
  "maxJobsPerCompany": 100,
  "fetchFullDescription": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `errors` (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 = {
    "careerUrls": [
        "https://paypal.wd1.myworkdayjobs.com/jobs"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ratio_tech/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 = { "careerUrls": ["https://paypal.wd1.myworkdayjobs.com/jobs"] }

# Run the Actor and wait for it to finish
run = client.actor("ratio_tech/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 '{
  "careerUrls": [
    "https://paypal.wd1.myworkdayjobs.com/jobs"
  ]
}' |
apify call ratio_tech/workday-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8fwgbve9xhfaA4QRV/builds/NcqUtV51q3jzUEcrx/openapi.json
