Job Posting Age Anomaly Detector avatar

Job Posting Age Anomaly Detector

Pricing

from $1.70 / 1,000 job openings

Go to Apify Store
Job Posting Age Anomaly Detector

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

Trove Vault

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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 ageThresholdDays to define what unusually old means for your workflow.
  • Keep the original jobUrl and description snippet for fast human review.
  • Append rows into an existing dataset with datasetId for monitoring over time.
  • Pass runId through the workflow when this actor feeds CRM, recruiting, or market dashboards.

What it returns

FieldMeaning
titleJob title.
companyHiring company when visible.
location / cityLocation text and normalized target city.
functionAreaFunction area from the input.
postedAtParsed posting date when available.
postingAgeDaysAge of the posting in days.
ageThresholdDaysThreshold used for the run.
exceedsAgeThresholdWhether the posting is older than the configured threshold.
hardToFillSignalhigh, medium, low, or unknown.
signalReasonPlain-English explanation of the signal.
salaryRangeVisible salary range when published.
jobUrlSource job URL for review.
descriptionSnippetShort snippet for quick screening.
scrapedAtTimestamp 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

  1. Enter a city such as Prague, Munich, Lisbon, London, or Toronto.
  2. Choose a function area such as Software Engineering, Sales, Marketing, Customer Success, Finance, or Operations.
  3. Add optional keywords to narrow the result set.
  4. Set ageThresholdDays; 60 is a practical default for many roles.
  5. Review rows where exceedsAgeThreshold is true and sort by hardToFillSignal.

Input example

{
"city": "Prague",
"functionArea": "Software Engineering",
"keywords": ["backend engineer"],
"ageThresholdDays": 60,
"maxResults": 50,
"runId": "prague-backend-weekly"
}

Input reference

FieldRequiredDescription
cityYesTarget city or hiring market.
functionAreaYesJob family to scan.
keywordsNoJob titles, skills, or phrases matched against titles and descriptions.
ageThresholdDaysNoDays after which a posting is treated as unusually old. Default is 60.
maxResultsNoMaximum rows returned after filtering and deduplication.
datasetIdNoExisting Apify dataset to append rows into.
runIdNoExternal 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

ProblemWhat to try
No rows returnedBroaden keywords, increase maxResults, or use a more common city/function combination.
Too many irrelevant rowsAdd specific keywords such as a title, stack, or seniority phrase.
postingAgeDays is missingThe public posting may not expose a parseable date. Use jobUrl for manual review.
Results look staleCheck whether the employer refreshed an old URL or reposted the same role.
Need weekly monitoringSchedule 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.

  • 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, and runId support.

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.