DEV Community

Devil Scrapes
Devil Scrapes

Posted on

Workday Jobs Scraper: How to Pull Every Posting From Any Workday Career Site

Workday Jobs Scraper: How to Pull Every Posting From Any Workday Career Site

If you've ever tried to build a recruiting pipeline, a labor-market dataset, or a "who's hiring" competitive-intel feed, you've hit Workday. It powers the career sites of a huge share of the Fortune 500 — NVIDIA, Salesforce, Adobe, half of enterprise healthcare and finance. Every one of those *.myworkdayjobs.com boards looks different on the surface, but underneath they all run on the same internal JSON API. That's the detail this post is about, and it's also the reason we built the Workday Jobs Scraper.

Why Workday job data is worth pulling

Workday postings are structured, current, and — unlike a lot of enterprise HR data — genuinely public. No login wall, no gated candidate portal. Every req has a title, location, requisition ID, and (usually) a full description sitting behind the site's own search box. That's a clean signal for:

  • Recruiters and sourcers mapping which enterprise employers have open reqs in a given function
  • Job-board aggregators who need Workday coverage next to Greenhouse, Lever, and Ashby
  • Competitive-intel teams watching a rival's hiring velocity as a proxy for headcount growth
  • Labor-market researchers sampling demand by role, location, or industry at scale

The naive approach, and why it gets annoying fast

Open devtools on any Workday career site, filter to XHR, and you'll spot a call to /wday/cxs/{tenant}/{site}/jobs. Looks trivial — just a POST with a search payload. The catch is everything downstream of that first successful call. Workday sits behind Cloudflare, so a bare requests.post() from a script gets a fingerprint mismatch and a block long before you've paginated through a real board. You also need to work out the tenant/data-center/site triple from the URL structure ({tenant}.{dc}.myworkdayjobs.com/{site}), handle pagination correctly, and — if you want full descriptions — fire a second request per posting without tripping rate limits. None of that is exotic, but multiply it by dozens of tenants and it's a maintenance job, not a script.

What we built instead

The Workday Jobs Scraper talks to that same cxs JSON endpoint directly, but does the parts that make it fragile for you: we present a real Chrome TLS/H2 handshake via curl-cffi browser impersonation, retry 408/429/5xx responses with exponential backoff (Retry-After honoured), and rotate proxy sessions through Apify Proxy when a run is pulling many tenants back to back. You give it career-site URLs — or explicit {tenant, dc, site} objects if you already know them — and get back one normalized row per posting, regardless of which of the hundreds of Workday tenants you're pointed at.

Run it via the Apify Python SDK:

from apify_client import ApifyClient

client = ApifyClient("APIFY_TOKEN")
run = client.actor("DevilScrapes/workday-jobs-scraper").call(run_input={
    "careerSites": ["nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
    "maxResultsPerSite": 25,
    "includeDescription": True,
    "proxyConfiguration": {"useApifyProxy": True},
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["location"], item["job_req_id"])
Enter fullscreen mode Exit fullscreen mode

Or paste the same input directly into the Store page and hit Start — no code required.

One output row looks like this:

{
  "job_id": "/job/US-CA-Santa-Clara/Senior-Factory-Support-Firmware-Engineer_JR1998421",
  "title": "Senior Factory Support Firmware Engineer",
  "location": "US, CA, Santa Clara",
  "posted_on_text": "Posted 5 Days Ago",
  "time_type": "Full time",
  "job_req_id": "JR1998421",
  "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Senior-Factory-Support-Firmware-Engineer_JR1998421",
  "company": "nvidia",
  "dc": "wd5",
  "site": "NVIDIAExternalCareerSite",
  "description_html": "NVIDIA is seeking a Senior Factory Support Firmware Engineer...",
  "scraped_at": "2026-07-21T11:40:00Z"
}
Enter fullscreen mode Exit fullscreen mode

The technically interesting bit

Workday's public URL ({tenant}.{dc}.myworkdayjobs.com/{site}/job/...) and its internal detail payload aren't the same thing — the detail data actually lives behind the cxs path, keyed by an externalPath that only shows up once you've already paginated the listing endpoint. A lot of "generic" Workday scrapers on the market skip this and just re-request the public HTML page for descriptions, which is slower and more fragile. We fetch the detail payload the way the site's own JS does, which is also why includeDescription costs one extra request per posting rather than a full page render.

Pricing — no fine print

Pay-Per-Event: $0.005 per run (one-off warm-up) plus $0.0015 per job posting written to the dataset. A 1,000-posting pull costs $1.51. No data lands, no charge beyond the warm-up fee. Apify gives every new account $5 of free credit, no card required, which covers a couple thousand rows before you spend a cent.

Honest limitations

We only reach public career sites — not SSO-gated internal portals — and Workday doesn't expose a structured salary field, so we don't invent one. maxResultsPerSite caps volume but doesn't change price, because you're billed per row written, not per HTTP call. And like any scrape, this is a point-in-time snapshot — schedule recurring runs if you want to track how a board changes week over week.

Try it, and the rest of the fleet

Workday is one piece of the ATS landscape. If you need coverage beyond it, we also run the SmartRecruiters Jobs Scraper, the Workable Jobs Scraper, and the Multi-ATS Jobs Scraper covering Greenhouse, Lever, and Ashby in one normalized schema — all keyless, all pay-per-result.

Grab the Workday Jobs Scraper on the Apify Store and try it with the free $5 credit — no card needed. If you hit a tenant that behaves differently or need a field we don't expose yet, open an issue on the Actor's Issues tab; we read every one. Browse the rest of the fleet at apify.com/DevilScrapes.

What Workday tenant would you point this at first?

Top comments (0)