# Company Hiring Signals: Who's Hiring Tracker (`mystique-lab/hiring-signal-tracker`) Actor

Track which companies are hiring, how fast and in which teams. One row per company: open roles, roles posted in 7/30/90 days, department mix, new and closed roles since the last run, and a 0–100 hiring score. Greenhouse, Lever, Ashby, Workday and more. $5 per 1,000 companies.

- **URL**: https://apify.com/mystique-lab/hiring-signal-tracker.md
- **Developed by:** [Mystique Lab](https://apify.com/mystique-lab) (community)
- **Categories:** Lead generation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 company checkeds

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

## Company Hiring Signals: Who's Hiring Tracker

Company hiring signals from public job boards. Paste company names or careers pages and get **one row per company** with open roles, hiring
velocity, department mix, a hiring score, and what changed since your last run.

![hiring-signal-tracker demo](https://api.apify.com/v2/key-value-stores/cRIPJiTuB8saU3ee6/records/hiring-signal-tracker-demo.gif)

### Who it's for

B2B sales and RevOps (hiring = buying signal), recruiters and agencies, investors, analysts.

### Use cases

- **Sales prospecting:** find accounts that are hiring sales or engineering right now (hiring = budget and a new buyer).
- **Account watchlists:** run weekly on your target list and get new and closed roles since last week.
- **Recruiting agencies:** spot companies with a hiring surge before they post on job sites.
- **Investors and analysts:** track headcount growth and team mix across a portfolio or competitors.

### How to use it in 3 steps

1. Type company names or websites in **Companies** (e.g. `Stripe`, `ramp.com`).
2. Optional: set a **Monitor name** and add a weekly Schedule to get changes since the last run.
3. Run, then export the rows to CSV, Excel or Google Sheets, or pull them by API.

### What you get per company

- `openRoles`, `previousOpenRoles`, `changeSinceLastRun`
- `newRolesSinceLastRun`, `closedRolesSinceLastRun`, plus a `newRoles` list (title, department, location, date, link)
- `postedLast7Days` / `postedLast30Days` / `postedLast90Days` and `rolesWithPostDate`
- `departmentMix` (Engineering, Sales, Marketing, Customer, Product & Design, Operations & Finance, People, Other)
  and `departmentChangeSinceLastRun`, e.g. `{ "Sales": 4 }`
- `topRawDepartments`, `topLocations`, `remoteShare`, `seniorShare`
- `hiringScore` (0–100) and `signals`: `hiring_surge_30d`, `go_to_market_buildout`, `engineering_buildout`,
  `leadership_hiring`, `many_new_roles_since_last_run`, `openings_dropped_30pct`, `no_open_roles`

### Input

| field | what it does |
|---|---|
| `companies` (required) | Just type the company name (`Stripe`, `Hugging Face, Inc.`) or its website (`notion.com`, `https://www.ramp.com/careers`) and we find the job board. You can also paste a job-board URL (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Workday) or `ats:slug` (`greenhouse:airbnb`). |
| `monitorName` | Same name on every scheduled run = diffs (new/closed roles, department change). Empty = one-off snapshot. |
| `includeNewRoleList` | List new roles (since last run, or posted in the last 7 days on a first run). Default on. |
| `maxNewRolesListed` | Cap on that list per company (default 25, max 500). |

### Output sample (real, Oct 20, 2026, trimmed)

```json
{ "company": "Ramp", "ats": "ashby", "status": "ok", "openRoles": 169, "postedLast30Days": 52,
  "departmentMix": { "Sales": 69, "Engineering": 49, "Product & Design": 15, "Operations & Finance": 13, "People": 12, "Marketing": 6, "Customer": 5 },
  "hiringScore": 72, "signals": ["hiring_surge_30d","go_to_market_buildout","engineering_buildout","leadership_hiring"] }
```

Each row shows `detectedVia` (how we found the board: `name-match`, `careers-page …` or `input`) and `otherBoardsFound` if the name matched more than one board, so you can check it's the right company.

Companies not found appear as a row with `status: "not_found"` (free). A `SUMMARY` record counts ok/failed companies.

### Pricing

**$0.005 per company checked** ($5 per 1,000). No start fee. Companies not found are free.
A 200-account weekly watchlist is about $4/month.

### FAQ

- **How do I get diffs?** Set a Monitor name and add a daily or weekly Schedule. The first run is the baseline.
- **Can I get every job instead of counts?** Use our ATS Jobs Feed actor.
- **Does it use LinkedIn?** No. Only the public job-board feeds of the 6 ATS.
- **What is a hiring signal?** A sign a company is growing a team: many roles posted in the last 30 days, a sales or engineering build-out, or leadership hires. Each row lists them in `signals`.
- **How fresh is the data?** Live: every run reads the job boards at run time.
- **Can I send it to my CRM?** Export CSV or JSON, or connect the dataset with Apify's Zapier, Make or n8n integrations.
- **Is it legal?** It reads public job-board APIs the ATS vendors publish for showing jobs. Check your own use case.

### Limits

- Greenhouse, Lever, Ashby, Workable, SmartRecruiters and **Workday**. iCIMS and Taleo are not supported yet.
- **Name lookup** matches public boards whose name equals the company name, then reads the company's careers page. Check `detectedVia` for common-word names. Sites that load jobs with JavaScript only, and Workday companies with no Workday link on their careers page, need the board URL pasted.
- **Workday:** we find it from a careers-page link, or paste the myworkdayjobs.com careers URL (e.g. `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`). Boards over 2,000 jobs are split by category, so big employers get full counts. Workday only shows "Posted N Days Ago" / "30+ Days Ago", so 7- and 30-day counts are exact but `postedLast90Days` is `null` for Workday. Big boards take a few minutes (we pace requests).
- Department mix is mapped from the company's own department names and job titles; "Other" = not mapped.
- Some boards (often Workable) don't publish dates, so velocity can read 0. Check `rolesWithPostDate`.
- The hiring score is a simple, explainable formula (size + 30-day velocity + 7-day posts), not a prediction.

# Actor input Schema

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

Type company names (Stripe, Notion) or websites (notion.com, https://www.ramp.com/careers) and we find the job board. Job-board URLs (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Workday) and 'ats:slug' (greenhouse:airbnb) also work. Workday: paste the careers URL if the company's site doesn't link to it, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite.

## `monitorName` (type: `string`):

Give the same name on every scheduled run to get new roles, closed roles and department changes since the last run. Leave empty for a one-off snapshot.

## `includeNewRoleList` (type: `boolean`):

Include titles/links of new roles (since last run, or posted in the last 7 days on a first run).

## `maxNewRolesListed` (type: `integer`):

Cap on the newRoles list per company.

## Actor input object example

```json
{
  "companies": [
    "Stripe",
    "ramp.com",
    "https://jobs.lever.co/spotify"
  ],
  "monitorName": "",
  "includeNewRoleList": true,
  "maxNewRolesListed": 25
}
```

# Actor output Schema

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

No description

## `summary` (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": [
        "Stripe",
        "ramp.com",
        "https://jobs.lever.co/spotify"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mystique-lab/hiring-signal-tracker").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": [
        "Stripe",
        "ramp.com",
        "https://jobs.lever.co/spotify",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mystique-lab/hiring-signal-tracker").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": [
    "Stripe",
    "ramp.com",
    "https://jobs.lever.co/spotify"
  ]
}' |
apify call mystique-lab/hiring-signal-tracker --silent --output-dataset

```

## MCP server setup

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

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/tS0PsrwdDv5uOurBo/builds/qdAB4yJIK2E4tSXRl/openapi.json
