Workday Jobs Scraper - 2,600+ Employer Career Sites avatar

Workday Jobs Scraper - 2,600+ Employer Career Sites

Pricing

from $1.00 / 1,000 job results

Go to Apify Store
Workday Jobs Scraper - 2,600+ Employer Career Sites

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

Sulle H

Maintained by Community

Actor 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

FieldDescription
providerAlways workday — the same schema the multi-ATS Actors below emit
company / companySlugWorkday tenant name, and the full three-part board key
jobIdWorkday requisition id — stable, so it works as a dedupe key across runs
titleJob title
locationLocation as published
employmentTypeFull time or part time, as the employer classified it
postedAtISO date, derived from Workday's posting age — see below
applyUrlDirect link to the posting on the employer's own site
scrapedAtWhen 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

OptionWhat it does
keywordsKeep only titles containing one of these. Case-insensitive.
excludeKeywordsDrop titles containing any of these, e.g. senior, intern.
locationsKeep only locations containing one of these.
remoteOnlyKeep only postings that look remote.
postedWithinDaysFreshness filter, 90 days by default. Rows with no date are kept.
companiesCareers URLs or three-part keys. Leave empty to search all 2,658.
maxBoardsHow many boards to scan, largest-first.
maxJobsHard cap on rows, so a run costs what you expect.
maxJobsPerCompanyStops 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 requests
rows = 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_BOARDS record in the key-value store, with the reason for each.
  • companySlug:jobId is 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.