Workday Jobs Scraper for myworkdayjobs.com avatar

Workday Jobs Scraper for myworkdayjobs.com

Pricing

from $0.75 / 1,000 results

Go to Apify Store
Workday Jobs Scraper for myworkdayjobs.com

Workday Jobs Scraper for myworkdayjobs.com

Reads any Workday careers site on myworkdayjobs.com through the tenant's own CXS search API and returns the requisition ID, title, employmentType, isRemote, postedAt, apply URL and a location split into city, state and country. Paginates a whole board 20 postings at a time.

Pricing

from $0.75 / 1,000 results

Rating

0.0

(0)

Developer

String

String

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

9 days ago

Last modified

Share

Pull every open role off any Workday careers site — one URL in, the whole board out, with the location split into city, state and country.

What can Workday Job Board Scraper do?

Give it a careers-site URL and it returns the board's postings as rows, walking the whole board rather than the first page.

🏢 Any Workday board, no setup. Paste a careers URL such as salesforce.wd12.myworkdayjobs.com/External_Career_Site and it works out the tenant and board itself. Nothing is per-company.

📋 Every posting, paginated to the end. Workday hands out 20 at a time; this walks the board to its own reported total, or stops at your maxItems.

📍 A location you can filter on. Tenants write Reno, NV, USA.VA.Reston and

California - San Francisco
; each comes back split into city, state and an ISO country code.

🏠 A real remote flag. isRemote reads the location and Workday's own remoteType, not the title.

📅 A calendar date. Workday publishes "Posted 4 Days Ago"; you get postedAt as YYYY-MM-DD.

🔑 A stable jobId. Workday's own requisition id, so a scheduled run de-duplicates on one column.

🚫 No login. No Workday account, cookie or API key — this is the external careers site a logged-out visitor sees.

Why scrape Workday?

Workday is the ATS of large employers. If you are tracking hiring at enterprises, this is where the requisitions actually live, and the CXS API returns them as clean JSON rather than as rendered markup.

  • Monitor enterprise headcount direction across a named competitor set, run on a schedule.
  • Detect a new site or market entry from where requisitions start appearing.
  • Feed a job board or talent CRM directly from the employer's board, keyed on a stable jobId.
  • Build recruiting lists filtered on city, state, country or isRemote.
  • Score sales accounts on hiring signals, weighting by postedAt freshness.
  • Track how much of a large employer's hiring is genuinely remote, using the flag rather than the title.

How to use it

  1. Follow the employer's "careers" or "search jobs" link until the address bar shows <tenant>.wd<N>.myworkdayjobs.com/<Board>. Copy the URL. A single posting's URL works too.
  2. Add it to Job boards, up to 100 per run.
  3. Set Maximum results. Boards paginate 20 at a time, so this is what bounds the request count.
  4. Raise Concurrency toward 10 when collecting many boards.
  1. Run it, then export the dataset as JSON, CSV, Excel or XML, or read it over the API.

Output

One row per posting. Illustrative shape:

{
"jobId": "JR284401",
"title": "Lead Solution Engineer",
"company": null,
"tenant": "salesforce",
"location": "California - San Francisco",
"city": "San Francisco",
"state": "CA",
"country": "US",
"isRemote": false,
"department": null,
"employmentType": "Full time",
"postedAt": "2026-08-16",
"jobUrl": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/California---San-Francisco/Lead-Solution-Engineer_JR284401",
"boardUrl": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
"sourceUrl": "https://salesforce.wd12.myworkdayjobs.com/wday/cxs/salesforce/External_Career_Site/jobs",
"collectedAt": "2026-08-20T09:14:02.118Z"
}

The run also writes a SUMMARY record holding the item count, the failure count and each failed board or page with its error.

Limitations

Board-level data only. Workday's search API publishes no description body and no salary, and it names neither the employer nor the department, so company and department are always null — the FAQ says why. Follow jobUrl for the posting itself.

Locations are resolved from free text the tenant wrote, so the split is a best reading rather than a lookup. A two-letter part is tried as a US or Canadian region before a country, which keeps the CO in Denver, CO, USA as Colorado rather than Colombia; the trade is that a bare CA always reads as California. Virtual and Home Office are read for isRemote and then dropped, and region labels such as EMEA and APAC are left as neither a city nor a country.

How much does it cost?

A run that returns 1,000 rows costs $1.50 on a paid plan, or $1.75 with no subscription. You are charged per result row written to the dataset, so a run that returns nothing costs nothing, and maxItems is the budget dial.

PlanPer 1,000 rows
Free$1.75
Bronze$1.50
Silver$1.00
Gold$0.75
Platinum$0.75
Diamond$0.75

Apify bills its own platform usage for the run on top of this.

At 20 postings per request, requests track rows closely, so maxItems is effectively the budget dial. Collecting the first 200 postings of fifty boards is much cheaper than collecting fifty boards in full, and the scheduler here is built to make that first case work rather than fetching everything and throwing the surplus away.

Runs started from an Apify free plan stop at 250 requests and 250 results and report the limit in the run status. Any paid plan runs the full input. Because pagination turns one board into many fetches, the second pass of a free-plan run is bounded against whatever the first pass left rather than against the full allowance again.

Using it with the Apify API

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "<YOUR_APIFY_TOKEN>" });
const run = await client.actor("usestring/workday-jobs").call({
boards: ["https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"],
maxItems: 3000,
concurrency: 5
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const remoteShare = items.filter((job) => job.isRemote).length / items.length;
console.log(`${items.length} postings, ${(remoteShare * 100).toFixed(1)}% remote`);

Read the run's SUMMARY record from its key-value store to see which boards, if any, were rejected.

FAQ

How do I find a company's Workday careers site? Follow the careers link on the employer's own site. Workday sites look like https://<tenant>.wd<N>.myworkdayjobs.com/<Board>, where <N> is a data-centre number. Paste the whole URL, or paste a single posting's URL and let the Actor reduce it to the board.

How many postings come back per request? Twenty. Workday rejects anything larger with HTTP_400, so a 2,000-posting board is 100 requests and there is no way around that.

Why is there no company name? Workday publishes none on any public endpoint. The search response has no such field, and the detail endpoint carries only the hiring legal entity, which is often something like 4 LZB Retail, Inc. rather than the brand a person would recognise. Rather than fill the column with something misleading it is left null, and tenant is the identity to join on.

Why is there no department? For the same reason. Department exists on a Workday board only as the jobFamilyGroup facet, which counts how many postings sit in each category without naming the category of any individual posting.

How accurate is postedAt? It is exact for anything posted within the last 30 days, since Posted 4 Days Ago resolves to a real calendar date against the run clock. Beyond that Workday only says 30+ Days Ago, and the field is null.

Do results ever duplicate? They are de-duplicated on jobUrl before being written, which is necessary because a board whose reported total understates it hands back page one again past the end instead of terminating.

What happens if a board rejects the search? Workday answers a rejected search with an error envelope carrying its own httpStatus inside a 200 response, so it would otherwise look like a successful empty board. That envelope is read, and the board is recorded under failures in the run's SUMMARY.

Feedback

If a board returns nothing, or a location splits into the wrong fields, open an issue from this Actor's Store page with the board URL. Workday location strings vary more than anything else here, and a real example is what it takes to handle a new form.