# Workday Jobs Scraper: Open Roles, Salaries & Descriptions (`larkmoor/workday-jobs`) Actor

Get every open job from any company's Workday career site (myworkdayjobs.com): title, requisition ID, locations, country, remote flag, time type, posted date, salary range parsed from the description, and full description. Keyword, country, location and date filters. $1 per 1,000 jobs.

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

## Pricing

from $0.85 / 1,000 jobs

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?

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

## Workday Jobs Scraper: Open Roles, Salaries & Descriptions

Get every open job from any company that hires through **Workday** — NVIDIA, Salesforce, Walmart, Target, Netflix, Adobe, Intel, Capital One, banks, hospitals, universities and thousands more — as one clean row per job: title, requisition ID, primary and additional locations, country, a remote flag, full-time/part-time, the posted date, the pay range stated in the description, the job URL and the full description as text and HTML.

It reads the same public JSON that a company's Workday career site (`<company>.wdN.myworkdayjobs.com`) loads in your browser when you search its jobs. No login, no browser, no proxies, no cookies.

### What you can use it for

- **Job boards and aggregators**: fill a niche board (AI, healthcare, finance, a region) with fresh roles from big employers that use Workday
- **Recruiting and sales leads**: see which enterprises are hiring for which teams and where — a company opening 40 data roles in Austin has budget
- **Salary research**: US employers publish pay ranges in their Workday postings; collect them by title, level and location
- **Competitive intelligence**: track a competitor's hiring by location and job family week by week
- **Job alerts**: schedule a daily run with `postedWithinDays: 1` and send only new roles to Slack, email or a Google Sheet
- **Career search**: one list of every open "product manager" role across all your target companies

### Why this one

- **$1 per 1,000 jobs**, $0.001 per run start — about half the price of other Workday actors
- **Pay range built in**: parsed from the description in both styles Workday employers use ("$120,000 - $150,000" and "168,000 USD - 264,500 USD"), with currency and period
- **Real dates**: the job's actual posting date when Workday exposes it, not just "Posted 30+ Days Ago"
- **All locations**: multi-location jobs keep every location, plus country name and 2-letter code
- **Filters you don't pay for**: keywords (Workday's own search), locations, countries, remote only, posted within N days, salary only — only rows that pass are charged
- **256 MB memory**: a 500-job site finishes in about a minute

### Input

| Field | What it does |
|---|---|
| `startUrls` | Workday career-site URLs (`https://<company>.wdN.myworkdayjobs.com/<site>`); a job link from the site works too |
| `keywords` | Workday search text, one search per keyword, merged without duplicates |
| `locations` | Keep jobs whose location contains any of these ("Santa Clara", "TX", "Remote") |
| `countries` | Keep jobs in these countries (name or 2-letter code) |
| `remoteOnly` | Only remote roles |
| `postedWithinDays` | Only jobs posted in the last N days |
| `withSalaryOnly` | Only jobs that state a pay range |
| `includeDescription` | Include the full description (text + HTML) |
| `maxJobsPerSite` / `maxResults` | Limits per site and for the whole run |

Example input:

```json
{
  "startUrls": [{"url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"}],
  "keywords": ["data scientist"],
  "countries": ["US"],
  "postedWithinDays": 30,
  "maxResults": 200
}
```

### Output

One row per job:

```json
{
  "company": "nvidia",
  "organization": "2100 NVIDIA USA",
  "careerSite": "NVIDIAExternalCareerSite",
  "title": "Modeling Engineer, Supply Chain Optimization",
  "jobReqId": "JR2025602",
  "location": "US, CA, Santa Clara",
  "locations": ["US, CA, Santa Clara"],
  "country": "United States of America",
  "countryCode": "US",
  "remote": false,
  "timeType": "Full time",
  "postedOn": "Posted 30+ Days Ago",
  "publishedAt": "2026-09-15",
  "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/...",
  "salaryMin": 168000,
  "salaryMax": 264500,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": "168,000 USD - 264,500 USD",
  "descriptionText": "...",
  "descriptionHtml": "<p>...</p>"
}
```

Download as JSON, CSV, Excel, XML or HTML, or read it through the API.

### How much does it cost?

Pay per event: **$0.001 per job** ($1 per 1,000) and **$0.001 per run start**. Platform usage at 256 MB is a fraction of a cent per run.

- 100 new data-science jobs from 5 companies, checked daily: about $0.10 a day
- 2,000 jobs from one large employer once a week: about $2.00 a week
- A daily alert with `postedWithinDays: 1` across 30 companies (≈150 new jobs): about $0.15 a day

Jobs dropped by your filters are not charged.

### FAQ

**Is it legal?**
It reads public job postings that the company publishes for anyone to see, through the same JSON the public career site uses, at a polite rate. No login, no candidate data and no personal data are touched. As with any data, check your own use against the rules where you work.

**How do I find a company's Workday URL?**
Open the company's careers page and click "Search jobs" or any job. If the address is like `https://<company>.wd1.myworkdayjobs.com/en-US/<SiteName>/...`, paste it as is; the actor finds the site from it.

**Why do some jobs show "Posted 30+ Days Ago" and an older date?**
Workday shows a rounded label; the actor also reads each job's real start date and puts it in `publishedAt`.

**Why is the salary empty for some jobs?**
Not every employer states a range. US employers usually do for roles in states with pay-transparency laws (California, Colorado, New York, Washington and others).

**Can it search all Workday companies at once?**
Workday has no public list of every career site, so you give the sites. Dozens per run work fine.

**Does it cover Greenhouse, Lever or Ashby?**
This actor focuses on Workday. For Greenhouse and Ashby we have dedicated actors, and our Career Site Jobs actor mixes all major systems in one run.

### Tips

- Use `keywords` for Workday's own search (fast, server-side), then `countries` / `locations` to narrow down.
- Turn `includeDescription` off when you only need titles and locations — rows get much smaller.
- Schedule daily with `postedWithinDays: 1` and connect Slack or email for a zero-maintenance job alert.

### Integrations

Works with Google Sheets, Slack, Zapier, Make, Airtable, webhooks, the Apify API and the Python and JavaScript clients.

### Changelog

- **2026-10-23** — First release: all open jobs per Workday career site, multi-location, country, remote flag, real posting date, pay range parsing (symbol and currency-code styles), keyword, country, location, date and salary filters.

# Actor input Schema

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

Career-site URLs on myworkdayjobs.com, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite (copy it from the company's 'Search jobs' page; any job link on the same site works too).

## `keywords` (type: `array`):

Search text sent to Workday's own job search (one search per keyword, results merged without duplicates). Empty = all open jobs.

## `locations` (type: `array`):

Keep jobs whose location (or any additional location) contains any of these, e.g. 'Santa Clara', 'TX', 'Remote'.

## `countries` (type: `array`):

Keep jobs in these countries: a name ('United States of America', 'Germany') or 2-letter code ('US', 'DE').

## `remoteOnly` (type: `boolean`):

Keep only jobs whose location, remote type or title mentions remote work.

## `postedWithinDays` (type: `integer`):

Only jobs posted in the last N days. Empty = any date.

## `withSalaryOnly` (type: `boolean`):

Keep only jobs whose description states a pay range.

## `includeDescription` (type: `boolean`):

Include the full job description as text and HTML.

## `maxJobsPerSite` (type: `integer`):

Upper limit of jobs per career site.

## `maxResults` (type: `integer`):

Upper limit for the whole run. You pay only for jobs returned.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    }
  ],
  "keywords": [
    "data scientist"
  ],
  "remoteOnly": false,
  "withSalaryOnly": false,
  "includeDescription": true,
  "maxJobsPerSite": 2000,
  "maxResults": 20
}
```

# Actor output Schema

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

All results as JSON items in the run's default dataset (also downloadable as CSV/Excel from the dataset).

# 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://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
        }
    ],
    "keywords": [
        "data scientist"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("larkmoor/workday-jobs").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://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite" }],
    "keywords": ["data scientist"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("larkmoor/workday-jobs").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://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    }
  ],
  "keywords": [
    "data scientist"
  ],
  "maxResults": 20
}' |
apify call larkmoor/workday-jobs --silent --output-dataset

```

## MCP server setup

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

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/gTJKuaFDPYjxOX6kT/builds/8CfXJeTRsi5RJyu4q/openapi.json
