1A ghost job is a posting, not a scam
A ghost job is a live posting with no current hiring intent. It is rarely fraud and almost never illegal. It is usually just entropy: a role filled internally while the external listing stayed up, a req frozen mid-process when the budget review landed, an evergreen posting a recruiter keeps warm for a role the company hires four times a year, or a scrape that outlived the original.
That is what makes them hard. A ghost posting and a live one look identical on the page you apply from. The difference is not in the words, it is in the metadata: how old the listing is, whether it exists on the company's own careers site, whether it has been reposted, whether anyone attached a salary to it.
None of those are subjective. All of them are checkable. What follows is the actual model we run on every posting in the pipeline, with the real point values, so you can run it by hand on a listing we have never seen.
2The model, with the real numbers
Ghost probability is additive, not a classifier. Each signal contributes a fixed number of points, the points sum, and the total is capped at 95%. There is no 100% because the only way to be certain a posting is dead is for a human at the company to say so.
Posting age dominates the model on purpose. It is the single most predictive input and the only one visible on every listing regardless of source. A posting past 90 days carries half the ghost score on its own.
One signal subtracts. If the role is verified live on the company's own careers page, the score drops 15 points, because a company maintaining its own ATS listing is the strongest evidence that somebody still owns the req.
What each signal contributes to ghost probability
Additive points from lib/jobs/ghost-probability.ts, capped at 95
The heaviest single signal. Real reqs close or get reposted long before this.
Decision windows at most companies are 6-10 weeks from posting.
Checked asynchronously. A board listing with no ATS counterpart is a scrape or a corpse.
We saw this posting under an earlier date. Word-for-word reposts are pipeline-building.
Aging, not yet damning. Worth a quick apply rather than an evening.
Scaled by detection confidence, so a 30% match adds 6 points and a certain one adds 20.
Budget approval requires a number. A posting without one may never have had budget.
Skipped for sources that only return snippets, so the source is not punished for the job.
Only meaningful alongside age. A week-old posting with 400 applicants is just popular.
The only counter-signal in the model. Someone still owns this req.
Three mid-weight signals put a posting near 50%. Age past 90 days plus a failed careers-page check reaches 80% on its own.
3How to run the same check by hand
Every input above is something you can verify yourself in about a minute. The order matters: the first two checks resolve most postings, and the rest only matter if the first two come back clean.
Signal, where to look, what a fail means
Run top to bottom and stop when the posting is clearly dead
| Where to check it | What counts as a fail | |
|---|---|---|
| Posting ageHighest weight | Under the title on LinkedIn. Buried in the listing footer on Indeed. | Past 30 days is aging, past 60 is bad, past 90 is usually terminal. |
| Careers pageStrongest confirmation | The company's own site, in their Greenhouse, Lever, or Workday listing. | Absent from their ATS while live on a board. Apply through the ATS or not at all. |
| Repost historyLook for word-for-word | Click through on LinkedIn for the reposted date. | Three or more identical reposts in 90 days. Changed title or comp is fine. |
| Salary disclosureJurisdiction matters | The listing body. Check the posting's target state. | Missing on a role targeting CO, NY, CA, or WA, where disclosure is required. |
| Description depthWord count is a proxy | The requirements section, read properly rather than skimmed. | Under 100 words, or 400 words that never name a tool, a team, or a deliverable. |
| Who posted itEmployer or intermediary | The company field, and whether the apply link leaves for a third-party domain. | A staffing firm standing in for an unnamed client. You cannot verify a req you cannot name. |
The careers-page check resolves more postings than the other five combined. Do it first if you only do one.
4The eight signals in detail
Ghost job detection, signal by signal
Posting age over 45 days
- Real openings at companies actively hiring see candidate flow within two to four weeks and reach a decision within six to ten. A listing up 60+ days without a repost is either filled, frozen, or fishing.
- Check the original posting date, not the refreshed date. LinkedIn and Indeed both surface reposted listings as recent, which is exactly the signal you are trying to catch.
Not on the company careers page
- This is the strongest single check you can run, worth 30 points against a posting and 15 in its favor when it passes. Most real employers run their own ATS and route applications through it.
- If the role is live on a board and absent from the company's own site, it is a scrape artifact or a role that closed without the board noticing. Apply through the ATS or skip it.
No salary listed
- Getting a req approved means someone approved a number. A posting with no range is more likely exploratory, stale, or pre-budget than one that states a band.
- In Colorado, New York, California, and Washington, disclosure is required. Absence on a role targeting those states is a compliance signal on top of a ghost signal.
Thin description, under 100 words
- A real opening usually means a hiring manager wrote or approved the description, which produces a document with actual requirements in it. Eighty words with no specifics is a placeholder.
- The pipeline skips this signal for sources that only ever return truncated snippets. A short Adzuna description says nothing about the posting, so charging it ghost points would penalize the source rather than the job.
Vague requirements with no specifics
- Five-plus years in a fast-paced environment, with no tools, no deliverables, and no team named, describes nothing. Real descriptions reflect real work, and real work has specifics.
- This is separate from word count. A 600-word description can still be vague, and the JD complexity check deducts fit points for it independently of ghost probability.
Reposted three or more times
- A repost with real changes, a new title, an updated band, revised requirements, is a company iterating on a role it wants to fill. A word-for-word repost is a company keeping a net in the water.
- The pipeline flags this when it sees the same posting resurface under a later date than the one it first recorded.
High applicant count on an old posting
- Five hundred applicants on a 90-day-old listing means the role either filled long ago or was never going to close. The count alone proves nothing.
- A week-old posting with 400 applicants is a popular job, not a ghost. This signal only earns its 10 points in combination with age.
The recruiter cannot confirm the status
- A recruiter actively working a req knows its status immediately. I will check on that role and get back to you is an answer about a role nobody is working.
- This is the one signal the pipeline cannot run for you. It is also the most definitive, and a short LinkedIn note costs you two minutes.
Each signal below is one of the model inputs, with what it is actually detecting and how to read it when it fires alone.
5What the probability should change about your behavior
A ghost flag is not a block. High-probability postings still appear in your dashboard, because a 70% ghost probability still leaves a real 30%, and sometimes that posting is the one you actually want.
What changes is the size of the bet. The point of the number is to stop you making a 45-minute decision with 5 seconds of information, not to make the decision for you.
Same job title, two very different postings
What the model sees, and what it should cost you
82% ghost probability
Posted 94 days ago, absent from the careers page
- Posted 94 days ago+50
- Not found on the company ATS+30
- No salary range listed+10
- 600+ applicants+10
- Reasonable effort
Five minutes, generic resume, no cover letter. Or skip it.
Capped at 95, so even this is not a certainty. It is a bad bet, not an impossible one.
5% ghost probability
Posted 9 days ago, verified live on the ATS
- Posted 9 days ago+0
- Verified on the company careers page-15
- Salary band published+0
- 850-word description naming the team and stack+0
- Reasonable effort
Full tailoring, today, before it ages past two weeks.
Ghost probability floors at 0. This is as clean as a posting gets.
Both postings can carry the same fit score. Fit tells you whether you would be a good hire; ghost probability tells you whether anyone is hiring.
Ghost probability runs on every posting in your dashboard, alongside the fit score.
Check a Job FreeWritten by
Jesse Johnson
Founder, ShouldApply
Founder of ShouldApply. I write about job search strategy, hiring, and how to spend your time on opportunities that actually fit. Full bio →
Keep Reading
Frequently Asked Questions
Enterprise companies (10,000+ employees) show higher ghost job rates because their ATS pipelines are often maintained by large HR operations teams that don't always close postings promptly. Startups under 50 people show lower ghost rates — they post when they have genuine budget and pull down postings when they fill. Mid-market companies are variable.
Yes, but it requires navigating to the right person. The most direct approach: find the recruiter on LinkedIn, connect, and send a brief note asking whether the role is actively being filled. A recruiter working an active opening will confirm. Silence or vague answers are themselves signals.
Nothing actionable. If you applied and received no response after 4 weeks, it's likely a ghost. Archive it in your tracker and redirect your energy. Ghost jobs don't become real because you follow up repeatedly.
Yes. Job boards scrape and republish company postings, often without removing them when the role is filled or cancelled. Company careers pages (maintained in their own ATS) are more current. Apply through company career pages whenever possible — it also routes your application to the correct system rather than a board-level ATS layer.
Related Posts
ShouldApply Outcome Data
What tracked applications actually returned, broken out by score band, with the raw counts published.
Score jobs and check ghost probability
Ghost probability flag on every posting — see it before you apply.
Stop applying blind: build a scoring habit
How to build a pre-application screening routine.
Free ATS checkers compared
What free tools check vs. what ghost probability adds.
Should I apply? How to score any job
The complete pre-application checklist including ghost detection.
Check the ghost signal before you apply.
Ghost probability runs automatically on every job in your dashboard. Stop spending time on postings that were never going to call back.
Check Ghost Probability