If you build anything on Ashby's public job board API, there is one field that
will quietly ruin your filter.
isRemote is a boolean. It is not the boolean you think.
I pulled every posting from ten real Ashby boards on 2026-08-02, 1,668 in
total, and counted:
| postings | share | |
|---|---|---|
isRemote: true |
1,072 | 64% |
workplaceType: "Remote" |
295 | 18% |
Filter on the boolean and you get three and a half times as many roles as are
actually remote.
It is not noise, it is a definition
Cross-tabulating the two fields across nine of those boards, 1,637 postings,
leaves no ambiguity at all:
workplaceType isRemote postings
Hybrid true 776
Remote true 295
OnSite false 271
(absent) false 295
Zero exceptions in 1,637 rows. isRemote is exactly
workplaceType != "OnSite", with an absent type counting as on-site.
So the field is honest about what it computes and misleading about what it is
called. It means not fully on-site. Hybrid roles, 47% of everything I
pulled, all carry it.
The per-company spread is the part that bites
An average of 3.6x would be survivable. The variance is not:
| board | postings |
isRemote true |
actually Remote | overstated |
|---|---|---|---|---|
| openai | 754 | 485 | 32 | 15.2x |
| replit | 88 | 88 | 6 | 14.7x |
| ramp | 126 | 117 | 16 | 7.3x |
| notion | 109 | 74 | 0 | everything |
| cohere | 142 | 131 | 100 | 1.3x |
| vanta | 100 | 90 | 63 | 1.4x |
| cursor | 120 | 47 | 41 | 1.1x |
| sierra | 175 | 16 | 15 | 1.1x |
| linear | 23 | 23 | 22 | 1.0x |
Linear is honest by accident: nearly all its roles genuinely are remote, so the
two fields agree. Notion is the opposite extreme. It has zero roles marked
Remote and 74 postings flagged isRemote: true, because Notion is a hybrid
company and every hybrid role trips the flag.
Which means any sanity check you run on one company can pass and tell you
nothing. Test on Linear and the field looks perfect. Test on Notion and every
result is wrong.
Three states, not two
The real fix is not a better boolean, it is admitting that this is not a
boolean question. workplaceType has three values, and the third one is the
one people actually argue about:
Remote 295
Hybrid 776
OnSite 271
Collapsing that into yes-or-no has to lie in one direction or the other.
Ashby's boolean lies toward remote; a boolean built the other way would tell
776 people a hybrid role is on-site, which is equally wrong and would just
annoy a different group.
If you are normalising job data across sources, carry all three. A row that
says Hybrid is more useful than a row that says true, and it is the only
version you can aggregate honestly.
The 295 with nothing set
There is a fourth group worth knowing about: 295 postings, 18% of that
cross-tab, carry no workplaceType at all. They all come back isRemote: false.
That is a company that never filled the field, being reported as not remote. It
might be. Nobody said so. If you are ranking or filtering, treat an absent
workplace type as unknown rather than as a no, because the API has already made
that judgement for you and it had nothing to go on.
Getting the field at all
One more trap, unrelated but in the same request. Ashby omits compensation
entirely unless you ask:
GET /posting-api/job-board/ramp no compensation key
GET /posting-api/job-board/ramp?includeCompensation=true "$211.4K - $290.6K"
I had that parameter wired to a description flag in my own client for a while,
which meant every run that did not ask for descriptions silently dropped
salary. Worth reading a response you are sure you already understand.
What I would actually do
def workplace(posting):
"""Three states, and unknown is not a no."""
wt = posting.get("workplaceType")
if wt in ("Remote", "Hybrid", "OnSite"):
return wt
return "Unknown" # NOT False, and not isRemote
Four lines, and it is right on all 1,668.
None of this is Ashby's fault exactly. isRemote is doing what it says in the
code that produced it. It is just that the name promises an answer to a
question the data cannot answer, and a boolean will always find someone willing
to believe it.
Every number here is from the public job board API, no key, and reproducible:
api.ashbyhq.com/posting-api/job-board/<board>?includeCompensation=true. I
maintain a set of ATS scrapers that normalise
this across nine systems, which is how I ran into it.
Top comments (0)