# Company Hiring Signals from 20,000+ Career Sites (`digital_influx/hiring-signals`) Actor

Which companies are hiring, for what and where: open jobs, jobs posted in the last 7 and 30 days, job functions, countries, remote share and leadership roles per company, from the career sites of 20,000+ companies. Find who hires for any role. No LinkedIn, no login.

- **URL**: https://apify.com/digital_influx/hiring-signals.md
- **Developed by:** [Bruno Petrelli](https://apify.com/digital_influx) (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 $10.00 / 1,000 company profile saveds

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 from 20,000+ Career Sites

**Who is hiring, for what and where.** One profile per company: how many jobs it has open, how many it posted in the last 7, 30 and 90 days, in which job functions (engineering, sales, data, healthcare...), in which countries, how many are remote, which leadership roles it is hiring, and its newest jobs with links.

It works two ways:

- **Find the companies hiring for something:** leave *Companies* empty and filter by role keywords, job functions, places and dates. You get the companies with the most matching jobs, ranked. *"Companies with 3+ engineering jobs in London posted this month."*
- **Profile a list of companies:** give names, websites or careers page URLs and get the hiring profile of each one. Schedule it weekly with *Only companies with new jobs* to know when your target accounts start hiring.

The data is the open jobs of **20,000+ companies**, read once a day from their own career sites on Greenhouse, Lever, Ashby, Recruitee, Personio, Teamtailor and Gem: the jobs each company publishes for anyone to apply. No LinkedIn, no login, no proxies.

### Who uses it

- **Recruiting and staffing agencies:** companies that are building a team are your next clients. Find them by role and city, see how many jobs they posted this month and which ones are leadership roles.
- **B2B sales teams:** hiring is a buying signal. A company hiring 5 data engineers will buy data tools; one hiring its first sales team will buy a CRM. Feed the list into your CRM or outreach.
- **Investors and market research:** which companies grow which teams, where, and how fast, from their own job posts.
- **Job seekers and career coaches:** who is hiring for your role in your city, with the newest jobs.

### What you get

One record per company. Deliveroo's engineering, data and product jobs, read on 2026-10-08 (`"functions": ["engineering", "data_ai", "product"]`, two jobs listed):

```json
{
  "company": "Deliveroo",
  "status": "ok",
  "matchingJobs": 44,
  "openJobs": 197,
  "postedLast7Days": 5,
  "postedLast30Days": 44,
  "postedLast90Days": 44,
  "newestJobPostedAt": "2026-10-07T22:05:05.000Z",
  "topFunction": "Engineering",
  "functions": { "engineering": 25, "data_ai": 13, "product": 6 },
  "countries": { "GB": 40, "IN": 3, "DE": 1 },
  "remoteJobs": 0,
  "remotePercent": 0,
  "leadershipJobs": 0,
  "leadershipTitles": [],
  "internships": 0,
  "seniority": { "senior": 21, "unspecified": 17, "lead": 5, "entry": 1 },
  "newestJobs": [
    { "title": "Software Engineer II - Android", "function": "Engineering", "department": null, "location": "London, United Kingdom - Deliveroo",
      "country": "GB", "remote": null, "postedAt": "2026-10-07T22:05:05.000Z", "url": "https://job-boards.greenhouse.io/deliveroo/jobs/8202481" },
    { "title": "Senior Machine Learning Engineer - Recommendations", "function": "Data, AI & machine learning", "department": null, "location": "London, England",
      "country": "GB", "remote": null, "postedAt": "2026-10-07T13:29:52.000Z", "url": "https://job-boards.greenhouse.io/deliveroo/jobs/8261231" }
  ],
  "signals": [
    "5 of 44 matching jobs posted in the last 7 days (44 in the last 30).",
    "57% of the matching jobs are in engineering.",
    "Jobs in 3 countries: GB, IN, DE."
  ],
  "careersUrl": "https://job-boards.greenhouse.io/deliveroo",
  "platform": "greenhouse",
  "companySlug": "deliveroo",
  "openApplications": 1,
  "dataAsOf": "2026-10-08T21:57:14.438Z",
  "source": "live",
  "input": "https://job-boards.greenhouse.io/deliveroo",
  "matchedBy": "careers page"
}
```

| Field | What it is |
|---|---|
| `company` | Company name (from the career site, or the name you gave). |
| `status` | `ok` for a company with matching jobs. For a list of companies, also `too_few_jobs`, `no_matching_jobs`, `not_found`, `unreadable` or `unsupported`, with a `message` (these rows are free). |
| `matchingJobs` | Jobs that pass your filters. With no filter, every open job (open applications left out). |
| `openJobs` | All the company's open jobs, whatever the filters. |
| `postedLast7Days`, `postedLast30Days`, `postedLast90Days` | Matching jobs first published in the last 7, 30 and 90 days before `dataAsOf`. |
| `newestJobPostedAt` | When the newest matching job was published. |
| `topFunction`, `functions` | The main job function and the count per function, biggest first. |
| `countries` | Matching jobs per country (two-letter code), from the career site or from a country named in the location. |
| `remoteJobs`, `remotePercent` | Matching jobs that offer a fully remote option. |
| `leadershipJobs`, `leadershipTitles` | Director, head of, VP and C-level jobs, and their titles. |
| `seniority`, `internships` | Matching jobs per level read from the title (intern, entry, senior, lead, director, executive, unspecified). |
| `newestJobs` | The newest matching jobs: title, function, department, location, country, remote, date and link to the job page. |
| `signals` | The profile in short sentences: "7 of 27 matching jobs posted in the last 7 days (27 in the last 30).", "Hiring for 2 leadership roles: ...", "Jobs in 3 countries: GB, DE, US." |
| `careersUrl`, `platform`, `companySlug` | The company's careers page and the platform it runs on. |
| `openApplications` | Open applications and talent pools the company also posts. They are not counted as jobs. |
| `dataAsOf`, `source` | When the jobs were read: the date of the daily index, or now for a company read live (`live`). |
| `input`, `matchedBy` | For a list of companies: what you wrote, and how it was matched (`name`, `website` or `careers page`). |
| `newSinceLastRun` | With *Only companies with new jobs*: how many matching jobs are new since the last run (those are the ones listed). |

### Input

Companies hiring 2 or more data engineers, with jobs posted in the last 30 days (the example of the form):

```json
{
  "keywords": ["data engineer"],
  "postedWithinDays": 30,
  "minJobs": 2,
  "maxCompanies": 20
}
```

Companies with 3 or more engineering jobs in London posted in the last 30 days:

```json
{
  "functions": ["engineering"],
  "locations": ["London"],
  "postedWithinDays": 30,
  "minJobs": 3,
  "maxCompanies": 25
}
```

Remote engineering and data teams that are growing fastest:

```json
{
  "functions": ["engineering", "data_ai"],
  "remoteOnly": true,
  "postedWithinDays": 30,
  "minJobs": 3,
  "sortBy": "recent"
}
```

Your target accounts every week, only the ones that posted new jobs:

```json
{
  "companies": ["Stripe", "notion.so", "https://jobs.ashbyhq.com/openai", "Hugging Face"],
  "onlyNew": true
}
```

| Field | What it does |
|---|---|
| `companies` | Names, websites or careers page URLs (Greenhouse, Lever, Ashby, Workable, Recruitee, Personio, Teamtailor, Gem). Up to 1,000. Empty = search every company. |
| `keywords`, `excludeKeywords` | Words in the job title, whole-word ("intern" does not match "internal"). |
| `functions` | Job functions: `engineering`, `data_ai`, `product`, `design`, `it_security`, `sales`, `marketing`, `customer_success`, `operations`, `finance`, `people`, `legal`, `science_research`, `healthcare`, `education`, `retail_hospitality`, `trades_logistics`, plus `ai_training` and `open_application` (left out unless chosen). |
| `locations` | Text in the job location or the country code: Berlin, Germany, DE, London. "remote" also matches remote jobs. |
| `remoteOnly` | Only jobs with a fully remote option. |
| `postedWithinDays` | Only jobs published in the last N days. Empty = every open job. |
| `seniority`, `workplaceTypes`, `employmentTypes` | Level read from the title; remote, hybrid or on-site; full-time, part-time, contract, temporary, internship. |
| `minJobs` | Only companies with at least this many matching jobs (1 by default). |
| `sortBy` | `jobs` (most matching jobs), `recent` (most posted in the last 30 days) or `newest`. A list of companies keeps your order. |
| `maxCompanies` | How many top companies a search saves (50 by default). |
| `jobsPerCompany` | Newest matching jobs listed per company (5 by default, up to 50). |
| `onlyNew` + `memoryName` | Only companies that posted a matching job no earlier run of the same setup reported. The memory lives 180 days in a key-value store named `digital-influx-hiring-signals` in your account. |

### Job functions

The function of each job comes from its title, in English, German, French, Dutch, Spanish and the Nordic languages, and from the department the career site gives when the title says nothing. The rules were written on the 428,796 titles of the index of 2026-10-02 and checked by hand on samples of each function: about 85% of the jobs get a function, the rest are `other`. A title that names two functions goes to the more specific one: "Sales Engineer" is sales, "Data Engineer" is data, "Product Designer" is design, "Technical Account Manager" is customer success, a retail "Sales Assistant" is retail.

Two kinds of postings are left out unless you choose them in `functions`: **open applications and talent pools** ("Initiativbewerbung", "Join our talent community"), which are not jobs, and **AI-training and survey gigs** that a few boards post by the thousand ("Registered Nurses - AI Training"), which would otherwise outrank real employers.

### How much it costs

Pay per event: **USD 0.01 per company profile saved**, only for companies with matching jobs. Companies not found, without matching jobs or that could not be read are saved free, so you know what happened to each one. A search over the whole index takes a few seconds and costs only the profiles it saves: the example of the form costs at most USD 0.20.

### Use it from AI agents (MCP)

Claude, ChatGPT, Cursor and any other MCP client can run this Actor as a tool: add `https://mcp.apify.com?tools=digital_influx/hiring-signals` as a remote MCP server and sign in with your Apify account. For job search itself, see Job Search MCP (`digital_influx/job-search-mcp`) by the same author.

### Good to know

- **Fresh every day.** The index is rebuilt every day by reading each company's career site, so a job closed yesterday is gone and a job posted yesterday is in. `dataAsOf` says when. Companies you name that are not in the index are read live, at the moment of the run.
- **Dates are first publication dates.** `postedLast7Days` counts jobs first published in those days. A company that republishes old jobs can look busier than it is. Almost every job has a date: in the index of 2026-10-02 only 360 of 196,413 Greenhouse jobs had none, and those count only in `matchingJobs`.
- **Open jobs, not employees.** This is not a headcount: it counts the jobs a company has open on its own career site.
- **Which companies:** about 20,000 companies whose career site runs on one of the seven platforms, found through Common Crawl and checked live. Many are technology companies and startups in the US and Europe, plus retailers, healthcare providers and others. A company on another platform (Workday, SmartRecruiters, its own site) is not covered; Workday career sites can be read with Workday Jobs Scraper (`digital_influx/workday-jobs-scraper`).
- **Names:** Ashby, Lever, Teamtailor and Gem do not send the company name, so the name comes from the board address ("Openai") unless you wrote the name yourself. Websites are matched by their name (`stripe.com` is the board `stripe`): check `careersUrl` when a short name could be another company.
- **Very big Lever boards** are read up to their 1,000 newest jobs.
- **Requests:** a search reads only the index. Companies read live are asked through the public job APIs of each platform, with an honest User-Agent, a few at a time, and Lever at its one request per second.

### Sources

The public job board APIs of Greenhouse, Lever, Ashby, Workable, Recruitee, Personio, Teamtailor and Gem, where each company publishes its own open jobs. The jobs belong to the companies that post them; this Actor counts them and links to them. No platform or company endorses this Actor.

# Actor input Schema

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

Company names (Stripe, Hugging Face), websites (stripe.com) or careers page URLs on Greenhouse, Lever, Ashby, Workable, Recruitee, Personio, Teamtailor or Gem. Each one gets a profile, in this order, with the filters below applied to its jobs. A company not in the daily index is read live from its careers page. Leave empty to search every company of the index instead.

## `keywords` (type: `array`):

Count only jobs whose title contains any of these words (whole-word match: 'intern' does not match 'internal'). Example: data engineer, account executive.

## `functions` (type: `array`):

Count only jobs of these functions, read from the job title (and the department the career site gives). Open applications and AI-training gigs are left out unless you choose them here. Empty = every function.

## `locations` (type: `array`):

Count only jobs whose location or country code contains one of these texts: Berlin, Germany, DE, London. The word 'remote' also matches jobs flagged remote.

## `remoteOnly` (type: `boolean`):

Count only jobs that offer a fully remote option.

## `postedWithinDays` (type: `integer`):

Count only jobs published in the last N days before the index date. Empty = every open job, however old.

## `seniority` (type: `array`):

Count only these levels, read from the job title: "Senior Data Engineer" is senior, "Head of Sales" is director. "Not stated" keeps titles without a level word, which are mostly mid-level roles. Empty = all levels.

## `excludeKeywords` (type: `array`):

Do not count jobs whose title contains any of these words. Example: intern, contract.

## `workplaceTypes` (type: `array`):

Count only these workplace types, as the company set them on its career site. Greenhouse jobs rarely state it unless the location says Remote, Hybrid or On-site: add "Not stated" to keep them. Empty = all.

## `employmentTypes` (type: `array`):

Count only these employment types. Ashby, Lever, Recruitee and Personio give the type; Greenhouse lists none, so its jobs count as "Not stated" unless the title says intern, part-time or (contract). Empty = all.

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

Keep only companies with at least this many jobs that pass the filters. 3 or more finds companies that are really building a team.

## `sortBy` (type: `string`):

For a search over every company: most matching jobs, most matching jobs posted in the last 30 days, or the newest posting first. A list of companies keeps your order.

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

For a search over every company: how many of the top-ranked companies to save. Each saved company profile is one charged event.

## `jobsPerCompany` (type: `integer`):

How many of the newest matching jobs to list in each company profile (title, function, place, date and link). 0 = none.

## `onlyNew` (type: `boolean`):

Save only the companies that posted a matching job that earlier runs of this same setup did not report, and list those new jobs. A weekly schedule over your target accounts then tells you who just started hiring, and you pay only for those. The memory is kept for 180 days in a key-value store named "digital-influx-hiring-signals" in your account.

## `memoryName` (type: `string`):

By default each list of companies and set of filters has its own memory. Give a name to share one memory between tasks, or a new name to start over. Letters, digits, dot, dash and underscore.

## Actor input object example

```json
{
  "keywords": [
    "data engineer"
  ],
  "remoteOnly": false,
  "postedWithinDays": 30,
  "minJobs": 2,
  "sortBy": "jobs",
  "maxCompanies": 20,
  "jobsPerCompany": 5,
  "onlyNew": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "keywords": [
        "data engineer"
    ],
    "postedWithinDays": 30,
    "minJobs": 2,
    "maxCompanies": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("digital_influx/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 = {
    "keywords": ["data engineer"],
    "postedWithinDays": 30,
    "minJobs": 2,
    "maxCompanies": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("digital_influx/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 '{
  "keywords": [
    "data engineer"
  ],
  "postedWithinDays": 30,
  "minJobs": 2,
  "maxCompanies": 20
}' |
apify call digital_influx/hiring-signals --silent --output-dataset

```

## MCP server setup

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