Home Depot's stores, Walgreens and Best Buy take applications through BrassRing (Infinite Talent, once IBM Kenexa). Every employer's search lives on one host, sjobs.brassring.com, addressed by a partner id and a site id: Best Buy is partnerid=25632&siteid=5649. The host has no robots.txt (it answers 404). Its search answers JSON, after one step.
curl -s -c jar "https://sjobs.brassring.com/TGnewUI/Search/Home/Home?partnerid=25632&siteid=5649" \ | grep -o '__RequestVerificationToken" type="hidden" value="[^"]*' | cut -d'"' -f5 > rft curl -s -b jar -X POST -H "RFT: $(cat rft)" -H "Content-Type: application/json" \ -d '{"PartnerId":"25632","SiteId":"5649","Keyword":"","Location":"","KeywordCustomSolrFields":"JobTitle","LocationCustomSolrFields":"Location"}' \ "https://sjobs.brassring.com/TgNewUI/Search/Ajax/MatchedJobs" \ | jq '.JobsCount, (.Jobs.Job | length)' That printed 3115 and 50: Best Buy's open jobs that day, and the first page. Five things to know, measured on 2026-10-27 with a few seconds between requests.
1. The page first, then the search
The search page sets a cookie and carries a __RequestVerificationToken in a hidden field. The JSON search wants both: the cookie back, and the token in a header named RFT. Without either one it answers 500 and a 282-byte HTML error page, not a message saying what is missing.
2. A job is a list of questions
Each job is an array of {"QuestionName", "Value"} pairs: reqid, jobtitle, then fields called formtext12 or formtext10. What those mean is set per site, in the search page's JobFieldsToDisplay: for Best Buy, formtext12, formtext10 and formtext1 are the city, the state and "Part time". The date is lastupdated, written 27-Oct-2026. The employer's name is the page's PartnerName.
3. 50 a page, by page number
ProcessSortAndShowMoreJobs takes pageNumber from 1 and a SortType. The full description comes in the list: one page of 50 is about 700 KB.
4. Two sort orders, both full of ties
The only sorts are LastUpdated and JobTitle, and many jobs share a value, so page 2 can repeat a job from page 1 and skip another. Read once by LastUpdated, Best Buy's 63 pages that afternoon gave 3,105 rows and 2,619 distinct jobs: 486 never came up. Dedupe on reqid, then sweep again by JobTitle, and stop when the union reaches JobsCount.
5. One employer, several sites
A partner id is the employer, and it can run more than one site. Walgreens' partner 26336 has site 5014 with 22,246 jobs and site 5019 with 596, each with its own search and count. Home Depot's store roles are on BrassRing (25526/5032, 24,004 jobs) and its other careers site is on Workday. At 50 a page, Home Depot's stores alone are 481 pages a sweep, and one sweep is not enough.
Hosted
Company Career Page Jobs Scraper on Apify takes Home Depot, Walgreens or Best Buy by name, reads every site the name runs, carries the session, sweeps both sorts until it holds what the site declares, and names each field from the site's own layout: 3,103 of Best Buy's 3,105 in one run. BrassRing Jobs API holds the jobs already collected from 83 of these sites. Every other system's public endpoint, with a tested curl, is in job-board-apis.


