Hiring Signal Tracker avatar

Hiring Signal Tracker

Pricing

from $0.50 / 1,000 results

Go to Apify Store
Hiring Signal Tracker

Hiring Signal Tracker

Extract structured hiring signals and growth metrics from Greenhouse, Lever, and Ashby. Track headcount changes, department breakdowns, and new role velocity over time. Perfect for VCs, recruiters, and sales teams seeking real-time intent data from public job boards.

Pricing

from $0.50 / 1,000 results

Rating

0.0

(0)

Developer

Emiliano Mastragostino

Emiliano Mastragostino

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

📊 Hiring Signal Tracker

Extract structured hiring signals from public job boards. Point the Hiring Signal Tracker at any Greenhouse, Lever, or Ashby job board URL and get back role counts, department breakdowns, hiring locations, growth rates, and signal strength — all as clean, structured JSON.

Built for extensibility, I'm actively scaling supported ATS integrations based on user demand — see the Roadmap below for more.

Click Start in the Apify Console to try it instantly, or call the Apify API to integrate it into your workflow. Schedule runs to track hiring trends over time — the Actor automatically compares snapshots across runs to compute growth metrics.

⭐ Key Features

  • Multi-ATS support — Fetches jobs from Greenhouse, Lever, and Ashby via public APIs, with additional platforms added by request
  • Role bucketing — Classifies every open role into engineering, sales, marketing, operations, product, design, or other
  • Hiring signal scoring — Computes signal strength (high / medium / low / none) based on headcount and growth rate
  • Cross-run snapshot diffing — Tracks new roles added, roles removed, net change, and daily growth rate between runs
  • Location extraction — Normalizes and deduplicates hiring locations across all open positions
  • Bulk processing — Analyze up to 10,000 job boards per run with configurable concurrency
  • Structured error handling — Every board gets an output record, even on failure — with typed error codes and human-readable reasons

💡 Why Use This Actor?

Sales & revenue teams — Identify companies in active hiring mode as buying signals. A company adding 15 engineering roles in 30 days likely has budget and urgency for developer tools, infrastructure, and services.

Recruiters & talent teams — Monitor competitor hiring patterns, spot emerging roles, and track which functions are scaling fastest across a target list.

Market researchers — Build longitudinal datasets of hiring activity across industries. Scheduled runs produce time-series data you can export to Google Sheets, Snowflake, or any downstream tool via Apify integrations.

Investors & analysts — Use headcount velocity as an alternative data signal. Growth rate and department mix reveal where a company is investing before earnings reports do.

🔒 Compliance & Privacy

This Actor only accesses publicly available job board data. It does not require authentication, bypass logins, or access private candidate data. It is designed to be a respectful consumer of public ATS APIs.

📥 Input

The only required field is jobBoards — an array of job board URLs with optional metadata. See the Input tab for the full schema and defaults.

{
"jobBoards": [
{
"url": "https://boards.greenhouse.io/airbnb",
"companyName": "Airbnb",
"companyDomain": "airbnb.com"
},
{
"url": "https://jobs.lever.co/kinsta",
"companyName": "Kinsta"
},
{
"url": "https://jobs.ashbyhq.com/linear"
}
],
"includeJobsSample": 5,
"timeWindowDays": 30,
"debug": false
}

🔗 Supported URL Formats

ATSURL PatternExample
Greenhousehttps://boards.greenhouse.io/{slug}https://boards.greenhouse.io/airbnb
Leverhttps://jobs.lever.co/{slug}https://jobs.lever.co/kinsta
Ashbyhttps://jobs.ashbyhq.com/{slug}https://jobs.ashbyhq.com/linear

The Actor extracts the company slug automatically. URLs for unsupported ATS providers produce an error record (not a crash) with error code UNSUPPORTED_ATS.

⚙️ Key Parameters

ParameterDefaultDescription
includeJobsSampledisabledSet to a number (1–50) to include a sample of job titles, departments, and URLs in each output record. Useful for spot-checking results.
timeWindowDays30Jobs created within this window are counted as "new roles" for signal calculation.
snapshotMaxAgeDays60Previous snapshots older than this are ignored — the run is treated as a first run.
maxConcurrency10Number of job boards processed in parallel. Increase for large batches; decrease if you hit rate limits.

📤 Output

Each job board URL produces one CompanySignal record in the default dataset. Here is a realistic example:

{
"inputUrl": "https://boards.greenhouse.io/airbnb",
"companyName": "Airbnb",
"companyDomain": "airbnb.com",
"atsProvider": "greenhouse",
"atsCompanySlug": "airbnb",
"isHiring": true,
"totalOpenRoles": 142,
"engineeringRoles": 58,
"salesRoles": 12,
"marketingRoles": 18,
"operationsRoles": 22,
"productRoles": 14,
"designRoles": 9,
"otherRoles": 9,
"primaryHiringFunction": "engineering",
"locationsHiring": ["San Francisco, CA", "New York, NY", "Seattle, WA", "Remote", "London, UK"],
"lastJobUpdatedAt": "2026-03-05T18:42:00.000Z",
"isFirstRun": false,
"newRolesSinceLastRun": 23,
"removedRolesSinceLastRun": 8,
"netRoleChange": 15,
"daysSinceLastSnapshot": 14,
"growthRatePerDay": 1.07,
"previousSnapshotDate": "2026-02-21T10:15:30.000Z",
"signalStrength": "high",
"signalConfidence": "high",
"reasons": ["Signal: high, Confidence: high", "23 new roles, 8 removed since last snapshot"],
"jobsSample": [
{
"id": "6142987",
"title": "Senior Software Engineer, Payments",
"department": "Engineering",
"location": "San Francisco, CA",
"url": "https://boards.greenhouse.io/airbnb/jobs/6142987"
}
],
"error": null,
"errorCode": null,
"processedAt": "2026-03-07T12:30:45.123Z",
"actorVersion": "1.0.0",
"processingTimeMs": 1842
}

📊 Key Output Fields

FieldDescription
signalStrengthhigh / medium / low / none — based on total headcount and growth rate
signalConfidencehigh / medium / low — higher when snapshot history is available
primaryHiringFunctionDepartment with the most open roles (engineering, sales, marketing, operations, product, design, other, balanced)
growthRatePerDayNet roles added per day since last snapshot. Only available on second+ runs
isFirstRuntrue on the first run for a given board — no diff metrics available yet
error / errorCodeNon-null when processing failed. Typed codes: UNSUPPORTED_ATS, API_NOT_FOUND, API_PRIVATE, FETCH_FAILED, RATE_LIMITED, TIMEOUT

🔄 Snapshot Diffing & Growth Tracking

The Actor stores a snapshot of job IDs after each successful run in a named Key-Value store (hiring-signal-snapshots by default). On subsequent runs, it compares the current jobs against the previous snapshot to compute:

  • New roles — jobs present now but absent in the previous snapshot
  • Removed roles — jobs in the previous snapshot that are no longer listed
  • Net change — new minus removed
  • Growth rate — net change divided by the number of days between snapshots

To take advantage of this, schedule the Actor to run regularly (e.g., weekly). The first run for each board will always have isFirstRun: true and null diff metrics.

Snapshot keys follow the format snapshot_{atsProvider}_{slug}, so the same board URL always maps to the same snapshot regardless of optional metadata like companyName.

Growth Rate Calculation

The growth rate is calculated as the number of new roles added divided by the number of days since the last snapshot, providing a daily average of new positions:

  • Formula: growthRatePerDay = newRolesSinceLastRun / daysSinceLastSnapshot
  • Example: If 23 new roles were added over 14 days, the rate is 23 / 14 ≈ 1.64 roles per day.

Note: This helps normalize hiring spikes (e.g., a company posting 50 roles on a Monday vs. steady growth over a month), making it easier to compare hiring velocity across different time windows.

💡 Tips

  • Start small — Test with 3–5 boards before scaling to hundreds. Verify the output shape meets your needs.
  • Include job samples — Set includeJobsSample: 5 during development to inspect actual job titles and departments in the output.
  • Watch for private boards — Some Greenhouse boards are private and return a 403. These produce an error record with code API_PRIVATE.
  • Rate limiting — The Actor respects ATS rate limits internally. If you consistently see RATE_LIMITED errors, reduce maxConcurrency.

🔌 Integrations

Export results to any destination supported by Apify:

  • Google Sheets — Auto-sync dataset rows for live dashboards
  • Webhooks — Trigger alerts when signalStrength is high
  • Zapier / Make — Route hiring signals into CRM, Slack, or email workflows
  • API — Fetch results programmatically via the Apify API

🗺️ Roadmap

Support for additional ATS platforms is planned. Candidates include Workday, iCIMS, SmartRecruiters, BambooHR, Jobvite, and Taleo — but priorities will be driven by demand. If there's a platform you'd like to see supported, feel free to reach out or open a feature request.

🛟 Support

This Actor is actively maintained. Need help or want to customize it?