DEV Community

Daniel Meshulam
Daniel Meshulam

Posted on Fully Autonomous

ADP jobs API: PepsiCo, Stellantis and Casey's careers sites on myjobs.adp.com, as JSON

PepsiCo Beverages North America (myjobs.adp.com/pbna), Stellantis (myjobs.adp.com/stellantisexternalcx) and Casey's (myjobs.adp.com/caseysstore) hire through ADP's career centre. ADP's documented Recruiting API needs partner credentials. The career sites themselves read from two public JSON calls, with no key and no login:

curl -s "https://myjobs.adp.com/public/staffing/v1/career-site/pbna" \
  | jq '{clientName, name, orgoid}'
Enter fullscreen mode Exit fullscreen mode

That prints the employer, the site's own name and an orgoid. Five things to know, each measured on 2026-10-27 with pauses of several seconds between requests.

1. Two calls, and the second needs a header

The job list refuses any request without the orgoid header, and answers 400 "Missing orgoid header". The settings call above is the only place that gives it:

ORG=$(curl -s "https://myjobs.adp.com/public/staffing/v1/career-site/pbna" | jq -r .orgoid)
curl -s -H "orgoid: $ORG" \
  "https://myjobs.adp.com/public/staffing/v1/job-requisitions?careerSiteDomain=pbna&\$top=100&\$skip=0" \
  | jq '.count, (.jobRequisitions | length)'
Enter fullscreen mode Exit fullscreen mode

That printed 373 and 100: PepsiCo Beverages' open jobs that day, and the first page. clientName is the employer. name is the site's label, which for PepsiCo is ExternalCareerSiteNewUX.

2. Ask for the fields, or there is no date

The default answer carries the title, the places and the requisition id, and no posting date and no description. $select adds them, in the same request:

curl -s -H "orgoid: $ORG" \
  "https://myjobs.adp.com/public/staffing/v1/job-requisitions?careerSiteDomain=pbna&\$top=1&\$skip=0&\$select=jobTitle,postingDate,salaried,jobDescription" \
  | jq '.jobRequisitions[0] | {jobTitle, postingDate, salaried, chars: (.jobDescription | length)}'
Enter fullscreen mode Exit fullscreen mode

The full description comes in the list itself, so it costs no request per job. salaried holds the pay basis as the employer filed it: "Hourly", or "Commission/Target Pay" for PepsiCo's sales roles.

3. The count stops at 10,000, the list does not

Dhanani Group, the franchisee whose site is popeyes, declares count: 10000 on every page. At $skip=13800 the list still answered a short page of 21 jobs, so it held 13,821:

ORG=$(curl -s "https://myjobs.adp.com/public/staffing/v1/career-site/popeyes" | jq -r .orgoid)
curl -s -H "orgoid: $ORG" \
  "https://myjobs.adp.com/public/staffing/v1/job-requisitions?careerSiteDomain=popeyes&\$top=100&\$skip=13800&\$select=reqId" \
  | jq '.count, (.jobRequisitions | length)'
Enter fullscreen mode Exit fullscreen mode

Page until a short page. A loop that stops at count drops a third of this employer and reports success.

4. Two sites can be one list

Sempra runs sdgecareers and socalgascareers. Both give the same orgoid, and both answered the same 340 jobs, the first 100 identical id for id. Dhanani's burgerking and popeyes share one orgoid too. The list belongs to the organisation, not the site, so dedupe on orgoid plus reqId before counting anything.

5. The site's name is not the company's

popeyes is Dhanani Group, a franchisee, not Popeyes. pbna is PepsiCo Beverages North America, not PepsiCo. ADP publishes no way to find a site from a company name or domain, so a list of employers needs a list of verified slugs. One more: ADP's older careers host, workforcenow.adp.com with a ?cid= in the address, is a different product with a different API, and its robots.txt sends you to a login page.

When we read all 503 of these sites in September, a burst of four quick pages got back a 2,782-byte HTML page instead of JSON, with no 429, and the block held for tens of seconds. Space the pages.

Hosted

ADP Jobs Scraper on Apify takes a slug, a careers URL or one of 327 employer names, sends the right orgoid, pages past the 10,000 and puts the employer's real name on every row. Company Career Page Jobs Scraper takes Stellantis, Casey's or Sempra next to employers on Workday, Oracle and the rest. Every other system's public endpoint, with a tested curl, is in job-board-apis.

Top comments (0)