Hiring Signals Monitor: Buying Signals from Job Postings avatar

Hiring Signals Monitor: Buying Signals from Job Postings

Pricing

from $20.00 / 1,000 company signals

Go to Apify Store
Hiring Signals Monitor: Buying Signals from Job Postings

Hiring Signals Monitor: Buying Signals from Job Postings

Turn a list of companies into sales and recruiting signals: new job postings matching your skills or tools (Rust, Kafka, Snowflake), hiring surges, and technologies added to or dropped from their website. Reads Greenhouse, Lever, Ashby, Recruitee, Personio and Teamtailor. Pay only for signals.

Pricing

from $20.00 / 1,000 company signals

Rating

0.0

(0)

Developer

Michael Costa

Michael Costa

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

Share

What does Hiring Signals Monitor do?

Hiring Signals Monitor turns a list of companies into hiring signals from their job postings: which of them opened roles that mention your keywords (a skill, tool or role: Rust, Kafka, Snowflake, "data engineer"), which are in a hiring surge, and which added or dropped a technology on their website. Data comes live from each company's public job board (Greenhouse, Lever, Ashby, Recruitee, Personio, Teamtailor) and home page.

You get one row per company that has a signal, with a one-line summary. Companies with nothing new aren't rows and aren't charged; they're listed in the run summary. It is not a job-board search: it checks the companies you name.

Try it in one click: the input comes pre-filled with GitLab, Stripe, Palantir and Linear and the keywords Python, Kafka and Rust. In a local run on 2026-09-26 that gave 3 companies with a signal (Linear had none), about $0.06 (3 × $0.02, plus $0.00005 for the run start). Then replace them with your own accounts and keywords.

SignalWhat it meansNeeds
new_roles_matchingRoles that mention a keyword and weren't open at the last run (or, without monitoring, were posted in the last 30 days).Nothing extra
hiring_surgeOpen roles grew by 20% and at least 5 roles within 30 days (all adjustable).Monitoring on
stack_added / stack_removedA technology appeared on, or disappeared from, the company's home page since the last run.Monitoring on and a website domain

Monitor your accounts: signals since the last run, in Slack, email or a webhook

With Only signals since my last run on, each run compares every company with the last run of the same search and returns only what's new: roles that opened since then, a surge, a stack change. A week with nothing new costs only the run start.

  1. Put your companies in Companies (add the website after |, e.g. Ramp | ramp.com, for stack signals), your keywords in Signal keywords, turn on Only signals since my last run ("sinceLastRun": true) and click Start. This first run is the baseline: roles posted in the last 30 days count as new, and the counts and tech stacks are recorded for the next runs.
  2. Click Save as a new task. The memory belongs to that task and its search (keywords, where they're matched, departments, locations): changing the keywords starts a new baseline, adding a company doesn't reset the others.
  3. In Schedules, create a schedule (for example weekly, Monday 06:00) and add the task.
  4. On the task's Integrations tab, send each run's rows where you work:
    • Slack: event "run succeeded", message {{resource.statusMessage}} plus a link to https://console.apify.com/storage/datasets/{{resource.defaultDatasetId}}. Each row's summary reads like "GitLab: 3 new roles matching Kafka since 2026-09-19 (...); open roles 180 -> 221, +22.8% since 2026-09-01".
    • Gmail: attach the dataset as CSV.
    • HTTP webhook: ACTOR.RUN.SUCCEEDED; fetch GET https://api.apify.com/v2/datasets/<defaultDatasetId>/items?format=json with your API token.

The pre-filled input with monitoring on, run twice (local runs, 2026-09-26, 10 real companies): the first run gave 5 companies with a signal; the second, minutes later, gave 0 rows and said "0 of 10 companies with a signal, 10 quiet; compared with the run of 2026-09-27 00:41 UTC".

What data does Hiring Signals Monitor return?

FieldExampleNotes
company, domainGitLab, gitlab.comdomain is null when none is known (see below).
signalTypes["new_roles_matching", "hiring_surge"]One or more of the four signals.
summaryGitLab: 22 new roles matching Python, Kafka, Rust posted in the last 30 days (...)One line, ready for Slack or a CRM note.
newRoles[]{"title": "Staff Software Engineer - NLP", "url": "...", "location": "Bangalore, India", "postedAt": "...", "matchedKeywords": ["Rust"], "matchedIn": ["description"]}Up to 25, title matches first, then newest. newRoleCount has the total.
roleCounts{"openNow": 199, "openLastRun": 187, "matchingNow": 44, "changePercent": 6.4, ...}Last-run and surge fields are null on a baseline.
techStack, techStackCheckedAt["Cloudflare", "Marketo", "Nuxt.js", ...]The home page's technologies and when they were read (with monitoring, re-read every 7 days by default); null if not checked.
stackAdded, stackRemoved[{"name": "HubSpot", "categories": ["Marketing automation"]}]Empty unless it changed.
baseline, previousRunAtfalse, 2026-09-19T06:00:03ZWhether there was anything to compare with.

The full list is under Output.

How much does it cost to monitor hiring signals?

You pay per company with a signal: $20.00 per 1,000 company signals ($0.02 each), plus $0.00005 each time a run starts. Companies with nothing new are free, however many you check; so are companies that fail (board down, not found) and companies left unchecked by your limits. One row covers everything that company signals in that run (all its new roles, a surge and stack changes together).

  • The pre-filled example: 3 companies with a signal × $0.02 = $0.06, plus the start.
  • A month, for example: 200 target accounts checked weekly with monitoring on. If 15% of them show a signal in a given week (an assumption; it depends on your keywords and accounts), that's about 130 rows a month ≈ $2.60. A week where nothing changes costs $0.00005.
  • Caps: Max companies with signals per run in the input, and Maximum cost per run in the run options. The run stops cleanly at whichever comes first; the companies it didn't get to are listed in the run summary (notChecked) and are checked on the next run.

How to monitor hiring signals

  1. Open Hiring Signals Monitor and click Try for free (or Start if you're signed in).
  2. In Companies, list your accounts, one per line: a name (Stripe), a careers page (https://linear.app/careers) or a job-board URL (https://boards.greenhouse.io/gitlab), optionally followed by | website.com.
  3. In Signal keywords, add the skills, tools or role words that mean "this account is a fit": Snowflake, Kafka, data engineer. Optionally limit Departments and Locations.
  4. Turn on Only signals since my last run for a scheduled monitor, then click Start and open the Output tab (views: Signals, New matching roles, Website tech stack). Export as JSON, CSV or Excel.

Example: Python, Kafka and Rust roles at four tech companies

The pre-filled input:

{
"companies": ["https://boards.greenhouse.io/gitlab | gitlab.com", "https://boards.greenhouse.io/stripe",
"https://jobs.lever.co/palantir | palantir.com", "Linear | linear.app"],
"signalKeywords": ["Python", "Kafka", "Rust"]
}

Real output from a local run on 2026-09-26: GitLab 22 new matching roles (199 open), Stripe 40 (702 open; its domain stripe.com was found from its job links), Palantir 8 (321 open); Linear had 30 open roles, 1 matching, none posted in the last 30 days, so it was quiet and not charged. The GitLab row (lists shortened with ...):

{
"id": "6aed9a020fa12e6d-20260927T004219",
"companyId": "6aed9a020fa12e6d",
"company": "GitLab",
"input": "https://boards.greenhouse.io/gitlab | gitlab.com",
"domain": "gitlab.com",
"domainSource": "input",
"jobBoards": ["greenhouse:gitlab"],
"signalTypes": ["new_roles_matching"],
"summary": "GitLab: 22 new roles matching Python, Kafka, Rust posted in the last 30 days (Staff Software Engineer - NLP; Principal Site Reliability Engineer, Platform Engineering: Dedicated; Staff Backend Engineer, Core DevOps, +19 more)",
"newRoleCount": 22,
"newRoles": [
{"title": "Staff Software Engineer - NLP", "url": "https://job-boards.greenhouse.io/gitlab/jobs/8781299002",
"location": "Bangalore, India", "department": "Architecture Engineering", "postedAt": "2026-09-24T06:04:48Z",
"matchedKeywords": ["Rust"], "matchedIn": ["description"]},
"..."
],
"roleCounts": {"openNow": 199, "openLastRun": null, "matchingNow": 44, "matchingLastRun": null, "newMatching": 22,
"surgeReferenceCount": null, "surgeReferenceAt": null, "changePercent": null},
"techStack": ["Cloudflare", "Cloudinary", "Dreamdata", "GitLab", "HSTS", "HTTP/3", "..."],
"techStackCheckedAt": "2026-09-27T00:42:19Z",
"techStackError": null,
"stackAdded": [],
"stackRemoved": [],
"baseline": true,
"previousRunAt": null,
"checkedAt": "2026-09-27T00:42:19Z"
}

The run summary (OUTPUT record) listed the quiet company:

{"input": "Linear | linear.app", "company": "Linear", "domain": "linear.app", "openRoles": 30, "matchingRoles": 1, "techCount": 15, "baseline": true}
.

Input

FieldWhat it does
CompaniesOne per line: name, careers page or job-board URL (greenhouse:gitlab works too), optionally | domain. Up to 500 per run.
Signal keywordsWhole words or phrases, case-insensitive. "Go" doesn't match "Google" and "C" doesn't match "C++". Empty: every new role counts.
Match keywords intitleAndDescription (default) or title only.
Departments, LocationsLimit the roles, and the counts used for surges, to these (contains, case-insensitive).
Only signals since my last runMonitoring (see above). Off: every run reports matching roles posted in the last New roles: posted within days (default 30).
Hiring surge growth %, minimum roles, windowDefault 20%, 5 roles, 30 days.
Check each company's website tech stackOn by default; one home-page fetch per company per run.
Re-check each home page every (days)With monitoring, a home page checked within this many days (default 7) isn't fetched again; techStackCheckedAt says when it was read. 1 = every run.
Only these technologies count as stack signalse.g. HubSpot, Segment, Intercom. Empty: any change counts.
Max companies with signals per runCaps the rows (and so the cost) per run.

Where does the website domain come from?

From what you type after |, else from something the company publishes: the careers page you gave (https://careers.acme.com -> acme.com), its job links when most of them point to its own site (Stripe's do), or a Teamtailor career site on its own domain. It's never guessed from the company's name. Without a domain, job signals work as usual and techStackError says how to add one.

Output

Each row is one company with at least one signal; the fields are the same on every row. Besides the dataset, each run writes two records to its key-value store:

  • OUTPUT: the run summary, with quiet (companies checked with nothing to report: open and matching roles, domain, number of technologies), failed (with the reason), notChecked (left for the next run by your limits), withSignals and limitReached.
  • RUN_STATS: per input line, what it resolved to and any problem, plus signal counts by type.

companyId is the same for a company on every run, so you can group its signals over time; id is unique per row.

Run it on a schedule, or from your own code

Save your input as a task, add it to a schedule, and collect rows from GET https://api.apify.com/v2/actor-tasks/<task id>/runs/last/dataset/items?status=SUCCEEDED&format=csv with your API token, a webhook, or Make, Zapier or n8n. A quiet run succeeds with an empty dataset.

Can I use Hiring Signals Monitor from an AI agent (MCP)?

Yes. Through Apify's MCP server (https://mcp.apify.com) an agent can call it with companies and signalKeywords and read back the rows' summary lines. Every input field's description states its format, defaults and limits.

Who it's for

  • Sales and business development: buying signals on a list of target accounts, the moment one starts hiring for the thing you sell into (a data team hiring Snowflake engineers, a company adding a marketing-automation tool), weekly.
  • Recruiters and agencies: which client or target companies just opened roles in your specialty.
  • Investors and analysts: hiring surges and stack changes across a watchlist.

Why this one?

  • Signals, not raw job dumps. One row per company that changed, with a summary, instead of thousands of job rows to diff yourself. Quiet companies are free.
  • Three signal kinds in one run: matching new roles, hiring surges and website tech-stack changes (the detector behind Website Technology Detector: 100% precision, 98% recall on a 181-site hand-checked benchmark, 2026-09-25).
  • Guards against false signals: a failed board isn't evaluated, a role that briefly disappears isn't re-announced, a board that suddenly lists nothing is held for a run, and a home page that fails or goes blank never reports technologies removed.
  • Live, not a cached index: every run reads the boards and pages at that moment.
  • Polite and safe. It identifies itself honestly (User-Agent HumbleEchidnaApify), follows each site's robots.txt and Crawl-delay, and only requests public web addresses on the standard ports (80 and 443).
  • Reliable. One failing company never affects the others; the log, OUTPUT and RUN_STATS say which and why.

Limits

  • Only companies whose jobs are on Greenhouse, Lever, Ashby, Recruitee, Personio or Teamtailor. Workday, iCIMS, SmartRecruiters, Workable and others are refused with the reason (their terms or robots.txt don't allow this use). Careers pages that load jobs with JavaScript or block bots can't be scanned; paste the job-board URL instead.
  • Surges and stack changes need monitoring on (a previous run to compare with).
  • The tech stack comes from one page, the home page, fetched without a browser: technologies that only load through JavaScript can be missed, and a site behind a bot check is reported as not checked.
  • Up to 500 companies per run; split longer lists into several tasks.
  • Keyword matching is literal: a keyword in a description ("nice to have: Kafka") counts. Use Match keywords in: title for stronger, fewer matches.

FAQ

It reads only feeds each platform publishes for machines, for the companies you list, and each platform's terms were checked before it was added. Greenhouse's docs say "Job Board data is publicly available"; Lever's postings API says published postings "may be scraped by third parties"; Ashby, Recruitee, Personio and Teamtailor document their public job feeds, and their terms bind their customers, not feed readers (details and links in the Changelog). The home page is fetched once, as a normal logged-out visitor, following robots.txt. It collects job postings and technology names only: no recruiter names, emails or other personal data.

Why is a company missing from the results?

It had no signal (it's in OUTPUT.quiet, with its open and matching role counts), it failed (OUTPUT.failed, with the reason: board not found, not a supported platform, blocked by robots.txt), or your limits stopped the run first (OUTPUT.notChecked).

Does it support Workday, iCIMS or LinkedIn?

No. Their terms or robots.txt don't allow this use, so they're refused with the reason instead of scraped.

How is this different from a job scraper?

A job scraper returns every job and leaves the comparison to you. This returns only companies where something changed, with the change summarised, and doesn't charge for the rest. If you want every job, use Company Career Page Jobs Scraper.

How fresh is the data?

Live: each run reads the job boards and home pages at that moment.

ActorUse it when
Company Career Page Jobs ScraperYou want every job at these companies, or new, changed and closed jobs, as rows.
Website Technology DetectorYou want full tech-stack detail (versions, evidence, categories) for a list of websites.

Feedback and support

Found a bug, or need a platform or signal that isn't here? Open an issue on the Issues tab with the input you used.

Versions

Current version: 1.0. See the Changelog tab for what changed in each version.