# Companies Hiring Now: Hiring Leads with Contacts (`datasignalslab/companies-hiring-leads`) Actor

Companies that opened new jobs in the last 7 days across 6,600 career sites (Greenhouse, Lever, Ashby, Workable and more), with new roles, departments, locations, careers URL, email, phone and LinkedIn. One lead per company, pay per lead.

- **URL**: https://apify.com/datasignalslab/companies-hiring-leads.md
- **Developed by:** [DataSignals Lab](https://apify.com/datasignalslab) (community)
- **Categories:** Lead generation, Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 lead-returneds

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

## Companies Hiring Now: Hiring Leads with Contacts

Find the companies that opened new jobs this week, before anyone else calls them. This Actor checks up to 6,600 company career sites (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Teamtailor, Breezy, Rippling, Personio, Recruitee and Workday), counts the jobs posted in your window, and returns one lead per company that is actively hiring: new roles, departments, locations, the careers page, and the email, phone and LinkedIn page from the company website. You pay per lead, nothing for companies that did not post anything.

### Who uses hiring leads

- Recruitment agencies and RPOs: a company that just posted five sales roles needs candidates now. The lead gives you the roles, the location and the address to send your pitch.
- B2B sales teams selling to growing companies (HR software, payroll, office space, equipment, relocation): hiring is the earliest public signal that a company is spending.
- Investors and analysts: hiring velocity per company, refreshed daily, without reading 6,600 job boards.
- Job seekers and career coaches: companies hiring in your field this week, with the newest roles and the direct links.

### Step by step

1. Enter role keywords such as `sales` or `python`, or leave empty for every role.
2. Optionally pick a country and the ATS platforms you care about.
3. Set the window (7 days by default) and the minimum number of new jobs per company.
4. Run it. Each company that posted enough new jobs in the window becomes one row.
5. Schedule it daily or weekly and de-duplicate on `slug` to get only the companies that are new to your list.

### What you get per lead

| Field | Example |
| --- | --- |
| company | `Figma` |
| slug | `figma` |
| ats | `greenhouse` |
| careersUrl | `https://boards.greenhouse.io/figma` |
| website | `https://figma.com` |
| newJobs | `12` (posted in the window and matching your filters) |
| openJobs | `148` (everything open on the board) |
| hiringVelocity | `0.081` (newJobs divided by openJobs) |
| latestPostedAt | `2026-10-27` |
| sampleTitles | `["Account Executive, Enterprise", "Sales Development Representative"]` |
| departments | `["Sales", "Customer Success"]` |
| locations | `["New York, NY", "London"]` |
| countries | `["United States", "United Kingdom"]` |
| remoteShare | `0.25` |
| sampleJobUrls | three direct links to the newest matching jobs |
| emails | `["hello@figma.com"]`, addresses on the company's own domain first |
| phones | `["+1 415 555 0100"]` |
| linkedin | `https://www.linkedin.com/company/figma` |
| contactPage | the contact or about page that was read |
| contactChecked | `true` when the website was read |
| asOf | `2026-10-28` |

```json
{
  "company": "Weekday",
  "slug": "weekday-1",
  "ats": "workable",
  "careersUrl": "https://apply.workable.com/weekday-1/",
  "website": "https://weekday.works",
  "newJobs": 217,
  "openJobs": 839,
  "hiringVelocity": 0.259,
  "latestPostedAt": "2026-10-27",
  "sampleTitles": ["AEM Developer", "AI Manager", "AI ML Engineer (Senior)"],
  "departments": ["AI Training"],
  "locations": ["Bengaluru, Karnataka, India", "United States"],
  "countries": ["India", "United States", "Canada"],
  "remoteShare": 0.45,
  "emails": ["founders@weekday.works"],
  "phones": ["+15612508998"],
  "linkedin": "https://www.linkedin.com/in/sanjaypriya",
  "contactPage": "https://www.weekday.works/contact",
  "contactChecked": true,
  "asOf": "2026-10-27"
}
```

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| keywords | array | `[]` | Only count new jobs whose title or department contains one of these words |
| country | string | empty | Only count new jobs in this country, for example `Germany` |
| platforms | array | `[]` | Limit to these ATS systems, for example `["greenhouse", "lever"]` |
| daysBack | integer | `7` | A job counts as new when posted within this many days |
| minNewJobs | integer | `1` | A company becomes a lead at this many new jobs |
| includeContacts | boolean | `true` | Read the company website for email, phone and LinkedIn |
| contactPages | integer | `3` | Pages of the company site to read |
| maxCompanies | integer | `300` | Career sites to check in this run, companies with a known website first |
| maxLeads | integer | `100` | Stop after this many leads, `0` for no limit |
| companyFilter | string | empty | Only companies whose name contains this text |
| companies | array | `[]` | Check only these slugs, overrides the filters |

### How it works

The Actor carries an index of 6,651 companies and the ATS each one uses, built from public career sites. For every company it reads the public job-board API of that ATS (no login, no scraping of HTML), keeps the jobs posted inside your window, applies your keyword and country filters, and skips the company when the count is below your threshold. For the companies that remain and have a known website, it reads the home, contact, about and imprint pages for email addresses, phone numbers and the LinkedIn page, the same way the Website Contact Scraper does. Companies with a known website are checked first, so a run with a small `maxCompanies` still returns leads with contact details.

### Cost example

Pay per lead returned: $0.02 per company ($20 per 1,000), nothing for a company without new jobs and nothing for an empty run. On 27 October 2026 a test over 40 companies with a 14 day window returned 8 leads, 6 of them with an email address or LinkedIn page, for 16 cents. A daily run over 300 companies with `minNewJobs` 3 typically returns 10 to 30 leads, so a month of daily hiring leads for one sector costs in the order of 6 to 18 dollars. Compare that with sales intelligence tools that start at several hundred dollars per month for the same signal.

### Use with AI agents and automation

Every row is flat JSON, so it drops straight into a CRM import, a Google Sheet, Zapier or Make. For an AI agent the Actor is available through the Apify MCP server: ask for "companies that posted sales jobs in Germany this week with an email address" and the agent runs it with `keywords`, `country` and `includeContacts` set.

### Limits

- The posted date comes from the ATS. Personio does not publish one, so Personio companies only appear when `daysBack` covers the whole board, and Workday dates are read from the posting text.
- Contact details are read from the public company website. For 1,892 of the 6,651 companies in the index the website is known. The other companies are checked for new jobs too, but their leads come without contacts and `contactChecked` is `false`. Companies with a known website are always checked first.
- Email addresses are what the company publishes on its own site: general addresses such as hello@, jobs@ or press@, not personal addresses of named people.
- One run checks at most the number of companies you set in `maxCompanies`. The whole index of 6,651 companies takes about an hour and is meant for a weekly schedule.

### Data source and compliance

Job data comes from the public job-board APIs of the ATS vendors, the same endpoints a company's own careers page calls. Contact details come from pages the company publishes on its own website. Nothing is logged in, no personal profiles are read and no CAPTCHAs are bypassed. Use the addresses in line with the applicable direct-marketing rules of your country.

### FAQ

**Is this a job scraper?** No. The job scrapers of DataSignals Lab return every job. This Actor returns companies, one row each, with the count and a sample of their new jobs. Use it to find who is hiring, then use a job scraper if you need every posting.

**Why does a company I know is hiring not appear?** Either it posted fewer jobs in the window than `minNewJobs`, its ATS is not among the eleven supported, or it is not in the index yet. Add it under `companies` with its slug to check it directly.

**Can I get only companies new to my list?** Run it on a schedule and de-duplicate on `slug` in your sheet or CRM. Each run returns the current state, so a company that keeps posting stays in the results.

**Are the emails verified?** They are read from the company website and sorted with the company's own domain first. They are not sent a test message.

**How fresh is the data?** Each run reads the job boards live. The company index is rebuilt monthly.

# Actor input Schema

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

Only count new jobs whose title or department contains one of these words, for example 'sales', 'python', 'nurse'. Leave empty to count every new job.

## `country` (type: `string`):

Only count new jobs in this country, for example 'United States', 'Germany', 'Netherlands'. Empty means any country.

## `platforms` (type: `array`):

Limit to these career-site systems: greenhouse, lever, ashby, workable, smartrecruiters, teamtailor, breezy, rippling, personio, recruitee, workday. Empty means all.

## `daysBack` (type: `integer`):

A job counts as new when it was posted within this many days.

## `minNewJobs` (type: `integer`):

A company becomes a lead when it posted at least this many new jobs in the window.

## `includeContacts` (type: `boolean`):

Reads the company website (home, contact, about, imprint) for email, phone and LinkedIn. Only for companies with a known domain. Off makes the run faster.

## `contactPages` (type: `integer`):

How many pages of the company site to read for contact details.

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

How many career sites to check in this run. Companies with a known website come first. 300 takes about 5 minutes.

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

Stop after this many leads. 0 means no limit.

## `companyFilter` (type: `string`):

Only check companies whose name contains this text.

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

Check only these company slugs, for example 'stripe' or 'figma'. Overrides the filters above.

## Actor input object example

```json
{
  "keywords": [
    "sales",
    "account executive"
  ],
  "country": "",
  "platforms": [],
  "daysBack": 7,
  "minNewJobs": 1,
  "includeContacts": true,
  "contactPages": 3,
  "maxCompanies": 300,
  "maxLeads": 100,
  "companyFilter": "",
  "companies": []
}
```

# Actor output Schema

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

All leads from this run as JSON, one object per company.

## `leadsCsv` (type: `string`):

The same leads as a CSV download.

# 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": [
        "sales",
        "account executive"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datasignalslab/companies-hiring-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 = { "keywords": [
        "sales",
        "account executive",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("datasignalslab/companies-hiring-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 '{
  "keywords": [
    "sales",
    "account executive"
  ]
}' |
apify call datasignalslab/companies-hiring-leads --silent --output-dataset

```

## MCP server setup

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