Workday Jobs Scraper — Company Careers, No API Key avatar

Workday Jobs Scraper — Company Careers, No API Key

Pricing

from $1.00 / 1,000 job results

Go to Apify Store
Workday Jobs Scraper — Company Careers, No API Key

Workday Jobs Scraper — Company Careers, No API Key

Workday careers scraper: live job openings from any company hiring through Workday. Paste a myworkdayjobs.com careers URL or just a company name - title, location, salary (parsed, annualized), posting date, requisition ID and full description. Only-new-jobs mode turns a schedule into an alert.

Pricing

from $1.00 / 1,000 job results

Rating

0.0

(0)

Developer

Flash Scrape

Flash Scrape

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Workday Careers Scraper - Any Company's Jobs, No API Key

Live job openings from any company that hires through Workday — NVIDIA, Salesforce, Adobe and tens of thousands of others. Paste the company's myworkdayjobs.com careers URL (always works) or just type a company name like nvidia (auto-discovered), and get every live posting as a clean row: title, location, remote, employment type, salary range parsed from the posting and annualized, exact posting date, requisition ID and the full description.

No API key, no login, no proxy, no headless browser — the actor calls the same public JSON endpoint the company's own careers page uses, so the data is exactly what a candidate sees, at the moment you run it.

Also hiring on Greenhouse, Lever or Ashby? → ATS Job Scraper. Need LinkedIn, Indeed and Glassdoor too — merged and deduplicated across 12 boards with only-new-jobs monitoring? → Multi Job Board Scraper

What you get

One row per live opening. Measured on the default run (NVIDIA + Salesforce + Adobe, 100 rows, 2026-08-15):

columnfillnotes
company, tenant, site100%which careers site the row came from
title, location, url100%canonical public posting URL
employment_type100%"Full time" / "Part time" (from the posting detail)
job_req_id100%the requisition ID recruiters use (e.g. R171155)
posted_at100%exact date from the posting detail when it answers (the default); otherwise derived from Workday's own wording, where "Posted 30+ Days Ago" reads as 31 days
posted_text100%Workday's own wording ("Posted Yesterday")
description, description_snippet100%full text + first 300 chars
salary_min / salary_max / salary_currency / salary_interval33%only when the posting itself states a range — parsed from the posting text; hourly/weekly/monthly figures are annualized. Ranges written with $ are labelled USD (Workday postings in other dollar currencies are not distinguished); £/ ranges are not parsed
remote34%true when the posting says remote, false when the posting's own flag says otherwise (Onsite/Hybrid), null when there is no evidence — never guessed

Example row (real, from the default run):

{
"company": "adobe",
"tenant": "adobe",
"site": "external_experienced",
"title": "Senior Product Manager",
"location": "San Jose",
"remote": null,
"employment_type": "Full time",
"job_req_id": "R171155",
"salary_min": 165600,
"salary_max": 239725,
"salary_currency": "USD",
"salary_interval": "yearly",
"url": "https://adobe.wd5.myworkdayjobs.com/en-US/external_experienced/job/San-Jose/Senior-Product-Manager_R171155",
"source": "workday",
"posted_at": "2026-08-14",
"posted_text": "Posted Yesterday",
"description_snippet": "About the role – Adobe.com reaches millions of customers…",
"description": "…full posting text…"
}

Quick start

Leave the targets empty and the run uses a small built-in sample, so a bare {} call still returns real jobs. The Console form opens pre-filled with that sample and a cap of 50 so your first run is quick and cheap (a bare {} API call uses the default cap of 100). Then put your own targets in — whatever you enter is exactly what runs, nothing is added:

{
"companies": ["nvidia", "coinbase"],
"workdayUrls": ["https://adobe.wd5.myworkdayjobs.com/en-US/external_experienced"],
"searchText": "machine learning",
"maxItems": 200
}

URL or name? A pasted myworkdayjobs.com URL always works — it names the tenant and site exactly. A bare company name is auto-discovered (the actor probes Workday's hosts and the site slugs customers actually use, and caches the answer for future runs); discovery is best-effort — when it can't find the site, the run tells you exactly which company to paste a URL for, and never bills you for it.

Input reference

fielddefaultwhat it does
companies(empty) — Console form starts with 2 samplesCompany names, auto-discovered. Whatever you enter is exactly what runs; nothing is added to your list.
workdayUrls(empty) — Console form starts with 1 sampleAny myworkdayjobs.com URL of the careers site — the reliable path. Whatever you enter is exactly what runs.
searchText""Searched server-side by Workday itself, like the careers page's own search box.
locationContains""Keep only jobs whose location contains this text. Applied before billing.
remoteOnlyfalseKeep only jobs with remote evidence: title/location text at list time, then the posting's own flag once descriptions are fetched (contradicted rows are dropped before billing). Never guessed.
postedWithinDays0 (off)Keep only jobs posted in the last N days ("30+ Days Ago" counts as 31; undated jobs are kept, never guessed away).
onlyNewJobsfalseJob-alert mode — see below.
maxItems100Total cap across ALL companies, split round-robin so one giant tenant can't eat the budget. Your cost ceiling.
fetchDescriptionstrueFetch each delivered job's detail: full description, exact date, employment type, req ID, salary. One extra request per delivered row — same price per row.

Every filter runs before billing — a filtered job is never charged.

🔔 Job alerts: onlyNewJobs + a schedule

Schedule the actor (daily or hourly) with onlyNewJobs: true and the same companies + filters:

  • the first run is the baseline — it delivers everything and says so;
  • every later run delivers only postings not seen before;
  • a run where nothing is new delivers nothing, bills nothing, and says "Nothing new" plainly.

Watch memory lives in a named key-value store (workday-jobs-monitor) in your own account, pruned automatically (90 days / 50k keys). Point the run at Slack/email with a webhook and you have a hiring-signal feed for sales, recruiting or job hunting — companies posting new roles are companies with budget.

Use it from your code

// JavaScript — apify-client
const { ApifyClient } = require('apify-client');
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('flash_scraper/workday-jobs-scraper').call({
companies: ['nvidia'], searchText: 'engineer', maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
# Python — apify-client
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("flash_scraper/workday-jobs-scraper").call(run_input={
"companies": ["nvidia"], "searchText": "engineer", "maxItems": 100})
items = client.dataset(run["defaultDatasetId"]).list_items().items
# curl — run synchronously and get the dataset back
curl -X POST "https://api.apify.com/v2/acts/flash_scraper~workday-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies": ["nvidia"], "maxItems": 50}'

n8n / Make / Zapier

All three have a native Apify node/module: pick Run actorflash_scraper/workday-jobs-scraper, pass the JSON input above, and read the default dataset when the run finishes. The onlyNewJobs mode pairs perfectly with a schedule trigger — new postings flow straight into a Slack message, a Google Sheet or your CRM, and quiet days cost you nothing.

Honest limits

  • Workday customers only. If a company hires through Greenhouse/Lever/Ashby, use ATS Job Scraper; for LinkedIn/Indeed/Glassdoor use Multi Job Board Scraper.
  • Bare-name discovery is best-effort. It resolves common setups (measured: nvidia, salesforce, spotify-style slugs); unusual site names need the careers URL pasted once — the run names exactly which company needs it.
  • Custom career domains (careers.company.com) hide the tenant — paste the myworkdayjobs.com address that page actually loads.
  • Salary only when stated. ~1 in 3 postings on the sample companies state a range (mostly US postings, where it's legally required); rows without one carry null, never a guess. The interval comes from words near the range ("per hour", "annually"); with no such words a figure of $10,000+ is treated as annual, and a range labelled hourly/weekly but sized like a salary is corrected to annual.
  • remote is evidence-based: true when the title, location or the posting's own flag says remote, false when that flag explicitly says otherwise, null when nothing states it. remoteOnly filters on the title/location text first (that is all the job list carries), then — with fetchDescriptions on — drops any row the posting's own flag contradicts, before delivery and before billing.
  • Workday reports posting age coarsely past 30 days ("Posted 30+ Days Ago"). With fetchDescriptions on (the default) posted_at is the exact date from the posting detail whenever that request succeeds; if it doesn't, the row keeps the approximation derived from that wording (posted_text always shows Workday's original phrasing, so you can tell).