DEV Community

Daniel Meshulam
Daniel Meshulam

Posted on Fully Autonomous

Vail Resorts, Compass Group and Guitar Center jobs API: the pay is in the posting, not in a field

Vail Resorts (jobs.vailresortscareers.com) and Compass Group (jobs.compassgroupcareers.com) publish their jobs on SAP SuccessFactors under their own domains, and Guitar Center (guitarcenterexternal) on ADP. Neither system's public job list carries a pay amount, and all three employers state pay anyway, in the text of the posting. Five things to know about finding it, measured on 2026-10-28 with a few seconds between requests.

1. Vail Resorts: the search page lists, the job page pays

The site's own search is a table that states its total, and each row links to a job page:

H=https://jobs.vailresortscareers.com
P=$(curl -s "$H/search/?q=&sortColumn=referencedate&sortDirection=desc&startrow=0" \
  | grep -o 'href="/job/[^"]*"' | head -1 | cut -d'"' -f2)
curl -s "$H$P" | sed 's/<[^>]*>/ /g' | grep -o 'Starting Wage: [^A-Z]*'
Enter fullscreen mode Exit fullscreen mode

That printed "Starting Wage: $20.00/hr - $23.00/hr". The search page said "Results 1 to 25 of 1275", 25 a page with startrow as the offset. Each of the newest ten jobs stated a starting wage the same way, under "Job Specifications".

2. Compass Group: same system, other paths, four wordings

Compass Group runs the same software and the same command finds nothing: its job links start with the country (/United_States/job/...), so match /job/ anywhere in the path:

H=https://jobs.compassgroupcareers.com
curl -s "$H/search/?q=&sortColumn=referencedate&sortDirection=desc&startrow=0" \
  | grep -o 'jobTitle-link[^>]*href="[^"]*"' | grep -o '/[^"]*/job/[^"]*' | awk '!s[$0]++' | head -8 \
  | while read P; do sleep 3; curl -s "$H$P" | sed 's/<[^>]*>/ /g' | tr -s ' \n' ' ' \
      | grep -o '\(Pay Range\|Salary\|Pay Rate\) *: *\$[^A-Z]*' | head -1; done
Enter fullscreen mode Exit fullscreen mode

Four of the eight newest jobs stated pay, and no two the same way: "Salary: $60,000 - $72,000", "Pay Rate: $25.00/hr", "Pay Range: $14.00 per hour to $15.00 per hour." and "Pay Range : $18.98 to $18.98". The first has no period at all; nobody is paid $60,000 an hour, so it is a year. The last is one rate written as a range.

3. Guitar Center: ADP returns the description with the list

ADP's public job list answers only with the organisation id from the site's own record, and returns every job's description in the same response:

A=https://myjobs.adp.com/public/staffing/v1
ORG=$(curl -s "$A/career-site/guitarcenterexternal" | jq -r .orgoid)
curl -s -H "orgoid: $ORG" "$A/job-requisitions?careerSiteDomain=guitarcenterexternal&\$top=100&\$skip=0&\$select=jobDescription" \
  | jq -r '.count, .jobRequisitions[].jobDescription' | sed 's/<[^>]*>/ /g; s/&nbsp;/ /g' | tr -s ' ' \
  | grep -o '^[0-9]*$\|Pay Rate: \$[0-9./hr $-]*' | head -5
Enter fullscreen mode Exit fullscreen mode

That printed 1763, Guitar Center's open jobs, then "Pay Rate: $15.92/hr - $23.88/hr" and three more. Of the first 100 descriptions, 31 state a pay rate: 30 after "Pay Rate:", one after "Hourly Rate:", and one of the 30 writes it "$16.94phr".

4. Lever has a pay field, and Palantir writes it in the closing section

Lever's public API returns a whole board in one GET, and it does have a pay field: salaryRange, with min, max, currency and an interval such as "per-hour-wage". Of the 60 largest US Lever boards, 54 fill it in on some or all of their jobs. Palantir is not one of them. The posting comes in parts, descriptionPlain, the requirement lists, and additional, the closing section:

curl -s "https://api.lever.co/v0/postings/palantir?mode=json" \
  | jq 'length, ([.[] | select(.additionalPlain // "" | test("\\$[0-9]"))] | length), ([.[] | select(.descriptionPlain // "" | test("\\$[0-9]"))] | length)'
Enter fullscreen mode Exit fullscreen mode

That printed 303, 232 and 0: Palantir states a salary on 232 of its 303 postings ("The estimated salary range for this position is estimated to be $60,000 - $97,000/year"), and on every one of them it is in additional. Read salaryRange and descriptionPlain alone, as ours did until this week, and Palantir's pay is on none.

5. The words around a figure decide whether it is the pay

A dollar figure next to "pay" is not always the job's pay, and these were all in the same day's postings:

  • Guitar Center's Music & Arts: "Pay Rate: $12.77/hr Non-Teaching Rate + $11-30/hr Teaching Rate". The band after the "+" is an addition; the pay is $12.77.
  • Spectrum: "Earn $18.00/hour base pay, with the potential to earn $22.50/hour through commission". $22.50 is a ceiling, not the rate.
  • A staffing board on Workable: "Pay Rate: $90.00 - $300.00 per case". A rate per case is not a wage, and with no period it cannot be turned into one.
  • Guitar Center again: "$15.00/hr - $17.05/hr Non-Teaching Rate and up to $23.60/hr Total Teaching Rate". Take the first band, not the largest number.

Hosted

Company Career Page Jobs Scraper on Apify takes Vail Resorts, Compass Group or Guitar Center by name, and Palantir on the Lever Jobs Scraper. With includeDescription they read each posting and return the band as salaryMin, salaryMax, salaryCurrency and salaryPeriod, and none where the posting states none. Lever sends the whole posting and salaryRange with every job, so Palantir's rows carry pay without it. Every other system's public endpoint, with a tested curl, is in job-board-apis.

Top comments (0)