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 jobs scraper: live openings from any company hiring through Workday. Paste a myworkdayjobs.com careers URL or just a company name - get title, location, salary (parsed, annualized), exact posting date, requisition ID and full description. Only-new-jobs mode turns a schedule into a job alert.
Pricing
from $1.00 / 1,000 job results
Rating
0.0
(0)
Developer
Flash Scrape
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
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 (e.g. 2026-08-14) |
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 text, hourly/monthly figures annualized, never guessed |
remote | 34% | true when the posting says remote; 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
Run it with no input at all — you get up to 100 live jobs from the three sample companies. Then put your own targets in:
{"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 | 2-company sample | Company names, auto-discovered. Your list replaces the sample entirely. |
workdayUrls | 1-URL sample | Any myworkdayjobs.com URL of the careers site — the reliable path. |
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 (location/title/posting flag). 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. remoteis evidence-based:trueonly when the posting says so,nullotherwise.- 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.