Hiring Signals Monitor | Greenhouse, Lever, Ashby Job Events avatar

Hiring Signals Monitor | Greenhouse, Lever, Ashby Job Events

Pricing

from $3.00 / 1,000 company monitoreds

Go to Apify Store
Hiring Signals Monitor | Greenhouse, Lever, Ashby Job Events

Hiring Signals Monitor | Greenhouse, Lever, Ashby Job Events

Job events (opened, updated, closed, reopened) with stable IDs plus a company hiring summary from public Greenhouse, Lever and Ashby boards. No login. Pay per company monitored and per event.

Pricing

from $3.00 / 1,000 company monitoreds

Rating

0.0

(0)

Developer

Kesar Chen

Kesar Chen

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Security

Limited permissions

Share

Hiring Signals Monitor

Give it a list of companies. Get job events, not job dumps: every run compares each company's public job board with the last run and writes opened, updated, closed and reopened events with a stable job ID and a sequence number, plus one company summary per run with open jobs, 7-day and 30-day net hiring, breakdown by function and location, the first hire in a function in six months, and salary coverage. Built on the public job boards of Greenhouse, Lever, Ashby, Recruitee, Workable, Teamtailor, Gem and Personio, no login, no key. Pay per company monitored and per event, no start fee: 200 companies checked daily is about $25 a month plus $1 per 1,000 events.

Why events instead of rows

Job-posting APIs sell you rows and leave the hard part to you: deduplicating across runs, noticing what disappeared, and working out that a company just posted its first sales role. Closed roles are as much a signal as new ones, and nobody sends them. This Actor keeps a snapshot per board in a named key-value store and emits only what changed:

EventFires whenCarries
openeda job ID appears for the first timetitle, function, seniority, locations, salary with source, liveness, URL, note such as first sales role in 180+ days
updatedtitle, location or description changedthe new values
closedan ID disappeared while the board itself answereddaysOpen, the last known title and URL
reopeneda closed ID came back, or Greenhouse / Gem re-posted the same requisition under a new IDthe date it was closed
board_unreachablethe board did not answerthe miss count; no jobs are marked closed on a miss

Every event has seq, increasing per board. Store the last seq you processed and resume from it; each event is billed once.

What you get that job APIs do not

  • A company row per run with openJobs, opened7d, closed7d, net7d, opened30d, closed30d, byFunction, byDepartment, byLocation, remoteShare, firstHireInFunction, salaryCoverage, staleShare90d, and the mapping audit (source, lastVerifiedAt, consecutiveMisses). That is the "is this account ramping up or freezing" answer in one row.
  • Salary with provenance. source: "structured" when the board publishes a range (Ashby and Greenhouse do; Lever, Recruitee and Teamtailor can), source: "description" when it was parsed from the text with a fixed rule and a confidence score. Never estimated.
  • Function and seniority by fixed rules, not a model: engineering, sales, marketing, customer, people, finance, legal, product, design, data, security, infrastructure, operations; intern through executive.
  • Liveness you can explain, not a ghost-job score. Every job and event carries liveness: days alive since the board's publish date, how many consecutive runs it was seen, how often it was reopened, and how many open jobs on the board share its title (multi-city duplicates). The company row adds staleShare90d, the share of open jobs older than 90 days. You decide the threshold; the evidence is on the row.
  • Domain in, board out. Paste stripe.com; the Actor reads the careers page, finds the Greenhouse, Lever, Ashby, Recruitee, Workable, Teamtailor, Gem or Personio board, verifies it answers, and remembers the mapping with the date it was last verified. A board that merely shares the company's name is not accepted unless it provably belongs to that domain. Companies with no discoverable board are skipped and never charged.
  • Alerts built in. Post matching events to Slack, Discord, Feishu or any webhook, filtered by event type and function, with an optional "net drop over 7 days" trigger for hiring freezes.
  • Honest degradation. A board that stops answering produces board_unreachable and a status: unreachable company row, not a wave of false closed events. Three misses in a row mark it retired and keep it in the output so you can see it.

Who uses it

  • Sales and SDR teams watch target accounts: notifyFunctions: ["sales"] posts every new sales role; firstHireInFunction is the "they are building a team" trigger.
  • Recruiters watch competitors' openings and closings per function and location.
  • Investors and analysts track net7d and net30d across a portfolio or a sector list, with the board-level audit trail.
  • AI agents read /events through the Apify MCP server; every field is described in the dataset schema.

Run it in the Apify Console

  1. Paste companies into Companies: domains (stripe.com), board URLs, or greenhouse:stripe / lever:spotify / ashby:ramp / recruitee:bunq / workable:epignosis / teamtailor:career.teamtailor.com / gem:gem / personio:personio.
  2. Leave Write current jobs on first run on if you want the baseline rows; turn it off if you only want changes.
  3. Click Start. The first run stores the baseline and writes company rows. Schedule the Task (daily or every 6 hours); from the second run on you get events.
  4. Optional: fill Notify: webhook URL and pick event types and functions.

Use one State store name per monitoring list. The named store holds each board's snapshot and the domain-to-board mapping, and never expires.

Pricing

EventPrice
Company monitored (one board checked in one run, changed or not)$0.004
Job event (opened / updated / closed / reopened written)$0.001
Job row (baseline rows on a board's first run, optional)$0.001
Board resolved (a domain mapped to a board for the first time)$0.01
ScenarioCost
50 companies, daily, first monthabout $6 plus baseline rows once (a 300-job board is $0.30)
200 companies, dailyabout $24 a month plus events, typically a few dollars
1,000 companies, dailyabout $120 a month plus events

Unchanged boards still count as monitored (the check is the service), but cost nothing in events. Apify platform usage is included. Paid Apify plans get lower per-event prices, shown on the Actor page.

Input

FieldTypeDefaultNotes
companieslistrequiredDomains, board URLs, or system:slug for any of the eight systems
resolveUnknownbooleantrueResolve plain domains via the careers page; a same-name board is used only if it provably belongs to the domain
emitSnapshotRowsbooleantrueWrite current jobs (type: job) on a board's first run
includeDescriptionbooleanfalseInclude posting text in job rows
maxJobsPerBoardinteger0Safety cap, 0 = all
stateStoreNametexthiring-signals-stateOne per monitoring list. If a store with this name already exists in your account but was created by another Actor, the run logs a warning and uses <name>-<actor id> instead
notifyWebhookUrltextemptySlack, Discord, Feishu or any HTTPS webhook
notifyEventslistopened, closed, reopenedEvent types to post
notifyFunctionslist[]Only these functions; empty = all
notifyMinNet7dDropinteger0Also post when open jobs fell by at least this many in 7 days
notifyMaxItemsinteger15Events per message

Minimal example:

{ "companies": ["stripe.com", "ramp.com", "lever:spotify"] }

Output

Event row:

{
"type": "event",
"seq": 42,
"eventType": "opened",
"at": "2026-10-26T08:00:00.000Z",
"domain": "ramp.com",
"ats": "ashby",
"slug": "ramp",
"jobKey": "ashby:ramp:3f1c…",
"title": "Enterprise Account Executive",
"department": "Sales",
"jobFunction": "sales",
"seniority": { "value": "mid", "source": "title-rule" },
"liveness": { "daysAlive": 0, "verifications": 1, "reopenCount": 0, "sameTitleOpen": 1 },
"locations": ["New York"],
"remote": false,
"salary": { "min": 150000, "max": 200000, "currency": "USD", "period": "year", "source": "structured", "confidence": 1 },
"url": "https://jobs.ashbyhq.com/ramp/3f1c…",
"firstSeenAt": "2026-10-26T08:00:00.000Z",
"closedAt": null,
"daysOpen": 0,
"note": "first sales role in 180+ days"
}

Company row:

{
"type": "company",
"at": "2026-10-26T08:00:00.000Z",
"domain": "ramp.com",
"ats": "ashby",
"slug": "ramp",
"status": "ok",
"openJobs": 167,
"opened7d": 9,
"closed7d": 4,
"net7d": 5,
"opened30d": 31,
"closed30d": 22,
"byFunction": { "engineering": 70, "sales": 41, "customer": 12 },
"byLocation": { "New York": 120, "Remote": 30 },
"remoteShare": 18.0,
"firstHireInFunction": ["sales"],
"salaryCoverage": 95.8,
"staleShare90d": 12.0,
"mapping": { "source": "careers-page", "firstSeenAt": "2026-10-01T08:00:00.000Z", "lastVerifiedAt": "2026-10-26T08:00:00.000Z", "consecutiveMisses": 0 },
"runNote": "board returned 167 jobs"
}

Limitations

  • Covers Greenhouse, Lever, Ashby, Recruitee, Workable, Teamtailor, Gem and Personio boards. Companies on Workday, SmartRecruiters, iCIMS, SuccessFactors, LinkedIn-only or Indeed-only postings are not resolved; they are reported as "no job board found" and not charged.
  • Resolution reads the public careers page. Sites that render the link only in a browser may not resolve; give the board URL or ats:slug directly in that case.
  • Salary ranges exist only where the company publishes them; coverage per company is in salaryCoverage.
  • The first run of a board is a baseline and produces no events. Hiring windows (opened7d, net30d) fill in as history accumulates.
  • Events are computed from what the board serves. A posting removed and re-added within one interval between runs is seen as unchanged.
  • Teamtailor sites on a custom domain are found when the careers page is the Teamtailor site itself; otherwise give teamtailor:<careers host>.
  • Workable's board feed does not include salary; Personio's feed does not include it either. Those rows carry salary only when parsed from the description.

Scheduling and integrations

Save the input as a Task, attach a Schedule, and point notifyWebhookUrl at Slack or Discord, or push the dataset into Clay, HubSpot, Google Sheets or n8n through Apify integrations. For an API, read the dataset with ?fields= and filter on seq.

FAQ

Is it legal? The job boards involved publish these listings without login or key for exactly this kind of distribution; the Actor reads them as any browser would, stores no personal data, and omits full posting text by default. How you use the output is your responsibility.

Why no Workday or LinkedIn? Their terms forbid automated access or they sit behind anti-bot checks. This Actor only uses sources whose public job boards are meant to be read.

Can I get all companies on Greenhouse? No. There is no directory of boards; you bring the list of companies you care about, which is also the only list that matters for your pipeline.

Is this affiliated with any of the job board systems? No. Independent tool, not endorsed by any of them.

How do I know a source is still working? A daily check hits one known board per system. The result row (type: "canary") carries the 7-day success rate per system; a system that fails the check fails the run, so a Schedule with a failure alert tells you the same day. Collected since 2026-10-26; once there are 30 days of history the table goes into this README.

See also

By the same author, same schema conventions: App Store Reviews Scraper, Google Play Reviews Scraper, Steam Reviews Scraper.

Support

Bugs, a board that does not resolve, or a job board system you need: open an issue on the Issues tab. Reports go to a human.