Blog
How the dataset is built, how to query it honestly, and what shipped. Written by the people building it.
Why every job carries its company
Most jobs APIs hand you an employer name and leave you to resolve it. Here is what changes when the company object is already attached.
6 min read
Read the postThe HyperJobs API is live
A read-only jobs API with the hiring company attached to every posting. What shipped, who it is for, and where the rough edges are.
6 min read
Reading salary data honestly
What the salary fields mean, why coverage is partial by construction, and what salary_gte's range-overlap semantics do and don't promise.
8 min read
How to measure remote hiring share
The query that answers it, and the ways it still lies to you: two remote fields, sparse classifiers, provenance mix, and the archive tail.
7 min read
The same role posted twice is one job
A role mirrored to Greenhouse and LinkedIn is one posting, not two. What deduplication has to decide, and what the API lets you see.
7 min read
This API tells you when you're wrong
A bad parameter is a 400 that names it, never a silent drop. Why strict validation is the kindest thing an API can do with your quota.
8 min read
The comma means OR, except for skill
taxonomies=Software,Healthcare is a union now. Why v1 made the comma OR on every multi-value filter but one — and why skill still intersects.
8 min read
Ask how many jobs there are and you get one answer
health, meta, and an unfiltered search used to report three different counts. Now they report one — here's what each number still means.
6 min read
The skill you were shown is not the skill you filter on
Skills go out display-formatted and come in as canonical tokens. Why ?skill=Machine Learning returns zero rows, and the heuristic that isn't an inverse.
8 min read
Every /v1/jobs query is a full scan
Text search got an index. Every other filter still scans — so narrowing returns faster without running faster. Which knobs are connected to anything.
8 min read
Nobody tells us a job is closed
Nobody tells us a job is closed — we notice it is gone from the board. Expiry is a diff, and everything odd about expires_at follows.
9 min read
The JSON string that never shipped
employment_type almost went live as JSON text inside JSON. The post explaining why we couldn't fix it is what convinced us to fix it.
6 min read
Your key crosses the wire exactly once
We store a SHA-256 hash of your API key and nothing else. What that buys, what it costs, and the CORS trap that breaks browser auth.
8 min read
Your sample is not random
This API sorts newest-first and never randomly. What a limit=200 page actually measures, and why /v1/companies can only ever show you 200.
8 min read