Workday Jobs Scraper & API - Open Roles, Any Company
Pricing
from $1.20 / 1,000 jobs
Workday Jobs Scraper & API - Open Roles, Any Company
Track hiring across up to 200 Workday boards in one run, in one row shape you can diff daily. Zero open roles, a board that does not exist and a failed fetch are three different rows - never a silently empty result. Unofficial, not affiliated with Workday.
Pricing
from $1.20 / 1,000 jobs
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
9 hours ago
Last modified
Categories
Share
Pull every open job from any company's Workday job board, read straight from Workday's own public board API. No HTML scraping, no proxies, no API keys, nothing that breaks when a careers page is redesigned.
Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by Workday. All product names are trademarks of their respective owners.
Don't know a company's board name? ATS Job Board Finder turns a domain into the board name this Actor takes.
It never returns an empty result to mean two different things
Most job-board Actors return an empty dataset when something goes wrong, and an empty dataset when there is genuinely nothing to report. Those are not the same answer, and if you are monitoring hiring activity the difference is the whole point.
Every board you ask for produces at least one row, tagged in the rowType column:
rowType | ok | What it means | Charged? |
|---|---|---|---|
job | true | A real open job | Yes |
no-open-roles | true | The board is live and has no open jobs (or none matching your filters) | No |
board-not-found | false | No board with that name exists on Workday | No |
unavailable | false | Workday could not be reached, or the entry could not be read as a board; reason says why | No |
budget-reached | false | The run hit the Max total charge you set. Names every board that was cut short and every board not fetched because of it | No |
partial | true | The rows are real, but the board has more than one run returns. Says how many of how many | No |
You are charged only for job rows.
What Workday actually publishes - measured, not estimated
Run on 2026-09-01 with the shipped build and the default input: 622 job rows across 2 boards.
| nvidia (500) | redhat (122) | |
|---|---|---|
title, jobUrl, locationRaw | 100% | 100% |
postedAt | 0% | 0% |
department, employmentType, workplaceType, isRemote | 0% | 0% |
salaryMin / salaryMax | 0% | 0% |
Workday carries the least of the five. Its board listing returns only the title, location, a job code and a relative "Posted 3 Days Ago" string - and a relative phrase is not a date, so postedAt stays null rather than being turned into a guess. That means remoteOnly, departmentContains and postedWithinDays filter out every Workday row - use titleContains and locationContains instead, or remoteHint for the guess. One run returns up to 500 roles per board; if a board has more you get a free partial row saying how many of how many you received, so a truncated run can never look complete.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
boards | array | workday:redhat.wd5.myworkdayjobs.com/jobs, workday:nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite | One entry per company board, up to 200 |
titleContains | string | (empty) | Keep only jobs whose title contains this text (case-insensitive) |
departmentContains | string | (empty) | Keep only jobs whose department or team contains this text |
locationContains | string | (empty) | Matches the primary location and every secondary location |
remoteOnly | boolean | false | Keep only jobs Workday itself flags as remote - never a guess |
postedWithinDays | integer | 0 (off) | Keep only jobs first published within N days. Unknown dates are excluded rather than assumed recent |
maxJobsPerBoard | integer | 0 (no limit) | Cap of job rows per board, applied after filtering |
includeDescription | boolean | false | Add the full description as plain text in descriptionText |
maxRetries | integer | 3 | Total attempts per board for temporary errors (HTTP 429 / 5xx). A 404 is a permanent answer and is not retried |
Naming a board: the board URL - https://<tenant>.wd5.myworkdayjobs.com/<Site>. A bare company name never tries Workday, because the tenant and the site name are both part of the address.
Output columns
rowType, ok, reason, ats, companySlug, companyName, jobId, title, department, team, employmentType, locationRaw, locationsAll, country, city, workplaceType, isRemote, remoteHint, salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryText, postedAt, updatedAt, jobUrl, applyUrl, descriptionText, source
All 29 columns are present on every row, in the same order - including the marker rows. The Greenhouse, Lever, Ashby, Workable and Workday Actors all return these same 29 columns, so adding another ATS never means rewriting your parser.
Two things it refuses to invent
isRemoteis set only when Workday itself says so. A guess based on the location text lives in a separate column calledremoteHint, so you always know which is which. A job located in "Remote, Oregon" is not a remote job.salaryMin/salaryMaxcome only from structured compensation fields. Nothing is parsed out of prose, and a missing figure staysnull- never0.
How it is checked
- 148 automated checks across 3 files, run before every publish
- 50 deliberate defects injected into the source; all 50 were caught by those checks (re-run and verified 2026-09-03)
- Only public job boards are read. Nothing needs a login, and no private ATS data is accessed
- Every request has a 45-second timeout, so a silent server cannot hang the run
- Up to 200 boards per run
The rest of the family
Same 29 columns, same row rules, one ATS each:
- greenhouse-jobs - Greenhouse boards
- lever-jobs - Lever boards
- ashby-jobs - Ashby boards
- workable-jobs - Workable boards
- ats-jobs-api - all five in one run, for a mixed list
- ats-board-finder - a company domain to the ATS and board name it uses
Support
Found a board that behaves oddly? Open an issue on the Issues tab and include the board name - it will be reproduced against the live API before anything is changed.