# Hiring Signals: Tech Stack & Headcount Growth from Job Posts (`data-done-right/hiring-signals`) Actor

Turn company job postings into hiring signals: which tools and technologies a company hires for (Salesforce, Snowflake, AWS), which teams are growing, and where. Reads public ATS job boards on Greenhouse, Lever, Ashby, Workday and more, and flags what changed since your last run.

- **URL**: https://apify.com/data-done-right/hiring-signals.md
- **Developed by:** [Data Done Right](https://apify.com/data-done-right) (community)
- **Categories:** Lead generation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.20 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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: Tech Stack & Headcount Growth from Job Posts

**Hiring signals** are the clues a company's job postings give about what it is building and buying. This Actor reads companies' public job boards and turns every opening into **sales and market intelligence** for SDR teams, investors and recruiters:

- **Tech stack.** About 200 tools are detected across CRM, data warehouses, cloud, languages, AI/ML, security, finance and HR. For example, "Snowflake appears in 23% of their postings."
- **Team growth** by function (Engineering, Sales, Data & AI, Marketing, Support...) and by seniority (Junior → Director+).
- **Where they hire** (top locations) and the **remote share**.
- **Salary bands** where they're published.
- **What changed since your last run**: open-jobs delta, plus **new technologies** (a new tool showing up in postings is a buying or migration signal) and dropped ones.

It works with **Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable and Recruitee**. Paste careers URLs or just company names.

### What data can you extract from job postings

One report per company, with the tech stack, team growth, locations, salaries and changes described above. Example:

```json
{
  "company": "palantir", "ats": "lever", "openJobs": 310, "postedLast30Days": 16, "remoteShare": 0.0,
  "byFunction": {"Engineering": 195, "Finance & Legal": 18, "Operations": 13},
  "technologies": [{"name": "Python", "category": "Languages", "jobsMentioning": 190, "share": 0.613},
                   {"name": "Kubernetes", "category": "Cloud & Infra", "jobsMentioning": 51, "share": 0.165}],
  "changeSinceLastRun": {"openJobsDelta": 12, "newTechnologies": ["Databricks"], "droppedTechnologies": []}
}
```

The company's own name and boilerplate text that appears in every posting are filtered out, so the signal stays clean.

### Find a company's tech stack from its job postings

Job ads name the tools a team works with every day, so they reveal a **company's tech stack** better than website scanners, which only see front-end scripts. Snowflake, dbt, Salesforce, Kubernetes and Workday HR never show up in a page's source code, but they do show up in the job descriptions.

### How do hiring signals work for sales teams

A company that suddenly posts several roles mentioning a tool (for example Snowflake or Salesforce) is probably adopting or migrating to it. Use these signals to find accounts for your product, and to time outreach to hiring spikes.

### Use cases

- **Sales and SDR teams:** find accounts adopting (or leaving) your competitor's tool, and time outreach to hiring spikes.
- **Investors and analysts:** headcount momentum and strategic direction (for example, AI hiring share).
- **Recruiters:** which companies are scaling which teams right now.

Schedule it weekly, and send the results to Google Sheets with our *Google Sheets Import & Export* Actor.

### Use it in Claude, ChatGPT and Cursor

Connect Apify's MCP server (mcp.apify.com) and your AI assistant can research accounts itself. For example: "what tech stack is Palantir hiring for, and which teams are growing?" The only required input is `companies`.

### How much does it cost

Pay per event: **$0.009 per company report** (100 companies ≈ $0.90), plus the standard start fee. Turning on the individual job rows adds no charge. Apify Silver plans get 10% off, Gold and higher 20%.

### FAQ

#### What are hiring signals?

Hiring signals are facts you can read from a company's open jobs: which technologies it asks for, which teams are growing, where it hires, and how those numbers change over time.

#### Why are hiring signals important?

Job posts are public and updated by the company itself, so they often show plans before a press release does. A new tool appearing in postings is often a buying or migration signal.

#### Do hiring signals work?

They are a useful hint, not proof. A tool named in job posts means the company uses or plans to use it, but a company with few openings gives you little signal. Each report shows the number of open jobs, so you can judge how much data is behind it.

#### How do I find out what tech stack a company uses?

Paste the company's careers URL or name. The report lists each technology its job posts mention, with the share of postings that name it, grouped by category (CRM, data, cloud, languages, AI/ML, security, finance, HR).

#### Can I get job postings data for many companies at once?

Yes. List as many companies as you like. You get one hiring-signals report per company, and turning on `includeJobs` adds the individual job postings.

#### Which job boards does it read?

Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable and Recruitee, through their public job APIs. Paste careers URLs or company names. It does not read LinkedIn.

#### Do I need a login or API key?

No.

#### Can I track changes over time?

Yes. Each run compares with your previous run and reports the open-jobs change plus new and dropped technologies. Schedule it weekly.

### Related tools

- **[ATS Jobs Scraper](https://apify.com/data-done-right/ats-jobs-scraper)**: the individual job rows from the same job boards.
- **Company Enrichment API**: one domain in, a company profile with socials, tech stack and open jobs out.
- **[Competitor Monitoring](https://apify.com/data-done-right/competitor-monitoring)**: weekly new pages, jobs, ads and news per competitor.

# Actor input Schema

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

Careers page URLs on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable or Recruitee, or company names.

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

Adds a second dataset ('jobs') with one row per posting, its technologies, function and seniority.

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

Workday tenants can have thousands of jobs; this caps detail fetching.

## `proxyConfiguration` (type: `object`):

Not needed for most boards.

## Actor input object example

```json
{
  "companies": [
    "https://jobs.lever.co/palantir"
  ],
  "includeJobs": false,
  "maxJobsPerCompany": 300,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All result items of this run (the default dataset), as JSON, CSV, Excel and more.

## `records` (type: `string`):

Key-value store records: the run summary, notes on any problems, and any files.

# 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": [
        "https://jobs.lever.co/palantir"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data-done-right/hiring-signals").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": ["https://jobs.lever.co/palantir"] }

# Run the Actor and wait for it to finish
run = client.actor("data-done-right/hiring-signals").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": [
    "https://jobs.lever.co/palantir"
  ]
}' |
apify call data-done-right/hiring-signals --silent --output-dataset

```

## MCP server setup

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

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/ettEUmPMDah9Yydbl/builds/DT7wY6jKKzrVStTcW/openapi.json
