# Hiring Signals from Greenhouse, Lever and Ashby (`subtle_pluto/hiring-signal-feed`) Actor

Turn company job boards into sales buying signals. Get a 0 to 100 signal score per account, hiring surges, new leadership roles, tools named in job postings, why now, and a ready-to-send opener. Uses the public Greenhouse, Lever and Ashby job board APIs.

- **URL**: https://apify.com/subtle_pluto/hiring-signal-feed.md
- **Developed by:** [Subtle Pluto](https://apify.com/subtle_pluto) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 company reports

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Hiring Signals from Greenhouse, Lever and Ashby Job Boards

**Find the companies that are ready to buy, the week they start hiring.** Give this Actor a list of target accounts. It reads each company's public job board and returns one row per company: a 0 to 100 signal score, what the hiring says they are doing, why now is the moment, a suggested opener, and the role to contact.

Job scrapers hand you thousands of rows. This hands your reps a ranked list of accounts and a reason to call.

### What you get for every company

- **Signal score (0 to 100)**, weighted toward the teams you sell to
- **Buying signal**: what the hiring shows, with real numbers
- **Why now** and a **suggested opener** written for your offer
- **Best role to contact**
- **Signals**: hiring surges, teams being scaled, new leadership roles, slowdowns
- **Open and new roles**, by team and by seniority
- **Tools named in job postings**, such as Salesforce, HubSpot, Snowflake, or NetSuite
- **Published salary ranges**, remote share, and top locations
- Optional: the newest postings for each company

### Sample output

```json
{
  "company": "Ramp",
  "signalScore": 93,
  "buyingSignal": "Ramp has 171 open roles and 13 new, mostly in engineering. 63 of the open roles are in sales. New leadership role: Chief Compliance Officer.",
  "suggestedOpener": "Noticed Ramp has 63 open sales roles and thought sales onboarding software could help the new hires ramp faster.",
  "bestContactRole": "Head of Sales",
  "signals": [
    "Hiring in your target team (sales): 63 open, 2 new in the last 7 days.",
    "Steady hiring: 13 new roles in the last 7 days (8% of open roles).",
    "Scaling engineering: 6 new roles in the last 7 days, 39 open in total."
  ],
  "openRoles": 171,
  "newRoles": 13,
  "toolsNamedInPostings": [{ "tool": "Salesforce", "postings": 31 }, { "tool": "NetSuite", "postings": 25 }],
  "salaryExamples": ["$211.4K – $290.6K • Offers Equity"]
}
```

Sample from a live test run in October 2026. Numbers change daily.

### Who uses it

- **Sales teams and SDRs** prioritizing target accounts each week
- **RevOps and growth teams** feeding fresh signals into a CRM, Clay, or a sequencing tool
- **Agencies and recruiters** spotting companies that are scaling a team
- **Investors and analysts** tracking hiring momentum across a portfolio or a market

### How to find hiring signals for your target accounts

1. Add companies under **Companies to watch**, one per line. A website (`acme.com`) works: the Actor finds the company's public job board for you. Board links and short codes also work: `greenhouse:acme`, `jobs.lever.co/acme`, `jobs.ashbyhq.com/acme`.
2. Describe **what you sell** in one line, and pick the **teams you sell to**.
3. Run it once to see today's picture.
4. Schedule it weekly. From the second run on, new roles are counted since your last run, and closed roles show up as possible slowdowns.
5. Optional: add a webhook to push the ranked list into Zapier, Make, n8n, Clay, or your CRM.

### Where the data comes from

The Actor reads the official public job board endpoints that Greenhouse, Lever, and Ashby publish for exactly this purpose. It needs no logins, no proxies, and no scraping of protected sites. Companies on other applicant tracking systems are marked `no-board-found` and are not charged.

### Pricing

| Event | Price |
| --- | --- |
| Company analyzed (board found and read successfully) | $0.05 |

That is $50 per 1,000 company signals. Companies with no public board, or boards that fail to load, are never charged.

### Output statuses

| Status | Meaning |
| --- | --- |
| `ok` | The company was analyzed. |
| `no-board-found` | No public Greenhouse, Lever, or Ashby board was found. Not charged. |
| `error` | The board could not be read. Not charged. |
| `skipped-budget` | The run hit your spending limit before this company. Not charged. |

A ranked summary of the top companies is saved to the key-value store record `OUTPUT`.

### Good to know

- Job history lives in a named key-value store in your own account (`hiring-signal-state` by default), so each run knows what is new.
- Tool detection is keyword based. A company's own product name can match a tool name, so treat tool counts as a strong hint, not a fact.
- Scores are relative signals for prioritizing outreach. They are not predictions of a purchase.

### FAQ

#### What are hiring signals?

Hiring signals are changes in a company's open jobs that hint at what it needs next. A burst of new sales roles, a new VP, or a tool named in dozens of postings tells a seller the account is moving and who to call.

#### Where does the job data come from?

From each company's public job board through the official Greenhouse, Lever and Ashby job board APIs. No LinkedIn scraping and no login.

#### Can I use a company website instead of a job board link?

Yes. Websites are scanned for a public Greenhouse, Lever or Ashby board. Companies without one are marked no-board-found and are not charged.

#### How do I send hiring signals to my CRM or Clay?

Add a webhook URL. After each run the ranked list of companies is POSTed as JSON, which Zapier, Make, n8n, Clay and most CRMs can receive.

#### How often should I run it?

Weekly or daily. On the first run, roles count as new if they were posted within your lookback window. After that, new roles are counted since your previous run.

### More tools from Subtle Pluto

- [Website Change Monitor with AI Alerts](https://apify.com/subtle_pluto/ai-website-change-monitor): real changes on competitor pricing, plan and policy pages, explained by AI.
- [Shopify Competitor Price Tracker](https://apify.com/subtle_pluto/shopify-catalog-watch): every price change, sale, sellout and launch on competitor Shopify stores.
- [Google Review Responder: AI Reply Generator](https://apify.com/subtle_pluto/google-review-responder): new Google reviews for every location, with AI-drafted owner replies and low-star alerts.

### Support

Open an issue on the Issues tab. We aim to reply the same day.

# Actor input Schema

## `companies` (type: `array`):

One per line. Use a company website (acme.com), a job board link (job-boards.greenhouse.io/acme, jobs.lever.co/acme, jobs.ashbyhq.com/acme), or a short code such as greenhouse:acme. Websites are scanned for their public job board automatically.

## `sellerOffer` (type: `string`):

One line about your product or service. The brief and the suggested opener are written for this offer, for example: sales onboarding software for fast-growing SDR teams.

## `focusFunctions` (type: `array`):

Companies hiring in these teams score higher.

## `lookbackDays` (type: `integer`):

Used on the first run. After that, new roles are counted since your previous run, which is more accurate.

## `minSignalScore` (type: `integer`):

Signal score runs from 0 to 100. Set 30 or higher to keep only companies with a clear signal.

## `useAI` (type: `boolean`):

When on, each company gets a plain-English buying signal, why now, a suggested opener, and the best role to contact. When off, built-in rules write a shorter brief.

## `includeJobs` (type: `boolean`):

Adds the most recent postings to each company row.

## `maxJobsPerCompany` (type: `integer`):

How many recent postings to include per company when postings are included.

## `notifyWebhookUrl` (type: `string`):

The ranked list of companies is POSTed here as JSON after each run. Works with Zapier, Make, n8n, Clay and your CRM.

## `anthropicApiKey` (type: `string`):

Optional. Leave empty to use the built-in AI.

## `maxCompanies` (type: `integer`):

A safety cap on how many companies one run checks.

## `stateStoreName` (type: `string`):

Job history lives in this named key-value store in your account so the next run knows what is new.

## Actor input object example

```json
{
  "companies": [
    "greenhouse:airbnb",
    "jobs.ashbyhq.com/ramp",
    "jobs.lever.co/palantir"
  ],
  "lookbackDays": 7,
  "minSignalScore": 0,
  "useAI": true,
  "includeJobs": false,
  "maxJobsPerCompany": 25,
  "maxCompanies": 500,
  "stateStoreName": "hiring-signal-state"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "greenhouse:airbnb",
        "jobs.ashbyhq.com/ramp",
        "jobs.lever.co/palantir"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("subtle_pluto/hiring-signal-feed").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "companies": [
        "greenhouse:airbnb",
        "jobs.ashbyhq.com/ramp",
        "jobs.lever.co/palantir",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("subtle_pluto/hiring-signal-feed").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "greenhouse:airbnb",
    "jobs.ashbyhq.com/ramp",
    "jobs.lever.co/palantir"
  ]
}' |
apify call subtle_pluto/hiring-signal-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,subtle_pluto/hiring-signal-feed"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/r6btkU7hA3IFv5Xyv/builds/3akR5bEyB4zaebLpw/openapi.json
