# Hiring Signal Bundle: Roles, Trend, Salary, Score (`transparent_meteorite/hiring-signal-bundle`) Actor

Hiring signal bundle that returns one row per company: open roles, new roles in the last 7 and 30 days, hiring trend, department and seniority mix, top roles with links, published salary ranges and a 0-100 hiring score. Covers 8 job sources in one run. No login.

- **URL**: https://apify.com/transparent_meteorite/hiring-signal-bundle.md
- **Developed by:** [Detroit Web Agent - Open Data](https://apify.com/transparent_meteorite) (community)
- **Categories:** Jobs, Lead generation, Business
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.00 / 1,000 company hiring bundles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Hiring Signal Bundle: Roles, Trend, Salary, Score

**Hiring signal bundle**: paste companies and get one row each with open roles, new roles in the last 7 and 30 days, hiring trend, department and seniority mix, published salary ranges and a 0-100 hiring score.

**In short:** paste companies (names, domains, careers-board URLs, Workday URLs) and get ONE row each with open roles, new roles in 7 and 30 days, hiring trend, department and seniority mix, the newest roles with links and pay, published salary ranges and a 0-100 hiring score. It merges Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Workday (165+ large employers) and LinkedIn public job listings. No login, no cookies, no personal data.

### Overview

- **Who it is for:** sales and BDR teams using hiring as a buying signal, recruiters and staffing firms, VC and competitor watchers, comp analysts.
- **Input:** `companies[]` (and/or `keywords` + `location` to discover companies hiring for a role), source toggles (`useAts`, `useWorkday`, `linkedinMode`), `lookbackDays`, `topRolesLimit`.
- **Output:** one dataset row per company (sample below).
- **Price:** from **$0.009 to $0.012 per company** (pay per event), plus $0.00005 per run start. Companies with nothing found are free.

### Sample output (real run, 2026-10-22)

Ramp, read from its public Ashby board (171 open roles; verified count matches the board):

```json
{
  "company": "Ramp",
  "status": "ok",
  "sourcesUsed": [
    "ashby:ramp"
  ],
  "careersUrl": "https://jobs.ashbyhq.com/ramp",
  "openRoles": 171,
  "newRoles7d": 13,
  "newRoles30d": 52,
  "trend": "growing",
  "trendPct": 27,
  "hiringScore": 77,
  "topDepartment": "sales",
  "departmentMix": {
    "engineering": 39,
    "data_ai": 9,
    "product_design": 11,
    "sales": 69,
    "marketing": 10,
    "customer_success": 6,
    "operations": 3,
    "people_finance_legal": 23,
    "other": 1
  },
  "seniorityMix": {
    "intern": 5,
    "entry": 3,
    "mid": 92,
    "senior": 34,
    "manager": 29,
    "director_plus": 8
  },
  "rolesWithPay": 164,
  "payRange": {
    "currency": "USD",
    "annualMin": 60000,
    "annualMax": 450000,
    "medianMidpoint": 217500,
    "rolesInCurrency": 153
  },
  "signal": "Ramp: 171 open roles, 52 new in 30d (12.1/wk, +27% vs prior 30d); top team sales. Signals: engineering surge +200% (12 vs 4 roles); people/finance/legal surge +80% (9 vs 5 roles). Score 77/100.",
  "topRoles": [
    {
      "title": "Manager, Customer Activation, Mid-Market",
      "location": "New York, NY (HQ)",
      "postedAt": "2026-10-22T22:24:53.127Z",
      "url": "https://jobs.ashbyhq.com/ramp/6a508863-352b-4f39-b299-5a3b6693605a",
      "pay": {
        "min": 194000,
        "max": 266000,
        "currency": "USD",
        "period": "year"
      }
    },
    {
      "title": "Software Engineer, Forward Deployed",
      "location": "New York, NY (HQ)",
      "postedAt": "2026-10-22T19:20:16.077Z",
      "url": "https://jobs.ashbyhq.com/ramp/29a5da77-37f0-402a-92bc-072778e77ed8",
      "pay": {
        "min": 168000,
        "max": 285000,
        "currency": "USD",
        "period": "year"
      }
    }
  ]
}
```

Same run, trimmed:

| Company | Source | Open | New 7d | New 30d | Trend | Score | Roles with pay |
|---|---|---|---|---|---|---|---|
| Figma | greenhouse:figma | 139 | 13 | 33 | growing | 78 | 81 (USD 70.5k-376k) |
| NVIDIA | workday:nvidia | 2000+ | 200+ | 200+ | unknown\* | 78 | 0 |

\*Workday only dates roles up to 30 days old and lists the newest first, so counts are lower bounds (`countsAreLowerBound`) and the prior-window trend is not computed.

### Input

| Field | Default | Notes |
|---|---|---|
| `companies` | 5 examples | Names, domains, careers-board URLs or Workday URLs |
| `keywords`, `location` | empty | Discover companies hiring for a role instead of pasting a list |
| `lookbackDays` | 30 | Window for new-role counts and trend |
| `topRolesLimit` | 10 | Newest roles returned per company, with links |
| `useAts`, `useWorkday`, `linkedinMode` | on, on, `fallback` | Source toggles |
| `monitorKey` | empty | Weekly monitoring: only changed companies are charged |
| `maxCompanies` | 25 | Hard cap on rows per run |

### Pricing and the math

| Event | Free plan | Bronze | Silver | Gold+ |
|---|---|---|---|---|
| company-bundle (one result row) | $0.012 | $0.011 | $0.010 | $0.009 |

Buying the pieces separately for the same company: Hiring Velocity Signals ($0.004) + Career Site Jobs API for the 10 newest roles (10 x $0.002 = $0.020) + a salary bucket ($0.005) = about **$0.029** and three runs to merge. The bundle is **$0.012 or less** and one run, because it reads each source once in-process instead of calling the sibling actors (no double platform billing). Compute for a typical 25-company run is a fraction of a cent.

### How sources combine

1. If the company matches the built-in Workday directory (or you paste a `myworkdayjobs.com` URL) the Workday career site is read.
2. Otherwise the public ATS board is found from the URL, the name, or the company website (robots.txt respected).
3. LinkedIn public guest listings are used as a fallback when no board exists (or always, with `linkedinMode: always`). Public listings only; no login or profile pages.

`sourcesUsed` in each row lists exactly what was read. Salary is shown only when the employer publishes it (Greenhouse pay transparency, Ashby and Lever compensation, Workday posting text for the newest roles).

### Use cases and workflows (n8n / Make)

Run the actor by API and read the dataset:

```
POST https://api.apify.com/v2/acts/transparent_meteorite~hiring-signal-bundle/run-sync-get-dataset-items?token=YOUR_TOKEN
Body: {"companies": ["stripe.com", "ramp", "NVIDIA"], "lookbackDays": 30, "topRolesLimit": 5}
```

- **n8n:** HTTP Request node (POST, JSON body above) -> IF node `hiringScore >= 70` -> Slack/HubSpot node with `signal` and `topRoles[0].url`.
- **Sales alerts:** run weekly with a `monitorKey`, push companies with `hiringScore >= 70` into HubSpot or Slack as a buying signal.
- **Competitor watch:** track a fixed list of rivals and chart `newRoles30d` and `trend` in a sheet.
- **Comp benchmarking:** collect published salary ranges by department and seniority across a peer group.
- **Make:** Apify "Run an Actor" module -> "Get dataset items" -> Filter `hiringScore >= 70` -> CRM module. Schedule weekly with a `monitorKey` so only companies whose hiring changed are charged.

### Sibling actors

[Hiring Velocity Signals](https://apify.com/transparent_meteorite/hiring-velocity-signals), [Career Site Jobs API](https://apify.com/transparent_meteorite/ats-open-roles), [Workday Jobs Scraper](https://apify.com/transparent_meteorite/workday-jobs-scraper), [LinkedIn Public Jobs](https://apify.com/transparent_meteorite/linkedin-public-jobs), [Salary Benchmarks from Job Posts](https://apify.com/transparent_meteorite/salary-transparency-index), [Visa Sponsorship Jobs](https://apify.com/transparent_meteorite/visa-sponsorship-jobs-scraper), [Remote Jobs Aggregator](https://apify.com/transparent_meteorite/remote-jobs-aggregator). Use the siblings when you need every job row rather than one summary per company.

### Limits

Only boards on the supported ATS vendors, the Workday directory, or LinkedIn public listings. Workday counts are lower bounds above 200 newest roles. Hiring scores are heuristics from public postings, not private data. Issues are answered on the Issues tab.

### FAQ

**Which job boards are read?** Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Workday and LinkedIn public listings.

**Am I charged for companies with no jobs found?** No. Only rows with hiring data are charged, and in monitor mode only changed companies.

**Is salary always present?** Only when the employer publishes it.

**Does it need a login?** No. Public pages and APIs only.

**Did this actor do the job?** If it saved you time, a short honest review on the [Reviews tab](https://apify.com/transparent_meteorite/hiring-signal-bundle/reviews) helps other people judge it. If something was off, open an Issue on this page with the input you used. I read every one and fix real bugs, usually the same day.

**This Actor vs tribloc/company-hiring-signals:** that one checks each company website for its careers page and job board. This one merges Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Workday and LinkedIn public job listings into one row per company with new-role counts, a trend and a 0-100 score.

### Changelog

- 0.1.1 (2026-10-23): README sections for input, FAQ and use cases; new icon.
- 0.1 (2026-10-22): first release. Combines hiring-velocity-signals, ats-open-roles (pay fields), workday-jobs-scraper and LinkedIn public jobs logic in one run; adds top roles with links, pay summary and Workday support.
- 2026-10-25: Listing refresh: new Store icon, README reorganised (overview, data fields, pricing, FAQ) and changelog tab added. No code change.

# Changelog

This Actor's version history is a separate document: https://apify.com/transparent_meteorite/hiring-signal-bundle/changelog.md

# Actor input Schema

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

One company per line. Accepted: a company name or website domain (large employers on Workday are matched automatically), a careers board URL (boards.greenhouse.io/x, jobs.lever.co/x, jobs.ashbyhq.com/x, apply.workable.com/x, jobs.smartrecruiters.com/x, x.recruitee.com), a Workday career-site URL, a vendor:slug token (greenhouse:figma) or a LinkedIn company URL.

## `preset` (type: `string`):

Presets fill sensible settings for common jobs. A preset only changes fields you left at their default.

## `keywords` (type: `string`):

Job title words, e.g. "account executive" or "data engineer". When set (or Location is set), the actor first finds companies posting matching jobs on LinkedIn and scores them.

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

LinkedIn location text, e.g. "United States", "Berlin, Germany" or "Remote".

## `lookbackDays` (type: `integer`):

Roles posted in this window count as new. Trend compares it with the window before it (e.g. last 30 days vs the 30 days before).

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

Upper limit on companies scored in one run (inputs plus discovered).

## `minHiringScore` (type: `integer`):

Skip (and do not charge) companies scoring below this. 0 keeps every company.

## `monitorKey` (type: `string`):

Any short name, e.g. "q4-accounts". Snapshots live in the named key-value store hiring-velocity-signals-monitor in your account. Empty = no monitoring.

## `linkedinMode` (type: `string`):

LinkedIn guest job search is slower (paced, one request at a time). ATS boards are fast official JSON APIs.

## `linkedinMaxPages` (type: `integer`):

Pages of 10 postings read per company from LinkedIn (5 = up to about 50 postings). Counts above this are marked as lower bounds.

## `discoveryPages` (type: `integer`):

Pages of 10 LinkedIn search results read in discovery mode.

## `atsDetection` (type: `boolean`):

Try to find a public Greenhouse / Lever / Ashby / Workable / SmartRecruiters / Recruitee board for names and domains (checks the board APIs and the company careers page, robots.txt respected).

## `useAts` (type: `boolean`):

Read the company's public applicant-tracking board. Fast official JSON; also gives published salary ranges.

## `useWorkday` (type: `boolean`):

If the company is one of the 165+ large employers in the built-in Workday directory (or you paste a myworkdayjobs.com URL), read its Workday career site.

## `topRolesLimit` (type: `integer`):

How many of the newest roles (title, location, link, pay when published) to include in each row.

## `workdayMaxPages` (type: `integer`):

Pages of 20 newest roles read per Workday company. Workday reports the full open-role count regardless.

## `includeNoJobRows` (type: `boolean`):

Add a free row for each company where no board or postings were found, so you can see what was missed.

## `timeBudgetSecs` (type: `integer`):

LinkedIn requests stop after this many seconds and the run finishes with what it has. ATS boards are not affected.

## `proxyConfiguration` (type: `object`):

Used for LinkedIn requests only. The default Apify datacenter proxy is enough; ATS board APIs are called directly.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/figma",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/notion",
    "NVIDIA",
    "stripe.com"
  ],
  "preset": "custom",
  "keywords": "",
  "location": "",
  "lookbackDays": 30,
  "maxCompanies": 25,
  "minHiringScore": 0,
  "monitorKey": "",
  "linkedinMode": "fallback",
  "linkedinMaxPages": 5,
  "discoveryPages": 5,
  "atsDetection": true,
  "useAts": true,
  "useWorkday": true,
  "topRolesLimit": 10,
  "workdayMaxPages": 10,
  "includeNoJobRows": true,
  "timeBudgetSecs": 240,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `full` (type: `string`):

No description

## `stats` (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": [
        "https://boards.greenhouse.io/figma",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/notion",
        "NVIDIA",
        "stripe.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("transparent_meteorite/hiring-signal-bundle").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": [
        "https://boards.greenhouse.io/figma",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/notion",
        "NVIDIA",
        "stripe.com",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("transparent_meteorite/hiring-signal-bundle").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": [
    "https://boards.greenhouse.io/figma",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/notion",
    "NVIDIA",
    "stripe.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call transparent_meteorite/hiring-signal-bundle --silent --output-dataset

```

## MCP server setup

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

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/dFSHJOteRVHH9esZK/builds/RzAJ0UxE8ohiqawLS/openapi.json
