Workday Jobs Scraper: Career Sites to CSV or JSON
Pricing
from $1.50 / 1,000 jobs
Workday Jobs Scraper: Career Sites to CSV or JSON
Scrape public job postings from Workday career sites (myworkdayjobs.com) into one clean schema. Paste each company's career-site address and get title, locations, remote type, posting date and apply link. Filters, an only-new-jobs mode for scheduled runs, and no recruiter or contact fields.
Pricing
from $1.50 / 1,000 jobs
Rating
0.0
(0)
Developer
Quicksloth
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Share
Get the open jobs of the companies you follow from their public Workday career sites, in one clean table. Paste the career-site address of each company; the Actor reads the public postings and returns them as JSON, CSV or Excel: title, every location, remote or hybrid, employment type, posting date, job link and apply link. Switch on only new jobs for scheduled runs and, after the first run, you pay only for postings that are new or changed.
Workday is the HR software that many large employers use to publish their job openings, on career sites at myworkdayjobs.com.
- One line per company. Paste Workday career-site addresses, up to 1,000 per run.
- Same output fields as our ATS Jobs Scraper. If you also use ATS Jobs Scraper for Greenhouse, Lever and Ashby, both datasets have the same fields, so you can merge them without mapping. The
atsfield tells the sources apart. - Only new or changed jobs. For monitoring, get just what appeared or changed since the last run. Postings already returned are not read again, and you pay only for the new ones.
- Filters before you pay. Workday's own search, title keywords and "posted in the last N days" cut the list before the details of each posting are read; location and remote filters are applied to the posting details. You pay only for jobs that are saved.
- Spending under control. Set a maximum number of jobs or a maximum cost per run; the Actor stops cleanly and says why. Runs started from the Console form are prefilled with a 500-job limit (about $0.75); API and MCP runs have no limit unless you set
maxJobsor a maximum cost. - No personal-data fields. The output has no recruiter, hiring-manager or contact fields, and job descriptions are off unless you ask for them (see Legal and data protection).
Free Apify plan: up to 100 jobs per run, enough to test it on your own list of companies.
What can you do with it?
- Sales and business development: use hiring as a buying signal. Find companies opening roles that suggest a need for your product (for example data-engineering jobs) with
searchTextortitleKeywords, then watch them on every scheduled run with Only new or changed jobs. - Recruiting and talent intelligence: follow the openings, locations and work type of target employers and see the new roles on every scheduled run.
- Labor-market and hiring-trend analysis: keep the results of each run and compare open roles by location, work type or employment type over time (
scrapedAtmarks the run,postedAtthe posting day). - Career-site export: turn a company's career site into a CSV or Excel file for your own analysis (see Limits for very large sites).
- Internal job alerts: send new postings to a spreadsheet, a database or a chat channel with Apify schedules, webhooks and integrations.
- AI agents and data pipelines: one predictable JSON schema, available through the Apify API and, for AI agents, through Apify's MCP server.
How to get jobs from a Workday career site
- Open the company's careers page, click any job and copy the address up to the site name, for example
https://<company>.wd5.myworkdayjobs.com/<site>. Paste it into Workday career sites, one address per line. A language part (/en-US/) or a job path after the site name is accepted and ignored. - Optional: add a search text, title or location keywords, limit the posting date with Posted in the last N days, and set Max jobs in total.
- Click Start. The Overview table of the dataset shows title, company, career site, location, workplace, type, posting date and job page. Download it as JSON, CSV or Excel, or read it through the Apify API.
Pricing
You pay per job saved to the dataset: $1.50 per 1,000 jobs ($0.0015 per job), plus Apify's standard start charge of $0.00005 per run. Career sites that are not found or are skipped, jobs removed by your filters, and postings already returned in only-new-jobs mode cost nothing.
| Jobs saved | Cost |
|---|---|
| 100 | $0.15 |
| 1,000 | $1.50 |
| 2,000 | $3.00 |
| 10,000 | $15.00 |
Monitoring example. You follow 20 career sites and run the Actor once a day with Only new or changed jobs on. The first run saves all matching jobs. If, say, 100 jobs are new or changed on a given day (your number will differ), that run costs about $0.15, and 30 such days cost about $4.50.
Cost control. In Apify Console you can set a maximum cost for each run; the Actor stops cleanly when it is reached and says so in the status message. Runs started from the Console form are prefilled with a 500-job limit (about $0.75): change or clear it to get more. API and MCP runs have no limit unless you set maxJobs or a maximum cost.
Free plan. Users on the free Apify plan get up to 100 jobs per run. The run log and status message say when this limit is reached. Paid plans have no such limit.
Accepted career-site addresses
| Format | Example |
|---|---|
Career site on myworkdayjobs.com | https://salesforce.wd12.myworkdayjobs.com/External_Career_Site |
| With a language part | https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite |
| A job page (the site name is read from it) | https://adobe.wd5.myworkdayjobs.com/external_experienced/job/Bangalore/Enterprise-Architect_R169928 |
Career site on myworkdaysite.com | https://wd3.myworkdaysite.com/recruiting/<company>/<site> |
The myworkdaysite.com format is accepted, but we have tested mostly myworkdayjobs.com career sites. A company's own careers page on its own domain is not an address the Actor can read: click a job there, and if the address changes to myworkdayjobs.com or myworkdaysite.com, use that one.
Input examples
Basic: the newest engineering jobs of two companies
{"companies": ["https://salesforce.wd12.myworkdayjobs.com/External_Career_Site","https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],"titleKeywords": ["engineer"],"postedWithinDays": 7,"maxJobs": 200}
Jobs with "Remote" in a location, posted in the last 14 days
{"companies": ["https://salesforce.wd12.myworkdayjobs.com/External_Career_Site","https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],"locationKeywords": ["Remote"],"postedWithinDays": 14,"maxJobs": 200}
Scheduled monitoring: only new or changed jobs
{"companies": ["https://salesforce.wd12.myworkdayjobs.com/External_Career_Site","https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],"searchText": "data engineer","postedWithinDays": 7,"onlyNewJobs": true,"stateKey": "weekly-data-roles"}
Input fields
| Field | Type | Default | Description |
|---|---|---|---|
companies | array of strings | (required) | Workday career-site addresses, one per line. Up to 1,000 per run. |
searchText | string | empty | Sent to Workday's own search box (for example data engineer), so only matching postings are read: faster, and fewer jobs to pay for. Results then come in Workday's relevance order instead of newest first. |
titleKeywords | array of strings | empty | Keep jobs whose title contains any of these words (case-insensitive; engineer also matches "engineering"). Applied before the details are read. |
locationKeywords | array of strings | empty | Keep jobs with a location containing any of these words (case-insensitive), for example a city, a country or Remote. Needs the posting details: on a big career site combine it with postedWithinDays, titleKeywords or searchText. |
remoteOnly | boolean | false | Keep only jobs whose work type is remote. When the company gives no work type, a location that says "Remote" counts too. See the FAQ. |
postedWithinDays | integer | empty | Keep only jobs posted in the last N days (1–30). Empty or 0 = any date. |
includeDescription | boolean | false | Add the job description as plain text (emails, phone numbers and names after labels such as "Recruiter:" removed). Makes the dataset much larger. |
onlyNewJobs | boolean | false | Return only jobs that are new, or whose title or listed location changed, since the previous run with the same filters. |
stateKey | string | empty | Optional name for the "only new jobs" history, so different scheduled tasks keep separate histories. |
maxJobsPerCompany | integer | no limit | Keep at most this many jobs per career site (newest first, or in search order when searchText is set). |
maxJobs | integer | no limit | Stop after this many jobs in total. The Console form is prefilled with 500; clear it for no limit. |
Output
Each job is one dataset item. A field is null when the company does not publish it for that job.
{"id": "workday:salesforce/External_Career_Site:Mid-Level-Senior-Backend-Software-Engineer_JR341307","ats": "workday","board": "salesforce/External_Career_Site","companyName": "salesforce.com Israel Ltd.","jobId": "Mid-Level-Senior-Backend-Software-Engineer_JR341307","title": "Lead Backend Software Engineer","department": null,"team": null,"locations": ["Israel - Tel Aviv"],"location": "Israel - Tel Aviv","isRemote": false,"workplaceType": "hybrid","employmentType": "full-time","postedAt": "2026-10-08T00:00:00.000Z","updatedAt": null,"url": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/Israel---Tel-Aviv/Mid-Level-Senior-Backend-Software-Engineer_JR341307","applyUrl": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/Israel---Tel-Aviv/Mid-Level-Senior-Backend-Software-Engineer_JR341307/apply","salaryMin": null,"salaryMax": null,"salaryCurrency": null,"salaryInterval": null,"salaryText": null,"descriptionText": null,"scrapedAt": "2026-10-08T07:00:00.000Z"}
| Field | Description |
|---|---|
id | Unique, stable id: workday:<tenant>/<site>:<jobId>. |
ats | Always workday. In ATS Jobs Scraper the same field says greenhouse, lever or ashby. |
board | The career site, as <tenant>/<site>. Use it to group jobs by career site. |
companyName | The hiring legal entity as the company publishes it, with a leading internal code such as "2100" removed. Large employers list their subsidiaries (for example a country entity) and some add their own prefix, so companyName can differ from the brand name. |
jobId | The last part of the job address (unique per posting, also when a requisition is reposted). |
title | Job title. |
locations, location | Every location of the posting, and the first one. |
isRemote, workplaceType | workplaceType is remote, hybrid or onsite. It comes from the company's own work-type label when there is one (for example "Office - Flexible" is reported as hybrid), otherwise from the word "Remote" or "Hybrid" in the locations; null when neither says. isRemote is true or false only when the label or the locations say so, otherwise null. |
employmentType | full-time, part-time, contract, internship or temporary when Workday's time type matches; other labels are kept as the company writes them. |
postedAt | Posting date, day precision (midnight UTC). |
url, applyUrl | The job page on the company's career site, and the same address with /apply added. |
descriptionText | Plain-text description when includeDescription is on, otherwise null. |
department, team, updatedAt, salary* | Workday career sites do not publish these as fields: always null. They are kept so the schema is the same as in ATS Jobs Scraper. Pay that a company writes inside the description text is not extracted. |
scrapedAt | When the run started (ISO 8601). |
Run summary
Every run also saves a summary in the default key-value store under the key OUTPUT:
{"companies": [{ "input": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site", "board": "salesforce/External_Career_Site", "status": "ok", "listed": 60, "jobs": 10, "error": null }],"totalJobs": 10,"newJobs": null,"stoppedBecause": null}
status is ok, failed or skipped. listed is how many postings were found in the career site's list; jobs is how many were saved. error holds a note whenever something needs your attention, even when status is ok (for example postings that closed while the run was reading them). stoppedBecause is maxResults, freePlanLimit or maxTotalChargeUsd when a limit cut the results.
A career site that cannot be found, fails or is skipped does not stop the run and costs nothing: it is reported here and the other career sites continue. The run fails only if every career site fails.
Only new jobs (scheduled runs)
Turn on onlyNewJobs and schedule the Actor (for example daily). The first run returns all matching jobs and remembers them. Later runs return only jobs that are new or whose title or listed location changed (for a posting with several locations, the list shows only their number). Postings already returned are not read again, so you pay only for the new ones. Jobs that were not returned because of a limit stay "unseen" and come back in the next run. A change made only inside the description is not noticed.
Tip: add postedWithinDays (at least as long as the gap between your runs) so the first run does not start with the whole career site.
The history is kept in a named key-value store in your account (workday-jobs-seen-state), separately for each career site and for each combination of search text, title keywords, location keywords and remote setting. If you run several scheduled tasks with the same filters, give each one its own stateKey. Postings that your location or remote filter removes are not remembered: they are checked again on every run, at no cost to you.
Limits
- Up to 1,000 career sites per run.
- Workday returns at most 2,000 postings for one search. On a career site with more open jobs than that, the Actor reads the first 2,000 of Workday's list (newest first on the career sites we tested, when there is no search text). To get the rest, use a narrower
searchText(for example a job title: Workday's search also looks at the job text, so broad words match almost everything), or schedule short runs withpostedWithinDaysandonlyNewJobs. When a career site hits this cap, theerrorfield of the run summary says so and gives the approximate number of postings on the site. - Workday shows posting dates older than 30 days only as "30+ days ago", so
postedWithinDaysgoes up to 30. - Workday career sites do not publish salary, department or team, so those fields are always
null. - One request per job is needed to read its details.
searchText,titleKeywords,postedWithinDaysandonlyNewJobsare applied before that request and make runs faster.locationKeywordsandremoteOnlyneed the details, so on a big career site combine them with one of the others. - The Actor needs the address of the career site. It cannot look a company up by name and has no directory of employers.
- A career site whose robots.txt does not allow reading it is skipped (see below).
Legal and data protection
- The Actor reads only public career sites that companies publish for job seekers: the same data a browser loads when you open the career page. No login, no private data. Workday does not document these addresses for outside use (see the FAQ).
- It reads the robots.txt of each career site (once per run) and skips a career site whose robots.txt does not allow it. Some companies disallow their career site there and others allow it (checked on 2026-10-08).
- It is gentle with the sites: at most 3 career sites at a time and 4 job-detail requests at a time per career site, a pause and a retry when a site answers "too many requests", and a User-Agent that names the Actor.
- No personal-data fields: the output has no names, emails or phone numbers of people. Descriptions are off by default. When you turn them on, they are free text written by the employer: email addresses, phone numbers in common formats and names after labels such as "Recruiter:", "Hiring Manager:" or "Contact:" are removed, but other mentions of people may remain. Check that you have a legal basis before storing them, and that your use of the employer's text is allowed.
- Workday is a trademark of Workday, Inc. Company names in this page belong to their owners; they are named only to say which career sites the Actor can read. This Actor is not affiliated with or endorsed by Workday, Inc. or by the companies whose career sites it reads.
- You are responsible for how you use the data, including compliance with the laws that apply to you and with the terms of the websites you read.
FAQ
How do I find a company's career-site address? Open the company's careers page and click a job. If the address contains myworkdayjobs.com or myworkdaysite.com, copy it up to the site name.
My company's careers page is on its own domain. Can I use it? Click any job: if the address changes to myworkdayjobs.com or myworkdaysite.com, use that address. Pages that only embed Workday under another domain are not supported yet.
Can it find companies for me, or read a company by name? No. It reads the career sites you list; it has no company directory and no search across all employers. Use searchText, title and location keywords to filter the jobs of your companies.
Do I need proxies or a browser? No. The Actor calls the same public JSON addresses that a career page loads, with plain HTTP requests.
Is this a Workday product or API? No. The Actor is independent. It reads the JSON that each public career page itself loads, and Workday does not document those addresses for outside use. If Workday changes them, the Actor can stop working until it is updated; tell us in the Issues tab.
How does the remote filter work? Each company fills in its own work-type label on Workday, in its own words (for example "Office - Flexible"), or leaves it empty. The Actor reports remote, hybrid or onsite when the label says so, and otherwise looks for "Remote" or "Hybrid" in the location text. remoteOnly keeps jobs reported as remote. A role that the company labels flexible is reported as hybrid and is not kept, even if its location says "Remote", and a remote role with no label and no "Remote" in its location is not detected. To keep every job that has "Remote" in a location, use locationKeywords with Remote instead.
Why did a career site fail with HTTP 404, 422 or 400? The company or site name in the address is wrong, or the company moved its career site. Open the address in a browser and copy it again.
Why was a career site skipped? Its robots.txt does not allow reading it, the same career site appears twice in your input, or the run had already reached its limit. The reason is in the error field of the run summary.
Why do I see fewer jobs than on the career site? Workday lists at most 2,000 postings per search (see Limits); your filters and postedWithinDays remove postings; and postings that closed between the list and the details are skipped (the run summary notes how many).
Why are some fields always empty? A field is null when the company does not publish it. Workday career sites never publish salary, department or team as fields.
What counts as "changed" in only-new mode? A change in the title or in the location shown in the career-site list. A change only in the description is not noticed. A job that disappears and is posted again later is returned as new when the whole list was read.
How current is the data? Each run reads the live career sites. scrapedAt is the time of the run; postedAt is the posting day shown by Workday.
Do you support Greenhouse, Lever or Ashby? Not in this Actor. Use ATS Jobs Scraper: it has the same output fields, so the two datasets can be combined.
How many career sites can I add? Up to 1,000 per run.
Support
Found a problem, or a career site that does not work? Open an issue in the Issues tab of this Actor and include the run ID and the career-site address.
Changelog
- 0.2 (2026-10-09): descriptions remove more phone numbers (national numbers written in one or two blocks, such as UK and Australian numbers, and numbers after labels like "Phone:") and names after "Contact:" or "Name:" at the start of a line.
- 0.1 (2026-10-08): first public release.
- Reads public Workday career sites (
myworkdayjobs.com, andmyworkdaysite.comaddresses) from their addresses, up to 1,000 per run. - One output schema with the same fields as ATS Jobs Scraper: locations, work type, employment type, posting date, job and apply links.
- Filters: Workday search text, title keywords, location keywords, remote only, posted in the last N days, maximum jobs per career site and in total.
- Optional job descriptions as plain text, with email addresses, phone numbers and names after labels such as "Recruiter:" removed.
- Only-new-or-changed mode for scheduled runs, with separate histories through
stateKey. - Run summary per career site in the
OUTPUTrecord; one failing career site does not stop the run; career sites whose robots.txt disallows reading are skipped. - Pay-per-event pricing: $0.0015 per job saved. Free plan: up to 100 jobs per run.
- Known limits: at most 2,000 postings per search; posting dates only up to 30 days back; no salary, department or team.
- Reads public Workday career sites (