The ghost-job check

How we decide a posting might not be real

A ghost job is a posting that is up but is not filling a seat: a req left open to collect resumes, a role already promised to someone, a pipeline that never converts. You cannot tell from the outside, and the cost of guessing wrong is an afternoon you did not have to spare.

So Riffed reads every posting you paste and tells you what it noticed. Here is exactly how, because a trust feature you cannot audit is not a trust feature.

What it will never tell you

It will never say a job is fake. It cannot know that. Nobody outside the hiring team can. What it can do is report what it observed in the posting and, when we have it, in how long that posting has been up. Every result here is a statement about evidence, not a verdict about an employer.

The same rule governs the rest of Riffed: we do not invent things about you, and we do not invent things about them either.

The three results

ScoreResultWhat we mean
0 or lessNothing here looks staleThe posting reads like a live opening. Worth your time.
1 to 3A couple of things worth checkingNot a red flag, just worth a two-minute look at the company's careers page before you spend an hour tailoring.
4 or moreSeveral signs this may not be actively hiringApply if you want to. Just do not let this one be the application you pour your whole afternoon into.

The score is just the weights below added up. No model decides it, no randomness enters it, and the same posting always produces the same answer. You can check our arithmetic.

What we refuse to conclude

A job reaches Riffed as a paste, a file, or a link we resolve. A link or a search result sometimes gives us an excerpt rather than the whole posting.

Presence is evidence. Absence is only evidence when we have the whole document. So on anything shorter than 1200 characters we stop counting the signals that are about something missing: no pay range, no location, too few requirements, too little detail. Marking a job risky because our own ingestion handed us three sentences would be manufacturing a worry out of our plumbing. Signals that fire on something the text actually says still count, because a fragment saying “join our talent community” means exactly what it means.

When that happens the check says so on the job itself, and tells you that pasting the full description will get you a complete read.

Signals that raise the score

WeightSignalWhy it counts
+3The wording matches an always-open req: talent pool, talent community, general application, future opportunities, keep your resume on file, rolling basis, no specific opening.
evergreen_language
These postings are collecting resumes by design. There is often no seat behind them at all.
+2The posting is shorter than 900 characters once whitespace is collapsed.
thin_posting
A team that knows what it needs usually says more than a paragraph about it.
+2Reading the posting produced 3 or fewer concrete requirements, counting required skills plus hard requirements like years, degrees or certifications.
sparse_requirements
Vagueness about the requirements usually means vagueness about the role.
+1No salary, pay range, hourly rate or compensation band appears in the text.
no_pay_range
Weak on its own, since plenty of real postings still omit it. It counts for one point and never decides a band by itself.
+1Nothing says where the role sits or whether it is remote, hybrid or on-site.
no_location
Also weak on its own. Open-ended reqs skip it more often than real ones do.
+1The posting is on behalf of an unnamed or confidential client.
unnamed_employer
Not an accusation. Plenty of agency roles are real. It costs one point because you cannot research the employer before spending your time.
+1The title covers several roles at once: all levels, multiple openings, various, general application.
generic_title
One posting standing in for many seats is closer to a pipeline than to an opening.

Signals that lower it

A check that only ever counted against a posting would flag everything. These pull the score back down, and they are why a well-written, freshly posted job comes out clean.

WeightSignalWhy it counts
-2The posting names at least 4 required skills and at least 3 day-to-day responsibilities.
specific_requirements
Specificity costs a hiring team effort. It is the clearest sign someone actually wrote this for a real gap.
-1A salary, pay range or hourly rate appears in the text.
pay_stated
Numbers get attached to budgets. Open-ended reqs usually skip them.
-1It names who you would report to, the hiring manager, or which team the role sits in.
named_context
Specific reporting lines come from a specific org chart with a specific hole in it.

What it gets wrong

What this costs you

Nothing, in either sense. The check runs on the free tier and it does not spend an AI action, because no model is involved. It is pattern matching and arithmetic over text you already gave us, and the result is stored with the job so re-reading it is free.

Why we built it

Ghost jobs are one of the things the Layoff Chronicles has written about, because they do a specific kind of damage: they take the one resource a laid-off person cannot replace, which is the belief that effort produces results, and they spend it on nothing. Telling you a posting has been up since March is not a feature so much as a way of giving you that afternoon back.

Read the Chronicles piece on ghost jobs →

Ruleset ghost@v1. If we change a weight or a threshold, this page changes with it.

← Back to Riffed