# Workday Jobs Scraper: Salary, Visa & New Jobs (`digital_influx/workday-jobs-scraper`) Actor

Extract every open job from any Workday career site (myworkdayjobs.com, myworkdaysite.com): NVIDIA, Salesforce, Wells Fargo and thousands more. Salary from the description, seniority, visa, exact posting date and full text. Only-new-jobs mode for daily schedules. No proxies, no login.

- **URL**: https://apify.com/digital\_influx/workday-jobs-scraper.md
- **Developed by:** [Bruno Petrelli](https://apify.com/digital_influx) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job saveds

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: Salary, Visa & New Jobs

Get **every open job from any Workday career site** in a clean table: NVIDIA, Salesforce, Wells Fargo, Capital One, Adobe, Intel, AstraZeneca and the thousands of other employers whose careers page ends in **myworkdayjobs.com** or **myworkdaysite.com**. Paste the careers page address and get title, location, country, **salary**, **seniority**, **visa sponsorship**, **years of experience**, employment type, the **exact posting date** and the full description.

It reads the same public job data that a Workday careers page loads in your browser. That means:

- **No proxies, no headless browser, no login, no CAPTCHAs.** In our test, 20 jobs from each of 10 big employers (200 jobs with full descriptions) came in about 20 seconds.
- **The exact posting date.** Workday's job list only says "Posted 30+ Days Ago"; the Actor reads each job page, so `postedAt` is a real date and the "posted within N days" filter is exact.
- **Salary, even though Workday has no salary field.** US pay-transparency ranges are written inside the description ("$197,300 - $313,700"); the Actor reads them into numbers. In our test sample of 200 jobs, 102 came out with a salary.
- **Only new jobs.** Schedule it daily and get just the postings that are new since the last run, and pay only for those.

### What you can use it for

- **Job boards and newsletters:** aggregate fresh roles from the big employers that hire through Workday, filtered by keyword, location, seniority and remote.
- **Recruiters and talent teams:** monitor the openings of competitors and target accounts every day, with only-new mode.
- **Sales intelligence:** hiring is a buying signal. A bank opening 20 data engineering roles is shopping for data tools.
- **Market research:** compare salary ranges, seniority mix and hiring velocity between employers.
- **Candidates and job sites for international talent:** keep only jobs that say they sponsor visas.
- **AI agents:** the output is plain JSON with plain-text descriptions, ready for an LLM. Agents can call this Actor through the Apify MCP server.

### Input

| Field | What it does |
|---|---|
| **Workday career sites** (required) | One per line: the address of the careers page, as it shows in your browser. A link to any job on that site works too. |
| Title keywords | Keep jobs whose title has any of these words. Whole-word match: `intern` does not match `internal`. Each word is also searched with Workday's own search, so big sites stay fast. |
| Exclude title keywords | Drop titles with these words, e.g. `manager`. |
| Locations | Keep jobs whose location, secondary locations or country code contain the text: `Texas`, `Germany`, `DE`. A two-letter code matches as a whole word or the country code, so `US` does not match "Dusseldorf". `remote` also matches jobs flagged remote. |
| Remote only | Only jobs marked Remote, or whose location says Remote. |
| Seniority | Keep only these levels, read from the title: intern, entry, not stated (usually mid-level), senior, lead, director, executive. |
| Posted within (days) | Only jobs published in the last N days, by their exact date. |
| Workplace type | Remote, hybrid, on-site, or not stated, as the employer set it. Most Workday jobs don't state it (159 of 200 in our sample): add *Not stated* to keep them. |
| Employment type | Full-time or part-time (on every Workday job); contract, temporary and internship when the title says so. |
| Description keywords / Exclude description keywords | Whole-word match on the full description: `Kubernetes`, `GDPR`; exclude `clearance`. |
| Only jobs that state a salary | A pay range written in the description. |
| Only jobs that offer visa sponsorship | The description says the company sponsors visas. Jobs that say nothing are dropped. |
| Job description | Plain text (default), HTML, both, or none. |
| Max jobs per career site / in total | Newest first. |
| Only new jobs (for scheduled runs) | Save only jobs that earlier runs with the same sites and filters did not save. |
| Memory name | Optional: share one memory between tasks, or start over with a new name. |

Accepted addresses:

```
https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite
https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Some-Job_JR2016045
https://salesforce.wd12.myworkdayjobs.com/External_Career_Site
https://wd1.myworkdaysite.com/recruiting/wf/WellsFargoJobs
```

**How to find a company's Workday address:** open the company's careers page and click on any job. If the address in your browser contains `myworkdayjobs.com` or `myworkdaysite.com`, copy it: that's the one. If the company has a careers site on its own domain, the Workday address often appears when you click **Apply** on a job.

Example input:

```json
{
  "careerSites": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite", "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"],
  "keywords": ["engineer", "scientist"],
  "locations": ["California", "remote"],
  "seniority": ["senior", "lead"],
  "postedWithinDays": 7
}
```

Daily monitoring of new postings (schedule it in *Schedules*):

```json
{
  "careerSites": ["https://capitalone.wd12.myworkdayjobs.com/Capital_One", "https://wd1.myworkdaysite.com/recruiting/wf/WellsFargoJobs"],
  "keywords": ["data"],
  "maxJobsPerCompany": 50,
  "onlyNew": true
}
```

### Output

One item per job:

```json
{
  "id": "JR359867",
  "platform": "workday",
  "companySlug": "salesforce",
  "company": "Salesforce",
  "title": "Director of Software Engineering (Data)",
  "department": null,
  "team": null,
  "location": "California - San Francisco",
  "locations": ["California - San Francisco"],
  "country": "US",
  "remote": false,
  "workplaceType": "hybrid",
  "employmentType": "Full time",
  "experienceLevel": null,
  "seniority": "director",
  "postedAt": "2026-09-30T00:00:00.000Z",
  "updatedAt": null,
  "url": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/California---San-Francisco/Director-of-Software-Engineering--Data-_JR359867",
  "applyUrl": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/California---San-Francisco/Director-of-Software-Engineering--Data-_JR359867/apply",
  "salary": { "min": 197300, "max": 313700, "currency": "USD", "period": "year", "text": "$197,300 - $313,700", "source": "description" },
  "yearsOfExperience": 15,
  "visaSponsorship": null,
  "descriptionText": "To get the best candidate experience, please consider applying for a maximum of 3 roles within 12 months...",
  "descriptionHtml": null,
  "scrapedAt": "2026-09-30T20:00:00.000Z"
}
```

Field notes:

- `companySlug` is the Workday tenant (the first part of the address) and `company` is made from it, so `wf` stays "Wf". Workday does not publish the employer's display name.
- `id` is the requisition id from the job page (`JR359867`). `url` opens the job and `applyUrl` its application form.
- `country` is an ISO 3166-1 alpha-2 code (`US`, `GB`, `DE`), from the country Workday gives on the job page.
- `remote: true` means the job offers a fully remote option. `workplaceType` is what the employer declared: `remote`, `hybrid` or `onsite`, and `null` when it says nothing.
- `salary` is read from the pay range written in the description. A number is taken only when it is clearly pay: it needs a pay word, a period or a currency code next to it, and bonuses, funding rounds or revenue are skipped. When in doubt the field stays `null`.
- `seniority` is read from the title: `intern`, `entry`, `senior`, `lead` (lead, staff, principal), `director` (director, head of) or `executive` (VP, C-level). `null` means the title names no level.
- `yearsOfExperience` is the minimum asked for in the description ("5+ years of experience" → 5).
- `visaSponsorship` is `true` when the description offers visa sponsorship, `false` when it says there is none, and `null` when it does not say.
- `department` and `team` are always `null`: Workday's public job data has no department.
- The run's **OUTPUT** record in the key-value store lists, for every career site, how many jobs were open, how many matched, how many were already saved by an earlier run, and why a site failed (not found, not a Workday address, HTTP error).

### Only new jobs

Turn on **Only new jobs** and schedule the task (daily or hourly). Each run saves only the jobs that earlier runs with the same career sites and filters did not save, so you get just the new postings and pay only for those. The memory is kept for 180 days in a key-value store named `workday-jobs-state` in your own Apify account. With a per-site limit, the new jobs are looked for among the newest ones.

Each set of sites and filters has its own memory. To share one between two tasks, give both the same **Memory name**; to start over, give a new one.

### Pricing

Pay per event: you pay **only for jobs saved to the dataset**, not for jobs that were read and filtered out, and not for jobs skipped by *Only new jobs*. Filters cost nothing, so a precise filter is the cheapest run. Set a maximum cost for a run and the Actor stops cleanly when it is reached.

### Good to know

- Only **public** career sites are available: the same jobs anyone sees on the company's careers page.
- Workday lists jobs newest first, 20 per page. With a job cap the Actor stops reading pages once it has enough candidates, so big employers stay fast and cheap. Workday itself lists at most about 2,000 jobs per search: for employers with more, use title keywords, which run as Workday searches of their own.
- Each saved job is read from its job page (the list has no exact date, country or description). Description, salary, visa, workplace and employment type filters are decided on the job page: the Actor reads the job pages newest first and stops once enough jobs pass your cap. Without a cap it reads every candidate job page, which takes a while on big employers.
- Career sites on a company's own domain that only embed Workday are not detected: paste the myworkdayjobs.com or myworkdaysite.com address that appears when you click **Apply**.
- **Greenhouse, Lever, Ashby, Workable, BambooHR and more?** Our **ATS Job Scraper** reads 12 job platforms, Workday included, with the same columns. **No list of companies?** Our **Job Search API** searches 20,000+ company career sites by job title, location and date.

### Support

Found a career site that doesn't load, or a field that looks wrong? Open an issue on the Actor's Issues tab with the careers page address. Issues get an answer within a few days.

# Actor input Schema

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

One per line: the address of a company's Workday careers page, as it shows in the browser. It ends in myworkdayjobs.com or myworkdaysite.com, for example nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite or wd1.myworkdaysite.com/recruiting/wf/WellsFargoJobs. A link to any job on that site works too.

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

Keep jobs whose title contains any of these words (whole-word match, so 'intern' does not match 'internal'). Each word is also searched with Workday's own search, so big career sites stay fast. Leave empty for all jobs.

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

Drop jobs whose title contains any of these words, e.g. senior, manager.

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

Keep jobs whose location, any secondary location or country code contains one of these texts (e.g. Berlin, Germany, DE). The word 'remote' also matches jobs flagged remote.

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

Keep only jobs that offer a fully remote option: the employer marked the job Remote, or its location says Remote.

## `seniority` (type: `array`):

Keep only these levels, read from the job title: "Senior Data Engineer" is senior, "Head of Sales" is director. "Not stated" keeps titles without a level word, which are mostly mid-level roles. Empty = all levels.

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

Keep only jobs published in the last N days. Jobs without a publish date are dropped when this is set.

## `workplaceTypes` (type: `array`):

Keep only these workplace types, as the employer set them on the job (Workday's remote type: Remote, Hybrid, Flex, On-site). Most Workday jobs do not state it (80% in a sample of 200): add "Not stated" to keep them. Empty = all.

## `employmentTypes` (type: `array`):

Keep only these employment types. Workday gives full-time or part-time on every job; contract, temporary and internship come from the title ("Intern", "(Contract)"). Empty = all.

## `descriptionKeywords` (type: `array`):

Keep jobs whose description contains any of these words (whole-word match), e.g. Python, Kubernetes, GDPR. The text of every candidate job is read, so these runs take longer on big career sites.

## `excludeDescriptionKeywords` (type: `array`):

Drop jobs whose description contains any of these words, e.g. clearance, relocation.

## `onlyWithSalary` (type: `boolean`):

Keep only jobs with a pay range written in the description (Workday has no salary field; US pay-transparency ranges are common). 102 of 200 jobs had one in our sample.

## `onlyVisaSponsorship` (type: `boolean`):

Keep only jobs whose description says the company sponsors visas. Jobs that say nothing about it are dropped.

## `descriptionFormat` (type: `string`):

Plain text is best for spreadsheets and AI agents. 'None' makes runs faster and results smaller.

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

Newest first. 0 or empty = no limit (Workday itself lists at most about 2,000 jobs per search).

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

Stop after saving this many jobs across all career sites. 0 or empty = no limit. You also never pay more than the spending limit you set for the run.

## `maxConcurrency` (type: `integer`):

How many career sites are read at the same time (1 to 10).

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

Save only jobs that earlier runs with these same career sites and filters did not save, so a daily schedule gives you just the new postings and you pay only for those. With a per-site limit, the new jobs are looked for among the newest ones. The memory is kept for 180 days in a key-value store named "workday-jobs-state" in your account.

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

By default each set of career sites and filters has its own memory. Give a name to share one memory between tasks, or a new name to start over. Letters, digits, dot, dash and underscore.

## Actor input object example

```json
{
  "careerSites": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
  ],
  "remoteOnly": false,
  "onlyWithSalary": false,
  "onlyVisaSponsorship": false,
  "descriptionFormat": "text",
  "maxJobsPerCompany": 20,
  "maxConcurrency": 4,
  "onlyNew": false
}
```

# Actor output Schema

## `results` (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"
    ],
    "maxJobsPerCompany": 20
};

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

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

```

## MCP server setup

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