# Hiring Signal Intelligence — Job Growth & Tech Hiring Tracker (`ramsford/hiring-signal-intelligence`) Actor

Track any company's hiring activity across LinkedIn, Indeed, Greenhouse, Lever, and Ashby. Get department breakdowns, tech-stack signals, seniority mix, geographic expansion, and AI-written hiring narratives. Pay per company report.

- **URL**: https://apify.com/ramsford/hiring-signal-intelligence.md
- **Developed by:** [Don Johnson](https://apify.com/ramsford) (community)
- **Categories:** Jobs
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1,000.00 / 1,000 hiring signal intelligence 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Hiring Signal Intelligence Agent — Track Job Growth, Dept Expansion & Tech Hiring Across Any Company

**Hiring signals are buying signals.** This Actor tracks any company's hiring activity across **five sources** — LinkedIn Jobs, Indeed, Greenhouse, Lever, and Ashby — and returns a structured intelligence report with department breakdowns, tech-stack signals, geographic expansion, and an AI-written narrative.

***

### The Problem

When a company is hiring 5 Kubernetes engineers, they are buying observability tools. When they are hiring 10 EMEA AEs, they are expanding into Europe. When their hiring drops 40% month-over-month, they are tightening.

You can see all of this in their job postings — but it is spread across LinkedIn, Indeed, and **three different ATS systems** (Greenhouse, Lever, Ashby). Every other Apify Actor covers exactly **one** source. This one covers all five.

***

### What You Get Per Company Report

- **Total open roles + velocity** — change vs the last run, so you see acceleration or contraction over time
- **Department breakdown** — Engineering, Sales, Marketing, Product, Operations, Data, etc.
- **Tech-stack signals** — Python, Kubernetes, React, AWS, LLM, Snowflake, and 60+ more keywords
- **Geographic expansion signals** — new regions being staffed (EMEA, APAC, LATAM, remote)
- **Seniority mix** — IC vs Manager vs Director vs VP+
- **AI-written narrative** — plain-English synthesis ("Acme is aggressively building EMEA sales, doubling its data team, and slowing US hiring")
- **New roles since last run** — the diff that matters for sales/competitive intel
- **Sample open roles** — title + location + department + seniority + apply URL

***

### Why This Actor vs. Alternatives

| Alternative | Gap |
|---|---|
| LinkedIn Jobs scraper | LinkedIn only — misses 60% of postings on ATS boards |
| Greenhouse/Lever-only scrapers | One ATS — misses companies on other ATSes |
| Indeed scraper | Indeed only — no tech-stack or department synthesis |
| Manual research | Hours per company, no diff over time, no synthesis |
| HG Insights / TheirStack | $20k+/year enterprise data — same signal at 1/100th the cost |

**The only Apify Actor that monitors hiring across 5 distinct sources and delivers a written narrative — not just a CSV of job titles.**

***

### Who This Is For

- **Sales teams** — hiring is the strongest buying signal. Run on your target accounts before every outbound campaign.
- **Consultants** — see who is spending on what, before competitors. Match your service offer to a company's actual investment trajectory.
- **MSPs and agencies** — expansion = new client opportunity. Spot growth before the press release.
- **Recruiters** — find hot markets and companies hiring your specialty.
- **Investors and analysts** — hiring data is leading-indicator data. See growth signals before public filings.

***

### How It Works

1. You provide a list of companies. For each company, give any subset of job-board URLs (LinkedIn, Indeed, Greenhouse, Lever, Ashby).
2. The Actor pulls jobs from each source — using public ATS JSON APIs (Greenhouse/Lever/Ashby) where available and Playwright scraping for LinkedIn and Indeed.
3. Jobs are deduplicated across sources, then classified by department, seniority, region, and tech-stack keywords.
4. A snapshot from the previous run is loaded; the diff produces velocity, new roles, and department deltas.
5. A plain-English narrative is generated and a full markdown report is built.
6. Output goes to the dataset (JSON + readable markdown) and one PPE event is charged.

***

### Input

```json
{
  "companies": [
    {
      "name": "Acme Corp",
      "linkedinUrl": "https://www.linkedin.com/company/acme/",
      "indeedUrl": "https://www.indeed.com/cmp/acme-corp",
      "greenhouseUrl": "https://boards.greenhouse.io/acme",
      "leverUrl": "https://jobs.lever.co/acme",
      "ashbyUrl": "https://jobs.ashbyhq.com/acme"
    }
  ],
  "maxJobsPerSource": 100,
  "reportStyle": "full"
}
```

Only `name` is required. Provide as many of the five URLs as you have — more sources = stronger signal. The Actor handles missing sources gracefully.

***

### Sample Output

```markdown
## Hiring Signal Intelligence Report — Acme Corp
Generated: 2026-05-15T18:42:00Z

### Headline
Acme Corp has 47 open roles concentrated in Engineering (18), Sales (12), Data & ML (6).
Hiring acceleration: 31 → 47 roles (+16 since last run). Departments adding fastest: Sales (+7), Engineering (+4), Data & ML (+3). Geographic expansion signal: EMEA (+5), APAC (+2). Tech-stack signal from job descriptions: kubernetes (8), python (12), aws (10), llm (4), snowflake (3). Leadership-heavy mix: 19% of openings are director-and-above — often signals a scaling org building its management layer.

### Open Roles
- Total open roles detected: **47**
- Velocity vs last run: **+16** (31 → 47)

### Sources
- greenhouse: 28 jobs
- lever: 0 jobs — No leverUrl or token not parseable.
- ashby: 0 jobs — No ashbyUrl or token not parseable.
- linkedin: 14 jobs
- indeed: 8 jobs

### Department Breakdown
- Engineering: 18 (+4 vs last)
- Sales: 12 (+7 vs last)
- Data & ML: 6 (+3 vs last)
- Marketing: 4
- Product: 3
- Operations & Finance: 2 (-1 vs last)

### Tech-Stack Signals
- python: 12
- aws: 10
- kubernetes: 8
- react: 7
- snowflake: 3
- llm: 4

### Geographic Mix
- United States: 22
- EMEA: 12 (+5)
- Remote: 8
- APAC: 3 (+2)

### Seniority Mix
- Mid-level / IC: 24
- Senior: 13
- Manager / Lead: 6
- Director / Head: 3
- C-Suite / VP: 1

### New Roles Since Last Run
- Head of EMEA Sales
- Senior Data Engineer (Snowflake)
- Staff ML Engineer
- Account Executive - DACH
- Solutions Architect - APAC

### Sample Open Roles
- Senior Software Engineer, Platform
- Account Executive - UK
- Staff Data Scientist
- ...
```

***

### Pricing

**$1.00 per company hiring intelligence report.** Pay-per-event — no subscription, no minimums.

Comparison: TheirStack / HG Insights enterprise = $15k–$40k/year for the same signal class. Five reports a week with this Actor = ~$20/month.

***

### Use Cases

#### Pre-Outbound Sales Intel

Before a sales campaign, run this on 20 target accounts. Filter to companies with `velocity > +5` and you have an outbound list that converts 3–5× higher than cold lists.

#### Competitive Hiring Watch

Run weekly on your top 5 competitors. When their `Sales` department grows 30% in a month, expect a market push next quarter.

#### Geographic Expansion Detection

Track `geographicMix` deltas. New `EMEA` or `APAC` headcount = a market entry signal 6–12 months before it appears in PR.

#### Tech-Stack Migration Watch

Track `techStackSignals` over time. A surge in "kubernetes" or "snowflake" hires reveals platform migrations that are buying signals for adjacent tools.

#### Funding-Round Anticipation

Hiring acceleration of +15 roles per month frequently precedes a publicly-announced funding round by 60–90 days.

***

### FAQ

**Do I need all five URLs per company?**
No. Provide whichever you have. The Actor degrades gracefully — sources without a URL are skipped and noted.

**How does it handle LinkedIn and Indeed anti-bot?**
The Actor uses Playwright with realistic browser fingerprint, scrapes only public listings, and respects timeouts. Some runs may fail for those sources due to anti-bot — ATS sources (Greenhouse/Lever/Ashby) are far more reliable since they expose public JSON APIs.

**How fresh is the data?**
Live on every run. ATS API data is real-time. LinkedIn/Indeed reflect what those sites are publicly showing at scrape time.

**Can I run this on a schedule?**
Yes — use Apify's built-in scheduler to run daily or weekly. The Actor stores a snapshot per company so each run produces velocity and delta against the prior run.

**What if a company is on a different ATS (Workday, BambooHR, etc.)?**
Coverage today is LinkedIn + Indeed + Greenhouse + Lever + Ashby — which together cover the majority of US/EU tech and SaaS hiring. Additional ATSes are on the roadmap; open an issue or message us if you need one.

***

[Run your first hiring intelligence report →](https://apify.com/ramsford/hiring-signal-intelligence)

# Actor input Schema

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

List of company objects. Each needs at minimum: name. Provide any subset of: linkedinUrl, indeedUrl, greenhouseUrl, leverUrl, ashbyUrl. More sources = stronger signal.

## `maxJobsPerSource` (type: `integer`):

Maximum number of job postings to collect from each source per company. Higher = richer signals, longer run time.

## `reportStyle` (type: `string`):

'full' produces a detailed markdown report. 'brief' produces a bullet-point summary.

## Actor input object example

```json
{
  "companies": [
    {
      "name": "Acme Corp",
      "linkedinUrl": "https://www.linkedin.com/company/acme/",
      "indeedUrl": "https://www.indeed.com/cmp/acme-corp",
      "greenhouseUrl": "https://boards.greenhouse.io/acme",
      "leverUrl": "https://jobs.lever.co/acme",
      "ashbyUrl": "https://jobs.ashbyhq.com/acme"
    }
  ],
  "maxJobsPerSource": 20,
  "reportStyle": "brief"
}
```

# 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": [
        {
            "name": "Vercel",
            "greenhouseUrl": "https://boards.greenhouse.io/vercel",
            "ashbyUrl": "https://jobs.ashbyhq.com/vercel"
        }
    ],
    "maxJobsPerSource": 20,
    "reportStyle": "brief"
};

// Run the Actor and wait for it to finish
const run = await client.actor("ramsford/hiring-signal-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": [{
            "name": "Vercel",
            "greenhouseUrl": "https://boards.greenhouse.io/vercel",
            "ashbyUrl": "https://jobs.ashbyhq.com/vercel",
        }],
    "maxJobsPerSource": 20,
    "reportStyle": "brief",
}

# Run the Actor and wait for it to finish
run = client.actor("ramsford/hiring-signal-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": [
    {
      "name": "Vercel",
      "greenhouseUrl": "https://boards.greenhouse.io/vercel",
      "ashbyUrl": "https://jobs.ashbyhq.com/vercel"
    }
  ],
  "maxJobsPerSource": 20,
  "reportStyle": "brief"
}' |
apify call ramsford/hiring-signal-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ramsford/hiring-signal-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/R4nskabEQtIuGrwK4/builds/railxsiWQ9WDHraOe/openapi.json
