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

How to spot ghost jobs: a seven-point checklist mapped to real data fields

Every ghost job check you can run by hand corresponds to a field on the posting record: age, reposts, close status, description length, salary, the employer's open-role count and posted-date drift. Run the checklist on one listing with the checker, or run it on thousands with three API filters.

Dvir Atias

Dvir Atias

Founder, JobsPipe

Spotting a ghost job by hand means asking seven questions of the listing. Each one maps to a field JobsPipe stores on the posting record, which means you can run the checklist on one job with a URL or on a hundred thousand with a query. This post gives the checklist, the honest answer to whether ghost jobs are real, how to avoid them, and the API version of every check.

How to spot ghost jobs: the seven checks

Spot a ghost job by checking its age, whether it has been reposted, whether it ever closes, how thin the description is, whether it names a salary, how many roles the employer has open at once, and whether its posted date keeps moving. No single check is conclusive. Two or three together are.

1. How old is it really?

The date on the board is what the board says. The date that matters is when the posting was first seen anywhere. On a JobsPipe record that is discovered_at, and the ghost score treats 45 days as the first threshold and 90 days as the second. If you only have the listing, search the exact title and company and look at the earliest copy you can find.

2. Has it been reposted?

A posting that vanishes and returns is being refreshed. JobsPipe counts a repost when a posting has three or more sightings with a gap of ten days or more between them. By hand, the tell is a “posted 2 days ago” listing whose text you have read before.

3. Does it ever close?

status is active or closed, and a closed posting carries closed_at and a closed_reason: the source said so, the page went away, or it went unseen long enough to count as gone. last_seen_at is the last time a recheck confirmed it live. A listing that is always active while similar roles from the same employer close is the one to question.

4. Is the description thin?

Under 400 characters is the ghost score’s threshold. A real hiring manager writes requirements, a team, a location and something about the work. A placeholder has a title and a paragraph of boilerplate.

5. Is there a salary?

min_annual_salary_usd and max_annual_salary_usd are null on most postings, so this is a weak signal on its own: 66.9% of scored postings lack a salary. It matters when it stacks with the others, and in pay transparency states a missing range is itself a warning.

6. How many roles does the employer have open?

A company with 500 or more open roles is a mass poster, and mass posters are where evergreen requisitions live. 19.2% of scored postings belong to one. By hand, open the employer’s careers page and count; through the API, search company_name_or for the employer and look at how many active postings come back and how old they are.

7. Does the posted date keep moving?

Compare date_posted with discovered_at. A posting whose claimed date is 30 or more days later than when it was first sighted has been re-dated, which is the stale posted date signal. By hand, this is the same job showing “new” on three consecutive visits.

Are ghost jobs real?

Yes, and they are less common than the discourse suggests. Across ten boards, 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. Roughly 1 in 6 listings deserves scrutiny. The rest behave like normal openings: they are posted, they are seen for a few weeks, and they close.

The share varies enormously by board, from a few percent on boards that expire free listings on a timer to most postings on applicant tracking systems dominated by mass posters. That spread is the most useful thing to know, and it is laid out in ghost jobs by job board.

How to avoid ghost jobs

Avoid ghost jobs by preferring recent postings, preferring postings with a salary and a substantial description, checking the employer’s own careers page rather than a board copy, and checking one listing directly before spending an hour on an application.

  • Sort by first seen, not by the board’s date. Boards re-date; a sighting log does not.
  • Prefer the employer’s own page. A board copy can outlive the original by weeks. If the careers page no longer lists the role, the board copy is a ghost whatever its date says.
  • Treat a repost as a yellow flag, not a red one. Large employers refresh requisitions constantly. A repost plus a thin description plus no salary is a different matter.
  • Check before you apply. Paste the job URL into the checker on the ghost jobs page. It returns the posting’s first and last sighting, its status and close reason, its score and the signals visible on the record. Thirty seconds, no account.

The same checks as API filters

Every check above is a filter or a field on POST /v1/jobs/search. This request keeps only active postings, drops anything scoring above 24, ignores anything posted more than 30 days ago and requires a posted salary.

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": ["account executive"], "status": "active", "max_ghost_score": 24, "posted_at_max_age_days": 30, "min_salary_usd": 60000, "limit": 25 }'

Checks 1, 3 and 7 come back as fields (discovered_at, status, closed_at, closed_reason, last_seen_at, date_posted) so you can apply thresholds of your own. Check 2 and check 6 are folded into ghost_score. To see the shape without a key, send the same body to POST https://api.jobspipe.dev/v1/sandbox/jobs/search. The definitions behind the thresholds are in what are ghost jobs.

Two refinements are worth knowing. Setting status to closed or any lets you audit your own feed: pull the postings you surfaced last month and count how many have since closed with a closed_reason of stale or gone, which is the closest thing to a ghost rate for your users. And because the mass poster signal fires on every role at a very large employer, a hard cap of 24 will remove legitimate openings at those companies; if they matter to your product, raise the cap to 44 and let posted_at_max_age_days carry the age check instead. The same filters are available through the JobsPipe MCP server for agents that recommend roles.

Run all seven checks with one request. Free tier included.

Get a free API key
FAQs

Frequently Asked Questions

How do you spot a ghost job?

Check seven things: how old the posting really is, whether it has been reposted, whether it ever closes, whether the description is thin, whether it names a salary, how many roles the employer has open at once, and whether the posted date keeps moving. No single check is conclusive; two or three together are.

Are ghost jobs real?

Yes. Across ten boards, 17.8% of scored active postings carry a ghost score of 25 or higher and 1.3% score 50 or higher. Roughly 1 in 6 listings deserves scrutiny; the rest are posted, seen for a few weeks, and close.

How do I avoid ghost jobs?

Sort by first-seen date rather than the board's date, prefer postings with a salary and a substantial description, check the employer's own careers page rather than a board copy, treat a repost as a yellow flag rather than a red one, and check a single listing directly before spending an hour on an application.

Is there a tool to check whether a job is still open?

Yes. The checker on the JobsPipe ghost jobs page takes a job URL and returns the posting's first and last sighting, its status and close reason, its ghost score and the signals visible on the record. It needs no account.

How long is too long for a job posting to be open?

The ghost score treats 45 days from first sighting as the first threshold and 90 days as the second. Most roles on most boards are filled or pulled before 45 days, so a posting past that point with no other explanation deserves a second look.

How do I run these checks through the API?

Use POST /v1/jobs/search with status set to active, max_ghost_score to cap the score, posted_at_max_age_days to exclude old postings and min_salary_usd to require a salary. Age, close status and posted-date drift come back as fields (discovered_at, status, closed_at, closed_reason, last_seen_at, date_posted) so you can apply your own thresholds.