Workday Jobs Scraper — Company Careers, No API Key
Pricing
from $1.00 / 1,000 job results
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
Maintained by CommunityActor 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):
| column | fill | notes |
|---|---|---|
company, tenant, site | 100% | which careers site the row came from |
title, location, url | 100% | canonical public posting URL |
employment_type | 100% | "Full time" / "Part time" (from the posting detail) |
job_req_id | 100% | the requisition ID recruiters use (e.g. R171155) |
posted_at | 100% | 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_text | 100% | Workday's own wording ("Posted Yesterday") |
description, description_snippet | 100% | full text + first 300 chars |
salary_min / salary_max / salary_currency / salary_interval | 33% | 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 |
remote | 34% | 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
| field | default | what it does |
|---|---|---|
companies | (empty) — Console form starts with 2 samples | Company names, auto-discovered. Whatever you enter is exactly what runs; nothing is added to your list. |
workdayUrls | (empty) — Console form starts with 1 sample | Any 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. |
remoteOnly | false | Keep 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. |
postedWithinDays | 0 (off) | Keep only jobs posted in the last N days ("30+ Days Ago" counts as 31; undated jobs are kept, never guessed away). |
onlyNewJobs | false | Job-alert mode — see below. |
maxItems | 100 | Total cap across ALL companies, split round-robin so one giant tenant can't eat the budget. Your cost ceiling. |
fetchDescriptions | true | Fetch 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-clientconst { 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-clientfrom apify_client import ApifyClientclient = 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 backcurl -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 actor → flash_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.comaddress 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. remoteis evidence-based:truewhen the title, location or the posting's own flag says remote,falsewhen that flag explicitly says otherwise,nullwhen nothing states it.remoteOnlyfilters on the title/location text first (that is all the job list carries), then — withfetchDescriptionson — 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
fetchDescriptionson (the default)posted_atis 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_textalways shows Workday's original phrasing, so you can tell).