Hiring Signals Monitor: Roles Opened & Closed avatar

Hiring Signals Monitor: Roles Opened & Closed

Pricing

from $16.00 / 1,000 company snapshots

Go to Apify Store
Hiring Signals Monitor: Roles Opened & Closed

Hiring Signals Monitor: Roles Opened & Closed

Weekly hiring snapshot per company from Greenhouse, Lever, Ashby, Recruitee and Personio boards: roles opened and closed since last run, velocity, team and location mix, pay ranges and rule-based signals such as surges and new teams.

Pricing

from $16.00 / 1,000 company snapshots

Rating

0.0

(0)

Developer

Saiber Operations

Saiber Operations

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Hiring Signals Monitor: Roles Opened & Closed per Company (Greenhouse, Lever, Ashby)

Watch a list of companies and get one hiring snapshot per company per run: how many roles are open, which roles opened and closed since your last run, hiring velocity, the team / location / remote mix, published pay ranges, and plain-language signal tags such as surge, new_department or leadership_role_opened. It reads each employer's own public job board on Greenhouse, Lever, Ashby, Recruitee or Personio, so it's live, not a stale database.

Built for:

  • B2B sales and RevOps. Hiring is the cheapest early buying signal. Three new SDR roles means a sales-tooling purchase is coming; a new Head of Security means security software. Run it weekly over your target accounts and act on the deltas.
  • Agencies. Spot prospects that just opened marketing, RevOps or engineering roles.
  • VC, PE and analysts. Headcount momentum for portfolio companies and competitors, by team and location.
  • Recruiting firms. See which companies are scaling which teams before the roles reach job sites.
  • AI agents. One structured row per company, no API key.

Sample output

A company snapshot (role lists shortened):

{
"recordType": "snapshot",
"stateKey": "default",
"company": "coinbase",
"companyName": "Coinbase",
"ats": "greenhouse",
"boardUrl": "https://job-boards.greenhouse.io/coinbase",
"status": "ok",
"runAt": "2026-10-31T12:00:00Z",
"previousRunAt": "2026-10-24T12:00:00Z",
"daysSincePrevious": 7.0,
"isBaseline": false,
"openRoles": 214,
"openedCount": 12,
"closedCount": 4,
"changedCount": 2,
"reopenedCount": 0,
"netChange": 8,
"opened": [{ "globalId": "greenhouse:coinbase:9000001", "title": "VP, Sales", "department": "Sales", "primaryLocation": "Remote - US", "workplaceType": "remote", "jobUrl": "https://www.coinbase.com/careers/positions/9000001", "postedAt": "2026-10-29T00:00:00Z" }],
"velocity": { "windowDays": 30, "openedLastNDays": 31, "closedLastNDays": 9, "openedPerWeek": 7.23, "closedPerWeek": 2.1, "medianDaysToClose": 41.5, "medianPostingAgeDays": 38.0, "oldestOpenPostingDays": 212.4 },
"byDepartment": { "Engineering": { "open": 88, "opened": 5, "closed": 1 }, "Sales": { "open": 21, "opened": 4, "closed": 0 } },
"workplace": { "remote": 120, "hybrid": 61, "onsite": 3, "unknown": 30, "remoteShare": 0.561 },
"pay": { "jobsWithRange": 198, "share": 0.925, "annualByCurrency": { "USD": { "min": 90000, "max": 410000, "count": 160, "medianMidpoint": 187000 } } },
"signals": [
{ "tag": "surge", "detail": "opened 12 roles in 7 days vs 3.0/week before" },
{ "tag": "department_expansion:Sales", "detail": "4 roles opened in Sales" },
{ "tag": "leadership_role_opened", "detail": "VP, Sales" }
],
"topSignal": "surge"
}

(Illustrative example.) With change events on, each opened, closed or changed role is also its own row (recordType: "change", eventType: "opened" | "closed" | "changed", title, departments, location, workplace, employment type, pay, URL, first and last seen). Dataset tabs: Snapshots, Signals, Changes. All rows go to one dataset, so the Changes tab also lists snapshot rows (with empty change columns): when you export or integrate change events, filter on recordType = "change" (and on recordType = "snapshot" for snapshots).

How monitoring works

  1. The first run for a company records a baseline: a full snapshot with isBaseline: true and zero deltas.
  2. Every later run compares the board with what was saved and reports what opened, closed or changed in between.
  3. What each run saw is kept in your Apify account's key-value store named saiberops-hiring-signals, per watchlist name, so it works from a schedule, a saved task, the API or a manual run, as long as it's the same account and watchlist name. Use different watchlist names for different lists. If you leave the name at default, a run started from a saved Apify task uses task-<task ID> instead, so each saved task automatically keeps its own memory; runs outside a task share default.

Inputs

InputWhat it does
CompaniesJob-board URLs, shorthands (greenhouse:stripe, lever:spotify, ashby:ramp, recruitee:acme, personio:acme) or careers-page URLs. Up to 1,000 per run.
Watchlist nameSeparate memory per list. Left at default, each saved task gets its own (task-<task ID>); other runs share default.
Also output one row per opened, closed or changed roleChange-event rows, charged per row. Off by default.
List roles inside each snapshotUp to 100 opened / closed / changed roles per snapshot, free. On by default.
Velocity window (days)7–90, default 30.
Detect edited rolesTitle, location, department, employment type, workplace type or pay changes. On by default.
Start over for this watchlistRecords a new baseline.
Max jobs read per companySafety cap (default 5,000). A capped board reports no closures that run; roles it didn't reach are kept, and a role unseen on 4 capped runs in a row is dropped from memory without being reported as closed.
Detect the ATS from careers pages / Guess the board name / Respect robots.txtSame discovery as the ATS Job Feed.

Schedule it weekly (or daily) in Apify. Paste careers-page URLs rather than plain company names.

Pricing

Pay per event.

EventFree planBronzeSilverGold
Company snapshot$0.025$0.02$0.018$0.016
Role change event (optional)$0.0025$0.002$0.0018$0.0016
Careers page detected$0.0025$0.002$0.0018$0.0016

A 500-company watchlist checked weekly costs about $10 a week at Bronze, plus Apify's standard Actor start fee. Not charged: snapshots for companies whose board couldn't be read (status: "stale" or "error"), suspicious snapshots (see Limits), board URLs and shorthands (no detection needed), cached detections, detections for a company whose snapshot wasn't charged in that run (the detection is cached and later runs reuse it free), and anything after your Max cost per run, where the Actor stops cleanly.

Integrations and API

Send snapshots to Google Sheets, a CRM, Slack, Make, Zapier or n8n through Apify's integrations, or call it from the Apify API. A common setup: weekly schedule, then a Slack alert for every snapshot whose signals list isn't empty. AI agents can use it through Apify's MCP server.

Limits

  • Supported ATSs: Greenhouse, Lever, Ashby, Recruitee and Personio. Workable, SmartRecruiters, BambooHR, Teamtailor, Rippling, Workday and iCIMS boards are recognised but not read yet.
  • Signal tags are simple, documented rules (no AI): surge (5+ roles opened and at least 3× the recent weekly rate; needs two earlier runs), new_department (first role ever seen in a department), department_expansion:<name> (3+ roles opened in one department), first_remote_role, leadership_role_opened (Head of, Director, VP, Chief, C-level titles), hiring_freeze_signal (5+ closed, none opened, open roles down 30% or more), pay_range_published (first structured pay range on the board), roles_reopened (re-posted within 60 days of closing).
  • Safety guards: if a board can't be read, the saved state is left untouched, so an outage never looks like mass closures. If only Greenhouse's department list fails, roles keep the departments seen before and no role is reported as changed for it. If more than 80% of a company's known roles (at least 5) vanish at once, the snapshot is marked suspicious, the known roles are kept, and it isn't charged. If the next run sees exactly the same reduced set of roles, the closures are real: that run's snapshot reports them (with hiring_freeze_signal where it applies, and closed-role events if they're on), is charged as usual and carries a MASS_CLOSURE_CONFIRMED note. A board that comes back in full in between reports no closures.
  • Pay: only annual ranges are summarised per currency; no currency conversion. Greenhouse ranges don't state an interval, so it's inferred (see the ATS Job Feed's notes).
  • No job descriptions and no people. Snapshots and events contain company, role, location, pay, dates and URLs only. Recruiter and hiring-manager names or emails are never output.
  • Unlisted Ashby jobs (direct-link-only) are not counted.
  • If a run hits the max cost while writing change events, the remaining events for that company are skipped (the snapshot still lists the roles).
  • A host that answers 403 or 429 (or a bot challenge) is not called again during that run. No proxies are used.

FAQ

Why are all my snapshots "baseline"? It's the first run for those companies under that watchlist name (or Start over was on). The next run shows deltas.

Can I monitor the same companies for two clients? Yes: use two watchlist names, or two saved tasks with the name left at default (each task then keeps its own memory). To make two tasks share one memory, give them the same watchlist name.

A company shows status: "error". Open the DETECTION and RUN_SUMMARY records: the board name may be wrong, or the careers page doesn't link a supported board.

How is "days to close" measured? From the ATS's posted date (or the first run that saw the role) to the run that found it gone.

Responsible use and data sources

The Actor reads only what each employer already publishes for its own careers page, through the ATS vendors' public, no-login job-board endpoints (Greenhouse Job Board API, Lever Postings API, Ashby public job posting API, Recruitee Careers Site API, Personio's public job XML feed). It identifies itself as SaiberOpsBot with a contact address, follows robots.txt (RFC 9309) on every host it calls, paces itself to about two requests per second per host, never logs in, never uses proxies, and stops calling a host that answers 403 or 429. Output is business data about job openings; free-text fields that can contain personal data are never read. Not affiliated with or endorsed by any ATS vendor or employer.

Support

Found a bug or want another signal rule? Open an issue on this Actor's Issues tab and we'll respond there.

Maintained by Saiber Operations LLC.