Skip to content

feat: Workday careers sites in the job feed - #72

Merged
coderback merged 1 commit into
mainfrom
feat/workday-boards
Oct 20, 2026
Merged

coderback merged 1 commit into
mainfrom
feat/workday-boards

Conversation

@coderback

Copy link
Copy Markdown
Owner

Why

34 of the graduate employers' careers sites checked in #71 run on Workday, which the collection didn't fetch: the largest group after plain company pages.

A Workday site searches through a public JSON service, the same one its own pages call:

  • POST …/wday/cxs/<tenant>/<site>/jobs lists postings, 20 a call and without descriptions;
  • GET …/wday/cxs/<tenant>/<site><externalPath> returns one posting.

What changed

  • _WORKDAY_BOARDS: 31 sites as "<tenant>/wd<n>/<site>".
    • Early-careers sites first: Lloyds, LSEG, MUFG, Visa, Rolls-Royce, FCA, abrdn.
    • Then whole careers sites: Citi, Barclays, NatWest, Capital One, Allstate, Thales, Shell, bp, Centrica and others.
    • Accenture's site refuses searches (429) and isn't listed.
  • _fetch_workday: boards are big and worldwide (Citi lists 2000+), so each is searched rather than read whole.
    • It searches with the collection's queries, taking the 40 best matches per query.
    • It reads in full only postings whose title matches and that may be in the searched locations, including ones listed as "2 Locations". At most 25 per board.
    • Every board's calls share one gate (4 at once). A 429 is waited out once, then the site is left for the next run.
  • collect_jobs passes its locations to the board fetchers for this.
  • check_board knows Workday: a one-posting search gives the total, and 404 means gone.
  • Full descriptions on demand (_ats_full_description):

Autopilot doesn't fill Workday forms (ATS_HOSTS unchanged). These jobs are applied to from the job page, which writes the CV and letter.

Tests

  • The search: only matching, possibly-local postings are read, each once, and the location string is built from the posting.
  • A refusing site: it's waited out once, then left.
  • check_board: gives the total, or None when the site is gone.
  • Full descriptions: from Workday and from Lever EU.
  • Test fakes of _search_level2_ats_apis take locations.
  • Fast suite: 1088 passed.
  • Live, one collection's pass:
    • 67 s;
    • 248 postings read, 166 in London/UK, 74 past the title filter, all with full descriptions;
    • 47 graduate roles: Lloyds' SE, Cyber and Data Science & AI schemes; LSEG Engineering; Visa Data Science; Rolls-Royce; Barclays 2027 programmes; NatWest Graduate Trainee – Engineering.
    • check_board 33 on Lloyds and None on a missing site; a Lloyds description fetched (6,251 chars).

After deploy

  1. Rebuild the API with docker compose up -d --build api.
  2. Press Refresh on the feed, or wait for the next collection.

34 graduate employers' careers sites run on Workday, which the collection didn't
fetch. A Workday site searches through a public JSON service (the one its own
pages call): POST .../wday/cxs/<tenant>/<site>/jobs lists postings, 20 a call
and without descriptions; GET ...<externalPath> is one posting.

- _WORKDAY_BOARDS: 31 sites ("<tenant>/wd<n>/<site>"), early-careers ones first
  (Lloyds, LSEG, MUFG, Visa, Rolls-Royce, FCA, abrdn) and whole careers sites
  (Citi, Barclays, NatWest, Capital One, Thales, Shell, bp…). Accenture's
  refuses searches (429) and isn't listed; a site an employer page misled the
  check into (Allstate's, for another firm) is listed once.
- _fetch_workday: boards are big and worldwide (Citi 2000+), so each is searched
  with the collection's queries (40 best matches each), and only postings whose
  title matches and that may be in the searched locations ("2 Locations" ones
  included) are read in full, 25 at most per board. Calls share one gate (4 at
  once); a 429 is waited out once, then the site is left for the next run.
- collect_jobs passes its locations to the board fetchers for this.
- check_board knows Workday (a one-posting search: its total; 404 = gone).
- Full descriptions on demand: Workday postings through the site's job service
  (only *.myworkdayjobs.com hosts are called), and Lever EU postings from the EU
  API (step 1's CoreTech Security came back empty from api.lever.co).

Live, one collection's pass: 67 s, 248 postings read, 166 in London/UK, 74 past
the title filter, all with full descriptions; 47 graduate roles (Lloyds' SE,
Cyber, Data Science & AI schemes; LSEG; Visa; Rolls-Royce; Barclays' 2027
programmes; NatWest Graduate Trainee - Engineering). Autopilot doesn't fill
Workday forms: these are applied to from the job page.
@coderback
coderback merged commit cfbdb0d into main Oct 20, 2026
3 of 4 checks passed
@coderback
coderback deleted the feat/workday-boards branch October 20, 2026 15:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant