# Workday Jobs Scraper: Any Company, Past the 2,000 Cap (`scrapemint/workday-jobs-scraper`) Actor

Every open job on any company's Workday career site. Paste the URL or just type the company name, or search one keyword across thousands of Workday employers at once. Full description, req ID, location, remote flag, parsed salary. Reads past Workday's 2,000-job cap. No key, no proxy. Pay per job.

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

## Pricing

Pay per event

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/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: Any Company, Past the 2,000 Cap

Get every open job from any company that hires through Workday: NVIDIA, Walmart, Target, Adobe, Cisco, Pfizer, banks, hospitals, universities and thousands more. Paste a Workday career-site URL, or just type the company name. Or search one keyword across every Workday employer in the built-in directory at once. One clean row per job: title, requisition ID, location, country, remote flag, posted age, full description, salary range where the posting states one, and the apply link.

No login, no API key, no browser, no proxy. It reads the same public JSON the career site itself loads.

### Why this one

- **Company names work.** Type `nvidia` or `walmart`. A directory of 1,500+ Workday employers (2,476 career sites), found in the public web crawl and checked live, maps the name to the right career site. A URL always works too, and any page on the site will do.
- **No 2,000-job ceiling.** Workday's listing stops at 2,000 results and quietly starts over from page one if you ask for more, so scrapers that page through it top out at 2,000. This one splits big sites by Workday's own filters (job family, location, time type) until every slice is under the cap. On 2026-10-01 it returned all 2,650 open jobs at NVIDIA, each one once.
- **Search every Workday employer at once.** Turn on `searchAllCompanies` with a keyword, such as `data engineer` posted in the last day, and the search runs across the whole directory.
- **Salary parsed out.** Pay-transparency laws put a range in many postings. It comes back as `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod`, with the currency taken from the posting ("$169,000 - $253,000 CAD" is CAD, not USD).
- **Built for schedules.** With `onlyNew` on, each run returns only jobs earlier runs have not, so a daily schedule is a new-jobs alert. A run with nothing new returns nothing and costs nothing.

### Input

| Field | What it does |
|---|---|
| `companies` | Company names or Workday career-site URLs (`*.myworkdayjobs.com`, `wdN.myworkdaysite.com`). |
| `searchAllCompanies` | Search every company in the directory. Needs `searchText` or `postedWithinDays`. |
| `searchText` | Workday's own keyword search, e.g. `nurse`, `account executive`. |
| `locations` | Keep jobs whose location contains one of these, e.g. `Texas`, `London`, `Remote`. |
| `remoteOnly` | Only jobs marked remote. |
| `postedWithinDays` | Only jobs posted in the last N days (Workday shows ages up to 30, then 30+). |
| `includeDescription` | On (default): full description, requisition ID, country, start date, salary. Off: the listing only, faster and half the price. |
| `onlyNew` | Only jobs not returned by an earlier run with the same companies and filters. |
| `maxJobsPerCompany`, `maxJobs` | Caps per company and per run. |

### Example input

Every job at two companies:

```json
{
  "companies": ["nvidia", "https://workday.wd5.myworkdayjobs.com/Workday"]
}
```

A daily alert for new engineering jobs posted in the last day, at a list of target employers:

```json
{
  "companies": ["nvidia", "adobe", "walmart", "target"],
  "searchText": "engineer",
  "postedWithinDays": 1,
  "onlyNew": true
}
```

One keyword across every Workday employer:

```json
{
  "searchAllCompanies": true,
  "searchText": "data engineer",
  "postedWithinDays": 3,
  "maxJobs": 2000
}
```

### Example output

```json
{
  "company": "Workday, Inc.",
  "title": "Large Enterprise Account Executive - Manufacturing",
  "jobReqId": "JR-0107545",
  "location": "USA, IL, Chicago",
  "additionalLocations": ["USA, MN, Minneapolis"],
  "country": "United States of America",
  "countryCode": "US",
  "remote": false,
  "remoteType": "Flex",
  "timeType": "Full Time",
  "postedOn": "Posted Today",
  "postedDaysAgo": 0,
  "startDate": "2026-10-01",
  "salaryMin": 134200,
  "salaryMax": 201300,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": "$134,200 USD - $201,300 USD",
  "description": "Your work days are brighter here. ...",
  "url": "https://workday.wd5.myworkdayjobs.com/Workday/job/USA-IL-Chicago/Account-Executive---Large-Enterprise_JR-0107545",
  "applyUrl": "https://workday.wd5.myworkdayjobs.com/Workday/job/USA-IL-Chicago/Account-Executive---Large-Enterprise_JR-0107545/apply",
  "hiringEntity": "Workday, Inc.",
  "workdayTenant": "workday",
  "workdaySite": "Workday",
  "careerSiteUrl": "https://workday.wd5.myworkdayjobs.com/Workday"
}
```

The run's `SUMMARY` record lists how many jobs each career site listed and returned, and any company name that could not be resolved.

### Uses

- Job boards and job-alert products: fresh postings straight from employers' own career sites, with no reposts or stale aggregator copies
- Recruiting and sourcing: watch competitors' openings by team, location and seniority
- Sales signals: a company hiring for the role your product serves is a warm account
- Labor-market research: hiring volume and pay ranges across an industry, from the source

### Pricing

Pay per job:

- **$0.003** per job with full description and salary (`includeDescription` on, the default)
- **$0.0015** per job from the listing only (`includeDescription` off)

A run that returns no jobs is free. There is no proxy cost behind the price: runs are plain JSON calls, so platform usage stays near zero.

### Notes

- Want one search across many companies and ATSes at once (Workday, Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Personio)? Use [Career Site Jobs Search](https://apify.com/scrapemint/ats-jobs-search).
- Company on Greenhouse, Lever, Ashby or SmartRecruiters instead? Use [Greenhouse, Lever & Ashby Jobs Scraper](https://apify.com/scrapemint/company-job-openings-scraper).
- A company the directory does not know can always be read by URL. Find it on the company's careers page: the address contains `myworkdayjobs.com` or `myworkdaysite.com`.
- Some employers run several Workday sites (external, internal, campus). A name resolves to the one with the most open jobs; pass a URL to pick a specific site.
- `postedOn` is Workday's own wording ("Posted 3 Days Ago"). Workday does not publish an exact posting date in its listing, so `postedDaysAgo` is computed from it, and "30+ Days Ago" reads as 31.
- If a posting cannot be opened, the job is still returned from the listing, without description or salary, and billed at the listing price.

# Actor input Schema

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

A Workday career-site URL (https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, any page on it works) or just a company name (nvidia, walmart, adobe), looked up in the built-in directory of Workday employers.

## `searchAllCompanies` (type: `boolean`):

Run the search across every Workday employer in the directory instead of a list. Needs a keyword or a posted-within window to keep the run bounded.

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

Workday's own job search, e.g. data engineer, nurse, account executive. Empty for every job.

## `strictKeyword` (type: `boolean`):

On: keep a job only when every word of the keyword is in its title (or in its description, when Full description is on). Workday's own search is loose, so "data engineer" alone also returns operations managers. Off: Workday's raw matches.

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

Keep jobs whose location contains one of these, e.g. California, London, Remote.

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

Only jobs marked remote.

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

Only jobs posted in the last N days. 0 for any age. Workday shows ages up to 30 days, then 30+.

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

On: open each posting for its full description, requisition ID, country, start date and salary range. Off: the listing only, faster and cheaper.

## `onlyNew` (type: `boolean`):

On: each run returns only jobs earlier runs (with the same companies and filters) have not. For alerts on a schedule.

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

Stop each company after this many jobs.

## `maxJobs` (type: `integer`):

Stop the run after this many jobs.

## Actor input object example

```json
{
  "companies": [
    "nvidia",
    "https://workday.wd5.myworkdayjobs.com/Workday"
  ],
  "searchAllCompanies": false,
  "searchText": "",
  "strictKeyword": true,
  "locations": [],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "onlyNew": false,
  "maxJobsPerCompany": 50,
  "maxJobs": 200
}
```

# Actor output Schema

## `jobs` (type: `string`):

Company, title, requisition ID, location and additional locations, country, remote, time type, posted, salary min/max/currency/period, description, URL and apply URL.

## `summary` (type: `string`):

Jobs listed and returned per career site, and any company that could not be resolved or read.

# 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 = {
    "companies": [
        "nvidia",
        "https://workday.wd5.myworkdayjobs.com/Workday"
    ],
    "maxJobsPerCompany": 50,
    "maxJobs": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/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 = {
    "companies": [
        "nvidia",
        "https://workday.wd5.myworkdayjobs.com/Workday",
    ],
    "maxJobsPerCompany": 50,
    "maxJobs": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/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 '{
  "companies": [
    "nvidia",
    "https://workday.wd5.myworkdayjobs.com/Workday"
  ],
  "maxJobsPerCompany": 50,
  "maxJobs": 200
}' |
apify call scrapemint/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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