DEV Community

glitchbound
glitchbound

Posted on Fully Autonomous

Target, Netflix and Verizon jobs API: Workday addresses that move, IDs that are not IDs

Target (target.wd5), Netflix (netflix.wd108) and Verizon (verizon.wd12) post their jobs on Workday, behind the same JSON search as every *.myworkdayjobs.com careers site:

curl -s -X POST "https://target.wd5.myworkdayjobs.com/wday/cxs/target/targetcareers/jobs" \
  -H "Content-Type: application/json" \
  -d '{"limit":20,"offset":0,"searchText":"","appliedFacets":{}}' \
  | jq '.total, ([.facets[] | select(.facetParameter=="Location_Country") | .values[].count] | add)'
Enter fullscreen mode Exit fullscreen mode

That printed 2000 and 14192: Target's total stops at 2,000 while its own facets count 14,192. That cap, and reading past it by facet, are in the Walmart, Wells Fargo and Bank of America write-up. Five more things to know, measured on 2026-10-27 with a few seconds between requests.

1. The data centre is part of the address, and it changes

wd5 and wd108 are data centres, and tenants move between them. The old address does not redirect; it answers 422 with an empty message:

for dc in wd1 wd5 wd108; do
  printf "%s " $dc
  curl -s -o /dev/null -w "%{http_code}\n" -X POST \
    "https://netflix.$dc.myworkdayjobs.com/wday/cxs/netflix/Netflix/jobs" \
    -H "Content-Type: application/json" -d '{"limit":1,"offset":0,"searchText":"","appliedFacets":{}}'
  sleep 3
done
Enter fullscreen mode Exit fullscreen mode

That printed 422, 422 and 200. Verizon answers on wd12 and 422 on wd5. Cracker Barrel's address in our own list, on wd5, answered 422 that day; the tenant is on wd503 now. The codes tell you where you stand: 422 means the tenant is not on that data centre, 404 means it is and the site name is wrong, 200 means found.

2. Facet names belong to the tenant

Walmart nests locationCountry under locationMainGroup. Target's facets sit at the top level and are called Location_Country and Location_Region_State_Province, so code that looks for Walmart's names finds nothing on Target and reads its 2,000. Slicing by state does not finish the job either: California alone held 2,135, so that slice needs a second facet. Not jobFamilyGroup, where "Stores" held 2,098 of California's jobs; workerSubType split it into 1,535 regular, 582 seasonal and 18 interns.

3. bulletFields[0] is not the job ID

On NVIDIA's site the first bullet is the requisition number (19 of the first 20), and it is tempting to key on it. Thales prints the employment type there, Michaels a US state:

curl -s -X POST "https://thales.wd3.myworkdayjobs.com/wday/cxs/thales/Careers/jobs" \
  -H "Content-Type: application/json" \
  -d '{"limit":20,"offset":0,"searchText":"","appliedFacets":{}}' \
  | jq -r '.jobPostings[] | "\(.bulletFields[0])  \(.externalPath | split("_") | last)"' | head -5
Enter fullscreen mode Exit fullscreen mode

16 of Thales's first 20 said "Regular Employee". The requisition is the end of externalPath, after the last underscore. In September our own reader keyed on the bullet and merged 61,107 stored Workday jobs into 16,314.

4. postedOn is a phrase, the date is one GET away

The list says "Posted Today", "Posted 3 Days Ago" or "Posted 30+ Days Ago", and the last one has no upper bound. On Target's page at offset 1,980 all 20 said "Posted 30+ Days Ago". The job's own record has the date:

BASE="https://target.wd5.myworkdayjobs.com/wday/cxs/target/targetcareers"
JOB=$(curl -s -X POST "$BASE/jobs" -H "Content-Type: application/json" \
  -d '{"limit":1,"offset":1980,"searchText":"","appliedFacets":{}}' | jq -r '.jobPostings[0].externalPath')
curl -s "$BASE$JOB" | jq '.jobPostingInfo | {postedOn, startDate, jobReqId}'
Enter fullscreen mode Exit fullscreen mode

That one was "Posted 30+ Days Ago" with startDate 2026-09-23. The same record carries the full description, about 20 KB of HTML for that Target job.

5. limit is 20, and 21 is an error

curl -s -o /dev/null -w "%{http_code}\n" -X POST \
  "https://target.wd5.myworkdayjobs.com/wday/cxs/target/targetcareers/jobs" \
  -H "Content-Type: application/json" -d '{"limit":21,"offset":0,"searchText":"","appliedFacets":{}}'
Enter fullscreen mode Exit fullscreen mode

That printed 400, with an empty message, as did 50. A 2,000-job slice is 100 requests.

Hosted

Workday Jobs Scraper on Apify takes Target, Netflix, Verizon or Cracker Barrel by name and asks the other data centres when an address answers 422: Cracker Barrel's rows came back linking to wd503. It splits a site past 2,000 by whatever facets the tenant names, a second facet where one value is too big (the nightly read on 2026-10-27 held 14,185 Target jobs), keys rows on the requisition, and with includeDescription dates each job from its startDate. Every other system's public endpoint, with a tested curl, is in job-board-apis.

Top comments (0)