LinkedIn Ghost Job Detector & Checker - Apply Link Verifier avatar

LinkedIn Ghost Job Detector & Checker - Apply Link Verifier

Pricing

from $1.40 / 1,000 verified job decisions

Go to Apify Store
LinkedIn Ghost Job Detector & Checker - Apply Link Verifier

LinkedIn Ghost Job Detector & Checker - Apply Link Verifier

Ghost job detector and apply-link verifier for LinkedIn job rows: recovers the exact official application link, flags ghost, expired and mismatched listings, blocks unverified rows before they reach your job board, and can end each run with a verification report. No LinkedIn login or cookies.

Pricing

from $1.40 / 1,000 verified job decisions

Rating

0.0

(0)

Developer

Kamer Ozkan

Kamer Ozkan

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

4

Monthly active users

4 days ago

Last modified

Categories

Share

LinkedIn ghost job detector, job checker, and apply-link verifier: give it the LinkedIn job rows you already have (any scraper's dataset or pasted JSON) and get one auditable decision per row - the exact official application URL when it can be proven, EXPIRED when the employer has removed the job, SOURCE_MISMATCH or STATUS_CONFLICT when the evidence disagrees, and AMBIGUOUS (free) when there is no proof. No LinkedIn login, cookies, or credentials.

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 reconciles each row 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. The safety rule is simple: no proof, no link.

Actively maintained: duplicate job IDs and rows without a usable job URL are now handled inside the run (dropped or returned as INVALID_INPUT, never charged) instead of failing the whole batch, and every run can end with a batch verification report.

What you can build with it

๐Ÿงน 1. A publish gate for your job board feed

Run your LinkedIn or multi-board scraper, pass its dataset ID, publish only rows with safeToPublish: true, and route reviewRequired rows to a queue. Schedule it, or trigger it from Make, Zapier, n8n, or the Apify API on every new dataset.

{
"datasetId": "YOUR_DATASET_ID",
"maxItems": 500,
"includeVerificationReport": true
}

๐Ÿ‘ป 2. A ghost-job audit for staffing and recruiting teams

Paste the rows a client or candidate complained about. EXPIRED, SOURCE_MISMATCH, and STATUS_CONFLICT are the ghost-job signals, each with the evidence trail that produced it (official inventory checked, sitemaps scanned, ATS API queried). The optional report lists them per company.

๐Ÿ”— 3. Exact ATS route recovery for aggregators

Generic careers pages are resolved to the exact job on Workday, Greenhouse, Lever, JazzHR, and other ATS providers; sourceProvider tells you which one, confidence how strong the match is, and applyMethod whether the job is LinkedIn Easy Apply only.

๐Ÿ” 4. Weekly re-verification of what you already published

Re-run last week's published rows with a stable datasetId. Rows that flipped to EXPIRED come back with safeToPublish: false, so a dead link never survives a week on your site.

Batch verification report

Set includeVerificationReport: true and the run writes three records to its key-value store once at least one row was verified:

RecordContent
VERIFICATION_REPORTJSON: rows, publishable share, ghost-or-unsafe share, review count, status and ATS-provider breakdown, per-company table (ghost risk first), the ghost-or-unsafe rows, the rows held for review, next steps
VERIFICATION_REPORT.htmlPrintable, script-free page of the same content, ready to forward to a client or a content team
VERIFICATION_REPORT.txtPlain-text digest for email, Slack, or a ticket

OUTPUT.verificationReport records whether the report was stored and how it was billed.

Pricing and cost examples

Pay-per-event. Prices below are the FREE-tier rates effective 16 September 2026 (until 15 September 2026 the live price is $0.002 per useful decision). Paid Apify plans get automatic tier discounts of up to 30%.

EventPriceNotes
โœ… Useful decision (verified-job)$0.005 ($5 per 1,000)ACTIVE, AUTHORIZED_APPLY_ROUTE, LINKEDIN_EASY_APPLY, EXPIRED, SOURCE_MISMATCH, STATUS_CONFLICT
๐Ÿ†“ AMBIGUOUS / INVALID_INPUT row$0Delivered for audit, never charged
๐Ÿ“‹ Verification report (verification-report)$0.15Once per run when requested; priced from 16 September 2026, included free until then

Worked examples at the 16 September prices:

  • Daily feed of 200 jobs, ~90% useful decisions, with the report: โ‰ˆ $1.05 per run โ†’ โ‰ˆ $32 per month
  • One-off ghost-job audit of 25 rows with the report: โ‰ˆ $0.28
  • Weekly re-verification of 500 published rows: โ‰ˆ $2.50 per run โ†’ โ‰ˆ $11 per month

Failed runs create no useful-decision charges; platform usage is included.

What it fixes

Feed problemActor decision
External apply URL is missingFinds and proves the exact employer or ATS route
Apply URL opens a generic careers boardResolves the board to the exact job
LinkedIn row remains visible after the official job closesReturns EXPIRED with no publishable URL
Company, title, location, or job content conflictsReturns SOURCE_MISMATCH or STATUS_CONFLICT
The job only supports LinkedIn Easy ApplyReturns LINKEDIN_EASY_APPLY and the LinkedIn route
Evidence is not strong enoughReturns AMBIGUOUS, publishes no URL, and does not charge

The safety rule is simple: no proof, no link.

Try it in 60 seconds

  1. Keep the two prefilled example jobs.
  2. Click Start.
  3. Open the Verified apply routes dataset view.
  4. Use actionUrl only when safeToPublish is true.

The prefill demonstrates two verified outcomes from a live run on 2026-09-02: an exact employer-site application page (GitHub) and an exact Greenhouse job route (GitLab). 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": "4456275537",
"jobUrl": "https://www.linkedin.com/jobs/view/4456275537",
"jobTitle": "Senior Software Engineer, Copilot Agent Platform",
"companyName": "GitHub",
"location": "United States"
}
],
"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"
]
}

A second verified result, unedited apart from the shortened evidence array, from a live run on 2026-09-02 (BEhcNYa0JWNNk5aLc): a GitLab role resolved to its exact Greenhouse job.

{
"jobId": "4451351698",
"title": "Intermediate Support Engineer",
"company": "GitLab",
"location": "Bengaluru, Karnataka, India",
"linkedinUrl": "https://www.linkedin.com/jobs/view/4451351698",
"status": "ACTIVE",
"actionUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8687026002",
"officialUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8687026002",
"applyMethod": "OFFSITE",
"safeToPublish": true,
"reviewRequired": false,
"usefulClassification": true,
"confidence": 0.97,
"sourceProvider": "greenhouse",
"evidence": [
"linkedin_about_website_direct",
"linkedin_description_loaded",
"linkedin_apply_method:OFFSITE",
"verified_company_website_map",
"career_page_without_supported_ats",
"official_site_inventory_miss:custom",
"(evidence shortened)"
],
"checkedAt": "2026-09-02T13:33:11.745117+00:00"
}

Important output fields:

FieldUse
actionUrlRoute your product may open or publish
safeToPublishMachine-readable release gate
statusFinal decision for the job row
reviewRequiredWhether the row should enter a manual queue
confidenceStrength of the match
sourceProviderVerified ATS or official source
evidenceChecks supporting the decision
requestAccountingRequests used by each verification layer
originalOriginal 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. actionUrl and officialUrl are null because no safe apply page exists. A missing value is always null, never a guessed link.
  • Deliberate lifecycle status. EXPIRED is declared only after the complete official inventory was checked, as the evidence trail shows.
  • Publish protection built in. safeToPublish flips to false, 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

StatusMeaning
ACTIVEExact live official job route verified
AUTHORIZED_APPLY_ROUTEValid source-owned application route verified
LINKEDIN_EASY_APPLYNo external route is expected; use the LinkedIn URL
EXPIREDThe exact official job is no longer available
SOURCE_MISMATCHThe row appears to belong to a different hiring organization
STATUS_CONFLICTTrusted sources disagree about the current state
AMBIGUOUSEvidence is insufficient; no URL is published and the row is not charged
INVALID_INPUTThe row lacks a usable LinkedIn job ID or URL, title, company, or location; delivered for audit, not charged
DUPLICATE_INPUTThe job ID already appeared earlier in the same run; delivered for audit, 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:

  1. It preserves your existing job row.
  2. It checks customer-supplied links instead of trusting them.
  3. It resolves generic ATS boards to the exact job.
  4. It compares LinkedIn, employer, ATS, and live detail-page evidence.
  5. 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

See "Pricing and cost examples" at the top of this page. In short: one verified-job event per useful decision, AMBIGUOUS, INVALID_INPUT and DUPLICATE_INPUT rows are free, failed runs charge nothing, and the optional verification-report event is billed once per run when requested. Apify platform usage is included; no subscription or per-seat fee.

Production workflow

For a recurring feed:

  1. Run your existing LinkedIn or job scraper.
  2. Pass its dataset ID to this Actor.
  3. Publish rows where safeToPublish is true.
  4. Send reviewRequired rows to a review queue.
  5. 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.