# Company Hiring Signals & Job Postings Scraper (`bearcoda/company-hiring-signals`) Actor

Give it company websites. Finds their job board (Greenhouse, Lever, Ashby, Workday, Oracle, Taleo, SuccessFactors, iCIMS and more) and returns every open job plus hiring signals: roles by function and seniority, leadership hires, new and closed jobs since last run.

- **URL**: https://apify.com/bearcoda/company-hiring-signals.md
- **Developed by:** [Bearcoda](https://apify.com/bearcoda) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 job posting 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

## Company Hiring Signals & Job Postings Scraper

Paste a list of company websites. For each one, this Actor finds the company's job board on **Greenhouse, Lever, Ashby, Workday, Oracle, Taleo, SuccessFactors, iCIMS** and more, pulls every open job, and turns it into **hiring signals** you can sort and filter:

- how many roles are open, and how many were posted in the last 7 and 30 days
- openings by function (engineering, sales, marketing, data/AI, customer success, …) and seniority
- leadership hires (VP, Head of, Director, C-level), which usually mean a new budget owner
- remote share, top departments and top locations
- **new and closed jobs since your last run** — schedule it weekly and see exactly what changed
- a 0–100 **hiring intensity** score

It reads the companies' own public job boards (the same JSON feeds their careers pages use), so results are complete, fresh and fast. No login, no cookies, no proxies.

### Who it's for

- **Sales & RevOps:** a company hiring 5 SDRs needs a sales tool; one hiring a Head of Security is about to buy security software. Find accounts with buying intent and reach out first.
- **Recruiters & agencies:** see which companies are scaling a team before the roles hit job boards.
- **Investors & analysts:** track headcount growth, new teams and hiring freezes across a portfolio or a market.
- **Job seekers:** watch a list of target companies and get only the new roles that match.

### How to use it

1. Add companies in **Companies** — any of these work:
   - a domain: `stripe.com`
   - a careers page: `https://www.notion.so/careers`
   - a job-board URL: `https://jobs.lever.co/palantir`, `https://jobs.ashbyhq.com/ramp`, `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`
   - a company name (the Actor will guess the board name)
2. Optional filters: title keywords, location keywords, job functions, remote only.
3. Run it. Each company becomes one row with the summary and (optionally) its jobs.
4. **Schedule** it (daily or weekly) with *Track new and closed jobs* on, and turn on *Return only jobs that are new since the last run* to get a clean feed of new openings.

### Ready-made examples

Open one, swap in your own companies and run it:

- [B2B intent data from company hiring signals](https://apify.com/bearcoda/company-hiring-signals/examples/b2b-intent-data-from-company-hiring-signals): signals only, $0.03 per company
- [Buying signals: companies hiring sales reps](https://apify.com/bearcoda/company-hiring-signals/examples/buying-signals-companies-hiring-sales-reps)
- [Track competitor hiring week over week](https://apify.com/bearcoda/company-hiring-signals/examples/track-competitor-hiring-week-over-week)
- [New job postings alert for target accounts](https://apify.com/bearcoda/company-hiring-signals/examples/new-job-postings-alert-for-target-accounts)
- [Job postings data export for any company list](https://apify.com/bearcoda/company-hiring-signals/examples/job-postings-data-export-for-any-company-list)
- [Company job scraper: Greenhouse, Lever, Workday](https://apify.com/bearcoda/company-hiring-signals/examples/company-job-scraper-greenhouse-lever-workday)
- [Greenhouse jobs API](https://apify.com/bearcoda/company-hiring-signals/examples/greenhouse-jobs-api-export-company-jobs)
- [Lever job board scraper](https://apify.com/bearcoda/company-hiring-signals/examples/lever-job-board-scraper-with-hiring-signals)
- [Workday jobs API](https://apify.com/bearcoda/company-hiring-signals/examples/workday-jobs-api-scrape-workday-job-boards)
- [Enterprise jobs: Oracle, SuccessFactors, Phenom](https://apify.com/bearcoda/company-hiring-signals/examples/enterprise-jobs-oracle-successfactors-phenom)

### Output

One item per company (example; numbers are illustrative):

```json
{
  "input": "ramp.com",
  "companyName": "Ramp",
  "found": true,
  "ats": "ashby",
  "boardUrl": "https://jobs.ashbyhq.com/ramp",
  "confidence": "found-on-website",
  "openJobs": 142,
  "newJobsSinceLastRun": 9,
  "closedJobsSinceLastRun": 4,
  "postedLast7Days": 11,
  "postedLast30Days": 38,
  "remoteShare": 0.12,
  "hiringIntensity": 87,
  "byFunction": { "engineering": 51, "sales": 29, "customer": 14, "data_ai": 9 },
  "seniorityMix": { "mid": 70, "senior": 41, "lead": 22, "executive": 3, "entry": 6 },
  "leadershipHiring": ["Head of Security", "VP, Finance"],
  "topDepartments": [{ "name": "Engineering", "count": 51 }],
  "topLocations": [{ "name": "New York, NY (HQ)", "count": 88 }],
  "jobs": [
    {
      "id": "ab-34413f8d-…",
      "title": "Security Engineer, Cloud",
      "department": "Engineering",
      "location": "New York, NY (HQ)",
      "remote": false,
      "employmentType": "FullTime",
      "postedAt": "2026-10-14T16:02:11.000Z",
      "url": "https://jobs.ashbyhq.com/ramp/…",
      "compensation": { "summary": "$180K – $230K" },
      "jobFunction": "engineering",
      "seniority": "mid",
      "isNew": true
    }
  ]
}
```

Companies where no supported board was found come back with `"found": false` and **are not charged**.

#### Match confidence

| `confidence` | Meaning |
|---|---|
| `direct-url` | You gave a job-board URL. |
| `directory` | The company is in the Actor's built-in directory of large employers (Fortune 100, big tech) whose job boards are hidden behind custom careers sites. |
| `found-on-website` | The board is linked from the company's own website or careers page. |
| `guessed-verified` | Board name was guessed and the jobs point back to the company's domain or name. |
| `guessed` | Board name was guessed but couldn't be verified — double-check these. Turn off *Guess the board name* to skip guessing. |
| `careers-page-scan` | The company hosts jobs on its own website. Job titles and links were read from its careers page; department, location and dates aren't available, and very long lists may be partial. |

### Pricing

Pay per result, no subscription:

- **$0.03 per company with a job board found** (summary + signals)
- **$0.003 per job returned** ($3 per 1,000)
- Companies with no board found: free

Want only the signals? Turn off **Include individual jobs** and pay $0.03 per company. Checking 1,000 target accounts costs about $30.

### Supported platforms

**Startup and mid-market systems:** Greenhouse (incl. EU boards), Lever (incl. EU), Ashby, Workable, SmartRecruiters, Recruitee.

**Enterprise systems:** Workday, Oracle Recruiting Cloud, Oracle Taleo, SAP SuccessFactors, iCIMS, Eightfold, Avature, Phenom and Radancy (TalentBrew) career sites.

Department, location and posting date depend on what each system publishes: Greenhouse, Lever, Ashby, Workday, Oracle, Eightfold and Phenom are richest; iCIMS, Avature and SuccessFactors mostly give titles and links. For Workday boards you also get `boardBreakdown`: job counts by category, job type and location across the whole board.

Companies with their own custom careers site get a careers-page scan instead (titles and links).

### Coverage diagnostics (privacy)

When the Actor can't find a job board for a company, it reports that company's **domain** (or the name you typed) and which hiring system it detected, so we can add it in the next release. That's all: no job data, no other inputs, nothing about you or your account. Each run uses a random ID that isn't linked to you. Turn it off with **Help improve coverage** (`shareDiagnostics: false`) and nothing is sent.

### About the developer

This Actor is built and maintained by **[Bearcoda](https://bearcoda.com)**, a software development studio in Las Vegas, Nevada. Bearcoda has been building production software since 2013: web and mobile platforms, data pipelines, and AI and voice agents, with senior engineers working alongside AI tooling.

- **Maintained, not abandoned.** Every supported job board is checked regularly, and when a site changes, the fix ships in the next release.
- **Need something custom?** A different data source, a CRM sync, or a hiring-signals pipeline built for your team: [talk to Bearcoda](https://bearcoda.com).
- **Found a problem?** Open an issue on this Actor's Issues tab and include the company domain.

### FAQ

**Is this legal?** The Actor reads job postings companies publish on purpose, through the public job-board feeds that power their careers pages. It collects no personal data.

**How fresh is the data?** Live — each run reads the board directly.

**What about very large boards?** Each company returns up to *Max jobs per company* (default 1,000). `totalJobsOnBoard` always shows the full count and `truncated` tells you when the list was cut. Raise the limit if you want every job; change tracking covers the jobs that were fetched.

**How do I track changes across separate lists?** Use a different *Change-tracking store name* for each list.

**Why did my run stop early?** The run reached the *Maximum cost per run* you set. Raise it in the run options, or turn off *Include individual jobs* to pay only per company.

**Something's wrong with a company?** Open an issue on the Actor's Issues tab with the company domain and we'll fix it.

# Actor input Schema

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

Company website domains (stripe.com), careers-page URLs, job-board URLs (Greenhouse, Lever, Ashby, Workday, Oracle, Taleo, iCIMS, ...), or company names. One per line.

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

Return the list of open jobs for each company. Turn off to get only the hiring-signal summary (cheaper: you are charged per job returned).

## `trackChanges` (type: `boolean`):

Remember which jobs each company had on your previous run and flag what's new or closed. Ideal for scheduled runs.

## `onlyNewJobs` (type: `boolean`):

With change tracking on, only jobs that appeared since your previous run are returned (summary still covers the whole board).

## `titleKeywords` (type: `array`):

Only return jobs whose title contains one of these words (e.g. 'engineer', 'sales'). Summary still covers all jobs.

## `locationKeywords` (type: `array`):

Only return jobs whose location contains one of these (e.g. 'New York', 'Remote', 'Germany').

## `jobFunctions` (type: `array`):

Only return jobs in these functions.

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

Only return jobs marked remote. Hybrid roles are not counted as remote.

## `atsPlatforms` (type: `array`):

Leave empty to check all supported platforms.

## `guessIfNotFound` (type: `boolean`):

If no job board link is found on the company website, try likely board names (e.g. 'acme' for acme.com). Guessed matches are labelled in the 'confidence' field.

## `scanCareersPage` (type: `boolean`):

If the company hosts jobs on its own site (no supported job board), list the job links found on its careers page. These rows have titles and links only and are labelled 'careers-page-scan'.

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

Stop after this many jobs per company. The full count is still reported in totalJobsOnBoard.

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

How many companies to check at the same time.

## `stateStoreName` (type: `string`):

Named key-value store used to remember jobs between runs. Use different names to keep separate watchlists.

## `shareDiagnostics` (type: `boolean`):

Send the domains of companies this Actor could not find a job board for (and which hiring system they use, if known) to the developer, so they can be added. No job data and nothing about you is sent. Turn off to send nothing.

## Actor input object example

```json
{
  "companies": [
    "stripe.com",
    "ramp.com",
    "https://jobs.lever.co/palantir"
  ],
  "includeJobs": true,
  "trackChanges": true,
  "onlyNewJobs": false,
  "remoteOnly": false,
  "guessIfNotFound": true,
  "scanCareersPage": true,
  "maxJobsPerCompany": 1000,
  "maxConcurrency": 5,
  "stateStoreName": "hiring-signals-state",
  "shareDiagnostics": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

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

No description

## `runStats` (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 = {
    "companies": [
        "stripe.com",
        "ramp.com",
        "https://jobs.lever.co/palantir"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bearcoda/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 = { "companies": [
        "stripe.com",
        "ramp.com",
        "https://jobs.lever.co/palantir",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("bearcoda/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 '{
  "companies": [
    "stripe.com",
    "ramp.com",
    "https://jobs.lever.co/palantir"
  ]
}' |
apify call bearcoda/company-hiring-signals --silent --output-dataset

```

## MCP server setup

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