Build1 distinct publisher2 min readPublished
Three of the four public ATS endpoints wrap their list in a jobs key, so the parser passes its first test and then reports an empty array whether the vendor is wrong, the board is empty or the upstream threw a 502.
The Engineer · Build desk
![Illustration accompanying Lever's bare array makes the naive jobs[] parser return zero roles forever](/_next/image?url=https%3A%2F%2Fmedia.theclarity.today%2Fnews%2Fheroes%2F2026-08-28%2Fbuild%2Flever-s-bare-array-makes-the-naive-jobs-parser-return-zero-roles-forever-1859824271-59122a2c4b21a6ce.png&w=3840&q=75)
Compiled by The EngineerSomething wrong?How this is made
The one-liner ships because it is right three times out of four. Greenhouse, Ashby and the Workable widget all wrap their list in a `jobs` key, and Lever hands back a bare array [10]. Test `data.jobs ?? []` against whichever vendor your first customer runs and you have a three-in-four chance of never meeting the defect [13][1]. Against a Lever board the same expression returns an empty list on every request, permanently, because the response has no `jobs` key to read [14].
That empty array has four preimages [14]. The company is not on that ATS. The board is real and has no open roles today. The endpoint is returning 502. Or the board is Lever. A 404 is overloaded in the same direction: it reports a wrong vendor guess or a wrong slug guess, not a company that stopped posting [16].
The remedy in the post is a discriminated result instead of a list, described as four outcomes [17]. The snippet actually emits five distinct state strings, because `not-json` is broken out for a 200 that carries an HTML error page [19][2]. Keep the fifth one. `res.ok` is true in that case, so a status check will not catch it. The fetch is wrapped in `AbortSignal.timeout(20000)` [18], twenty seconds [3], and the catch branch returns `fetch-failed` with the exception message [17].
The slug layer is where the sillier failure lives. `notion` on Ashby returns 200 with 134 jobs, the first titled "Software Engineer, Developer Platform" [21]. `notion` on the Workable widget also returns 200, with `name` set to Notion, zero jobs, and a description for a luxury lifestyle agency in Shoreditch [22]. Stop at the first 200 and you have traded 134 live rows for 0 [5]. The author checked the obvious counter-explanation: `zzqqxxnotarealcompany` 404s on both Workable and Greenhouse, so those 200s are real registrations rather than a catch-all [25]. A single-letter Workable slug returns 200 with `name: "a"` [24], which is about what that namespace is worth as evidence.
The counts are someone else's boards on a single day, and the author notes they move daily, so yours will differ [28]. Nothing in the parsing argument rests on them. What transfers is the container shape, since that is a contract rather than a measurement, and the shape is what the copied snippet gets wrong.
Ranked by verification strength, evidence, and original report placement.
The post says there is a second trap in the other direction involving investor portfolio pages, accelerator sites and job aggregators that link to boards; the available text cuts off mid-sentence.
Most companies running Greenhouse, Lever, Ashby or Workable publish their open roles on a public JSON endpoint requiring no API key, no OAuth and no browser.
The author states every count in the post came back from a live request made while writing, with figures measured on 2026-08-28.
The author warns that job counts move daily, so a reader's numbers will differ.
GET https://boards-api.greenhouse.io/v1/boards/stripe/jobs returned 200 with a jobs[] of 578 entries.
GET https://boards-api.greenhouse.io/v1/boards/monzo/jobs returned 200 with a jobs[] of 66 entries.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 28, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Four of six steps can bin a resume before a human sees it, and the worst is an image-only PDF1 distinct publisher
build
A 200 OK that means zero: Workday's job API empties out above limit 201 distinct publisher
build
The field is there, the data is not: 1.55M postings on measuring ATS APIs before trusting them1 distinct publisher
leadership
Engineering leaders are quitting with nothing lined up. Read it as a repricing, not a burnout wave1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Self-checkable, self-measured
Every figure traces to one person's terminal on 28 August 2026, with no second party re-running a single call. What rescues it is the shape of the claims: a reader can reproduce the six curl commands in a minute, and the load that matters — Lever's bare array, text instead of title, the notion slug answering on two vendors — is contract behaviour that does not decay like a headcount does. The weakest link is the one the author volunteers: the Workable path is an undocumented widget endpoint that can move without notice.
Boards live, discipline unproven
What is demonstrably in production is the plumbing, not the prescription. Stripe answering with 578 roles, Notion's 134 on Ashby and Match Group's 71 on Lever show these feeds carry real hiring at scale. The four-state contract that the piece argues for has exactly one shipped implementation named anywhere in this reporting, and it belongs to the author.
Headline mostly earns it
'One dangerous bug' is doing a little marketing, yet the mechanism survives inspection: data.jobs ?? [] genuinely cannot tell a Lever board from a 502 from an empty board, and the notion collision is the sort of error that ends up in a client deck with a straight face. Two things tip it slightly overstated — the remedy code emits five states where the prose sells four, and a one-afternoon snapshot is presented with the authority of measurement.
The fix is also the product
The closing section names two Apify actors — an ATS Jobs Scraper API and an ATS Finder — that do precisely what the preceding argument says you must do: normalise four vendors into one row shape and return typed failures instead of silent empties. That does not make the bug imaginary, but the problem statement and the product boundary were drawn by the same hand, and nothing in the piece touches cost, rate limits, or whether hitting Workable's widget endpoint at volume is sanctioned.
Firm on shapes, soft on numbers
Split the story and confidence splits with it. The structural findings are near-certain and testable on demand. The counts are point-in-time and effectively expired. The attribution section is the strongest work here, because the author supplies his own control: a nonsense slug 404s on both vendors, so the single-letter 'a' returning 200 is a real registration rather than a catch-all — reasoning that holds up without anyone taking his word for it.