DEV Community

Cover image for Workday API Without a Tenant: Pull Every Job Posting as JSON in 2026
Truffle Pig Data
Truffle Pig Data

Posted on

Workday API Without a Tenant: Pull Every Job Posting as JSON in 2026

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

  1. Open the Workday Careers API and click Try for free.
  2. Paste careers URLs into startUrls; optionally add searchText, maxJobsPerSite, or postedAfter.
  3. 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 }'
Enter fullscreen mode Exit fullscreen mode

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"])
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

GitHub logo 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

Apify MCP setup 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)