# Workday Jobs Scraper — Career Site Jobs API with Salaries (`nefes-tools/workday-jobs`) Actor

All open jobs from any company's Workday career site (myworkdayjobs.com): title, location, country, remote/hybrid, posting date, salary range, description and link. Handles 2,000+ job sites, keyword/country filters, only-new mode for daily alerts. Pay per job.

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

## Pricing

from $1.00 / 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.

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 — Career Site Jobs API with Salaries

**Paste any company's Workday career site and get every open job in one clean table** — title, location, country,
remote/hybrid, full or part time, exact posting date, **salary range when published**, full description and the job link.
Workday runs the career sites of most Fortune 500 companies (NVIDIA, Salesforce, Pfizer, Mastercard, Intel, AstraZeneca…).
Works past Workday's 2,000-job limit, filters by keyword, country and date, and "only new jobs" turns it into a daily
job alert. **$1 per 1,000 jobs, no monthly fee.**

| You give | You get, per job |
|---|---|
| `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`, `https://salesforce.wd12.myworkdayjobs.com/External_Career_Site` … | company (hiring legal entity), title, requisition ID, location + all additional locations, country and ISO code, remote/hybrid/on-site, full/part time, posting date, salary min/max/currency/period + the original salary sentence, clean description, job link |

### Who uses it

- **Recruiters and staffing agencies:** watch the big employers your clients compete with and see new roles the day
  they open — with the pay range, so you can price candidates.
- **Sales teams (hiring signals):** a company opening 40 data engineering roles in Germany is buying tools, training and
  office space. Feed the list to your CRM.
- **HR-tech, job boards and newsletters:** fill a niche board (remote AI jobs, pharma in Switzerland, US jobs with
  published salaries) straight from the employer, not from aggregators.
- **Investors and market analysts:** hiring by country, function and seniority is an early signal of expansion or cuts.
- **Salary benchmarking:** US pay-transparency laws put a salary range in most US postings; you get it as numbers.

### Input

- **Workday career sites** — open the company's job search page and copy the link from the address bar. Any link from
  the site works (with `/en-US/`, a job link, `…myworkdaysite.com/recruiting/…`).
- **Search keywords** — searched with the site's own job search (title and description). Several keywords = any of them.
- **Locations** — `Germany`, `United Kingdom`, `Santa Clara`, `Remote`… The Actor uses the site's own location filter
  when it knows the place, otherwise it matches the job's location text. Use the spelling the site shows.
- **Exclude keywords in title**, **workplace** (remote / hybrid / on-site), **posted within N days**,
  **max jobs per site**, **max jobs in total**.
- **Only new jobs since the last run** — remembers what you already got; you pay only for new jobs.
- **Fast mode:** turn off *Open each job for full details* to get titles, locations and links only (about 20× fewer
  requests; dates older than 30 days and salaries are then not available).

### Example row

```json
{
  "company": "Salesforce, Inc.",
  "title": "Software Engineer, AI Systems (PMTS)",
  "jobReqId": "JR361238",
  "location": "California - San Francisco",
  "additionalLocations": ["Massachusetts - Boston", "New York - New York", "Washington - Seattle", "Washington - Bellevue"],
  "country": "United States of America",
  "countryCode": "US",
  "workplaceType": "hybrid",
  "remoteType": "Office Tech-Flexible",
  "timeType": "Full time",
  "postedAt": "2026-09-29",
  "salaryText": "The typical base salary range for this position is $172,500 - $313,700 annually.",
  "salaryMin": 172500,
  "salaryMax": 313700,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "url": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/California---San-Francisco/Software-Engineer--AI-Systems--PMTS-_JR361238",
  "description": "…"
}
```

Also in every row: `hiringEntity` (legal entity exactly as Workday shows it), `postedOnText`, `careerSite`, `tenant`,
`site`, `jobId`, `fetchedAt`. Fields the company does not publish are `null`. Salary is read from the job description;
when it has several ranges (e.g. by city), the first one is used and the full sentence is in `salaryText`.

### Pricing

Pay per event: **$0.001 per job delivered** ($1 per 1,000) plus a tiny start fee. Filtered-out jobs, jobs you already
got in "only new" mode and sites that could not be read cost nothing. Set a maximum cost per run and the Actor stops
exactly there.

Speed: about 150 jobs per minute with full details, 1,000+ per minute in fast mode. A site with 2,600 jobs (NVIDIA)
is read completely.

### How it works — and what it doesn't do

- Uses the **public job search** that powers every Workday career site — the same data any visitor sees. No login, no
  browser, no proxies, no API key.
- Reads each site's **robots.txt** and respects it: career sites a company marks as off-limits (internal job boards,
  talent communities) are skipped.
- Polite by design: a pause between requests to each site. Anti-bot checks are never bypassed; such a site is skipped
  and reported.
- **No personal data:** recruiter e-mails, phone numbers and links to personal profiles are removed from descriptions;
  application forms and applicant or recruiter data are never collected.

### Run summary

The `SUMMARY` record in the key-value store lists every career site with jobs checked, delivered, filtered out, already
seen, and the reason if a site could not be read (wrong link, site not found, robots.txt).

### Tips

- Many companies have several Workday sites (experienced, campus, subsidiaries). Add each one you care about.
- One run can cover hundreds of companies. Give each schedule its own **memory name** so "only new" keeps separate
  histories.
- Companies on other systems (Personio, Workable, Greenhouse, Lever, Ashby…)? Use our
  [Career Page Jobs API](https://apify.com/nefes-tools/eu-company-jobs).

# Actor input Schema

## `careerSites` (type: `array`):

One per line. Open the company's job search page and copy the link from the address bar, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite or https://salesforce.wd12.myworkdayjobs.com/en-US/External\_Career\_Site. Job links from the same site work too.

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

Search each keyword with the site's own job search (title and description), e.g. data engineer, account executive. Several keywords = jobs matching any of them. Empty = all jobs.

## `excludeKeywords` (type: `array`):

Drop jobs whose title contains any of these words (case-insensitive), e.g. intern, principal.

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

Countries, states or cities, e.g. Germany, United Kingdom, California, Remote. The Actor uses the site's own location filter when it has one, otherwise it matches the job location text. Empty = all locations.

## `workplace` (type: `string`):

Filter by remote / hybrid / on-site where the company states it (needs job details).

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

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

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

Remember the jobs already delivered and return only new ones next time. Ideal for a daily schedule: you pay only for new jobs.

## `stateKey` (type: `string`):

Use a different name for each separate watch list, so their memories do not mix.

## `includeDetails` (type: `boolean`):

Adds exact posting date, country, all locations, remote type, salary range and description. Turn off for a fast list of titles, locations and links only.

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

Full description as plain text (e-mails, phone numbers and personal profile links are removed). Turn off for a smaller dataset.

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

Stop after this many jobs across all sites. You pay only for delivered jobs.

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

Optional cap per company.

## Actor input object example

```json
{
  "careerSites": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
  ],
  "workplace": "any",
  "onlyNew": false,
  "stateKey": "default",
  "includeDetails": true,
  "includeDescription": true,
  "maxResults": 20
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "careerSites": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("nefes-tools/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 = {
    "careerSites": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
    ],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("nefes-tools/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 '{
  "careerSites": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
  ],
  "maxResults": 20
}' |
apify call nefes-tools/workday-jobs --silent --output-dataset

```

## MCP server setup

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