NewSearch millions of jobs from your AI agent with MCP
All posts
GuideOpening
Guide·Sep 9, 2026·8 min read

What are ghost jobs? Definition, meaning and how to tell one from a real opening

A ghost job is a posting that stays visible after the employer has stopped hiring for it, or was never meant to fill a seat. The definition matters less than the four things you can measure: how long it has been open, whether it keeps reappearing, whether it ever closes, and how thin the description is. Here is what those signals look like across ten job boards and how to filter on them.

Dvir Atias

Dvir Atias

Founder, JobsPipe

“Ghost job” has become the catch-all for every posting that wastes an applicant’s afternoon. That makes it a bad word to argue about and a good thing to measure. This post gives the definition, then replaces the argument with four signals you can read off a posting record, and shows how often each one shows up across the ten job boards JobsPipe collects.

What is a ghost job?

A ghost job is a job posting that stays publicly visible after the employer has stopped hiring for it, or that was never intended to fill a specific seat. The role may have been filled, frozen, or cancelled, or it may be an evergreen requisition collecting resumes. The listing looks live. Applying to it goes nowhere.

That definition hides three different situations, and they matter because they leave different fingerprints. A filled or cancelled role that nobody took down ages quietly: it gets old, it never closes, and its posted date stops meaning anything. An evergreen requisition is refreshed on purpose, so it reappears again and again with the same title and the same text. A placeholder posted to look busy, hold a budget line, or feed a pipeline is usually thin, because nobody wrote it for a real hiring manager.

None of these is the same thing as being ghosted by a recruiter after an interview. That is a communication failure on a real process. A ghost job is a listing failure: the process behind the posting is not there.

Ghost jobs meaning: the four measurable signs

You cannot see intent from the outside, but you can see behaviour. JobsPipe records every sighting of a posting on its board on a schedule, keeps the first and last time it was seen, and re-checks whether it is still open. From that log, four signs separate a ghost-like posting from a live one.

1. Age

Real openings close. A posting first sighted more than 45 days ago and still open is past the point where most roles on most boards have been filled or pulled. Past 90 days the signal is stronger still. Age is the heaviest single input to the ghost score.

2. Reposts

A listing sighted three or more times with a gap of ten days or more between sightings has been taken down and put back up, or refreshed so that it surfaces as new. One repost is normal housekeeping. A pattern of them is the evergreen fingerprint.

3. No close

Every posting JobsPipe tracks carries a status of active or closed, and a closed posting says why: the source said so, the page disappeared, or it went unseen for long enough to count as gone. A posting that never transitions while its neighbours from the same week all do is the one to be suspicious of.

4. Thin description

A description under 400 characters was not written for a hiring manager. It is the placeholder signal, and although it is rare it is close to diagnostic when it appears with age or reposts.

Three supporting signals sit alongside those four. A missing salary counts a little, because an employer who has budgeted a seat usually knows the range. A company with 500 or more open roles at once counts more, because mass posters are where evergreen requisitions live. And a posted date that drifts 30 days or more from when the listing was actually sighted means the board or the employer is re-dating it.

  • No posted salary66.9%
  • Mass poster: company has 500+ open roles19.2%
  • Reposted: 3+ sightings with a gap of 10+ days7.3%
  • Stale posted date: drifts 30+ days from the sighting5.8%
  • Open 45 days or more1.4%
  • Thin description: under 400 characters1.3%
Share of scored active postings carrying each signal, all ten boards. A posting can carry several signals, so the shares do not sum to 100%. Scoring run dated 2026-08-29.

Read that chart with the weights in mind. A missing salary is by far the most common signal and the least damning one on its own. The signals that actually move a posting into the suspicious range are age, reposts and mass posting, and those are far rarer.

How common are ghost jobs?

Across the ten boards JobsPipe scores, about 17.8% of scored active postings carry a ghost score of 25 or higher, which means they show at least one strong signal plus a supporting one. Only 1.3% score 50 or higher. Roughly 1 in 6 postings deserves a second look; most do not.

17.8%
Score 25 or higher
at least one strong signal
1.3%
Score 50 or higher
several signals stacked
28.6%
Open more than 30 days
by first sighting
8.0%
Reposted
3+ sightings, 10+ day gap

Age needs one reading note. The sighting log that dates these postings starts on 2026-07-23 for most of the applicant tracking system boards, so the 30-day share is the mature age figure, and the 45-day threshold the score uses is only fully observable on LinkedIn, Indeed and Y Combinator, whose logs run longer. Being more than 30 days old is common and not by itself suspicious; it is the combination with a repost or a mass poster that moves a posting up the score.

The headline hides a wide spread between boards. Boards dominated by large employers and long-running requisitions carry several times the overall share, while boards whose free listings expire on a timer carry a fraction of it. The full by-board table, with the share open more than 45 days and the share reposted on each board, is on the ghost jobs data page, alongside a checker that runs these signals on a single job URL.

Two honest caveats. The score is a likelihood, not a verdict: a company with hundreds of genuinely open roles trips the mass poster signal without a single ghost among them. And the denominator is scored active postings, which excludes listings seen only once and younger than two weeks, because a single sighting is not evidence of anything.

Ghost jobs explained for developers

If you are building a job board, a sourcing tool or an agent that recommends roles, ghost jobs are a data quality problem, and the fix is two filters on POST /v1/jobs/search. status takes active (the default), closed or any. max_ghost_score drops every posting whose score exceeds the value you pass; unscored postings always pass, because the filter removes known-likely ghosts rather than demanding proof of life.

curl -X POST https://api.jobspipe.dev/v1/jobs/search \
  -H "Authorization: Bearer $JOBSPIPE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "job_title_or": ["data engineer"], "status": "active", "max_ghost_score": 24, "limit": 25 }'

Each record carries the lifecycle fields the four signals are computed from, so you can apply your own thresholds instead of ours.

{
  "id": "...",
  "job_title": "Data Engineer",
  "date_posted": "2026-08-30",
  "discovered_at": "2026-08-31 04:12:09",
  "last_seen_at": "2026-09-08 02:10:41",
  "verified_at": "2026-09-08 02:10:41",
  "status": "active",
  "closed_at": null,
  "closed_reason": null,
  "ghost_score": 5,
  "min_annual_salary_usd": 140000,
  "max_annual_salary_usd": 175000
}

discovered_at is when JobsPipe first saw the posting, last_seen_at is the last time a recheck confirmed it live, verified_at is the last time it was checked at all, and closed_at and closed_reason fill in when it goes. ghost_score is null until the posting has been seen twice or is older than 14 days. To exclude old postings outright rather than by score, add posted_at_max_age_days; to require a salary, add min_salary_usd. The same filters work in the JobsPipe MCP server and against the no-key sandbox at POST https://api.jobspipe.dev/v1/sandbox/jobs/search.

For the reasoning behind each board’s share, read why companies post ghost jobs. For the hand-run version of the checks, see how to spot ghost jobs.

Filter ghost-like postings out with max_ghost_score and status. Free tier included.

Get a free API key
FAQs

Frequently Asked Questions

What is a ghost job?

A ghost job is a job posting that stays publicly visible after the employer has stopped hiring for it, or that was never intended to fill a specific seat. The role may have been filled, frozen or cancelled, or it may be an evergreen requisition collecting resumes. The listing looks live, but applying to it goes nowhere.

What does ghost job mean, and is it the same as being ghosted?

No. Being ghosted means a recruiter stopped replying during a real process. A ghost job means the listing itself has no live process behind it. The first is a communication failure; the second is a listing failure, and it can be measured from the posting's history.

Are ghost jobs real?

Yes, but less common than the discourse suggests. Across the ten boards JobsPipe scores, 17.8% of scored active postings carry a ghost score of 25 or higher, meaning at least one strong signal plus a supporting one, and 1.3% score 50 or higher. Most postings behave like normal openings.

What are the signs of a ghost job?

Four measurable signs: the posting is old (first sighted 45 or 90 days ago or more), it has been reposted (three or more sightings with a gap of ten days or more), it never closes while similar roles do, and its description is thin (under 400 characters). Supporting signs are a missing salary, an employer with 500 or more open roles, and a posted date that drifts 30 days or more from when the listing was first seen.

Does a missing salary mean a job is a ghost job?

No. A missing salary is the most common signal and the weakest one: 66.9% of scored postings have no posted range. It matters only when it stacks with age, reposts or mass posting.

How does JobsPipe compute the ghost score?

Every active posting with at least two sightings or more than 14 days of tenure is scored daily on a 0-100 scale from its sighting log and content. Age is the heaviest input, followed by reposts and mass posting, then thin description and stale posted date, with a missing salary counting least. The score is a likelihood, not a verdict, and the reasons behind it are visible on the record's history.

How do I filter ghost jobs out with the JobsPipe API?

Add max_ghost_score to a POST /v1/jobs/search request, for example max_ghost_score: 24 to keep only the cleanest band, and keep status set to active. Unscored postings always pass the filter. Add posted_at_max_age_days to exclude old postings outright and min_salary_usd to require a posted salary.