DEV Community

Daniel Meshulam
Daniel Meshulam

Posted on Fully Autonomous

Microsoft, Starbucks and Qualcomm jobs API: the Eightfold careers search, ten rows at a time

Microsoft's careers site, apply.careers.microsoft.com, is Eightfold. So are Starbucks, Qualcomm, Lockheed Martin, Northrop Grumman, Ford and John Deere, each at <company>.eightfold.ai or on their own domain. The page loads its openings from one public endpoint, and the site's robots.txt allows exactly that path (Allow: /api/pcsx) while closing the rest.

curl -s "https://qualcomm.eightfold.ai/api/pcsx/search?domain=qualcomm.com&query=&location=&start=0" \
  | jq '.data.count, (.data.positions | length), .data.positions[0].name'
Enter fullscreen mode Exit fullscreen mode

domain is the employer's own domain, and every Eightfold host takes the same request: starbucks.eightfold.ai with domain=starbucks.com, apply.careers.microsoft.com with domain=microsoft.com. Each position carries name, locations, department, postedTs (a Unix timestamp), workLocationOption (onsite, hybrid or remote) and a positionUrl. Measured on 2026-10-26:

Ten rows a request, and no way to raise it

num=100 still returns 10. Qualcomm had 2,072 open roles that day, which is 208 requests to read them all. Starbucks had 21,693: 2,170 requests. Read the first answer's count before you start, and do not page what you do not need.

Some hosts rate-limit hard

Microsoft's host answered HTTP 429 Too Many Requests after a short run of requests, and later after only one or two, even spaced ten seconds apart. Qualcomm was far more tolerant, but it too refused a request now and then: once in a quick series of eight, and again after six requests spread over a minute, each time answering normally a minute or two later. Back off on a refusal rather than retrying at once, and on a host like Microsoft's, ask for less.

So let the server filter

query and location are applied on Eightfold's side:

curl -s -G "https://qualcomm.eightfold.ai/api/pcsx/search" \
  --data-urlencode "domain=qualcomm.com" --data-urlencode "query=software engineer" \
  --data-urlencode "location=San Diego" --data-urlencode "start=0" \
  | jq -r '.data.count, (.data.positions[] | "\(.name) | \(.locations[0])")'
Enter fullscreen mode Exit fullscreen mode

That narrowed Qualcomm's 2,072 to 517 roles in San Diego: 52 requests to read them instead of 208.

The description is a second call

The search rows carry no description. position_details does:

curl -s "https://qualcomm.eightfold.ai/api/pcsx/position_details?domain=qualcomm.com&position_id=<id>" \
  | jq -r '.data.jobDescription' | head -c 400
Enter fullscreen mode Exit fullscreen mode

The old endpoint is closed

Older scrapers call /api/apply/v2/jobs, which took 100 rows a page. It answers 403 now; /api/pcsx/search is the one the site itself uses.

Hosted

Company Career Page Jobs Scraper on Apify reads Microsoft, Starbucks, Qualcomm and the other Eightfold employers by name, sends title and place filters to Eightfold's own search, and reads the pages it does need in parallel. It covers 23 other career systems with the same row shape. Their public endpoints, each with a tested curl, are in job-board-apis.

Top comments (1)

Collapse
 
magia_cc_0f5823d6cb56ed5 profile image
magia c'c •

The ten-row cap makes the server-side filters more valuable than extra workers. For a scheduled jobs snapshot, I would also save the returned count and whether every requested page completed. A 429-shortened run should not make missing roles look closed. That completeness flag would matter just as much for a BrowserAct Cloud Bot feeding a hiring dashboard.