# Hiring Signal Leads — 27,000+ ATS Boards + Verified Email (`wiry_tournament/hiring-signal-leads`) Actor

Scrapes 27,000+ company ATS boards (Greenhouse, Ashby, Workday, BambooHR, Lever + 10 more) for buying-signal job titles — companies actively hiring are actively buying. Returns the decision-maker name, LinkedIn, and verified email. Pay-per-event: never billed for bounces or unresolved contacts.

- **URL**: https://apify.com/wiry_tournament/hiring-signal-leads.md
- **Developed by:** [Hiring Manager](https://apify.com/wiry_tournament) (community)
- **Categories:** Jobs, AI, Lead generation
- **Stats:** 3 total users, 2 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 verified emails

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

## ATS Job Board Scraper — B2B Leads + Verified Email Finder (27,000+ Companies)

A company posting "Head of Sales" is **actively buying sales tools right now**.\
This actor scrapes **27,000+ company ATS job boards** (Greenhouse, Lever, Ashby, Workday, BambooHR, SmartRecruiters + 9 more) — and the moment a buying-signal title appears, it finds the decision-maker's **name**, **LinkedIn**, and **verified email**.

**Intent-based B2B lead generation.** No subscription. No stale database. **Pay only for verified results.**

***

### What this actor does

This is a **hiring signal scraper** and **B2B email finder** combined. It monitors ATS job boards for job titles that signal budget and buying intent — then enriches each match with a verified contact.

Use it as a:

- **Sales intelligence tool** — find companies actively spending in your category
- **Email finder** — get verified emails for decision-makers at target accounts
- **Lead generation automation** — feed intent-qualified B2B leads into your CRM automatically
- **ATS scraper** — extract structured job posting data from 27,000+ boards

***

### What you get

| Field | Example |
|---|---|
| Company | HubSpot |
| Job posting | *Head of Sales — New York* |
| ATS source | Greenhouse |
| Decision-maker | James Stone, VP Revenue |
| LinkedIn | linkedin.com/in/jamesstone |
| Email | james.stone@hubspot.com |
| Email status | ✅ valid |

***

### How it works

1. **Signal** — polls 27,000+ Greenhouse / Ashby / Lever / SmartRecruiters / Workday / BambooHR / Workable / Jobvite / Taleo / iCIMS boards for your target job titles
2. **Contact** — finds the matching decision-maker (not the open role) via LinkedIn
3. **Email** — verifies deliverability before charging

You define the signal titles. We do the rest.

***

### Pricing

| Event | Price | When |
|---|---|---|
| Signal found | $0.002 | Job posting matched |
| Decision-maker found | $0.05 | Contact resolved (includes LinkedIn lookup + email enrichment) |
| Verified email | $0.004 | Only if `status = valid` |

**Max $0.056 per lead.** You are never charged for bounces, catch-all domains, or unresolved contacts.

> **Note:** The $0.05 decision-maker price is effective from 2026-07-14.

***

### Input

```json
{
  "signalTitles": ["Head of Sales", "VP Sales", "Director of Sales"],
  "decisionMakerTitles": ["CRO", "VP Sales", "VP Revenue", "Chief Revenue Officer"],
  "geoMode": "us",
  "maxLeads": 50,
  "includeDecisionMaker": true,
  "includeVerifiedEmail": true
}
```

| Parameter | Description | Default |
|---|---|---|
| `signalTitles` | Job titles that indicate a buying signal (what they're **hiring**) | required |
| `decisionMakerTitles` | Who to contact — the hiring **manager**, not the role being hired | defaults to signalTitles |
| `geoMode` | `"us"` or `"world_ex_gdpr"` | `"us"` |
| `maxLeads` | 1–500 | 20 |
| `includeDecisionMaker` | Find the decision-maker's LinkedIn + email | true |
| `includeVerifiedEmail` | Verify email deliverability | true |
| `companySlugs` | Override with specific boards (e.g. `greenhouse:stripe`) | — |

> **Tip:** `signalTitles` and `decisionMakerTitles` serve different purposes.\
> If a company is hiring a *Head of Sales*, the **signal** is "Head of Sales" but the **decision-maker** to contact is their *CRO* or *VP Revenue* — whoever manages that hire.

***

### Output

```json
{
  "signal": {
    "job_title": "Head of Sales",
    "ats": "greenhouse",
    "job_url": "https://boards.greenhouse.io/hubspot/jobs/...",
    "geo": "New York, NY",
    "posted_at": "2026-06-30"
  },
  "company": {
    "name": "HubSpot",
    "domain": "hubspot.com"
  },
  "decision_maker": {
    "name": "James Stone",
    "title": "VP Revenue",
    "linkedin": "https://www.linkedin.com/in/jamesstone"
  },
  "contact": {
    "email": "james.stone@hubspot.com",
    "email_status": "valid",
    "source": "harvestapi"
  }
}
```

***

### Why not Apollo / Kaspr / Lusha?

|  | Apollo / Kaspr / Lusha | **This actor** |
|---|---|---|
| Data source | Static database | Live ATS job boards |
| Freshness | Weeks to months old | Posted hours or days ago |
| Intent signal | ❌ | ✅ They just posted the job |
| Pricing | $99–$299/month subscription | Pay per verified result |
| Bounce billing | Yes | **Never** |
| Coverage | General contact search | 27,000+ pre-indexed boards |

***

### Use cases

- **SDR outreach** — reach companies the moment they signal budget for your category
- **Agency lead gen** — run at scale for clients, white-label the output
- **RevOps / GTM automation** — feed your CRM with intent-qualified leads automatically
- **Competitive intelligence** — track when competitors' customers start hiring your buyer persona
- **Sales hiring signal** — monitor for "VP Sales", "CRO", "Head of Revenue" hires across sectors

***

### Supported ATS platforms

| Platform | Companies covered |
|---|---|
| Workday | 3,477 (Fortune 500, health systems, enterprise) |
| BambooHR | 4,917 |
| Ashby | 4,014 |
| Greenhouse | 4,165 |
| Workable | 2,040 |
| SmartRecruiters | 2,864 |
| JazzHR | 1,041 |
| Breezy HR | 776 |
| Lever | 1,488 |
| Recruitee | 309 |
| Jobvite | 432 |
| Taleo | 649 |
| iCIMS | 413 |
| Rippling | 77 |
| Personio | 15 |
| **Total** | **27,137** |

Includes Fortune 500, F500, enterprise, mid-market, and high-growth startups across tech, finance, healthcare, defense, energy, and retail.

Add any company manually via `companySlugs` (e.g. `greenhouse:stripe`, `ashby:notion`, `lever:figma`).

***

### Performance

| Phase | Duration (approx.) |
|---|---|
| Full ATS scan (27,000+ boards) | 15–20 min |
| Lead processing (20 leads, DM + email) | 5 min |
| **Total for 20 verified leads** | **~20–25 min** |

- Scan runs in parallel across all boards (60 concurrent workers)
- Very large boards (> 1 MB response) are skipped automatically
- Memory footprint stays under 512 MB for a full run

***

### GDPR

`geoMode: "world_ex_gdpr"` excludes EU, UK, Switzerland, and other GDPR-jurisdiction countries.\
No personal data is stored between runs. Email verification is performed on-demand only.

# Actor input Schema

## `signalTitles` (type: `array`):

Job titles that indicate a buying signal. The actor polls ATS boards and keeps only postings matching these titles.

## `geoMode` (type: `string`):

Filter job postings by geography. 'US only' keeps US-based roles. 'Worldwide (excl. GDPR)' adds AU, SG, IN, MX, IL, JP and other non-GDPR markets.

## `decisionMakerTitles` (type: `array`):

LinkedIn titles of the person to CONTACT — typically the hiring manager, not the role being posted. Example: if you signal on 'Head of Sales', contact the 'CRO' or 'VP Sales' who manages that hire.

## `maxLeads` (type: `integer`):

Maximum number of leads to return.

## `includeDecisionMaker` (type: `boolean`):

Look up the decision-maker at each company via LinkedIn, including email enrichment. All-in price of $0.05 per contact found — you are never charged when only a non-decision-maker is returned.

## `includeVerifiedEmail` (type: `boolean`):

Verify email deliverability via SMTP. Billed ONLY when email is confirmed valid — never charged for bounces, catch-all, or risky results.

## `companySlugs` (type: `array`):

Override the built-in directory with specific ATS boards. Format: 'greenhouse:stripe', 'ashby:notion', 'lever:hubspot'. Leave empty to use the built-in directory of 6000+ companies.

## Actor input object example

```json
{
  "signalTitles": [
    "Head of Sales",
    "VP Sales",
    "VP of Sales",
    "Director of Sales"
  ],
  "geoMode": "us",
  "decisionMakerTitles": [
    "CRO",
    "VP Sales",
    "VP Revenue",
    "Chief Revenue Officer",
    "Head of Sales"
  ],
  "maxLeads": 20,
  "includeDecisionMaker": true,
  "includeVerifiedEmail": true
}
```

# Actor output Schema

## `leads` (type: `string`):

Dataset of hiring-signal leads. Each record contains signal (job title, URL, ATS, geo), company (name, domain), decision_maker (name, title, LinkedIn), and contact (verified email, status).

# 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 = {
    "signalTitles": [
        "Head of Sales",
        "VP Sales",
        "VP of Sales",
        "Director of Sales"
    ],
    "decisionMakerTitles": [
        "CRO",
        "VP Sales",
        "VP Revenue",
        "Chief Revenue Officer",
        "Head of Sales"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("wiry_tournament/hiring-signal-leads").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 = {
    "signalTitles": [
        "Head of Sales",
        "VP Sales",
        "VP of Sales",
        "Director of Sales",
    ],
    "decisionMakerTitles": [
        "CRO",
        "VP Sales",
        "VP Revenue",
        "Chief Revenue Officer",
        "Head of Sales",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("wiry_tournament/hiring-signal-leads").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 '{
  "signalTitles": [
    "Head of Sales",
    "VP Sales",
    "VP of Sales",
    "Director of Sales"
  ],
  "decisionMakerTitles": [
    "CRO",
    "VP Sales",
    "VP Revenue",
    "Chief Revenue Officer",
    "Head of Sales"
  ]
}' |
apify call wiry_tournament/hiring-signal-leads --silent --output-dataset

```

## MCP server setup

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

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/DYdbHuHejOnO8aJkP/builds/UiLBPTynvxCnlCzEA/openapi.json
