# Workday Jobs Scraper - Search Any Employer by Name (`signalscope-data/workday-jobs-scraper`) Actor

Scrape open jobs from any Workday careers site by company name or URL: title, department, location, salary, description. Company hiring-signal rows, new-job alerts. $1.50 per 1,000 jobs.

- **URL**: https://apify.com/signalscope-data/workday-jobs-scraper.md
- **Developed by:** [Bin](https://apify.com/signalscope-data) (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.50 / 1,000 job 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/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 — search any Workday employer by name

Extract **every open job from any Workday careers site** — NVIDIA, Salesforce, Walmart, Adobe, Netflix, Target, Bank of America, Pfizer and thousands of other enterprises that hire through Workday. Just type the **company name** ("Adobe", "Capital One", "Target") — no need to hunt for the careers URL. Get title, department, location, posting date, job type, requisition ID, hiring legal entity and the **full job description**, as clean JSON/CSV/Excel.

Schedule it with **"Only new jobs since last run"** to receive a daily feed of newly posted roles.

### Why use it

- 🔤 **Search by company name** — names are matched to the company's Workday tenant and career site automatically (`myworkdayjobs.com` and `myworkdaysite.com`). Companies with several career sites (e.g. Salesforce → Slack, Tableau, MuleSoft, internships) can be scraped all at once with **All career sites**.
- 🗂️ **Department filter** — `"departments": ["Engineering", "Sales"]` uses the site's own Job Category filter server-side and fills `department` on every job.
- 🏢 **Built for Workday** — uses Workday's own public careers API (the same one the careers page uses). No browser, no proxies → fast and cheap.
- 🔍 **Server-side keyword search** — query "data engineer" across a 10,000-job board in seconds instead of downloading everything.
- 📄 **Full details** — optional; adds the description, exact start date, time type (full/part time), `countryCode`, `additionalLocations` and `legalEntity` (the hiring subsidiary, e.g. "NDIN-Adobe Systems India Private Limited").
- 🧠 **Job insights on every row** (new) — `jobFunction`, `seniority` (intern / junior / mid-level / senior / staff/principal / manager/lead / director / executive) and `workplaceType` from the title and location; with **Job insights** on, also `skills` (60+ languages, clouds, data and business tools such as Python, AWS, Kubernetes, Salesforce, SQL, Figma), `yearsExperienceMin`, `minimumEducation`, `visaSponsorship` (offered / explicitly not offered) and `securityClearance` read from the description. Rule-based, instant and **free** — no AI credits. Filter by level with `"seniority": ["senior", "staff"]`.
- 💰 **Salary ranges** — `salaryMin` / `salaryMax` / `salaryCurrency` / `salaryPeriod` parsed from the description (e.g. NVIDIA's "224,000 USD - 356,500 USD"). Use **Only jobs with salary** for pay-transparency research.
- 🛟 **Reliable on huge boards** — Workday returns at most 2,000 jobs per query, so bigger boards are split by job family automatically (NVIDIA: all 2,700+ jobs, not just 2,000); request timeouts + retries; if a run nears its timeout it stops cleanly and keeps all results.
- 🆕 **New-jobs-only mode** — perfect for alerts, sales triggers (hiring signals) and job boards.
- 📊 **Company hiring signals** — `outputLevel: "companies"` returns **one row per company** instead of job rows: total open jobs, **new jobs in the last 7 / 30 / 90 days**, breakdown by **function** (engineering, sales, data & AI…), **seniority** (intern → executive), department, location and employment type, remote share, salary transparency + median pay, the 5 latest jobs — and, on scheduled runs, **new jobs, closed jobs and net headcount-plan change since the last run**. One cheap row per account for CRM / Clay / Sheets.
- 🎯 **Filters** — title keywords, exclude words, locations, remote only, posted within N days, max per company.
- ➕ **Also supports** Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio, Breezy HR, Rippling, BambooHR, Teamtailor and Pinpoint URLs in the same run — plus **Oracle Recruiting Cloud** career sites (`…oraclecloud.com/hcmUI/CandidateExperience/…`, e.g. JPMorgan Chase, Oracle) with server-side keyword search, pay ranges and full descriptions, and **SAP SuccessFactors** career URLs (`…successfactors.eu/career?company=…`).

### How to find a company's Workday URL

Usually you don't need to — type the company name. If a name isn't found (some companies use an internal tenant name), open the company's careers page → click any job → the address looks like
`https://COMPANY.wdN.myworkdayjobs.com/en-US/SITE_NAME/job/...`.
Copy it up to `SITE_NAME`, e.g. `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`.

### Input example

```json
{
  "companies": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "Adobe",
    "Capital One"
  ],
  "keywords": ["machine learning", "data engineer"],
  "departments": ["Engineering"],
  "locations": ["United States", "Remote"],
  "includeDescription": true,
  "onlyNewJobs": true
}
```

Hiring signals — one row per company, with new/closed jobs since the previous run (schedule it weekly):

```json
{
  "companies": ["Adobe", "Target", "Capital One"],
  "outputLevel": "companies",
  "stateKey": "target-accounts"
}
```

### Output example

```json
{
  "id": "JR2016289",
  "title": "Senior Machine Learning Engineer, Perception",
  "company": "nvidia",
  "department": "Engineering",
  "jobReqId": "JR2016289",
  "legalEntity": "NVIDIA Corporation",
  "countryCode": "US",
  "additionalLocations": ["US, CA, Remote"],
  "careerSite": "NVIDIAExternalCareerSite",
  "location": "US, CA, Santa Clara, United States of America",
  "remote": false,
  "employmentType": "Full time",
  "salaryMin": 184000,
  "salaryMax": 287500,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "postedAt": "2026-08-29T00:00:00.000Z",
  "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Senior-Machine-Learning-Engineer_JR2016289",
  "ats": "workday",
  "description": "NVIDIA is looking for ..."
}
```

Company row (`outputLevel: "companies"`, real data from Notion's board on 2026-10-07, lists shortened; `sinceLastRun` is illustrative — it appears from the second run with the same Monitor name):

```json
{
  "type": "company",
  "company": "notion",
  "input": "notion",
  "ats": "ashby",
  "atsSlug": "notion",
  "careerSite": null,
  "totalOpenJobs": 133,
  "jobsAnalyzed": 133,
  "filtered": false,
  "datesAvailable": 1,
  "newJobsLast7Days": 10,
  "newJobsLast30Days": 30,
  "newJobsLast90Days": 104,
  "jobsPostedOver30DaysAgo": 103,
  "newestPostingAt": "2026-10-02T19:56:09.176Z",
  "oldestPostingAt": "2025-07-25T22:00:31.199Z",
  "medianJobAgeDays": 60,
  "remoteJobs": 88,
  "remoteShare": 0.662,
  "byFunction": [
    {
      "function": "sales",
      "jobs": 44
    },
    {
      "function": "engineering",
      "jobs": 32
    },
    {
      "function": "customer success & support",
      "jobs": 19
    }
  ],
  "bySeniority": [
    {
      "level": "mid-level",
      "jobs": 76
    },
    {
      "level": "manager/lead",
      "jobs": 25
    },
    {
      "level": "staff/principal",
      "jobs": 16
    }
  ],
  "byDepartment": [
    {
      "department": "Sales / Sales",
      "jobs": 24
    },
    {
      "department": "Sales / Solutions Consultant",
      "jobs": 19
    },
    {
      "department": "Engineering / Engineering",
      "jobs": 16
    }
  ],
  "byLocation": [
    {
      "location": "San Francisco, California; New York, New York",
      "jobs": 34
    },
    {
      "location": "San Francisco, California",
      "jobs": 28
    },
    {
      "location": "Tokyo, Japan ",
      "jobs": 15
    }
  ],
  "byEmploymentType": [
    {
      "employmentType": "FullTime",
      "jobs": 129
    },
    {
      "employmentType": "Intern",
      "jobs": 3
    },
    {
      "employmentType": "Contract",
      "jobs": 1
    }
  ],
  "jobsWithSalary": 88,
  "salaryTransparencyShare": 0.662,
  "salaryCurrency": "USD",
  "medianSalaryMinYearly": 182500,
  "medianSalaryMaxYearly": 229000,
  "latestJobs": [
    {
      "title": "Payroll Analyst",
      "location": "San Francisco, California",
      "postedAt": "2026-10-02T19:56:09.176Z",
      "url": "https://jobs.ashbyhq.com/notion/92de7ece-b7d9-4b2a-b9cb-b978cc690a46"
    }
  ],
  "sinceLastRun": {
    "previousRunAt": "2026-09-29T08:00:00.000Z",
    "jobsBefore": 128,
    "newJobs": 9,
    "closedJobs": 4,
    "netChange": 5,
    "changePct": 3.9,
    "newJobTitles": [
      "Account Executive, Enterprise"
    ],
    "closedJobTitles": [
      "Software Engineer, Mobile"
    ]
  }
}
```

### Pricing

**$1.50 per 1,000 jobs.** No subscription. In new-jobs-only mode, already-seen jobs are never charged again.

Company hiring-signals rows (`outputLevel: "companies"`): **$0.01 per company** — job rows are not charged in that mode.

### Use cases

- **Recruiters & staffing agencies** — see new enterprise openings the day they are posted.
- **Sales teams** — hiring for a role = buying signal for your product.
- **Job boards & aggregators** — feed niche boards from hundreds of Workday sites.
- **Labor-market research** — track hiring by company, function and location.

### FAQ

**Can I get one row per company instead of every job?** Yes — set `outputLevel` to `companies`. Each row summarises the company's open jobs (after your keyword/location/department filters): totals, new jobs in the last 7/30/90 days (from posting dates; `datesAvailable` shows how many jobs have one), function and seniority mix (rule-based from title + department), top departments/locations, remote share and salary transparency. Run it on a schedule with the same **Monitor name** (`stateKey`) and every row gets `sinceLastRun`: new jobs, closed jobs, net change % and example titles — a hiring-spike or hiring-freeze alert for your target accounts. If a fetch was incomplete (timeout), closed jobs are reported as `null` instead of a false mass closure.

**What are the job insight fields and how accurate are they?** They are rule-based (keyword patterns, no AI), so they are fast, free and predictable. `seniority` comes from the title ("Senior", "Staff", "II/III", "Director", "Intern"...); titles with no level are `mid-level`, refined to `junior` (≤1 year asked) or `senior` (≥7 years) when the description states the experience. `skills` lists only tools and technologies explicitly named in the title or description. `visaSponsorship` is `false` only when the posting says sponsorship is not offered, `true` when it says it is, otherwise `null`. In a test on NVIDIA (Workday), Ramp (Ashby) and Spotify (Lever), senior/staff filtering returned 18 correctly levelled jobs with skills such as Python, C++, CUDA, PyTorch and Figma. With `outputLevel: "companies"` and an ATS whose list includes descriptions (Greenhouse, Lever, Ashby...), each company row also gets `topSkills`, `medianYearsExperience`, visa-sponsorship counts and the education mix — e.g. Ramp: Python 19%, Salesforce 17%, SQL 14% of 160 open jobs.

**Can I just type the company name?** Yes — e.g. "Adobe", "Capital One", "Target", "Intel", "Disney", "Salesforce". The Actor finds the company's Workday tenant and main career site; SUMMARY → `careerSites` shows which site was used. Some companies use an internal tenant name different from the brand — then paste the careers URL once.

**How do I get only engineering (or sales) jobs?** Add `"departments": ["Engineering"]`. Category names differ per company (PayPal uses "Technology Job Family Group", Capital One "AI & ML Engineering and Sciences"); partial words match, and if nothing matches the log prints that site's categories.

**What is `legalEntity`?** The hiring company/subsidiary from the job posting — handy to separate roles by country entity or acquired brands. Filled when "Include full job description" (or "Only jobs with salary") is on.

**Do I need a proxy or login?** No — it uses Workday's public careers API.

**Why are salaries empty?** Workday list pages don't include pay; salaries come from the job description, so turn on "Include full job description" or "Only jobs with salary". Companies outside pay-transparency regions often don't publish ranges.

**My run stopped with "Stopped early to avoid the run timeout"?** All jobs scraped so far are saved and SUMMARY lists skipped companies. Increase the run timeout, add keywords or set "Max jobs per company".

**Is it legal?** It reads only publicly posted job ads, no personal data.

### More tools from the same developer

- [Company Jobs Scraper](https://apify.com/signalscope-data/ats-jobs-scraper) — type a company name; auto-detects Workday, Greenhouse, Lever, Ashby, Personio & more, with salaries.
- [Workday Jobs Scraper](https://apify.com/signalscope-data/workday-jobs-scraper) — any myworkdayjobs.com careers site, server-side keyword search.
- [Greenhouse Jobs API & Scraper](https://apify.com/signalscope-data/greenhouse-jobs-scraper) — every job from one or many Greenhouse boards, new-jobs-only alerts.
- [Lever Jobs API & Scraper](https://apify.com/signalscope-data/lever-jobs-scraper) — any Lever board (incl. EU), structured salaries.
- [Ashby Jobs API & Scraper](https://apify.com/signalscope-data/ashby-jobs-scraper) — any Ashby board, structured compensation.
- [Workable Jobs API & Scraper](https://apify.com/signalscope-data/workable-jobs-scraper) — any Workable careers page.
- [Hacker News "Who is Hiring" Parser](https://apify.com/signalscope-data/hn-hiring-parser) — monthly HN hiring threads as structured jobs.
- [Public Tenders Monitor](https://apify.com/signalscope-data/public-tenders-monitor) — government procurement notices with keyword alerts.
- [Telegram Channel Scraper & Keyword Monitor](https://apify.com/signalscope-data/telegram-channel-monitor) — posts, views, reactions, keyword alerts.
- [App Store & Google Play Reviews Scraper](https://apify.com/signalscope-data/app-reviews-scraper) — reviews, ratings and new-review monitoring.
- [Shopify Products Scraper & Price Change Monitor](https://apify.com/signalscope-data/shopify-store-monitor) — full catalogs plus price-drop / restock alerts.

# Actor input Schema

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

Company names (e.g. "Adobe", "Capital One", "Target") or Workday careers site URLs, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite or https://wd1.myworkdaysite.com/recruiting/paypal/jobs. Names are matched to the company's Workday tenant automatically; if a name is not found, paste the careers URL (open any job and copy the address up to the site name). Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio and Breezy URLs also work, and Oracle Recruiting Cloud career sites (…oraclecloud.com/hcmUI/CandidateExperience/en/sites/…) and SAP SuccessFactors URLs (…successfactors.eu/career?company=…).

## `allCareerSites` (type: `boolean`):

When a company name resolves to a Workday tenant with several career sites (e.g. Salesforce: main site, Slack, Tableau, MuleSoft, internships), scrape all of them instead of only the main one.

## `outputLevel` (type: `string`):

"companies" = one row per company career site instead of job rows: total open jobs, new jobs in the last 7/30/90 days, breakdown by function, seniority, department, location and employment type, remote share, salary transparency and median pay, latest 5 jobs, plus new/closed jobs and net change since the previous run with the same Monitor name. Keyword/location/department filters still apply.

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

Searched server-side on Workday (fast even for 10,000+ job boards), then matched against the job title. Leave empty for all jobs.

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

Drop jobs whose title contains any of these words (e.g. "intern", "senior").

## `departments` (type: `array`):

Keep only jobs in these departments (e.g. "Engineering", "Sales", "Marketing"). On Workday this uses the careers site's own Job Category filter (server-side, fast) and fills the department field; partial words match. If nothing matches, the log lists the categories available on that site.

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

Keep only jobs at these levels: intern, junior (entry), mid-level, senior, staff/principal, manager/lead, director, executive. Detected from the job title; with job insights on, untitled levels are refined by the years of experience asked for. Leave empty for all levels.

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

Keep only jobs whose location contains ANY of these strings (e.g. "London", "Germany", "Remote").

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

Keep only jobs marked remote (or with "remote" in the location).

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

Keep only jobs published/updated in the last N days. 0 = no limit.

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

Keep only jobs that publish a pay range (from the ATS salary field or detected in the job description, e.g. "$150,000 - $200,000"). For Workday this fetches each job page, so it is slower.

## `onlyNewJobs` (type: `boolean`):

Remember jobs already returned and output only new ones. Ideal for scheduled daily/weekly alerts — you only pay for new jobs.

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

Used with 'Only new jobs'. Use a different name for each separate alert/schedule.

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

Add the plain-text job description to each result.

## `includeJobInsights` (type: `boolean`):

Every job already gets jobFunction, seniority and workplaceType from its title and location. Turn this on to also read each job's description (Workday / Oracle need one extra request per job, so runs are slower) and add: skills (60+ tools and technologies such as Python, AWS, Salesforce, SQL), yearsExperienceMin, minimumEducation / educationLevels, visaSponsorship (true = offered, false = explicitly not offered, null = not mentioned) and securityClearance. Rule-based and free - no extra charge. ATSs whose lists include descriptions (Greenhouse, Lever, Ashby...) get these fields even when this is off.

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

0 = unlimited.

## Actor input object example

```json
{
  "companies": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "Adobe"
  ],
  "allCareerSites": false,
  "outputLevel": "jobs",
  "seniority": [],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "onlyWithSalary": false,
  "onlyNewJobs": false,
  "stateKey": "default",
  "includeDescription": false,
  "includeJobInsights": false,
  "maxJobsPerCompany": 0
}
```

# 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 = {
    "companies": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "Adobe"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalscope-data/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": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
        "Adobe",
    ] }

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

```

## MCP server setup

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