# Hiring Signal Lead Finder (`herazur/hiring-signal-lead-finder`) Actor

Find companies actively hiring SDRs, AEs and engineers. Combine Greenhouse, Lever, career pages and public LinkedIn job signals into scored company leads with evidence and snapshot-based growth.

- **URL**: https://apify.com/herazur/hiring-signal-lead-finder.md
- **Developed by:** [Furkan Toluç](https://apify.com/herazur) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 company hiring leads

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 Lead Finder

Turn public job openings into **company-level sales leads**. Find companies hiring SDRs, account executives, engineers, recruiters or customer success teams, then prioritize them with an explainable hiring signal score.

Built for recruiting agencies, B2B SaaS teams, HR software, sales agencies, outsourcing, payroll, benefits and development agencies. The output is one row per matching company with source evidence, not a copy of a job search page.

### Quick start

Run with the default query:

```json
{"query":"Companies hiring 3+ SDRs in the US"}
```

The default scans a **starter universe** of Cloudflare, Datadog, MongoDB, Okta, Twilio, Figma, Contentsquare, Saviynt, Achievers and Tutor Intelligence, plus up to three pages of public LinkedIn search. Starter boards may move or close; see SUMMARY for per-source diagnostics. This is not a complete search of all employers.

For a targeted, repeatable scan:

```json
{
  "companies":[
    {"name":"Cloudflare","domain":"cloudflare.com","greenhouse":"cloudflare"},
    {"name":"Contentsquare","domain":"contentsquare.com","lever":"contentsquare"}
  ],
  "role":"SDR",
  "location":"United States",
  "minJobs":3,
  "includeLinkedIn":false
}
```

Use `greenhouse` or `lever` for the board slug (not a full URL). For Lever EU, add `"leverRegion":"eu"`. Alternatively provide a `careerUrl` pointing to the company's public careers page. `domain` is optional and user-supplied or taken from the starter list; discovered companies without a verified domain return `null` rather than a guessed address.

### Sources and coverage

| Source | How it works | Limitations |
| --- | --- | --- |
| Greenhouse | Public Job Board API | Only the specified board; excludes prospect posts |
| Lever | Public postings API, paginated | Maximum 10,000 postings per board; capped boards marked incomplete |
| Career pages | JobPosting JSON-LD, same-site job links and linked ATS boards | Bounded HTML crawl; JavaScript-only pages, unsupported ATS platforms and pagination can reduce coverage |
| LinkedIn Jobs | Public guest search cards | Best effort, sampled and sometimes blocked; no login, cookies or access-challenge bypass |

Source failures are recorded. Other working sources continue. If every source fails, the run fails and does not replace the snapshot. A successful run can legitimately have zero matching companies. Open SUMMARY to distinguish no matches from reduced coverage.

The query field is a small convenience parser: it recognizes SDR/BDR, AE/account executive, engineer/developer, a numeric `N+` threshold and US/USA/United States. **Use structured role, location and minimum fields for other queries.** It does not interpret arbitrary natural language, industries, revenue, funding, seniority or company size.

### Output

Illustrative output (not a claimed live result):

```json
{
  "company":"Example SaaS",
  "domain":"example.com",
  "matchingJobs":8,
  "openSdrJobs":8,
  "openAeJobs":4,
  "newSdrJobs":3,
  "newAeJobs":1,
  "growthPercent":60,
  "growthStatus":"MEASURED",
  "hiringSignal":"VERY HIGH",
  "leadScore":90
}
```

Every lead also includes role counts, score components, observation time, baseline time, source coverage and (by default) listing evidence. Export dataset rows as JSON, CSV or Excel using Apify's dataset export. Nested evidence is best consumed as JSON.

Counts represent **distinct observed title/location combinations**, not the number of people the company will hire. Duplicate title/location combinations are collapsed, including across sources. Distinct requisitions with identical titles and locations may be merged; differently written duplicate listings may remain. SDR includes business development representatives. Country matching is heuristic; unknown or country-unspecified remote locations are excluded from a country filter.

### New jobs and growth

On the first scan, `newSdrJobs`, `newAeJobs`, `newMatchingJobs` and `growthPercent` are **null**. Open jobs are not automatically new jobs. Updated timestamps are not treated as publication dates.

To compare sequential scans:

1. Save the first run's `SNAPSHOT` key-value record.
2. Run again with the same sources, filters and coverage limits, passing that JSON in `baseline`.
3. Or use the same `snapshotStoreName` on sequential runs. This optional named-storage mode requires full permissions; baseline JSON works without it. Avoid overlapping runs with the same store.

New means a title/location combination observed now and absent in the previous complete snapshot. A renamed or relocated role can therefore appear new. Comparison measures the interval **between your two scans**, not an assumed 7- or 30-day period.

Growth is `(current matching open jobs - previous matching open jobs) / previous matching open jobs * 100`. It describes observed hiring activity, **not headcount, revenue, funding or company growth**. Zero prior count returns `ZERO_BASELINE` and a null percentage. Missing, incomplete, changed-scope or sampled coverage returns `NO_COMPARABLE_BASELINE`. Career-page-only and LinkedIn-sampled companies are conservative: no growth percentage is claimed from incomplete coverage.

### Explainable lead score

The score is a heuristic from 0 to 100, not a prediction of purchasing intent:

| Component | Points |
| --- | --- |
| Matching open jobs | 8 per job, maximum 50 |
| Sales hiring breadth | 8 for SDR/BDR activity + 7 for AE activity |
| Newly observed matching jobs | 3 per new job, maximum 15; requires baseline |
| Positive matching-job growth | 1 per 10 percentage points, rounded, maximum 10 |
| Evidence coverage | 10 for complete sources, 5 for partial coverage; zero if no matching jobs |

Signals: VERY HIGH >=80, HIGH >=60, MEDIUM >=35, otherwise LOW. A company can have a useful score on its first scan, but receives no unmeasured freshness or growth points.

### Pricing and cost control

**$0.02 per matching company lead ($20 per 1,000)** plus the **$0.01 Actor-start event**. Platform usage is included. Apify charges the start event per GB of allocated memory, with a minimum of one event; the default 512 MB run therefore incurs one $0.01 start event. For example, 10 matching company leads at default memory cost $0.21. The start event also applies to runs with no matching companies.

The billable result is a **matching company lead**, not each job listing. `maxCompanies`, `maxLinkedInPages` and `maxCareerPages` bound the scan. Review the Store pricing panel and maximum charge before starting a run. No paid external scraper or AI API key is required.

### Integrations and support

Use Apify API, scheduled tasks and webhooks to send leads to your CRM or workflow. Save consistent inputs and compare snapshots for weekly territory research or account prioritization. Schedules are optional and are not created automatically.

For problems, open an issue on the Actor's Issues tab with your run URL and expected filters. Do not include tokens or private credentials. Inspect SUMMARY before reporting empty results: it includes every target's source outcome.

This Actor reads publicly accessible company job listings. It does not collect applicant profiles, personal contact databases, emails or resumes. Use the data responsibly and follow applicable source terms.

# Actor input Schema

## `query` (type: `string`):

Convenience parser for role keywords (SDR, AE, engineer), N+ and US. For other locations or more precise filters, use fields below. This is not an unrestricted AI query engine.

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

Optional array of {name, domain, greenhouse, lever, leverRegion, careerUrl}. Supply at least one board slug or career URL per company. Omit to scan the documented starter companies. Example: \[{"name":"Cloudflare","domain":"cloudflare.com","greenhouse":"cloudflare"}].

## `role` (type: `string`):

Overrides the role inferred from the query. SDR also includes BDR.

## `location` (type: `string`):

United States uses country/state/city matching; other values use text matching. Empty string means worldwide. Remote without a country is excluded from country-filtered results.

## `minJobs` (type: `integer`):

Overrides N+ in the query. Counts distinct observed title/location combinations, not headcount.

## `maxCompanies` (type: `integer`):

Includes targets and companies discovered in public LinkedIn search.

## `includeLinkedIn` (type: `boolean`):

Best-effort guest search. May be blocked or sampled. No login or paid third-party Actor required. Sampled company coverage is ineligible for growth comparison.

## `maxLinkedInPages` (type: `integer`):

Up to roughly 25 public job cards per page. Not exhaustive.

## `maxCareerPages` (type: `integer`):

Parses JobPosting JSON-LD and follows same-site job links. Detects linked Greenhouse/Lever boards. JavaScript-only sites may return no jobs.

## `snapshotStoreName` (type: `string`):

A private key-value store name in YOUR Apify account. Reuse the same name and filters on sequential runs to measure changes. Requires full Actor permissions for named storage. Do not run overlapping scans into the same store.

## `baseline` (type: `object`):

Paste the complete SNAPSHOT JSON from a previous run. Alternative to named storage; works with limited permissions. Different scan settings invalidate comparison.

## `includeEvidence` (type: `boolean`):

Include job titles, locations and original listing URLs in each company lead.

## Actor input object example

```json
{
  "query": "Companies hiring 3+ SDRs in the US",
  "companies": [],
  "maxCompanies": 30,
  "includeLinkedIn": true,
  "maxLinkedInPages": 3,
  "maxCareerPages": 8,
  "includeEvidence": true
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

## `snapshot` (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 = {
    "query": "Companies hiring 3+ SDRs in the US",
    "companies": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("herazur/hiring-signal-lead-finder").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 = {
    "query": "Companies hiring 3+ SDRs in the US",
    "companies": [],
}

# Run the Actor and wait for it to finish
run = client.actor("herazur/hiring-signal-lead-finder").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 '{
  "query": "Companies hiring 3+ SDRs in the US",
  "companies": []
}' |
apify call herazur/hiring-signal-lead-finder --silent --output-dataset

```

## MCP server setup

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

```

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/GihBN0EPgUt9fAfXw/builds/E9ygVX8PbeUXf4wq0/openapi.json
