Job Posting Age Anomaly Detector
Pricing
from $1.70 / 1,000 job openings
Job Posting Age Anomaly Detector
Find job postings that have stayed open unusually long in a city and function area. Returns posting age, anomaly flag, hard-to-fill signal, salary when available, and job URL.
Pricing
from $1.70 / 1,000 job openings
Rating
0.0
(0)
Developer
Trove Vault
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Find roles that have stayed open unusually long in a local hiring market.
Give the actor a city, a function area, and optional keywords. It returns a compact job table with posting age, a hard-to-fill signal, and the evidence needed to review the role quickly.
This actor is built for labor-market research, recruiting intelligence, sales prospecting, and weekly monitoring of persistent hiring demand. It does not require any third-party API key.
What it does
Job Posting Age Anomaly Detector scans job postings for a selected market and returns:
- Job title, company, location, and URL
- Posting date and posting age in days
- Whether the posting exceeds your age threshold
- A simple hard-to-fill signal
- A plain-English reason for the signal
- Salary range when available
- A short description snippet for quick review
The main signal is intentionally transparent: when a posting remains visible beyond the configured threshold, usually 60 days, it is flagged as an age anomaly.
Input
Typical input:
{"city": "Prague","functionArea": "Software Engineering","keywords": ["backend engineer"],"ageThresholdDays": 60,"maxResults": 50}
Required fields:
city: target city, for example Prague, Munich, Lisbon, London, or TorontofunctionArea: job family, for example Software Engineering, Sales, Marketing, Customer Success, Finance, or Operations
Optional fields:
keywords: job titles, skills, or phrases to narrow the scan. Keywords are matched against both job titles and descriptions.ageThresholdDays: number of days after which a posting is treated as unusually old. Default is 60.maxResults: maximum rows returned after filtering and deduplication. Default is 50.datasetId: existing Apify dataset to append results to.runId: external run identifier for workflow chaining.
The actor infers country context for common city names, so users do not need to provide a country for normal runs.
Output
Each dataset item is one job posting. Operational diagnostics are written to the run summary and logs, not mixed into the result table.
Example output:
{"title": "Senior Backend Engineer","company": "Example GmbH","location": "Berlin, Germany","city": "Berlin","functionArea": "Software Engineering","postedAt": "2026-01-18T00:00:00.000Z","postingAgeDays": 102,"ageThresholdDays": 60,"exceedsAgeThreshold": true,"hardToFillSignal": "high","signalReason": "Open for 102 days, above the 60-day threshold.","salaryRange": "EUR 90000-120000","jobUrl": "https://example.com/job","descriptionSnippet": "Short excerpt from the posting...","scrapedAt": "2026-05-03T10:00:00.000Z"}
How to read the signal
exceedsAgeThreshold is the clearest field. It tells you whether the posting has been open longer than your threshold.
hardToFillSignal gives a simple label:
high: old posting with strong age evidencemedium: old posting with moderate age evidencelow: recent posting or weak age evidenceunknown: posting age was unavailable
signalReason explains the label in plain English so the row can be used directly in reviews, spreadsheets, and downstream workflows.
Data quality
Job posting dates are useful but imperfect. Some companies refresh postings, keep evergreen roles live, or reuse job URLs. Treat the output as a shortlist for review, not as proof that every old posting is actively hard to fill.
Salary availability depends on the job posting. When compensation is not published, salaryRange is empty.
Use cases
- Find hard-to-fill roles in a target city
- Monitor senior hiring pressure by function area
- Build recruiter or vendor lead lists from persistent hiring signals
- Compare local hiring demand across markets
- Identify stale or evergreen job listings
- Feed clean job-age signals into a wider TroveVault workflow
API use
Run the actor manually, schedule it, or call it through the Apify API.
curl -X POST "https://api.apify.com/v2/acts/TroveVault~job-posting-age-anomaly-detector/runs" \-H "Authorization: Bearer YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"city":"Prague","functionArea":"Software Engineering","keywords":["backend engineer"],"maxResults":50}'
The actor writes a RUN_SUMMARY key-value-store record with row counts, anomaly count, matching mode, and run status.