# Company Hiring Signals - Open Jobs by Company Domain (`plainsight/company-hiring-signals`) Actor

Give it company domains, get hiring signals: which job board they use (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Personio...), how many open roles, by department and location, remote share, newest posting, plus every job. Pay only for companies with a job board found.

- **URL**: https://apify.com/plainsight/company-hiring-signals.md
- **Developed by:** [kaleb ashton](https://apify.com/plainsight) (community)
- **Categories:** Lead generation, Jobs, Business
- **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 with job boards

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

## Company Hiring Signals: open jobs for any list of company domains

Give it a list of **company domains** and get back, for each company: **is it hiring, how many open roles, in which departments and locations, how many are remote, when the newest role was posted**, which **job board** it uses (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Personio, Recruitee, BambooHR, Breezy), and the full list of open jobs.

Hiring is one of the strongest buying signals in B2B: a company hiring 20 salespeople needs sales tools, one hiring its first data engineer needs a data stack, and a company with zero open roles is probably not expanding.

- 🎯 **Input is a company list, not a job search**: paste the domains from your CRM or lead list
- 🔌 Reads jobs from the **job boards' own public APIs**, the same feeds the companies' careers pages use, so counts are exact and current
- 🧭 Finds the board even when the website doesn't link it, and only accepts a match that **verifiably belongs** to the company
- 💸 **$10 per 1,000 companies, charged only when a job board is found**. No board, no charge.

### What can you use it for?

| You are... | Use it to... |
|---|---|
| **SDR / AE** | Prioritise accounts that are hiring in the department you sell to (Sales, Engineering, Data, Security...). |
| **Recruiter / agency** | Find companies with many open roles, or roles open for a long time, to pitch your services. |
| **Investor / analyst** | Track headcount growth and hiring mix across a portfolio or market, week over week (schedule it). |
| **HR-tech / job-board vendor** | Build lead lists by the ATS a company uses today (e.g. "Lever customers with 50+ open roles"). |
| **Researcher / AI agent** | Answer "is company X hiring, and for what?" with one API or MCP call. |

### What data do you get?

Per company: `isHiring`, `openJobs`, `remoteJobs`, `hiringSummary` (e.g. *"155 open roles: Sales 61, Engineering 38, People & Talent 12..."*), `departments` and `locations` (with counts), `newestJobPostedAt`, `oldestJobPostedAt`, `ats`, `jobBoardUrl`, `careersPageUrl`, `detectionMethod`, `jobTitles`, and optionally `jobs`: every open role with `title`, `department`, `location`, `remote`, `url`, `postedAt` and `employmentType`.

#### Sample output (real, trimmed)

```json
{
  "domain": "ramp.com",
  "companyName": "Ramp",
  "isHiring": true,
  "openJobs": 155,
  "remoteJobs": 140,
  "hiringSummary": "155 open roles: Sales 61, Engineering 38, People & Talent 12, Product 8, Design 7, Marketing 7",
  "ats": "ashby",
  "jobBoardUrl": "https://jobs.ashbyhq.com/ramp",
  "newestJobPostedAt": "2026-09-30T16:00:23+00:00",
  "detectionMethod": "verified-slug-match"
}
```

Other real results from our tests: `stripe.com` → 715 open roles (Greenhouse), `visa.com` → 763 (Workday), `palantir.com` → 318 (Lever), `notion.so` → 128 (Ashby), `canva.com` → 150 (SmartRecruiters).

### How to use it

1. Paste company domains (or URLs, or work emails) into **Company domains**.
2. Choose whether you want the full job list or just the per-company summary.
3. Click **Start**, then export to CSV/Excel/JSON or send to HubSpot, Salesforce, Google Sheets, Clay, Make, Zapier or n8n.

```bash
curl -X POST "https://api.apify.com/v2/acts/plainsight~company-hiring-signals/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["ramp.com", "linear.app"], "includeJobs": false}'
```

**Tip:** schedule a weekly run on your target accounts and compare `openJobs` over time to spot companies that just started a hiring push.

### Pricing

**$0.01 per company where a job board was found** ($10 per 1,000). Companies where no board is found, and unreachable websites, are **free** and still listed in your results.

**Try it free:** start a run with an empty input and it checks 3 sample companies at no charge, so you can see the exact output format first.

### How does it work?

1. It reads the company's homepage and careers pages and looks for links or embeds of a supported job board.
2. If the site doesn't link one, it can look the company up directly on Greenhouse, Lever, Ashby, SmartRecruiters and Workable, but only accepts a board whose name or job listings match the company.
3. It reads the open roles from that board's public job API and summarises them.

**Coverage:** about 7 in 10 tech and growth-stage companies in our tests. Companies using a fully custom careers site, or an enterprise ATS without a public job feed (e.g. some Taleo/SuccessFactors/iCIMS set-ups), may show "no job board found", and those rows are free.

### FAQ

**How fresh is the data?** Live: every run reads the job boards at that moment.

**Is it legal?** It reads public job listings that companies publish for anyone to see, through the job boards' public endpoints. No logins, no personal data.

**Why does a company I know is hiring show no board?** It probably uses a careers system without a public job feed, or hosts jobs on its own site. You're not charged for those.

### Related tools by the same developer

- [Company Enrichment](https://apify.com/plainsight/company-enrichment): company profile, contacts, tech stack, email provider and domain age in one row.
- [Tech Stack Detector](https://apify.com/plainsight/tech-stack-detector): 7,600+ technologies plus internal SaaS tools from DNS.
- [Website Contact Extractor](https://apify.com/plainsight/website-contact-extractor): emails, phones and social profiles.

# Actor input Schema

## `domains` (type: `array`):

Company websites, one per line (stripe.com, https://www.notion.so, jane@ramp.com). The Actor finds each company's job board and reads its open roles.

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

Add every open role (title, department, location, remote, URL, posting date) to each company row. Turn off for a compact one-row-per-company summary.

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

Cap on jobs included per company when 'Include job list' is on. Counts and department stats always cover all jobs.

## `guessJobBoards` (type: `boolean`):

If the website doesn't link its job board, look it up on Greenhouse, Lever, Ashby, SmartRecruiters and Workable by company name. A match is only accepted when the board verifiably belongs to the company.

## `maxDomains` (type: `integer`):

Only process the first N domains (useful for a quick test).

## `maxConcurrency` (type: `integer`):

How many companies to process in parallel.

## Actor input object example

```json
{
  "domains": [
    "stripe.com",
    "linear.app",
    "notion.so"
  ],
  "includeJobs": true,
  "maxJobsPerCompany": 100,
  "guessJobBoards": true,
  "maxConcurrency": 15
}
```

# Actor output Schema

## `results` (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 = {
    "domains": [
        "stripe.com",
        "linear.app",
        "notion.so"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainsight/company-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 = { "domains": [
        "stripe.com",
        "linear.app",
        "notion.so",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("plainsight/company-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 '{
  "domains": [
    "stripe.com",
    "linear.app",
    "notion.so"
  ]
}' |
apify call plainsight/company-hiring-signals --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,plainsight/company-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/HQoQJl31cmjrfivs3/builds/3WlghMBFxZ1MHjUBP/openapi.json
