

# Can You Detect Ghost Jobs From Public Job Listings?

Public job data cannot prove an employer's hiring intent. Public checks record observed listing, page, and application-path states. They do not prove an active opening or hidden hiring intent. A ghost job claim concerns the hidden intent people expect when a listing exists. Public records alone cannot settle that intent. A working form or repeated listing does not guarantee the employer will hire.

## What Public Data Can and Cannot Show

When you look at a job post, you see information supplied by a scraper or an automated feed. An Actor is a hosted software program that collects public web data, and a Task is a saved set of settings for that program. These tools pull listings from public pages into neat rows, but they do not measure an employer's true hiring budget or internal plans.

| Information Type | What You Can Observe | What Remains Unknown |
| --- | --- | --- |
| Listing Details | Job ID, title, company name, raw date text, posted date, full job text. | The actual number of open seats or internal budget approval. |
| Application Link | Original apply URL, final target page, link resolution status. | Whether a hiring manager reviews incoming resumes. |
| Company Page | Matching requisition ID, official job description, active status. | Future plans to freeze hiring or cancel the role. |
| Listing History | Repeated source observations and source IDs, raw dates, and collection times; observed dates do not prove reposts or renewed publication. | Hidden intent. |

Understanding these limits stops you from making false claims about a listing. A post that stays online for a month might mean the employer is picky, slow, or constantly expanding. It does not prove the job is fake.

## The Verifiable Listing Checklist

Before deciding whether to apply, run the listing through three direct checks to separate observed facts from guesswork.

### Step 1: Retain Source Evidence

Save the source identity, job ID, source date, raw date string, collection time, description, and company evidence. Do not set an arbitrary age threshold as proof of a ghost job. Repeated source IDs can trigger review, but they cannot prove hidden intent.

### Step 2: Search the Official Career Page

Find the employer's official career page through its verified public website. Match the requisition ID, duties, and location where available. Record the checked time, page, and match basis. Keep "not found in this search" separate from other outcomes. Similar titles alone can describe different roles. Official confirmed closure supports closed at this check. Absence does not usually prove a post is outdated.

### Step 3: Test the Application Path

Open the listing's [application path](/en/articles/indeed-employer-apply-route/) without submitting your resume. Record a reachable form, explicit closed message, wrong destination, or access failure. A reachable form does not prove the employer will hire. An inaccessible access failure does not prove job closure, nor does it prove the path is outdated or misconfigured.

## Setting Up a Data Task

You can gather public listings automatically before doing your manual checks. Use the standard settings below to start collecting data from public search pages.

The current Indeed Jobs build accepts unique listings with full-description status. Exact relevant fields include `jobId`, `jobUrl`, `title`, `companyName`, `companyUrl`, `companyWebsite`, `descriptionStatus`, `descriptionText`, `postedAt`, `postedAtRaw`, `scrapedAt`, `applyUrl`, `finalApplyUrl`, and `applyUrlResolveStatus`. Optional values can miss. Setting `followApplyRedirects` to true resolves the final apply web address when useful; it does not test hiring intent or run an application audit. Setting `scrapeCompanyDetails` enables company enrichment. Current two-row full-description acceptance covers checked source rows, not real career or application paths; all manual checks are reader steps and fiction. Use the [Indeed Jobs Scraper](https://apify.com/chronometrica/indeed-jobs-scraper) Actor.

```json
{
  "country": "us",
  "searchTerm": "software engineer\ndata analyst\nproduct manager",
  "maxItems": 2,
  "postedWithinDays": "7",
  "radiusMiles": 25,
  "sortBy": "date",
  "jobType": "any",
  "remoteOnly": false,
  "maxPagesPerSearch": 15,
  "salaryType": "any",
  "minSalary": 0,
  "saveOnlyUniqueItems": true,
  "balanceKeywordCoverage": true,
  "followApplyRedirects": false,
  "scrapeCompanyDetails": true,
  "requestDelayMillis": 2500
}
```

Setting Up a Data Task

Change the search terms and country code to fit your target market. Keep the item limit low when you start. Set the redirect check option to true only when you want to resolve final web addresses automatically. Remember that collecting listing rows is just the first step. You must complete the verification matrix yourself.

## Evaluating Listings: Worked Examples

The following fictional examples show how to record your findings and make a decision. All four examples use a fictional review timestamp of 2026-10-01T12:00:00Z to keep dates consistent.

### Fictional Case Matrix

| Source ID | Repeat History | Official Match | Apply State | Review Decision | Intent |
| --- | --- | --- | --- | --- | --- |
| J1 | Three observations over two weeks, not proved publications or reposts | Requisition R10 matches duties and location | Form reachable | Apply if fit | Unknown |
| J2 | Single current listing | Requisition explicitly listed as closed | Page shows closed message | Set aside | Unknown |
| J3 | Single current listing | No matching title or requisition found | Access denied page | Verify first | Unknown |
| J4 | Single current listing | Requisition matches duties and location | Link leads to unrelated role | Path correction pending | Unknown |

### How to Interpret Each Result

- J1 Analysis: The source listing had three observations over two weeks, which are not proved publications or reposts. It matches official requisition R10 and has a reachable form. Decision is apply if fit, and intent is unknown.
- J2 Analysis: The listing has an explicit match to official closure at the same fictional check 2026-10-01T12:00:00Z. Decision is set aside now. It is not proved expired forever or always fake.
- J3 Analysis: The role is not found in the search and access failed, leaving status unknown. Decision is verify first.
- J4 Analysis: The apply link leads to the wrong role path, which is logged. Decision is to check the official matching path.

All four listings have unknown intent. One explicitly closed role is not a measured ghost-job rate of twenty-five percent.

## How to Decide Your Next Step

1. Apply if fit: Choose this when you have a checked official path and a reachable form.
2. Verify first: Choose this when facts are unclear or missing.
3. Set aside: Setting aside an inaccessible path is a personal time choice with availability unknown, not proof the job is closed. Only an explicit matched closure supports closed at this check.

If uncertainty remains, use an official published recruiting contact or application channel to ask about status if you choose. This is an optional reader action, not automatic outreach. Do not promise a reply or reinterpret silence as fraud. Keep your check date, since listing state can change.

The United States Bureau of Labor Statistics defines a job opening based on specific criteria: work must be available, hiring can start within 30 days, and the employer is actively recruiting from outside sources. See the [BLS Job Openings and Labor Turnover Survey Definitions](https://www.bls.gov/jlt/jltdef.htm) for how statistical agencies define an open position. Public advertisements alone do not prove all three conditions are met, which is why manual checks are necessary.

For more discussion on candidate experiences with reposted positions, you can read community reports on [Reddit csMajors Reposted Jobs Discussion](https://www.reddit.com/r/csMajors/comments/1s2pq11/linkedin_reposted_jobs/).

## Next Steps

To run your own check, open the [Indeed Reposted Job Evidence Dataset](https://apify.com/chronometrica/indeed-jobs-scraper/examples/indeed-repost-watch) preset built on the [Indeed Jobs Scraper](https://apify.com/chronometrica/indeed-jobs-scraper) Actor, choose 2 listings in your field, and fill out the verification matrix before deciding whether to apply.

## Sources

- [BLS JOLTS Definitions](https://www.bls.gov/jlt/jltdef.htm)
- [Indeed Jobs Scraper Actor](https://apify.com/chronometrica/indeed-jobs-scraper)
- [Reddit csMajors Discussion on Reposted Jobs](https://www.reddit.com/r/csMajors/comments/1s2pq11/linkedin_reposted_jobs/)