Workday Jobs Scraper & API - Whole Career Site avatar

Workday Jobs Scraper & API - Whole Career Site

Pricing

from $0.80 / 1,000 jobs

Go to Apify Store
Workday Jobs Scraper & API - Whole Career Site

Workday Jobs Scraper & API - Whole Career Site

Read every open role on any Workday career site, including the boards past Workday's 2,000 result limit where other scrapers quietly repeat page one. Each row carries the title, requisition ID, location, remote type, posting date and a working apply link. JSON, CSV, Excel or API.

Pricing

from $0.80 / 1,000 jobs

Rating

0.0

(0)

Developer

Automation Craft

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Workday Jobs Scraper & API - Whole Career Site

This Workday jobs scraper reads every open role on any myworkdayjobs.com career site through Workday's own public jobs API. No login, no API key, no cookies and no browser. Paste one career site URL or fifty, get a clean row per job with a working apply link, and pay once per job: a role a run has already delivered is never billed again.

It is built around the one thing Workday does that quietly breaks other scrapers. Workday stops paginating at 2,000 results and then serves page one again, with HTTP 200 and no error, so a large career site comes back truncated and repeated. This Actor splits a big board by job category, country and job type until every slice fits under that limit. On NVIDIA's career site, which reports total: 2000, one run delivered 2,675 unique jobs.

Quick start

  1. Open the company careers page and copy the address. It looks like https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. The /en-US/ form, a link to a single job, a wd1.myworkdaysite.com/recruiting/... link and even the bare tenant name nvidia all work.
  2. Paste it into Workday career site URLs. Add more sites to the list to read them in one run.
  3. Set Maximum jobs in the run. Leave Fetch the full job description off for a cheap list-only run, turn it on when you need the posting text.
  4. Click Start. Results arrive as JSON, CSV or Excel, or through the Apify API.
  5. To turn it into a monitor, put a name in Dedup memory name and schedule it. Every later run delivers and charges only the roles added since.

What you get

One row per job. Fill rates below are measured on live runs: 2,675 NVIDIA jobs and 155 Red Hat jobs on 2026-09-16.

FieldWhat it isFilled
titleJob title as Workday publishes it100%
companyWorkday tenant the career site belongs to100%
tenant, site, hostWhere the row came from100%
jobReqIdThe employer's own requisition number, for example JR2025406100%
urlDirect link to the posting, built from the path the API returned this run100%
locationsTextLocation as the board shows it100%
locationsThe location parsed out, empty when the board says "3 Locations"62% list only, 100% with descriptions
multipleLocations, locationCountSet when a posting spans several offices100%
postedTextWorkday's own wording, for example Posted 4 Days Ago100%
postedAtCalendar date derived from that label43% list only, 100% with descriptions
postedAgeDays, postedIsMinimumAge in days, and whether it is a lower bound100%
remoteTypeWorkday's remote label0 to 100%, the employer decides
timeTypeFull time or part timewith descriptions only, 100%
startDateWorkday's exact posting datewith descriptions only, 100%
country, countryCodeCountry of the requisitionwith descriptions only, 100%
descriptionHtml, descriptionTextThe full posting bodywith descriptions only, 100%
applyUrl, canApplyWorkday's own apply link and whether it still accepts applicationswith descriptions only, 100%
changeType, isKnown, firstSeenAt, lastSeenAtMemory verdict: NEW, UPDATED or DUPLICATE100%
coveragecomplete, capped or partial for the career site this row came from100%
bulletFields, timeLeftToApply, endDateTextExtra labels a board may publishvaries

Every run also pushes one run-summary row with per-site counters: how many jobs the board holds, how many slices were needed, how many rows were delivered, how many were already known and free, the requests used and the measured fill rates. A finished run is therefore never an empty dataset.

Honest notes on Workday's own data

  • remoteType is optional for the employer. NVIDIA fills it on none of its 2,675 postings, Red Hat on all 155. We report what is there and never guess.
  • Workday buckets everything older than 30 days as Posted 30+ Days Ago. We return postedAt: null with postedAgeDays: 30 and postedIsMinimum: true rather than invent a date. Switch descriptions on to get the exact date from Workday.
  • A posting that covers several offices shows as "3 Locations" on the board. We set multipleLocations and leave locations empty instead of storing "3 Locations" as a place; the description fetch fills in the real ones. A location filter keeps those rows rather than dropping them, because the board has not said where they are yet.
  • coverage is measured against Workday's own counters. complete means every job the career site's facet counts account for was delivered; when a board cannot be split far enough, the rows say partial and the run summary says why, instead of quietly returning a smaller number.

How much does it cost to scrape Workday?

Pay per result, so a run that finds nothing costs nothing.

EventFree and BronzeSilverGold and above
Job (primary)$0.001$0.0009$0.0008
Job description$0.0005$0.00045$0.0004
Actor start$0.00005 per run$0.00005$0.00005

That is $1.00 per 1,000 jobs, or $1.50 per 1,000 with the full description attached. Silver users get 10 percent off the result events and Gold and above 20 percent; the Actor start event carries no discount.

Worked example: reading NVIDIA's whole career site, 2,675 jobs without descriptions, costs 2,675 x $0.001 plus one start event, about $2.68. The same board with descriptions costs about $4.02. Run it again next week under the same memory name and you pay only for the roles added since.

Never charged: jobs your filters removed, jobs a dedup memory already delivered (whether skipped or re-sent), career sites that cannot be read, invalid input, the run summary and status rows, and a description that was requested but did not come back. Rows are written to the dataset first and billed afterwards, so a job you were never sent is never on your bill. The Actor start event is the one charge that applies to every run, including a run that finds nothing.

Input

FieldTypeWhat it does
careerSiteUrlsarrayThe career sites to read. Any Workday address shape, or a bare tenant name.
searchTextstringKeyword handed to Workday's own search box.
locationsarrayKeep only jobs whose location contains one of these words.
remoteOnlybooleanKeep only remote roles, reading both the remote field and the location text.
includeKeywords, excludeKeywordsarrayKeep or drop by words in the title, location or requisition ID.
postedWithinDaysintegerKeep only jobs posted in the last N days.
facetsobjectAdvanced: Workday facet ids passed straight through.
includeDescriptionbooleanFetch the full posting for every new job. Paid, off by default.
maxJobsPerSite, maxTotalintegerCaps. The run budget is shared fairly across the sites you listed.
completeLargeSitesbooleanSplit boards bigger than Workday's 2,000 result limit. On by default.
memoryNamestringName a cross-run memory so later runs deliver and charge only new jobs.
reemitKnownJobsbooleanSend the known jobs again, flagged and free.
resetMemorybooleanForget a memory and start a fresh baseline.
proxyConfigurationobjectOptional. Workday answers directly, so this is off.

Minimal input:

{
"careerSiteUrls": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
"maxTotal": 20
}

FAQ

Do I need a Workday API key or a login to scrape a career site?

No. Every career site serves its own jobs through a public JSON endpoint that the career page itself calls, and this Actor uses that endpoint. There is no key, no login, no cookie and no browser involved.

Why do other Workday scrapers stop at 2,000 jobs?

Because Workday stops paginating there. Ask for a page past result 2,000 and it returns page one again with HTTP 200, so a scraper that simply keeps paging collects duplicates and never notices. This Actor splits a large board by job category, country and job type until every slice fits under the limit, and sets coverage on every row so you can see whether a career site was read whole.

Can I scrape several company career sites in one run?

Yes. careerSiteUrls takes a list, every site is read in the same run, and maxTotal is shared fairly across them: each site gets an equal share first, then any unused budget goes to the sites that still have jobs.

Where do I find a company's Workday career site URL?

On the company careers page. The address contains myworkdayjobs.com or myworkdaysite.com, for example https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. You can also enter just the tenant name, such as nvidia, and the Actor resolves the career site from the tenant's robots.txt. Some companies run several career sites on one tenant, such as an external site and a campus site; each one is a separate entry.

Turn on Fetch the full job description. Each delivered job then carries descriptionHtml and descriptionText, plus Workday's exact posting date, the time type, the country, Workday's own applyUrl and the canApply flag. It costs one extra request per job and is charged as a Job description event.

How do I see only the Workday jobs posted since last week?

Two ways, and they combine. Set postedWithinDays to 7 for a date window, or give the run a memoryName and schedule it: every later run under that name delivers only the roles that appeared since, and bills nothing for the ones you already have.

Why does this Actor run with limited permissions?

Least privilege. It reads and writes only its own storages and never touches anything else in your Apify account. The cross-run memory is a named key-value store the Actor creates itself on its first run and reads back on later ones.

What this Actor does NOT do

  • It does not discover companies. You give it career sites; it does not search for which employers use Workday.
  • It does not read internal or login-only career sites, and it does not apply to jobs.
  • It does not return salary. Workday career sites do not publish a structured salary field; where a pay range exists it sits inside the description text, which you get when descriptions are on.
  • It does not scrape any other applicant tracking system. Greenhouse, Lever, Ashby, Workable and SmartRecruiters have their own Actors, linked below.
  • It does not invent a posting date for the roles Workday files under "30+ Days Ago".
  • It does not coordinate two runs that share one memory name at the same moment. Schedule a memory's runs one after another, not in parallel, or they can both treat the same role as new.

Use it from the API

curl -X POST "https://api.apify.com/v2/acts/automation_craft~workday-jobs-scraper/runs?token=<YOUR_TOKEN>" \
-H 'Content-Type: application/json' \
-d '{"careerSiteUrls":["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],"maxTotal":50}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('automation_craft/workday-jobs-scraper').call({
careerSiteUrls: ['https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite'],
includeDescription: true,
maxTotal: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("automation_craft/workday-jobs-scraper").call(run_input={
"careerSiteUrls": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
"memoryName": "weekly-nvidia",
"maxTotal": 500,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item.get("title"), item.get("url"))

Changelog

1.0

First release. Whole career sites past Workday's 2,000 result limit, every Workday address shape including bare tenant names, cross-run dedup memory, optional full descriptions with exact posting dates, and a run summary with per-site coverage and measured fill rates.

More data tools by Automation Craft