Workday Jobs Scraper - 2,600+ Employer Career Sites
Pricing
from $1.00 / 1,000 job results
Workday Jobs Scraper - 2,600+ Employer Career Sites
Scrape live job postings from any Workday career site, or search 2,600+ known Workday employers in one run. Paste the careers URL - titles, locations, departments, apply links.
Pricing
from $1.00 / 1,000 job results
Rating
0.0
(0)
Developer
Sulle H
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
Share
Workday Jobs Scraper — 2,658 Employer Sites, 595,820 Open Roles
Workday runs the careers site of a large share of the Fortune 500, and every one of those sites answers the same JSON endpoint. This Actor reads it — for a company you name, or across a bundled registry of 2,658 live Workday career sites carrying 595,820 open postings.
{ "keywords": ["nurse"], "locations": ["texas"], "maxJobs": 200 }
Or point it at specific employers. Paste the careers URL; the slug format is worked out for you:
{ "companies": ["https://cvshealth.wd1.myworkdayjobs.com/cvs_health_careers"] }
No login, no cookies, no proxies, no API key.
Why Workday is harder than it looks
Three things break naive Workday scrapers, and this Actor handles all three.
It is a POST API, not a GET. The endpoint wants a JSON body with an offset, applied facets and a search string. A crawler that only issues GETs sees nothing at all.
It returns 20 rows at a time. Not 100, not "all" — 20, whatever you ask for. Any cap expressed in pages rather than postings silently truncates Workday five times harder than the other platforms.
Its total field lies above 2,000. Every large employer reports exactly 2000, so ranking boards
by that number puts a 93,000-posting employer level with a 2,000-posting one. The response's own
facet counts carry the real figure, and that is what the registry stores — which is why Accenture
sits at the top of this registry with 93,353 postings rather than tied at the ceiling.
Board addresses, and how to get one
A Workday board is identified by three parts, not one: the data-centre cluster, the tenant, and the site name. They are all in the careers URL:
https://cvshealth.wd1.myworkdayjobs.com/cvs_health_careers└ tenant ┘ └cluster┘ └ site name ┘
Pass the whole URL and the Actor extracts wd1:cvshealth:cvs_health_careers itself. A locale
segment such as /en-US/ in the middle is handled too. If you already have the three-part key, pass
that instead.
Or skip the question entirely — run without companies and read the companySlug column.
What you get
| Field | Description |
|---|---|
provider | Always workday — the same schema the multi-ATS Actors below emit |
company / companySlug | Workday tenant name, and the full three-part board key |
jobId | Workday requisition id — stable, so it works as a dedupe key across runs |
title | Job title |
location | Location as published |
employmentType | Full time or part time, as the employer classified it |
postedAt | ISO date, derived from Workday's posting age — see below |
applyUrl | Direct link to the posting on the employer's own site |
scrapedAt | When this row was read |
The date field deserves an explanation
Workday does not publish a posting date. It publishes prose: Posted Today, Posted 5 Days Ago,
Posted 30+ Days Ago. This Actor converts the ones that carry a definite offset into real ISO
timestamps.
30+ Days Ago is genuinely unknown — it could be 31 days or three years — so postedAt stays
null rather than being invented. A wrong date is worse than a missing one, particularly if you are
filtering on freshness.
Because of that, postedWithinDays keeps rows with no date rather than dropping them. Otherwise
a freshness filter would throw away most of Workday.
What Workday does not publish
descriptionText and department are null on every row. Both live behind a separate
per-posting detail request — one HTTP call per job — which the listing endpoint does not expose and
a per-result price cannot carry. Salary is not a structured field at all.
If body text is the requirement, Greenhouse, Workable, Ashby and Breezy do publish it — the Career Site Job Feed covers those in this same output schema.
Input
| Option | What it does |
|---|---|
keywords | Keep only titles containing one of these. Case-insensitive. |
excludeKeywords | Drop titles containing any of these, e.g. senior, intern. |
locations | Keep only locations containing one of these. |
remoteOnly | Keep only postings that look remote. |
postedWithinDays | Freshness filter, 90 days by default. Rows with no date are kept. |
companies | Careers URLs or three-part keys. Leave empty to search all 2,658. |
maxBoards | How many boards to scan, largest-first. |
maxJobs | Hard cap on rows, so a run costs what you expect. |
maxJobsPerCompany | Stops one huge employer filling the entire run. |
That last one matters more here than anywhere else: the largest board in this registry has 93,353 postings, which is more than the whole Breezy and Ashby registries combined. Without a per-company cap it would fill any run by itself.
Recipes
Enterprise hiring, one query. Workday skews heavily corporate — healthcare systems, retail
chains, banks, manufacturers. Leave companies empty, set keywords, and you have a slice of
large-employer hiring that job aggregators charge for.
Track a competitor's headcount. One employer, run on a schedule, diff the jobId set between
runs. Departments and locations show where the money is going before any announcement does.
Regional labour-market data. locations plus a wide maxBoards gives you what is open in a
metro area across hundreds of large employers.
Use it as an API
Most people who rely on this Actor never open the Apify console after the first run — they call it from their own code and read the rows straight back. One request in, job rows out, no polling and no dataset id to chase:
curl -X POST "https://api.apify.com/v2/acts/starbright_overlap~workday-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords": ["nurse"], "locations": ["texas"], "maxJobs": 200}'
import requestsrows = requests.post("https://api.apify.com/v2/acts/starbright_overlap~workday-jobs-scraper/run-sync-get-dataset-items",params={"token": "YOUR_TOKEN"},json={"keywords": ["nurse"], "locations": ["texas"], "maxJobs": 200},timeout=300,).json()for r in rows:print(r["company"], "—", r["title"], "—", r["applyUrl"])
const rows = await (await fetch('https://api.apify.com/v2/acts/starbright_overlap~workday-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN',{ method: 'POST', headers: { 'Content-Type': 'application/json' },body: JSON.stringify({"keywords": ["nurse"], "locations": ["texas"], "maxJobs": 200}) },)).json();
Your token is at Settings → Integrations in the Apify console. Keep maxJobs set to what you
actually need — it is the cap that decides what the call costs.
Running it on a schedule instead
If you want the rows to arrive without asking, add a Schedule from the Actor page (Actions →
Schedule) and point a webhook at your endpoint. A daily schedule plus the postedWithinDays filter
is the usual setup for a job board or an alerting pipeline.
Pricing
Pay per result — you are charged per job row delivered. A board that fails or returns nothing costs you nothing. Platform usage is included rather than billed on top, so the per-result price is the whole price.
Beyond Workday
Companies move between applicant tracking systems, and most job-data projects need more than one:
- Career Site Job Feed — the same engine across Workday, Greenhouse, SmartRecruiters, Workable, Lever, Ashby and Breezy: 27,000+ employer boards in one run, identical output schema.
- New Job Alerts — the same coverage, but each run returns only what appeared since the previous run, so you are not diffing datasets yourself.
Rows from all of them share one schema, so you can union the datasets without a mapping layer.
Notes
- A dead board never aborts the run. Failures are collected into a
FAILED_BOARDSrecord in the key-value store, with the reason for each. companySlug:jobIdis a stable key. It does not change while a requisition is open, which makes it safe for detecting what opened and closed between runs.- No login, no proxies, no API key. Workday publishes this endpoint openly. Boards behind an employer login are invisible to every scraper, including this one.