Every large employer on the Workday ATS posts its openings on a public careers site, like NVIDIA's Workday careers page, and none of them hand you that list as JSON. I'll show the manual route and where it breaks, then the shortcut: the Workday Careers API, which turns any careers URL into one row per job with no Workday tenant, recruiting license, or login.
Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.
Does Workday have an API for job postings?
Yes, and that is what makes the search confusing. Workday's official REST and SOAP APIs serve enterprise HR integrations: they need tenant credentials and never expose public job listings. In practice a Workday API for job postings means a scraper you call like an API: send a careers URL, get every posting back as JSON.
What the Workday API returns
The Workday Careers API returns every live posting on a Workday careers site as structured JSON: title, locations, ISO posted date, full description, pay range, employment type, remote status, requisition ID, and apply URL.
| Field | Example | Notes |
|---|---|---|
title |
Senior Software Engineer |
company and jobReqId (JR1990000) ride along |
postedDate |
2026-07-30 |
Exact ISO date; postedOn keeps the relative label |
locationsText |
US, CA, Santa Clara |
additionalLocations lists the rest |
remoteType |
Flex |
Remote, Flex, or Onsite when the site exposes it |
salaryMin / salaryMax
|
148000 / 230000
|
Plus salaryCurrency; null when no range is published |
Who this is for
Job boards refreshing Workday job listings with a stable jobReqId to dedupe on; recruiting and sales intelligence teams tracking a competitor's open roles and hiring velocity; labor-market researchers comparing pay-range disclosure and remote share; and anyone feeding live hiring signals to an AI agent.
The manual way, and where it breaks
The DIY route is a headless browser that pages through the list and opens every posting for its description. The list carries only relative dates, so a "new this week" filter means fetching every job's detail record. Pay ranges are prose you parse yourself. One employer runs several career sites across two URL families, and a big tenant lists thousands of postings, so you add pacing and retries or get rate limited. You end up maintaining a crawler for what is really a data feed.
The faster way: run the Workday Careers API
Apify Console
- Open the Workday Careers API and click Try for free.
- Paste careers URLs into
startUrls; optionally addsearchText,maxJobsPerSite, orpostedAfter. - Run it and download the dataset as JSON, CSV, or Excel.
REST
curl -X POST "https://api.apify.com/v2/acts/johnvc~workday-careers-api/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "startUrls": [{ "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite" }], "searchText": "engineer", "maxJobsPerSite": 100, "includeDetails": true }'
Run endpoint reference: the Apify API docs.
Pull Workday jobs in Python
Call the Actor with apify-client; an error row means a bad URL, so keep the job rows:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("johnvc/workday-careers-api").call(
run_input={
"startUrls": [{"url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"}],
"searchText": "engineer",
"maxJobsPerSite": 50,
}
)
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
if job.get("resultType") != "job":
continue
print(job["title"], job["locationsText"], job["postedDate"])
print(" ", job.get("salaryMin"), job.get("salaryMax"), job.get("salaryCurrency"), job["applyUrl"])
Export Workday job listings to JSON, CSV, or Excel
Leave searchText empty and maxJobsPerSite at 0 to get the whole site, one row per posting; feed several sites into one run and join on tenant and siteId. The task Export Workday Job Listings to JSON, CSV or Excel is that configuration.
Monitor Workday job postings on a schedule
With postedAfter set to a recent ISO date, the run stops paging once a whole page is older than your cutoff, since Workday sorts newest first; a 2,000 job site with a 3 day cutoff reads about 280 listings, and filtered rows are never billed. Schedule it, diff on jobReqId, and new postings show up the day they appear. Start from Monitor New Workday Job Postings for Any Company.
Find remote Workday jobs
Every row carries remoteType (Remote, Flex, or Onsite, whenever the site exposes the label), and the SITE_SUMMARY key-value record counts each type for the whole site. Filter after the run, or clone Find Remote Jobs on Any Workday Careers Site.
Pull Workday jobs with salary ranges
When an employer publishes a pay range, the Actor extracts salaryMin, salaryMax, and salaryCurrency and keeps the snippet in salaryText; with no range stated, the fields are null rather than guessed. See Extract Jobs with Salary Ranges from Workday Sites.
One company, every opening: the NVIDIA example
Point the Actor at NVIDIA's careers URL with no filters and you get every live opening with locations and pay ranges, plus totalJobsOnSite to confirm nothing was dropped. Export All NVIDIA Jobs with Salaries and Locations is the one-click version; the example repo ships it as --example nvidia_jobs.
More ready-made task pages
Same export for other employers:
The list leans toward semiconductor companies because that is the industry I follow most closely.
Workday MCP server: use it from Claude, Claude Code, and Cursor
Apify exposes the Actor through the Model Context Protocol, so Claude, Claude Code, and Cursor get a workday-careers-api tool that takes a careers URL and returns structured jobs, so an agent can answer "which of these companies posted engineering roles this week" or track headcount across a watch list. The server URL is:
https://mcp.apify.com/?tools=actors,docs,johnvc/workday-careers-api
In Claude Code that is claude mcp add --transport http apify plus the URL, and you can read more about Claude Code at claude.ai.
The example repo
johnisanerd
/
Apify-Workday-Careers-API
workday api: Python + MCP quick-start for the Workday Careers API on Apify. Call it from Python (uv) or as an MCP tool in Claude and Cursor. Returns structured JSON for workday api.
Workday Jobs API: Scrape Any Workday Careers Site from Python or MCP
This repo shows two ways to use the Workday Careers API on Apify: a Python quick start managed with uv, and MCP install guides for five AI clients (Claude Cowork Desktop, Claude Code, Claude on the web, Cursor, and ChatGPT).
Give the API any Workday careers URL, like https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, and it returns every live job posting as structured JSON: titles, locations, exact ISO posted dates, full descriptions, extracted pay ranges, employment type, remote status, requisition IDs, and direct apply URLs. Thousands of Fortune 500 employers run hiring on the Workday ATS, and this is the practical Workday API for their public job data: no login, no proxies, pay per result.
Video walkthrough
Text walkthrough
Searching for a Workday API for job postings usually leads to Workday's enterprise SOAP and REST APIs, which need tenant credentials and…
A uv-managed Python quick start with nvidia_jobs, remote_jobs, and salary_ranges recipes, plus MCP install guides for five clients.
FAQ about scraping Workday job postings
How much does the Workday scraper cost, and is there a free tier?
About $0.10 per 1,000 job postings returned, plus a small actor-start event per run. Error rows and rows removed by postedAfter are never charged, and new Apify accounts include free platform credit. No subscription, no seat license: you pay for rows that reach your dataset.
Is Workday an ATS, and which myworkdayjobs.com sites can the scraper read?
Yes. Workday Recruiting is one of the most widely used enterprise applicant tracking systems, and every customer publishes jobs on a public careers site. myworkdayjobs.com is the official domain Workday hosts those sites on, so pages there are legitimate, and any site there or on myworkdaysite.com is readable with no login.
What is the best MCP server for Workday, and can Claude run this scraper?
For job data, the hosted Apify MCP server with this Actor attached, using the URL above. Claude, Claude Code, Cursor, and ChatGPT then call the scraper as a tool.
Can I schedule the scraper to catch new Workday job postings?
Yes. Save the run as a task and attach an Apify schedule with a cron expression like 0 7 * * *, using postedAfter for exact dates or list-only mode (includeDetails: false) plus a jobReqId diff when you only need what is new. Start from the Workday Careers API.
What will the scraper not give you?
Anything behind a Workday login: employee records, internal requisitions, applicant data, the HR APIs. On the public side, salary fields are null when no range is published, remoteType is filled only when the site shows the label, and postedAfter needs includeDetails on.
More from Truffle Pig Data
Same Actor, other angles: the Medium how-to, the LinkedIn write-up, and the Peerlist article.
Have company names instead of URLs? The companion Workday Career Sites API turns them into the tenant and site values this Actor consumes; the Oracle Fusion Recruiting and Taleo Jobs API does the same for employers on Oracle.
Wrapping up
Workday's own APIs will not give you a careers site, but you can still get every posting as clean JSON without a tenant. Try the Workday Careers API, or clone the example repo and point it at the employers you track.

Top comments (0)