Workday Jobs Scraper at a glance
Workday Jobs Scraper is a ready-to-run Apify actor from abotapi for collecting jobs data. Its documented output includes title, change type (incremental mode), req id, location and country, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Jobs, Lead Generation, Automation
- Pricing
- $2.20 per 1,000 results (Free plan), from $1.50 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 30 options
Scrape job postings from any Workday-hosted careers site on Myworkdayjobs.com. Paste careers-page or job URLs and get structured job data, including title, full description, locations, time type, posting dates, employer, apply URL, country, and geo data.
What Workday Jobs Scraper can do
- Works with any Workday-hosted employer automatically. The regional cluster and site id are read straight out of the careers URL you give it, no manual lookup needed.
- Two ways to start. Run a keyword and facet search inside one or more company careers sites, or paste any Workday careers or job URL and scrape it exactly as given, including filters already carried on the link.
- Comprehensive job record. Structured country and location, job requisition and posting ids, employer details, apply type and link, and a best-effort salary breakdown, on top of the full HTML and plain-text description.
- Filters matched against the live site, not guessed. Job category, job type, time type and location values you type are checked against each company site's own current facet list, and anything that does not match is dropped with a warning instead of silently narrowing or widening your results.
- Saves each job as it is collected. A run that stops partway still delivers what it found, and resumeFromRunId can continue one interrupted pull without re-collecting or re-charging jobs it already has.
- Built for recurring monitoring. Incremental mode classifies every job as NEW, UPDATED, UNCHANGED or EXPIRED across scheduled runs against state the actor keeps for you, no dataset id to paste each time.
Choose what to collect
These inputs let you configure Workday Jobs Scraper - Company Careers & Job Listings. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to choose jobs. 'Search by keyword' runs a keyword/facet search inside one or more company careers sites you provide. 'Scrape URLs directly' takes any Workday careers or job URLs and scrapes them exactly as given. |
companyUrlsarray | Search mode only. One or more company careers-site URLs or hosts to search within, e.g. https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite (the scheme is optional). The keyword and filters below are applied to each site. Find a company's careers URL on its 'Careers' page. |
keywordstring | Search mode only. Free-text keyword applied as the Workday search-box query, e.g. 'engineer' or 'data scientist'. Leave empty to list all jobs on the site. |
jobCategorystring | Search mode only. Filter by Workday 'Job Category' (Job Family Group), e.g. Engineering. Matched against the live facet list for each careers site. Leave empty for all categories. |
jobTypestring | Search mode only. Filter by Workday 'Job Type' (worker sub type), e.g. Regular or Intern. Matched against the live facet list. Leave empty for all. |
timeTypestring | Search mode only. Filter by Workday 'Time Type', e.g. Full time or Part time. Matched against the live facet list. Leave empty for all. |
locationstring | Search mode only. Filter by Workday location facet, e.g. United States of America or a region. Matched against the live facet list. Leave empty for all locations. |
Show 23 more inputs
| Input | What it controls |
|---|---|
jobCategoriesarray | Search mode only. Several job category names; each is matched to the site's live facet list. Combined with the single Job category field. |
jobTypesarray | Search mode only. Several worker sub types; each is matched to the live facet list. |
timeTypesarray | Search mode only. Several time types (e.g. Full time, Part time); each is matched to the live facet list. |
locationsarray | Search mode only. Several locations, partial match; each is matched to the site's live location facet list. Combined with the single Location field. |
postedAtstring | Keep only jobs posted on or after this date. Absolute YYYY-MM-DD or relative such as 7 days, 2 weeks, 1 month, 1 year. Workday lists postings as relative text, so this is applied to the listing after it is fetched; with it set, incremental mode never marks missing jobs EXPIRED. |
startAtstring | Keep only jobs whose start date is on or after this date (absolute YYYY-MM-DD or relative such as 2 weeks). Needs job details on. Applied after the detail page is read; dropped jobs are not emitted or charged. While it is set (with details on), incremental mode does not mark missing jobs EXPIRED. |
paginationinteger | Maximum result pages (20 jobs each) to read per careers URL. 0 = no page limit (Max jobs still applies). While a page limit is set and reached, incremental mode does not mark missing jobs EXPIRED. |
statsboolean | Fill the stats field with the job's position in the result list, the result total and the page. Workday exposes no view or apply counters. |
urlsarray | URL mode only. Paste any Workday URLs to scrape as-is. Each can be a careers/search page (e.g. https://company.wd5.myworkdayjobs.com/en-US/SiteName) a direct job URL, a job's /apply form (resolved to the job itself), or the Workday JSON search and job addresses under /wday/cxs/. Careers pages are paginated automatically; direct job URLs are fetched as single jobs. Filters carried on the URL are honored: both the keyword (?q=engineer) and the careers site's own filter links, so you can apply a filter on the site, click 'View Jobs', and paste the address bar here. A filter the site does not actually offer is dropped with a warning in the run log instead of being ignored silently. The search-mode keyword/filters above are ignored in this mode. Also accepts shared-host links like https://wd3.myworkdaysite.com/en-US/recruiting/tenant/Site. A company name alone cannot be resolved; paste its careers URL. Left untouched, this field scrapes one example of each URL shape. |
fetchDetailsboolean | When enabled (default), each job's detail page is fetched for the full description, structured country/geo, employer details, questionnaire id, and similar jobs. Disable for a faster, lighter run that returns only the fields available on the listing. |
detailsboolean | Alias of Fetch full job details, for users coming from other Workday scrapers. Only used when Fetch full job details is not set explicitly. |
maxItemsinteger | Maximum number of job rows to emit per company site / careers URL. This is the single result cap. Set to 0 for unlimited (walk every page until the site is exhausted; Workday returns at most ~2000 per search). |
residentialCountriesarray | When the run falls back to residential proxies, exit countries are rotated through this list to improve reliability and recover from a flagged IP. Defaults cover major regions. |
residentialBudgetGbstring | Hard cap on residential bandwidth for the run. When exceeded, the actor stops using residential bandwidth. Set to 0 to disable residential entirely. Leave empty for no cap. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large job pull without returning or charging for jobs already collected there. Use this after an interrupted run, or to keep extending one walk-all pull across separate runs. For recurring daily monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching jobs as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED jobs. A job is UPDATED when any output field other than the volatile ones changes (title, location, description, apply details and so on); the volatile fields postedOn (relative text such as "Posted 3 Days Ago"), similarJobs (rotating recommendations), source.searchUrl and scrapedAt are still returned but never trigger UPDATED. The alias and derived fields id, url, jobDescription, metadata, originUrl, videoInfo, page and stats are also never compared (their source fields jobReqId, jobUrl, description, jobPostingId, jobPostingSiteId, postingInternalId, questionnaireId and includeResumeParsing are compared instead); they are still returned too. Add more with "Ignore fields when detecting changes" below. Turn on "Emit unchanged" or "Emit expired" only when you also want those jobs returned (and billed). State is kept separately per mode + company site/URL/filter configuration; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode + company site/URL/filter settings, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return jobs that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return jobs that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max jobs capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Extra output fields that must NOT make a job count as UPDATED in incremental mode, for example "salary" or "location.additional" (dotted paths reach nested fields; a path through a list applies to every element). The fields are still returned in the output. postedOn, similarJobs, source.searchUrl and scrapedAt are always ignored, as are the alias and derived fields id, url, jobDescription, metadata, originUrl, videoInfo, page and stats (their source fields are compared instead). Changing this list never causes a wave of UPDATED rows: stored jobs are compared again using the current list. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
titleTitle (text)changeTypeChange type (incremental mode) (text)jobReqIdReq ID (text)locationTextLocation (text)countryCountry (text)timeTypeTime type (text)postedOnPosted (text)employerNameEmployer (text)jobUrlJob URL (link)applyUrlApply URL (link)changedFieldsChanged fields (array)firstSeenAtFirst seen (date)Show 6 more fields
lastSeenAtLast seen (date)startDateStart date (text)salarySalary (text)hiringOrganizationHiring organization (object)descriptionTextDescription (text)descriptionDescription (HTML) (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"rowType": "job",
"jobReqId": "JR0000000",
"postingInternalId": "00000000000000000000000000000000",
"jobPostingId": "00000000-0000-0000-0000-000000000000",
"jobPostingSiteId": null,
"questionnaireId": null,
"title": "Sample Software Engineer",
"jobUrl": "https://company.wd5.myworkdayjobs.com/en-US/SiteName/job/Location/Title_JR0000000",
"externalPath": "/job/Location/Title_JR0000000",
"postedOn": "Posted 5 Days Ago",
"startDate": "2026-01-01",
"timeType": "Full time",
"posted": true,
"canApply": true,
"includeResumeParsing": true,
"locationText": "US, CA, Sample City",
"country": "US",
"employerName": "Sample Company",
"description": "<p>Full job description HTML appears here.</p>",
"descriptionText": "Full job description text appears here.",
"salary": {
"rawText": "$120,000 - $150,000",
"min": 120000,
"max": 150000,
"currency": "USD",
"period": "year"
},
"applyUrl": "https://company.wd5.myworkdayjobs.com/en-US/SiteName/job/Location/Title_JR0000000/apply",
"applyType": "workday",
"externalUrl": null,
"location": {
"text": "US, CA, Sample City",
"additional": [],
"requisitionLocation": {}
},
"employer": {
"name": "Sample Company",
"tenantSlug": "company",
"careersUrl": "https://company.wd5.myworkdayjobs.com/en-US/SiteName",
"url": "https://company.wd5.myworkdayjobs.com/en-US/SiteName"
},
"hiringOrganization": {
"name": "Sample Company"
},
"similarJobs": [],
"source": {
"searchUrl": "https://company.wd5.myworkdayjobs.com/en-US/SiteName",
"site": "SiteName",
"tenant": "company",
"dc": "wd5",
"host": "company.wd5.myworkdayjobs.com",
"lang": "en-US"
},
"scrapedAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- Recruiting and talent sourcing teams: track new openings at target or portfolio companies as they post, by keyword or category.
- Market and competitive research: monitor hiring volume and role mix across companies over time to spot expansion or contraction.
- Job boards and aggregators: pull structured listings from any number of Workday-hosted employers into one consistent schema.
- Data science and workforce research: build a dataset of job titles, locations and posting dates for trend analysis.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Workday Jobs Scraper return?
The documented output for Workday Jobs Scraper includes title, change type (incremental mode), req id, location, country, time type, posted and employer. Availability of each field depends on the source page and the selected mode.
How much does Workday Jobs Scraper cost?
It costs $2.20 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed jobs on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated jobs by default. Jobs that disappear are only returned, marked EXPIRED, once you also turn on Emit expired and a run scans its whole tracked search; a job that later reappears after being marked EXPIRED that way comes back marked REAPPEARED.
What is the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues one specific interrupted run so you do not re-collect or re-pay for jobs it already has. Incremental mode is for running the same search again and again over time and getting only what changed. Combining both on a search that already has incremental history fails the run on purpose, so the two mechanisms cannot silently disagree about what "already collected" means.
Why did my run return an empty dataset instead of failing?
Search mode with no company site, or URL mode with no URLs, finishes successfully with nothing to scrape rather than failing. The same is true for a Workday URL the actor cannot recognize, or a company site whose requests keep being rejected after the built-in retry attempts: that entry is skipped with a warning in the run log, and any other entries in the same run still complete and are returned.
Why did my run fail instead of returning an empty dataset?
The run fails outright, before scraping, only when resumeFromRunId points to a run or dataset your Apify account cannot read, or when incrementalMode and resumeFromRunId are combined on a state key that already has tracked jobs from an earlier run. Both are deliberate: continuing from an unreadable or ambiguous baseline would otherwise look like a normal, if empty, result.
