Thousands of large employers (Nvidia, Salesforce, Adobe and much of the Fortune 500) publish their jobs on Workday. Unlike Greenhouse or Lever, Workday has no documented public API and no global directory, so most job scrapers skip it. But every Workday careers site loads its jobs from a small JSON endpoint that anyone can call. Here is how it works, the two traps that silently break most scripts, and a ready-made option if you don't want to maintain it.

1. Find the careers site

A Workday careers URL looks like this:

https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite 

Three parts matter: the tenant (nvidia), the data center (wd5) and the site name (NVIDIAExternalCareerSite). There is no way to list all tenants, so you need each company's careers URL. Google site:myworkdayjobs.com <company> usually finds it.

2. Call the jobs endpoint

The careers page calls this endpoint with a POST:

import httpx tenant, wd, site = "nvidia", "wd5", "NVIDIAExternalCareerSite" url = f"https://{tenant}.{wd}.myworkdayjobs.com/wday/cxs/{tenant}/{site}/jobs" r = httpx.post(url, json={"appliedFacets": {}, "limit": 20, "offset": 0, "searchText": ""}) data = r.json() print(data\["total"], data\["jobPostings"]\[0]\["title"]) 

Each posting has title, locationsText, postedOn ("Posted 3 Days Ago") and externalPath. For the full description, exact posting date and every location, GET the detail endpoint:

detail = httpx.get(f"https://{tenant}.{wd}.myworkdayjobs.com/wday/cxs/{tenant}/{site}{path}").json() info = detail\["jobPostingInfo"] # jobDescription (HTML), startDate, location, timeType, jobReqId (+ additionalLocations when there are several) 

3. The two traps

Trap 1: the 2,000-job wall. total never goes above 2,000, and it is only reported on the first page. Worse: past offset 2,000, Workday does not return an error. It quietly starts again from page 1. A naive "paginate until the page is empty" loop never ends and fills your dataset with duplicates. Keep a set of externalPath values and stop at the first page with nothing new. For employers with more than 2,000 openings, split the search with searchText or location facets.

Trap 2: relative dates. The list only says "Posted Today", "Posted Yesterday" or "Posted 30+ Days Ago". Use startDate from the detail endpoint when you need the real date.

Also: a 422 response means the tenant does not exist and a 404 means the site name is wrong. A 401 or 403 means that site does not allow anonymous access: respect it. Keep a few requests in parallel at most, and back off on 429.

4. Or skip the maintenance

If you need Workday next to Greenhouse, Lever, Ashby, Workable, Recruitee and SmartRecruiters in one unified format, the ATS Jobs Scraper on Apify does all of the above: paste Workday careers URLs or just type company names for the other platforms. It handles the 2,000 wall without duplicates, returns exact dates and full descriptions, and costs $1 per 1,000 jobs. Companies not found and blocked sites are free.

{ "companies": \["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite", "Stripe", "notion.so"], "titleKeywords": \["engineer"], "postedWithinDays": 7 } 

Typical uses: hiring signals for sales teams, niche job boards and newsletters, and tracking competitors' hiring.