0013 — V1 ingestion broadens beyond Greenhouse + Lever¶
Status: accepted (supersedes the scope limit in ADR-0005); the per-ATS feasibility notes
below are superseded in part by the 2026-07-28 survey at the end of this file —
docs/research/ats-feeds.md has the evidence.
ADR-0005 restricted V1 to Greenhouse and Lever because both expose public, keyless JSON
APIs and V1 needs no credentials. That reasoning constrains the mechanism, not the
count: the target job market spans many ATS, so V1 now ingests every ATS that offers a
public, keyless posting feed — one adapter per access method (per CLAUDE.md), unified into
the common RawPosting schema.
Added now — Ashby. GET api.ashbyhq.com/posting-api/job-board/{board_ref}?includeCompensation=true
is public and keyless and returns a single {"jobs": [...]} response with no pagination, so
its adapter mirrors Greenhouse/Lever exactly (one GET, map each item). Unlike Greenhouse,
Ashby's descriptionHtml is already real HTML, so it is passed through, not unescaped.
Tentative V2, in feasibility order (from live API research).
⚠️ Two of the three claims in this block were wrong — kept as written because an ADR is a record of what was decided and why, not a wiki page. Read the 2026-07-28 update below before acting on any of it.
V1.5 broadened ingestion to Ashby and is complete; the remaining adapters below are deferred to V2 (tentative) rather than built now — they are heavier and, for Workday, cannot be schema-verified without live POST calls:
- BambooHR — public
{company}.bamboohr.com/careers/listplus a per-id/careers/{id}/detail. Two-step and undocumented; the internal shape shifts between releases, so it needs a fragility guard and a committed fixture. - Workday —
POST {tenant}.{wdN}.myworkdayjobs.com/wday/cxs/{tenant}/{site}/jobs, offset pagination (limit≤ 20,totalreturned) plus a per-job detail call;board_refcarriestenant/wdN/site. It cannot use today's single-GETget_json, so it depends on a generalized adapter/HTTP contract (POST + pagination + detail) built alongside it.
Update 2026-07-28 — surveyed with live probes; see docs/research/ats-feeds.md. Applying
this ADR's own bar (public + keyless) to all ~25 inventory ATS found seven that qualify today
and are single-GET/JSON, i.e. the Greenhouse/Lever/Ashby shape rather than the heavier contract
above: BambooHR, Workable, Recruitee, BreezyHR, Pinpoint, SmartRecruiters, Rippling — roughly
48 companies currently sitting inactive. BambooHR in particular needs only careers/list
({meta, result[]}), not the two-step detail call assumed here. That makes them V1 work by this
ADR's existing rule, not V2. Workday's endpoint was confirmed live (422, not 404) but keeps its
deferred status: it still needs the multi-segment ref captured for all 28 rows first.
Definitively not keyless, so inventory-only stands: SuccessFactors (401), Teamtailor
(per-company API key), iCIMS, JazzHR, Dayforce, ADP, Phenom.
Deferred — iCIMS. There is no clean public, keyless API: the Job Portal API needs
customer context, the standard feed requires OAuth2, and public career sites are scrape-only
and shape-sensitive. Ingesting it would either break the "no credentials in V1" boundary
(ADR-0007) or take on brittle scraping, so iCIMS stays inventory-only (active=false) until
we deliberately accept one of those costs. Custom career pages are later still.
The secrets boundary (ADR-0007) is unchanged: only sources with public, keyless feeds are switched on; anything requiring auth stays off.
May be subsumed by an aggregated source. ADR-0017 evaluates adopting openjobdata (a free, daily, ~47-ATS Parquet dataset) as a hybrid source. If its Ottawa coverage verifies, it could supply Workday/BambooHR (and more) without building these adapters — reframing the adapters here as the niche fallback for local ATS the aggregate misses, rather than the main roadmap. Until that verifies, the tentative adapters above stand.