Adderley Data Apify Store

Adderley Data / Guides

Workday job board API: the careers-page JSON, its paging and its 2,000 cap

Workday does not publish a job board API for the public. What it has is the JSON that every careers site on myworkdayjobs.com loads in the visitor's browser: a POST to /wday/cxs/{tenant}/{site}/jobs. This page sets out how that endpoint behaves, the limits we measured against it, and what a whole board costs to read.

The request

Everything comes from the careers page's own address. For https://acme.wd5.myworkdayjobs.com/External the tenant is acme, the host is wd5 and the site is External, and the list is:

curl -X POST "https://acme.wd5.myworkdayjobs.com/wday/cxs/acme/External/jobs" \
  -H "Content-Type: application/json" \
  -d '{"appliedFacets": {}, "limit": 20, "offset": 0, "searchText": ""}'

A company name alone is not enough: nothing public maps a name to its tenant, its wd number and its site name, so you start from the careers link. Each posting in the list carries a path, and GET /wday/cxs/{tenant}/{site}{externalPath} returns that posting's own record.

Limits and quirks, measured

Checked against live careers sites on 24 September 2026:

  • Page size: 20 at most. A limit of 21 or more answers HTTP 400.
  • Total: only the first page reports total; later pages say 0.
  • The cap: total stops at 2,000. A board whose filter counts added up to 2,616 reported 2,000, so a larger board has to be read filter by filter.
  • Past the end: an offset past the last posting serves the first page again rather than an empty one, so stop at the first page's total.
  • Case: the tenant in the path is case-sensitive (upper case answered 502); the site name is not (370 postings either way).
  • Errors: a locale segment in the path answers 405; the wrong wd host or a tenant that does not exist answers 422; a site that does not exist answers 404.

The list is thin. Each entry gives a title, a location label, the path and a relative date such as "Posted 3 Days Ago", which stops at "Posted 30+ Days Ago". The posting date, the country and the time type are only in each posting's own record, which is one more request per posting.

What a posting holds

Read on Workday's own careers site, workday.wd5.myworkdayjobs.com/Workday, on Wednesday 14 October 2026: one list page and two posting records.

The list answers with total (389 that morning, on the first page only), jobPostings, facets and userAuthenticated. Each of its 20 entries carries six keys and nothing else:

  • title and externalPath: the role, and the path its record is read from, ending in the requisition id (…_JR-0110802).
  • locationsText: one location label as the company writes it, or a count such as "2 Locations" when there are several.
  • postedOn: relative text only, from "Posted Today" to "Posted 30+ Days Ago".
  • remoteType: the company's own label; on this board "Flex", "Onsite" or "Remote".
  • bulletFields: whatever the company shows under the title; here the requisition id.

The facets are the careers page's filters, with a count beside each value. Workday's own site has seven: remote type (3 values), country or territory (25), job category (20), state (55), time type (1), distance (5) and a location group. A value's id goes back in appliedFacets to narrow the list, which is how a board above the 2,000 cap is read in parts.

The record, a GET on that path, keeps the posting under jobPostingInfo:

  • startDate: the posting's start date, such as 2026-10-13, and the only absolute date in either response. Some boards add endDate, the date the posting closes.
  • timeType: "Full Time" on both records read.
  • location and additionalLocations: every location label, the second only when there are several. jobRequisitionLocation.country.alpha2Code gives the ISO country code (US); country gives only a name and Workday's internal id.
  • jobDescription: the whole posting as HTML, about 11,000 characters on each record read.
  • jobReqId, remoteType, externalUrl, canApply and posted, with Workday's internal ids and the ids of the application questionnaires.

Beside it, hiringOrganization.name is the employing legal entity, such as "Workday Government, LLC", and similarJobs was empty on both. Neither response has a pay field: where a company states pay, it sits inside jobDescription, in the company's own words. Neither names a recruiter.

What a whole board costs

Measured on Workday's own careers site, workday.wd5.myworkdayjobs.com/Workday, on Thursday 1 October 2026 (run ZSnKFj1HNi0j0F5TN): 362 open roles in 24 countries took 381 requests, 19 list pages plus one record per role, all answered at the first attempt, in 4 minutes 21 seconds at 90 requests a minute. On Tuesday 6 October the same site listed 374. Of the 362:

  • a pay range on 235 (65%), as numbers in US dollars, euros, Canadian dollars and pounds, none saying per what;
  • a city on 334 (92%), once Workday's coded labels such as USA.VA.Reston are read as country, region and city;
  • hybrid on 314, on-site on 35, remote on 13.

The full account of that run, and of the next day's run that read only what had changed, is in the guide Workday jobs into Google Sheets every day.

Where it stops

Reading one board once is a short script. Watching boards is not: the record request per posting makes every full read cost hundreds of requests, the 2,000 cap needs filter splitting on large employers, and nothing in the response tells you which roles are new, changed or gone since yesterday. Workday Jobs Scraper handles all three from the careers link alone: it pages and splits as above, reads a posting's record only when the list shows something new or changed, and in incremental mode returns, and charges for, only the roles that changed. One limit carries over from the list: an edit to a posting's text alone does not show in the list, so it is not seen as a change. Its page has the price and every field.

The same reference for other systems

Published 2026-10-06.