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
a day ago
Last modified
Categories
Share
Job Posting Age Anomaly Detector finds roles that have stayed open unusually long in a local hiring market. Give it a city, function area, optional keywords, and an age threshold. It returns a clean dataset of job postings with postingAgeDays, exceedsAgeThreshold, hardToFillSignal, signalReason, salary when available, and the original jobUrl for review.
Use it when you need recruiting intelligence, labor-market research, sales prospecting, or weekly monitoring of persistent hiring demand without manually searching job boards and copying dates into a spreadsheet.
Why use this actor
- Turn visible job posting age into a structured hard-to-fill signal.
- Focus on a city and function area instead of broad global job feeds.
- Use
ageThresholdDaysto define what unusually old means for your workflow. - Keep the original
jobUrland description snippet for fast human review. - Append rows into an existing dataset with
datasetIdfor monitoring over time. - Pass
runIdthrough the workflow when this actor feeds CRM, recruiting, or market dashboards.
What it returns
| Field | Meaning |
|---|---|
title | Job title. |
company | Hiring company when visible. |
location / city | Location text and normalized target city. |
functionArea | Function area from the input. |
postedAt | Parsed posting date when available. |
postingAgeDays | Age of the posting in days. |
ageThresholdDays | Threshold used for the run. |
exceedsAgeThreshold | Whether the posting is older than the configured threshold. |
hardToFillSignal | high, medium, low, or unknown. |
signalReason | Plain-English explanation of the signal. |
salaryRange | Visible salary range when published. |
jobUrl | Source job URL for review. |
descriptionSnippet | Short snippet for quick screening. |
scrapedAt | Timestamp when the row was created. |
Operational diagnostics are written to logs and RUN_SUMMARY, not mixed into the buyer-facing dataset.
Use cases
- Recruiting agencies: identify long-open roles that may indicate hard-to-fill demand and prioritize outreach.
- Sales teams: find companies with persistent hiring pressure in a category your product serves.
- Labor-market analysts: compare age-anomaly patterns across cities and job families.
- Talent teams: monitor whether critical roles remain open longer than expected.
- Market expansion teams: evaluate hiring demand in target cities before launching local campaigns.
How to use it
- Enter a city such as
Prague,Munich,Lisbon,London, orToronto. - Choose a function area such as
Software Engineering,Sales,Marketing,Customer Success,Finance, orOperations. - Add optional keywords to narrow the result set.
- Set
ageThresholdDays; 60 is a practical default for many roles. - Review rows where
exceedsAgeThresholdistrueand sort byhardToFillSignal.
Input example
{"city": "Prague","functionArea": "Software Engineering","keywords": ["backend engineer"],"ageThresholdDays": 60,"maxResults": 50,"runId": "prague-backend-weekly"}
Input reference
| Field | Required | Description |
|---|---|---|
city | Yes | Target city or hiring market. |
functionArea | Yes | Job family to scan. |
keywords | No | Job titles, skills, or phrases matched against titles and descriptions. |
ageThresholdDays | No | Days after which a posting is treated as unusually old. Default is 60. |
maxResults | No | Maximum rows returned after filtering and deduplication. |
datasetId | No | Existing Apify dataset to append rows into. |
runId | No | External run identifier copied into workflow metadata. |
Output example
{"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"}
API usage
curl -X POST "https://api.apify.com/v2/acts/trovevault~job-posting-age-anomaly-detector/runs" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"city": "Prague","functionArea": "Software Engineering","keywords": ["backend engineer"],"ageThresholdDays": 60,"maxResults": 50}'
How to interpret the signal
exceedsAgeThreshold is the most direct field. It tells you whether a role has remained visible longer than your configured threshold.
hardToFillSignal is a review label:
high: old posting with strong age evidence.medium: old posting with moderate evidence or partial date confidence.low: recent posting or weak age evidence.unknown: posting age was unavailable.
Use signalReason to understand why the row was labeled before copying it into sales, recruiting, or research workflows.
Limitations
- Posting dates are imperfect. Some employers refresh roles, reuse job URLs, or keep evergreen listings open.
- Salary data appears only when published in the visible job text.
- A long-open posting is a useful signal, not proof that the role is actively hard to fill.
- Public job pages can disappear, redirect, or show different content by geography.
- The actor does not authenticate into private ATS systems or paid job-board accounts.
Troubleshooting
| Problem | What to try |
|---|---|
| No rows returned | Broaden keywords, increase maxResults, or use a more common city/function combination. |
| Too many irrelevant rows | Add specific keywords such as a title, stack, or seniority phrase. |
postingAgeDays is missing | The public posting may not expose a parseable date. Use jobUrl for manual review. |
| Results look stale | Check whether the employer refreshed an old URL or reposted the same role. |
| Need weekly monitoring | Schedule the actor and pass a stable datasetId or runId for comparison. |
FAQ
Does the actor prove a role is hard to fill?
No. It provides an age-based anomaly signal for review.
What threshold should I use?
Start with 60 days. Use 30 days for fast-moving roles and 90 days for senior or niche roles.
Can I monitor several markets?
Run separate tasks for each city/function pair so thresholds and keywords stay clear.
Does it require an API key?
No third-party API key is required for normal runs.
Can I append results over time?
Yes. Use datasetId to append rows into an existing Apify dataset.
Why are some salaries blank?
Many postings do not publish compensation. The actor leaves salaryRange empty instead of guessing.
Can this feed a CRM or recruiting dashboard?
Yes. Use the dataset export, API, webhooks, or scheduled runs.
Related actors
- CRM Account Research Agent for account-level sales research.
- Buying Committee Mapper for public stakeholder mapping.
- Conference Events Scout for market and event opportunity research.
Changelog
- 0.1: Initial TroveVault release with city/function input, age thresholding, anomaly labels, salary extraction when visible,
datasetId, andrunIdsupport.
Feedback and support
Open an issue on the actor page with the input JSON, run ID, target city, and examples of rows you expected to see.