# Hiring Signals Tracker - Greenhouse, Lever & Ashby Jobs (`cazadores/hiring-intelligence`) Actor

Track which companies are ramping up hiring. Give a list of companies (domain, name or careers URL): get open jobs, new jobs in the last 7/30 days, jobs added and closed since your last run, hiring by area, skills in demand and a clear hiring signal. Official public job-board APIs, no login.

- **URL**: https://apify.com/cazadores/hiring-intelligence.md
- **Developed by:** [Juan Manuel D'Amico](https://apify.com/cazadores) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 company analyzeds

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 Tracker — Greenhouse, Lever & Ashby Jobs

**Know which companies are ramping up hiring — and by how much.** Give a list of companies and get, for each one:

- **Open jobs now**, and **new jobs in the last 7 / 30 / 90 days**
- **What changed since your last run**: jobs added, jobs closed, net change and %
- A clear **hiring signal** (`strong`, `moderate`, `low`, `shrinking`, `none`) **with the reasons**
- **Where they hire**: jobs by area (Engineering, Sales, Data & AI…), top departments, locations and remote roles
- **Skills in demand**: tools and technologies most mentioned in their job descriptions
- **History**: open jobs at every run, to see the trend

The number of jobs is data. **The change is the signal**: a company going from 8 to 37 open roles is about to buy software, laptops, benefits, office space and services.

- ✅ Official public job-board APIs of **Greenhouse, Lever and Ashby** — no login, no API key, no personal data
- ✅ Finds each company's job board automatically from its **domain, careers page or name**
- ✅ Remembers your previous runs and reports **only what changed**
- ✅ Built for **weekly or daily schedules**, webhooks and n8n / Make / Zapier

### Who uses it

- **B2B sales teams & SDRs** — prioritize accounts that are growing fast (SaaS, HR tech, benefits, insurance, equipment, coworking, training)
- **Recruiters & staffing agencies** — spot companies opening many roles in your specialty
- **Investors & analysts** — track hiring momentum of a portfolio or a market
- **Market research & competitive intelligence** — see where competitors are investing (new teams, new countries, new tech)

### Input

| Field | Description | Default |
|---|---|---|
| `companies` | One per line: domain (`stripe.com`), careers URL, job-board URL (`https://jobs.lever.co/palantir`), `greenhouse:stripe`, or company name (`Nubank`) | — |
| `outputJobs` | `new` = also a row per job that appeared since your last run (none on the first run, which saves the baseline) · `all` = every open job · `none` = company summaries only | `new` |
| `titleKeywords` | Only count jobs whose title contains any of these words (e.g. `engineer`, `sales`) | all |
| `locationKeywords` | Only count jobs whose location contains any of these words (e.g. `Argentina`, `London`, `Remote`) | all |

**Tip:** schedule the same input every week. The first run gives you the baseline and recent postings; every next run adds *jobs added / closed since last run*.

#### Example

Track engineering hiring in Latin America at a few fintechs:

```json
{
  "companies": ["Nubank", "https://jobs.lever.co/dlocal", "despegar.com", "belvo.com"],
  "titleKeywords": ["engineer", "developer", "data"],
  "locationKeywords": ["Argentina", "Brazil", "Mexico", "Colombia", "Remote", "LATAM"]
}
```

### Output

One row per company (plus job rows if `outputJobs` is `new` or `all`):

```json
{
  "type": "company",
  "company": "Stripe",
  "ats": "Greenhouse",
  "boardSlug": "stripe",
  "openJobs": 702,
  "newJobsLast7Days": 77,
  "newJobsLast30Days": 281,
  "newJobsLast90Days": 520,
  "previousOpenJobs": 687,
  "jobsAddedSinceLastCheck": 20,
  "jobsRemovedSinceLastCheck": 5,
  "netChange": 15,
  "changePct": 2.2,
  "hiringSignal": "strong",
  "signalReasons": ["281 jobs posted in the last 30 days (40% of open roles)"],
  "jobsByArea": { "Engineering": 264, "Product & Design": 123, "Sales": 94, "Data & AI": 53, "Operations": 51 },
  "topLocations": [{ "name": "San Francisco", "count": 120 }, { "name": "Dublin", "count": 85 }],
  "remoteJobs": 96,
  "topSkills": [{ "name": "SQL", "count": 139 }, { "name": "Python", "count": 87 }, { "name": "Java", "count": 66 }],
  "history": [{ "date": "2026-09-13", "openJobs": 672 }, { "date": "2026-09-20", "openJobs": 687 }, { "date": "2026-09-27", "openJobs": 702 }],
  "status": "ok"
}
```

Job rows include title, area, department, location, remote, publish date, skills and the link to the posting.

#### How the hiring signal works

| Signal | Rule |
|---|---|
| `strong` | 10+ jobs posted in the last 30 days and they are 30%+ of all open roles, **or** open jobs up 25%+ since last run (+5 jobs or more) |
| `moderate` | 5+ jobs posted in the last 30 days, **or** open jobs up 10%+ since last run |
| `shrinking` | open jobs down 20%+ since last run (5+ roles closed) |
| `low` / `none` | little recent activity / no open jobs |

`signalReasons` always tells you which rule fired.

### Pricing

- **Per company analyzed** (one summary row)
- **Per job row** returned (only if you ask for job rows)

Companies without a public Greenhouse, Lever or Ashby board are reported as `not_found` and **not charged**.

### FAQ

**Which companies are covered?** Any company whose public job board is on Greenhouse, Lever or Ashby — most US and European tech companies and scale-ups, and many in Latin America (Nubank, dLocal, Despegar…). More ATS (Workable, SmartRecruiters, Workday…) are on the roadmap: open an issue with the companies you need.

**How does it remember previous runs?** It stores a small snapshot per company in a key-value store of *your* Apify account (`hiring-intelligence-state`). Your history is private to you. Different filters are tracked separately.

**Why is my company `not_found`?** It may use another ATS or a custom careers site. Try its job-board URL directly.

**Does it collect personal data?** No. Only job postings published by the companies themselves: title, team, location, dates and link. No recruiter or candidate data.

# Actor input Schema

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

One company per line. Accepts a website domain (stripe.com), a careers page URL (https://ramp.com/careers), a job-board URL (https://jobs.lever.co/palantir, https://boards.greenhouse.io/airbnb, https://jobs.ashbyhq.com/notion), 'ats:slug' (greenhouse:stripe) or a company name (Nubank). The actor finds the company's Greenhouse, Lever or Ashby job board automatically.

## `outputJobs` (type: `string`):

Besides one summary row per company: 'new' = also one row per job that appeared since your previous run (the first run only saves the baseline, so it returns no job rows), 'all' = one row per open job, 'none' = company summaries only.

## `titleKeywords` (type: `array`):

Optional. Count only jobs whose title contains ANY of these words, e.g. 'engineer', 'sales', 'data'. Useful to track one team. Changes are tracked separately for each filter combination.

## `locationKeywords` (type: `array`):

Optional. Count only jobs whose location contains ANY of these words, e.g. 'Argentina', 'London', 'Remote'. Changes are tracked separately for each filter combination.

## Actor input object example

```json
{
  "companies": [
    "stripe.com",
    "https://jobs.lever.co/palantir",
    "ramp.com",
    "Nubank"
  ],
  "outputJobs": "new"
}
```

# Actor output Schema

## `companies` (type: `string`):

No description

## `allRows` (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.com",
        "https://jobs.lever.co/palantir",
        "ramp.com",
        "Nubank"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cazadores/hiring-intelligence").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.com",
        "https://jobs.lever.co/palantir",
        "ramp.com",
        "Nubank",
    ] }

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

```

## MCP server setup

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

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/ymucDFw9n8TsXV2nc/builds/dDnYIvZZuX6uBAs3G/openapi.json
