How we know
Full transparency. No secret sauce. Just public data, normalized titles, and a scoring engine that does not care about your employer brand.
Data sources
| Platform | Endpoint | Auth |
|---|---|---|
| Greenhouse | https://boards-api.greenhouse.io/v1/boards/{slug}/jobs?content=true | None — public job board API |
| Lever | https://api.lever.co/v0/postings/{slug}?mode=json | None — public JSON feed |
| Ashby | https://api.ashbyhq.com/posting-api/job-board/{slug} | None — public job board API |
| Workday | https://{tenant}.{dc}.myworkdayjobs.com/wday/cxs/{tenant}/{site}/jobs | None — public per-tenant career site API |
| Workable | https://apply.workable.com/api/v2/accounts/{slug}/jobs | None — public career site API |
| Rippling | https://ats.rippling.com/api/v2/board/{slug}/jobs | None — public job board API |
| Guest search (enrichment only) | No official API — n8n matches flagged ghosts via public guest URLs |
Ingest schedule
- n8n (Hostinger) — primary scheduler. Pulls ATS feeds every 6 hours, reclassifies nightly, LinkedIn match weekly for ghost-class streams.
- Vercel Pro — serves the site and exposes
/api/ingestfor n8n to POST batches. - Supabase Pro — stores companies, requisition streams, job postings, LinkedIn matches, and ingestion audit logs.
Classification
- Ghost — 3+ job ID rotations for the same normalized title over 90+ cumulative days.
- Suspected ghost — 2 rotations, or 60+ days with suspicious patterns.
- Stale — single ID open 60+ days.
- Evergreen — talent-pool language or department (not the same as ghost).
- Fresh — within normal window.
Title normalization strips remote tags, locations, and punctuation before matching streams. Description hashing catches copy-paste re-posts with renamed titles.
Correction: we undercounted 335 Workday employers
Between 29 June 2026 and 10 August 2026, our reader for Workday-hosted career sites stopped after the first 40 openings on every board and treated that as the whole board. Employers with hundreds of open roles were shown here with 40.
The second effect was worse than the first. Because the short read looked complete, every opening we could no longer see was recorded as closed — as though the employer had filled it. We have identified 28,246 closures across 311 employers that were caused by our bug rather than by anything those employers did.
The error ran in employers’ favour, not against them. A fabricated closure looks like a role that got filled quickly, so the scoring engine read it as good hiring behaviour. On 10 August we removed that false evidence: 2,345job streams lost a “each instance filled quickly” note they had never earned. Nobody was called a ghost-poster because of this bug. Several were let off the hook by it.
The affected closures are now marked in our database as unobserved, and the scoring engine ignores them instead of counting them as evidence about the employer. We are re-reading the affected boards in small batches so the change can be checked as it lands, rather than switching 335 employers over in one night.
What you will see change.An affected employer’s open-role count may jump sharply — from 40 to several hundred — and some of those newly visible roles carry stale or ghost badges. Those postings were open the whole time and are dated from the employer’s own ATS timestamps; we simply could not see past the first page. The badge is new. The posting is not.
One earlier note in our own records blamed this 40-role ceiling on rate limiting from our servers. That was wrong, and it kept the real cause hidden for six weeks.
What we never claim
We do not say a company is "lying." We report objective signals: posting age, ID rotation count, ATS timestamps, and optional LinkedIn cross-matches. You decide if HR is playing games.