DEV Community

UnitedHealth, Kaiser Permanente and Comcast jobs API: Radancy careers sites, one sitemap and one page per job

UnitedHealth Group (careers.unitedhealthgroup.com), Kaiser Permanente (www.kaiserpermanentejobs.org) and Comcast (jobs.comcast.com) run their careers sites on Radancy, also sold as TalentBrew. There is no public jobs API. There is a robots.txt that says where not to go, a sitemap, and a structured record on every job page.

curl -s "https://careers.unitedhealthgroup.com/robots.txt"

That prints Disallow:/search-jobs/ and nothing else.

Five things to know, measured on 2026-10-27 with a few seconds between requests.

1. The search is closed, the sitemap is not

All three sites disallow /search-jobs/, the address the careers page's own search uses. The sitemap lists every job instead, each with a <lastmod>:

curl -s "https://careers.unitedhealthgroup.com/sitemap.xml" \
  | grep -o '<loc>[^<]*/job/[^<]*</loc>' | wc -l

That printed 5706, UnitedHealth's open jobs, from a 5.5 MB file. Kaiser Permanente's listed 3,191 and Comcast's 680.

2. The title is in the address

Every job URL is /job/<city>/<title>/<org>/<id>, so a title can be picked out of the sitemap before any job page is fetched. Kaiser Permanente had 424 jobs with "nurse" in the title part:

curl -s "https://www.kaiserpermanentejobs.org/sitemap.xml" \
  | grep -o '<loc>[^<]*/job/[^<]*</loc>' | grep -c '/job/[^/]*/[^/]*nurse'

3. Each job page states itself

A job page carries one <script type="application/ld+json"> holding a schema.org JobPosting: title, date posted, places, employer, and the full description.

URL=$(curl -s "https://www.kaiserpermanentejobs.org/sitemap.xml" \
  | grep -o '<loc>[^<]*/job/[^<]*</loc>' | head -1 | sed 's/<[^>]*>//g')
curl -s "$URL" | tr '\n' ' ' \
  | sed 's/.*<script type="application\/ld+json">//; s/<\/script>.*//' \
  | jq '{title, datePosted, place: .jobLocation[0].address.addressLocality}'

4. One page per job is the cost

There is no list that carries the fields, so a whole site is one request per job. Five UnitedHealth job pages ran from 195 KB to 303 KB, so all 5,706 are over a gigabyte. Filter by the title in the address first, and on a second read fetch only the jobs whose <lastmod> moved.

5. The same schema, filled differently

All three pages carried a baseSalary object with an empty currency and no amount, so its presence says nothing. UnitedHealth wrote the country as "United States" and the region as "North Carolina"; Kaiser Permanente "US" and "WA"; Comcast "US" and "Texas". Kaiser's employmentType was "Standard", Comcast's "Full Time", UnitedHealth's absent. Normalise per site, and treat an empty field as absent.

Hosted Company Career Page Jobs Scraper on Apify takes UnitedHealth Group, Kaiser Permanente or Comcast by name, picks the titles you ask for out of the sitemap before it fetches a page, and returns one row per job with the place split into city, region and country. Every other system's public endpoint, with a tested curl, is in job-board-apis.

Read on DEV Community ↗ ← Back to News

Comments

No comments yet. Start the discussion.