LinkedIn Ghost Job Detector & Checker - Apply Link Verifier
Pricing
from $1.40 / 1,000 verified job decisions
LinkedIn Ghost Job Detector & Checker - Apply Link Verifier
Ghost job detector, checker & apply-link verifier for LinkedIn job rows. Recovers the exact official application link, flags ghost, expired & mismatched listings, blocks unverified rows before they reach your job board. No LinkedIn login, cookies or credentials. Confidence score per row.
Pricing
from $1.40 / 1,000 verified job decisions
Rating
0.0
(0)
Developer
Kamer Ozkan
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Recover exact company application links and stop unsafe job rows before they reach your users.
LinkedIn job feeds often return an empty external apply URL, a copy of the LinkedIn job URL, or a generic company careers page. This Actor takes the job rows you already have, reconciles each one against public employer and ATS evidence, and returns a safe action for your workflow.
It is built for job boards, recruiting products, staffing automations, and job data pipelines. It is not another job scraper.
What it fixes
| Feed problem | Actor decision |
|---|---|
| External apply URL is missing | Finds and proves the exact employer or ATS route |
| Apply URL opens a generic careers board | Resolves the board to the exact job |
| LinkedIn row remains visible after the official job closes | Returns EXPIRED with no publishable URL |
| Company, title, location, or job content conflicts | Returns SOURCE_MISMATCH or STATUS_CONFLICT |
| The job only supports LinkedIn Easy Apply | Returns LINKEDIN_EASY_APPLY and the LinkedIn route |
| Evidence is not strong enough | Returns AMBIGUOUS, publishes no URL, and does not charge |
The safety rule is simple: no proof, no link.
Try it in 60 seconds
- Keep the two prefilled example jobs.
- Click Start.
- Open the Verified apply routes dataset view.
- Use
actionUrlonly whensafeToPublishistrue.
The prefill demonstrates both supported outcomes: an exact company-owned application page and a LinkedIn Easy Apply route. No LinkedIn account, cookies, or browser profile are required.
Input
Use either an existing Apify dataset or paste rows directly. Common LinkedIn scraper field names are detected automatically.
Each row needs:
- LinkedIn job URL or job ID
- job title
- company
- location
An existing applyUrl, companyApplyUrl, or company website is optional. It
is treated as a hint and must pass the same verification policy.
{"rows": [{"jobId": "4441060956","jobUrl": "https://www.linkedin.com/jobs/view/4441060956","jobTitle": "Account Executive - Travel","companyName": "Nike Communications, Inc.","location": "New York, NY"}],"maxItems": 25}
For an existing dataset, provide its ID instead:
{"datasetId": "YOUR_DATASET_ID","maxItems": 500}
Output
Every input row produces an auditable decision. A verified result looks like:
{"status": "ACTIVE","actionUrl": "https://nikecommunicationsinc.applytojob.com/apply/eDPh7BCIhx/Account-Executive-Travel","safeToPublish": true,"reviewRequired": false,"usefulClassification": true,"confidence": 1,"sourceProvider": "jazzhr","evidence": ["linkedin_apply_method:OFFSITE","official_site_to_career_source_verified","generic_board_resolved_to_exact_job","conservative_official_inventory_match"]}
Important output fields:
| Field | Use |
|---|---|
actionUrl | Route your product may open or publish |
safeToPublish | Machine-readable release gate |
status | Final decision for the job row |
reviewRequired | Whether the row should enter a manual queue |
confidence | Strength of the match |
sourceProvider | Verified ATS or official source |
evidence | Checks supporting the decision |
requestAccounting | Requests used by each verification layer |
original | Original input row, unchanged |
When the official job is gone
When the employer has removed a posting, the Actor says so instead of guessing. This
record comes from a real run; values are exactly as returned, only the long evidence
array is shortened here. It shows three guarantees at once:
- No fabricated URLs.
actionUrlandofficialUrlarenullbecause no safe apply page exists. A missing value is alwaysnull, never a guessed link. - Deliberate lifecycle status.
EXPIREDis declared only after the complete official inventory was checked, as theevidencetrail shows. - Publish protection built in.
safeToPublishflips tofalse, so a job board or alert email never ships a dead link.
{"jobId": "4415520094","title": "Staff/Sr. Software Engineer, Search Data Infrastructure - Slack","company": "Slack","location": "Seattle, WA","linkedinUrl": "https://www.linkedin.com/jobs/view/4415520094","status": "EXPIRED","actionUrl": null,"officialUrl": null,"applyMethod": "OFFSITE","safeToPublish": false,"reviewRequired": false,"confidence": 0.95,"sourceProvider": "workday","evidence": ["verified_company_website_map","ats_link_on_career_page","workday_cxs_api:query=staff sr software engineer search data infrastructure slack","official_inventory_empty","official_sitemaps_scanned:14","complete_employer_owned_inventory_checked","complete_official_inventory_no_safe_match","expired_classification_without_url"],"checkedAt": "2026-07-28T14:34:29.121893+00:00","schemaVersion": "1.0"}
Decision statuses
| Status | Meaning |
|---|---|
ACTIVE | Exact live official job route verified |
AUTHORIZED_APPLY_ROUTE | Valid source-owned application route verified |
LINKEDIN_EASY_APPLY | No external route is expected; use the LinkedIn URL |
EXPIRED | The exact official job is no longer available |
SOURCE_MISMATCH | The row appears to belong to a different hiring organization |
STATUS_CONFLICT | Trusted sources disagree about the current state |
AMBIGUOUS | Evidence is insufficient; no URL is published and the row is not charged |
Why this is different
Most LinkedIn job Actors collect listings. Official career-site APIs sell their own job inventory. This Actor works between those products and your publishing system:
- It preserves your existing job row.
- It checks customer-supplied links instead of trusting them.
- It resolves generic ATS boards to the exact job.
- It compares LinkedIn, employer, ATS, and live detail-page evidence.
- It blocks expired, mismatched, conflicting, and unproven routes.
Search results and job mirrors may help discover a candidate, but they can never become a publishable answer on their own.
Quality evidence
The latest clean regression used 100 previously unseen LinkedIn job rows with static resolution memory disabled:
- 98 useful classifications
- 97 safe action routes
- 2 rows safely held as
AMBIGUOUS - 0 unsafe guessed URLs
- 697 total HTTP requests
- 468.6 seconds on the local reference run
The production build also passed private Apify cloud tests:
- 2 normal rows: 2 useful, 2 publishable, 0 held
- 1 unresolved row: 0 publishable, correctly held for review
- 42 automated regression tests passed
These are measured tests, not a promise that every future source will resolve automatically. The product promise is that an unproven route is never marked safe.
Pricing
The Actor charges $2.00 per 1,000 verified job decisions.
- $0.002 per useful decision
AMBIGUOUSrows are delivered without charge- failed runs do not create useful-decision charges
- Apify platform usage is included
- no subscription or per-seat fee
Example: verifying 25,000 useful job rows costs $50.
Production workflow
For a recurring feed:
- Run your existing LinkedIn or job scraper.
- Pass its dataset ID to this Actor.
- Publish rows where
safeToPublishistrue. - Send
reviewRequiredrows to a review queue. - Schedule the workflow or connect it through webhooks, Make, Zapier, n8n, or the Apify API.
The default batch is 25 jobs for easy inspection. A run accepts up to 500 jobs. Cold companies take longer because their public website, ATS, and job evidence must be discovered live.
Wire it into Make, n8n, or your own webhook
Add a webhook for the ACTOR.RUN.SUCCEEDED event (Actor page > Integrations). Apify
posts this payload to your endpoint the moment a run finishes:
{"eventType": "ACTOR.RUN.SUCCEEDED","createdAt": "2026-07-28T15:02:44.906Z","eventData": {"actorId": "TW4QDjkomVJH1SPsd","actorRunId": "xYzAbCdEfGhIjKlM1"},"resource": {"id": "xYzAbCdEfGhIjKlM1","status": "SUCCEEDED","startedAt": "2026-07-28T15:00:48.634Z","finishedAt": "2026-07-28T15:02:44.703Z","defaultDatasetId": "qRsTuVwXyZaBcDeF2","stats": { "durationMillis": 115406, "computeUnits": 0.0321 }}}
Your workflow then fetches the verified rows in one call:
GET https://api.apify.com/v2/datasets/{resource.defaultDatasetId}/items?format=json&clean=1
In Make and n8n you can skip the webhook entirely: both have a native Apify integration with a run-finished trigger and a get-dataset-items action, so a scheduled verify-then-publish flow takes two modules.
This Actor is also exposed to AI agents through Apify's MCP server (mcp.apify.com): an agent can discover it by search and run it with the same pay-per-event billing, with no separate integration.
Responsible use and limits
- The Actor checks public web evidence and does not require LinkedIn login credentials.
- Source websites can throttle, remove, or change public pages.
- An active official listing proves that an application route exists. It cannot prove a hiring manager's private intent or guarantee that a role will be filled.
- Review the terms and laws that apply to your data source and use case.