DEV Community

Daniel Meshulam
Daniel Meshulam

Posted on Fully Autonomous

BAE Systems, Honda and Dollar Tree jobs API: the Phenom job page and the pay fields each employer names

BAE Systems (jobs.baesystems.com), Honda (careers.honda.com) and Dollar Tree (careers.dollartree.com) run their careers sites on Phenom. The site's own search is one POST to /widgets, covered in the RTX, UPS and CVS Health write-up. That search returns a list. Five things to know about what the list leaves out, measured on 2026-10-28 and 29 with a few seconds between requests.

1. The list's description is a teaser, and not the posting's words

Each job in the list has descriptionTeaser: 307 to 413 characters on Honda's ten newest jobs, against 3,438 to 8,375 for the postings themselves. It is not the start of the posting either. Honda's newest teaser begins "We are looking for a SAP PP / QM Functional Analyst II", and the posting begins "What Makes a Honda, is Who makes a Honda". Of the newest 100 teasers at Honda, BAE Systems and Dollar Tree, none has a dollar figure.

2. The posting is on the job's own page

Each job page embeds the site's data as phApp.ddo, and jobDetail.data.job in it is the whole record. The page's path comes from the job's locale ("en_US" is /us/en/, "en_GLOBAL" is /global/en/):

page() {  # a Phenom host: the newest job's record, from the job's own page
  P=$(curl -s -X POST "https://$1/widgets" -H "Content-Type: application/json" \
    -d '{"ddoKey":"refineSearch","jobs":true,"from":0,"size":1,"sort":{"order":"desc","field":"dateCreated"}}' \
    | jq -r '.refineSearch.data.jobs[0] | (.locale | split("_") | "/\(.[1] | ascii_downcase)/\(.[0])") + "/job/" + .jobSeqNo')
  curl -s "https://$1$P" | grep -o 'phApp.ddo = {.*}; phApp.experimentData' \
    | sed 's/^phApp.ddo = //; s/; phApp.experimentData$//' | jq '.jobDetail.data.job'
}
page jobs.baesystems.com | jq -c '{salaryMin, salaryMax, payRange, chars: (.description | length)}'
Enter fullscreen mode Exit fullscreen mode

That printed {"salaryMin":"136000","salaryMax":"231200","payRange":"231200 - 136000 USD per year","chars":9980}. robots.txt on these sites disallows */apply, */jobcart and */chatbot, not the job pages.

3. Every employer names its pay fields itself

page careers.dollartree.com | jq -c '{minSalary, maxSalary}'
page careers.honda.com | jq -c '{salary, salaryRange}'
Enter fullscreen mode Exit fullscreen mode

Dollar Tree answered minSalary "$15.50" and maxSalary "$16.00"; Honda salary and salaryRange, both "$80,900.00 - $101,100.00". Some of it is in the list already: Honda's salary is filled on 280 of its 310 jobs, UPS's openingPayRate ("$21.00/hour") on 241 of its newest 500, Dollar Tree's salaryRange ("$20.50-$21.25") on 116 of its newest 500. BAE Systems keeps its numbers for the job page only.

4. Read the fields, then read them again

BAE's payRange writes the maximum first, so take the numbers from salaryMin and salaryMax. RTX has a compensationGrade ("P4"), which is a grade, not an amount; its pay is in the description ("The salary range for this role is 107,500 USD - 204,500 USD"). STERIS fills salaryMin and salaryMax with 60,500 and 101,000 on a job whose posting says "Pay range for this opportunity is $68,637.50 - $88,825.00", a narrower band than its own fields: decide which one you mean. Bechtel's salaryRange holds two quote characters and nothing else.

5. Without a field, the posting says it its own way

  • CoreCivic opens its postings with the pay and no label: "$86,635.00 / year".
  • Trane writes "Annual Base Salary Range or Hourly Base Pay Range: $56,300.00 - $101,394.99", a label that names two periods; the numbers say which.
  • Ecolab writes "42,000.00 - 52,500.00 - 63,000.00 USD Annual", a minimum, a midpoint and a maximum. The band is the outer two.

Hosted

Company Career Page Jobs Scraper on Apify takes BAE Systems, Honda or Dollar Tree by name. The list's own pay fields come with every run (Honda, UPS); with includeDescription it reads each job's page for the whole posting and returns the band its fields or its text state as salaryMin, salaryMax, salaryCurrency and salaryPeriod. BAE's newest row came back with "136,000 - 231,200 USD (year)". Every other system's public endpoint, with a tested curl, is in job-board-apis.

Top comments (0)