# Hiring Velocity Signal API — PredictLeads Alternative (`zhorex/hiring-velocity-signal-api`) Actor

Company hiring intent signals from LinkedIn + Indeed in one API call. Per-company counts, week-over-week velocity, role breakdown, seniority mix, and composite hiring score (0-100). $0.20/company, no contract — the self-serve alternative to PredictLeads and Cognism Elevate.

- **URL**: https://apify.com/zhorex/hiring-velocity-signal-api.md
- **Developed by:** [Sami](https://apify.com/zhorex) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $200.00 / 1,000 company hiring signal aggregateds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Hiring Velocity Signal API — PredictLeads & Cognism Alternative

**Hiring-intent signals for any company — $0.20 per company, no contract, no minimum.** Pay-per-signal access to per-company hiring velocity, role breakdown, seniority mix, and week-over-week delta — aggregated from LinkedIn + Indeed in one API call. The self-serve alternative to **PredictLeads ($40/mo credit minimum)** and **Cognism Elevate ($37,498/year for 5 seats)** for SDR / RevOps teams who want hiring triggers without an annual contract.

> Enterprise hiring-intent platforms charge **$22K–$37K/year per 5 seats** (Cognism Elevate, PredictLeads Enterprise, LeadIQ Pro). This Actor delivers the same company-level signal — total active jobs, new postings in window, week-over-week velocity delta, role breakdown, seniority mix, and a composite hiring-signal score (0-100) — at **$0.20 per company, pay only for what you pull**. No subscription. No setup fee. No annual contract. Built for B2B SDR Managers, RevOps Leads, VC analysts tracking portcos, M&A scouts, and sales-trigger newsletter operators.

### How to get hiring-intent signals in 3 easy steps

1. **Go to the [Hiring Velocity Signal API](https://apify.com/zhorex/hiring-velocity-signal-api) page** on Apify and click **"Try for free"**
2. **Paste your list of company domains** (e.g. `["stripe.com", "ramp.com", "linear.app"]`) — pick the lookback window (7 / 14 / 30 / 60 / 90 days) and the platforms you want to query (LinkedIn / Indeed / both)
3. **Click "Run"**, wait for the aggregator to finish, then **download your data** as JSON, CSV, or Excel — or wire it into a daily / weekly Apify Schedule for continuous account-list monitoring

No coding required. No API key for LinkedIn or Indeed. No login bypass. Works with Apify's free plan.

> 🏢 **Running a production hiring-trigger pipeline?**
>
> If you're tracking 100+ accounts, polling weekly, or pulling >5K company signals/month, I offer custom output schemas matched to your CRM (Salesforce / HubSpot / Attio), dedicated proxy infrastructure for sustained throughput, schema stability SLA (no breaking changes without 30-day notice), and volume pricing above 25K signals/month.
>
> DM me on Apify, open an Issue with subject **"Enterprise inquiry"**, or email **samimassis2002@gmail.com** with subject **"Hiring Velocity enterprise"**.

### Table of contents

- [What this Actor does](#what-this-actor-does) — single-call company-level hiring signal aggregation
- [Who buys this Actor](#who-buys-this-actor) — 5 buyer personas with typical spend
- [Example use cases](#example-use-cases) — 6 concrete workflows with $/mo + ROI
- [Pricing](#pricing) — $0.20/company-signal, billed only on aggregated records
- [Code examples — Python + JavaScript](#scrape-company-hiring-signals-with-python-javascript-or-no-code)
- [Scheduled / recurring runs](#scheduled--recurring-runs-where-ppe-compounds) — the cron pattern where PPE compounds
- [Example input + output](#example-input)
- [Output schema reference](#output-schema-reference)
- [What this Actor is NOT](#what-this-actor-is-not)
- [FAQ](#faq) — 12 Q&As targeting "PredictLeads alternative", "Cognism alternative", "hiring intent API"
- [Compliance posture](#compliance-posture)
- [Roadmap](#roadmap)

### What this Actor does

- Single list of company domains → company-level hiring signals in one call
- Aggregates LinkedIn Jobs + Indeed Jobs and deduplicates cross-platform listings (so a job posted to both platforms counts as one — no inflated counts)
- Computes `totalActiveJobs`, `newJobsInPeriod`, and `weekOverWeekDeltaPct` per company
- Classifies every posting into a role bucket (engineering / sales / marketing / product / ops / other) using a calibrated keyword/regex matcher, then surfaces the per-role counts as `roleBreakdown`
- Classifies every posting into a seniority bucket (junior / mid / senior / executive) and surfaces percentage mix as `seniorityMix`
- Computes a composite `hiringSignalScore` (0-100) weighted across velocity × delta × seniority × breadth — sort your account list by this score to surface high-intent accounts in seconds
- Surfaces top 5 most-frequent job titles per company as a one-glance "what kind of hiring" indicator
- Normalized output (one shape per company regardless of which platforms returned data — your downstream pipeline never has to branch on missing fields)
- Per-platform 60s wall-clock timeout (one slow platform never drags down the batch)

### Who buys this Actor

| Buyer profile | Use case | Typical monthly spend |
|---|---|---|
| **B2B SaaS SDR Manager** (Series A–B, 10–80 employees) | Weekly account-list refresh on 200–500 target accounts; surface hiring spikes as outreach triggers | $200–$2,000/mo |
| **RevOps Lead** at growth-stage SaaS | Score 5K-account TAM monthly by hiring intent; enrich Salesforce/HubSpot with the score field | $1,000–$6,000/mo |
| **VC analyst tracking portfolio companies** | Quarterly hiring-velocity report for each portco; flag underhiring (concerning) and overhiring (raise about to be announced) | $120–$800/mo per fund |
| **M&A / corporate development scout** | Weekly pull on 100–1,000 acquisition-candidate domains; sort by velocity score + seniority mix to surface companies in growth mode | $400–$3,200/mo |
| **Sales-trigger newsletter operator** (e.g. The Signal, Hampton, RB2B newsletters) | Daily refresh on 5K-domain list to surface hiring-spike companies as newsletter editorial; bill subscribers $50–500/mo | $1,000–$10,000/mo |
| **Recruiter / staffing agency BD** | Identify companies in active hiring expansion before competitors; lead the cold-outbound conversation with the signal | $200–$1,200/mo |

If you're in any of these buckets and you're currently doing manual LinkedIn Jobs page checks weekly, this Actor pays for itself in the time you save in week 1.

### Example use cases

#### 1. Weekly SDR account-list refresh
Cron weekly on Monday at 7am local time, 200 target accounts, 7-day lookback, all four optional signals enabled (`includeRoleBreakdown`, `includeSeniorityMix`, `includeWeekOverWeekDelta` × default `platforms: ["linkedin", "indeed"]`). Push to your CRM (Salesforce / HubSpot / Attio) as a hiring-intent score field; SDRs sort their week's outreach queue by score descending. **Typical volume**: 200 signals/wk × 4 weeks = 800/mo. **Cost: ~$160/mo.** Compared to Cognism Elevate at $37,498/year for 5 seats, you save ~$36K/year per seat-equivalent.

#### 2. Daily hiring-spike alert (real sales trigger)
Cron daily, 50 highest-priority accounts, 7-day lookback, filter the output for `weekOverWeekDeltaPct > 100` AND `hiringSignalScore > 70`. Pipe matching records to a Slack webhook that pings #sdr-triggers. **Typical volume**: 50 signals/day × 30 days = 1,500/mo. **Cost: ~$300/mo.** A single closed deal from a well-timed trigger pays for years of this.

#### 3. RevOps TAM scoring (one-off + quarterly refresh)
Score your entire 5K-account TAM by hiring velocity once per quarter. Sort by `hiringSignalScore` descending and feed the top 500 to your SDR team as "first-priority outbound this quarter." **Typical volume**: 5,000 signals one-time. **Cost: ~$1,000 per quarter.** Compared to PredictLeads Enterprise at $40/mo credit floor + ~$0.04/credit = $200+/mo recurring just to maintain account scoring, this is a one-shot $1,000 spend with no contract.

#### 4. VC portfolio hiring tracker
Monthly run on every portco domain (e.g. 30 portcos for a typical seed/A-stage VC). Pull `hiringSignalScore`, `roleBreakdown.engineering`, `roleBreakdown.sales`, `weekOverWeekDeltaPct`. Track the trend month-over-month: portcos with declining velocity for 2 consecutive months get flagged in the quarterly LP letter. **Typical volume**: 30 signals/mo. **Cost: ~$6/mo per fund.** Compared to a Crunchbase Pro seat at $749/mo, this is a rounding-error spend.

#### 5. M&A acquisition-candidate scout
Weekly pull on 500-domain acquisition-candidate list. Sort by `seniorityMix.executivePct` (companies building out leadership = pre-fundraise or pre-exit) and `roleBreakdown.sales` (companies building out GTM = ready to scale revenue). **Typical volume**: 2,000 signals/mo. **Cost: ~$400/mo.** Compared to building this internally with a custom LinkedIn scraper, multiple-engineer build-out + ongoing maintenance.

#### 6. Sales-trigger newsletter editorial pipeline
Weekly refresh on 5K-domain list. Filter for new entrants to the top-100-by-score cohort week-over-week. The new entrants = your newsletter's "5 companies that started hiring fast this week" segment — sold to 200 paying subscribers at $99/mo. **Typical volume**: 5,000 × 4 weeks = 20,000/mo. **Cost: ~$4,000/mo.** Newsletter revenue: $19,800/mo gross. Net margin: ~80% on a single signal source.

### Pricing

- `company-hiring-signal` event: **$0.20 per company-signal record** (aggregated across LinkedIn + Indeed, with role breakdown, seniority mix, week-over-week delta, and composite score). Billed only on successful signal records — error records (e.g. domain didn't resolve) are not charged.
- No subscription. No setup fee. No minimum spend. No annual contract.
- **Pricing justification**: each company-signal event runs ~30 underlying scrapes (LinkedIn jobs search + Indeed company-jobs page + cross-platform deduplication). The buyer would pay $0.003–$0.01 per raw job × 30 = $0.09–$0.30 to do this manually. $0.20 sits inside that range AND saves the aggregation logic, the regex maintenance, and the cross-platform dedup.

#### Realistic costs

| Workflow | Volume | Cost |
|---|---|---|
| Weekly SDR refresh, 200 accounts | 800 signals/mo | **~$160/mo** |
| Daily hiring-spike alert, 50 accounts | 1,500 signals/mo | **~$300/mo** |
| Quarterly TAM scoring, 5K accounts | 5,000 signals/quarter | **~$1,000/quarter** |
| Monthly VC portfolio tracker, 30 portcos | 30 signals/mo | **~$6/mo** |
| Weekly newsletter, 5K-domain list | 20,000 signals/mo | **~$4,000/mo** |

Compared to **PredictLeads Pro at $40/mo credit minimum + $0.04/credit** (so 1,500/mo = $60/mo + a $40 sunk minimum every month), or **Cognism Elevate at $37,498/year for 5 seats** (so $625/seat/month just to reach the API), the weekly SDR workflow above is **~74% cheaper** than the cheapest Cognism Elevate seat — without an annual contract, per-seat licensing, or walled-garden dashboard. You own the raw data.

Apify platform compute (RAM-seconds) is charged separately and is negligible — typically <$0.10 per company-signal record at default config.

### Scrape company hiring signals with Python, JavaScript, or no code

You can run Hiring Velocity Signal API directly from the Apify Console (no code), or integrate it into your scripts.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("zhorex/hiring-velocity-signal-api").call(run_input={
    "companyDomains": ["stripe.com", "ramp.com", "linear.app"],
    "lookbackDays": 30,
    "includeRoleBreakdown": True,
    "includeSeniorityMix": True,
    "includeWeekOverWeekDelta": True,
    "platforms": ["linkedin", "indeed"],
})

for signal in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(
        f"{signal['companyDomain']:25s} "
        f"score={signal['hiringSignalScore']:>5} "
        f"new={signal['newJobsInPeriod']:>3} "
        f"wow={signal['weekOverWeekDeltaPct']}% "
        f"eng={signal['roleBreakdown']['engineering']} "
        f"sales={signal['roleBreakdown']['sales']}"
    )
````

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('zhorex/hiring-velocity-signal-api').call({
    companyDomains: ['stripe.com', 'ramp.com', 'linear.app'],
    lookbackDays: 30,
    includeRoleBreakdown: true,
    includeSeniorityMix: true,
    includeWeekOverWeekDelta: true,
    platforms: ['linkedin', 'indeed'],
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((s) => {
    console.log(
        `${s.companyDomain} score=${s.hiringSignalScore} ` +
        `new=${s.newJobsInPeriod} wow=${s.weekOverWeekDeltaPct}%`
    );
});
```

#### Scheduled / recurring runs (where PPE compounds)

The real value of this Actor is in **scheduled refreshes**, not one-off pulls. Use [Apify Schedules](https://docs.apify.com/platform/schedules) with a cron expression:

- `0 7 * * 1` — Monday at 7am for weekly SDR account-list refresh
- `0 7 * * *` — daily at 7am for hiring-spike alerts
- `0 7 1 */3 *` — quarterly at 7am for RevOps TAM scoring

Each scheduled run hits the same Actor with your saved input config, pushes to the same dataset, and bills only on the new signals. Pair with a Zapier / Make / n8n webhook to push high-score records straight to Slack, Salesforce, HubSpot, Attio, or your data warehouse.

### Example input

```json
{
    "companyDomains": ["stripe.com", "ramp.com", "linear.app"],
    "lookbackDays": 30,
    "includeRoleBreakdown": true,
    "includeSeniorityMix": true,
    "includeWeekOverWeekDelta": true,
    "platforms": ["linkedin", "indeed"]
}
```

One list of domains, one call, signals back for every domain. Mix-and-match the four optional outputs to control cost — disabling the `weekOverWeekDelta` cuts each company's scrape time by ~40% (no second-window fetch) if you only need the snapshot.

### Example output (one company-signal record)

```json
{
    "companyDomain": "stripe.com",
    "companyName": "Stripe",
    "linkedinCompanyUrl": "https://www.linkedin.com/company/stripe",
    "indeedCompanyUrl": "https://www.indeed.com/cmp/Stripe",
    "lookbackDays": 30,
    "totalActiveJobs": 184,
    "newJobsInPeriod": 47,
    "weekOverWeekDeltaPct": 220.0,
    "roleBreakdown": {
        "engineering": 23,
        "sales": 9,
        "marketing": 4,
        "product": 5,
        "ops": 3,
        "other": 3
    },
    "seniorityMix": {
        "juniorPct": 4.3,
        "midPct": 27.7,
        "seniorPct": 53.2,
        "executivePct": 14.8
    },
    "topJobTitles": [
        "Senior Software Engineer",
        "Account Executive",
        "Senior Product Manager",
        "Staff Engineer, Payments",
        "Solutions Engineer"
    ],
    "hiringSignalScore": 87.4,
    "platformsQueried": ["linkedin", "indeed"],
    "scrapedAt": "2026-05-17T10:00:00+00:00"
}
```

Reading: Stripe posted **47 new engineering-heavy senior-skewed jobs in the last 30 days, up 220% week-over-week**. That's a sales trigger — they're in expansion mode, the average engineering-domain B2B SaaS sells well into companies in active expansion, and the seniority skew means decision-makers are getting hired right now.

### Output schema reference

| Field | Type | Notes |
|---|---|---|
| `companyDomain` | string | Echo of input, normalized to bare hostname (`stripe.com`, not `https://www.stripe.com`) |
| `companyName` | string | Best-effort canonical company name from cross-platform mode |
| `linkedinCompanyUrl` | string | null | Heuristic company URL — null if the brandable label didn't resolve |
| `indeedCompanyUrl` | string | null | Same |
| `lookbackDays` | int | Echo of input — useful when piping into a multi-window store |
| `totalActiveJobs` | int | Distinct currently-listed jobs across both platforms (deduplicated) |
| `newJobsInPeriod` | int | Subset of `totalActiveJobs` posted within `lookbackDays` |
| `weekOverWeekDeltaPct` | float | null | `(current - previous) / previous × 100`. `null` when previous-window count was 0 (delta undefined) or `includeWeekOverWeekDelta=false` |
| `roleBreakdown` | object | `{engineering, sales, marketing, product, ops, other}` integer counts |
| `seniorityMix` | object | `{juniorPct, midPct, seniorPct, executivePct}` percentages summing to ~100 |
| `topJobTitles` | string\[] | Top 5 most frequent job titles in the new-jobs window |
| `hiringSignalScore` | float (0-100) | Composite of velocity × delta × seniority × breadth |
| `platformsQueried` | string\[] | Which platforms produced data on this run |
| `scrapedAt` | ISO 8601 | UTC timestamp when this record was aggregated |
| `error` | string | absent | Only present on error records — values include `invalid_domain`, `unresolved_label`, `no_jobs_found` |

### What this Actor is NOT

- **Not a raw job scraper.** This Actor returns a single aggregated record per company — counts, deltas, breakdowns. If you need the individual job postings (title, description, JD text, recruiter contact), use the dedicated [LinkedIn Jobs + Recruiter Enrichment Actor](https://apify.com/zhorex) instead.
- **Not a contact database.** No employee names, no emails, no phone numbers. For company + employee + tech stack + validated phone enrichment, use [B2B SDR Enrichment Chain](https://apify.com/zhorex/b2b-sdr-enrichment-chain).
- **Not a Cognism / PredictLeads replacement at enterprise scale.** Cognism Elevate and PredictLeads Enterprise also bundle dialer integration, GDPR-cleansed contact data, SLAs, and dedicated success management. This Actor is the **raw signal layer** — bring your own CRM and alerting stack.
- **Not real-time streaming.** Poll-based — LinkedIn and Indeed don't expose change feeds for company jobs. Daily / hourly cron is the right cadence.
- **Not a full ATS / Greenhouse / Lever export.** Some companies surface roles only on their own ATS that never make it to LinkedIn / Indeed — this Actor will miss those. For full ATS coverage, contact us about a custom integration.
- **Not a Glassdoor signal source (yet).** Glassdoor headcount-change signal is on the roadmap — currently this Actor only covers LinkedIn + Indeed.

### FAQ

#### What is the best PredictLeads alternative in 2026?

The [Hiring Velocity Signal API by Zhorex](https://apify.com/zhorex/hiring-velocity-signal-api) is the best PredictLeads alternative on Apify in 2026 for B2B SDR / RevOps teams that need company-level hiring intent signals without a $40/mo credit floor and without per-credit complexity. It aggregates LinkedIn + Indeed in one normalized output at $0.20 per company-signal. No subscription, no minimum spend, no annual contract. Pay only for the signals you actually pull.

#### What is the best Cognism alternative for hiring intent data?

For the hiring-intent slice of Cognism Elevate ($37,498/year for 5 seats per Vendr's published enterprise contract data), this Actor delivers the same company-level signal — new postings count, week-over-week velocity, role breakdown, seniority mix — at $0.20 per company. A typical 200-account weekly refresh costs ~$160/mo here vs ~$625/seat/month for the cheapest Cognism Elevate tier. You give up Cognism's dialer integration, GDPR-cleansed contact data, and managed-service layer — keep those if you need them, swap in this Actor for the signal layer.

#### How is this different from a raw LinkedIn / Indeed jobs scraper?

A raw scraper returns 1 record per job posting. This Actor returns 1 aggregated record per company — total active jobs, week-over-week delta, role breakdown, seniority mix, composite score. You skip the data-engineering job of pulling thousands of raw records, deduplicating across platforms, classifying titles into role buckets, computing window-over-window deltas, and rolling up to company-level. That's ~200 lines of Python + ongoing regex maintenance you don't have to write. The output is ready to join with your CRM on the `companyDomain` field.

#### How much does it cost to monitor hiring intent on 500 accounts weekly?

500 accounts × 4 weekly refreshes/mo = 2,000 signals/mo × $0.20 = **$400/mo**. Compared to PredictLeads Pro at ~$200+/mo (with a sunk $40/mo minimum) or Cognism Elevate at ~$625/seat/mo, you sit between the cheapest credit-based comparable and the enterprise tier — and you get the signal **with no contract, no per-seat licensing, and no annual commit**. Cancel by deleting the Apify schedule.

#### Is there an official LinkedIn or Indeed hiring-intent API?

No. LinkedIn's Talent Insights API is enterprise-only with five-figure-plus annual contracts. Indeed has no public hiring-intent API. PredictLeads, Cognism, LeadIQ Pro, and others run their own scrapers and resell the data with markup. This Actor is the direct alternative — same scraping approach, normalized output, pay-per-signal.

#### Can the Actor handle large account lists?

Yes. The Actor batches companies with bounded concurrency (3 parallel by default) and a per-platform 60-second wall-clock budget so one slow platform never drags the whole batch. For 1,000+ account lists, split into multiple scheduled runs of ~200 accounts each, or contact us about an enterprise tier with higher per-batch concurrency and dedicated proxy infrastructure.

#### What does the `hiringSignalScore` actually measure?

It's a 0-100 composite of four sub-signals: **velocity** (log-scaled new-jobs count, 0-40 pts), **delta** (week-over-week growth, 0-30 pts), **seniority** (share of senior + executive postings, 0-20 pts), and **breadth** (number of non-zero role buckets, 0-10 pts). Calibration: a flat-velocity 10-job company scores ~50; a 50-job +150% WoW senior-heavy 5-bucket company scores ~95. Sort your account list by this single field to surface the highest-intent accounts to your SDR team in seconds.

#### What does `weekOverWeekDeltaPct` mean exactly?

It compares the **current** lookback window (default 30 days) to the **immediately preceding equivalent window** (the prior 30 days). A value of `+200` means the company posted 3x more jobs in the current window than in the previous one. A value of `-50` means they posted half as many. `null` means the previous-period count was zero (delta undefined — the company has no baseline). For most use cases, anything above `+100` is a strong hiring-spike trigger.

#### Can I scrape company hiring signals in Python?

Yes. Install the Apify Python client (`pip install apify-client`), then call `zhorex/hiring-velocity-signal-api` from any Python script — see the [Python example](#python) above. Works identically in JavaScript / Node, Go, Ruby, or any language with HTTP — Apify exposes a REST API for every Actor.

#### Does this need LinkedIn or Indeed login credentials?

No. The Actor reads only the publicly accessible job-discovery surfaces on both platforms — the same content any anonymous browser visitor can see. Optional `cookieStrings` are user-supplied and used only to raise recall and reduce rate-limit risk on large batches, never to bypass authentication or surface gated content. The field is encrypted at rest by Apify.

#### What if a domain doesn't resolve to a LinkedIn / Indeed company page?

The Actor logs the resolution failure and emits a record with `error: "unresolved_label"` (or `"no_jobs_found"` if the page resolved but contained no current postings). These records are **not** PPE-charged. Most-common cause: the company's brandable label doesn't match the heuristic — e.g. a company at `acme.com` whose LinkedIn page lives at `linkedin.com/company/acme-international` instead of `linkedin.com/company/acme`. For these edge cases, pre-resolve the LinkedIn slug manually and contact us about a v0.2 input mode that accepts explicit per-domain slug overrides.

#### Is scraping LinkedIn / Indeed jobs legal?

The Actor accesses only **publicly available content** — the same content any anonymous browser visitor can see on LinkedIn's public job-search surface and Indeed's public company-jobs pages. No login bypass, no gated content, no scraping of private profiles or applicant data. Always review your local laws and each platform's terms of service for your specific use case. The seminal [hiQ Labs v. LinkedIn](https://en.wikipedia.org/wiki/HiQ_Labs_v._LinkedIn) Ninth Circuit ruling established that scraping public LinkedIn data does not violate the CFAA — but your jurisdiction and use case may differ.

### Compliance posture

- **Only public job postings.** No login bypass, no scraping of private content, no harvesting of applicant data, no recruiter PII enrichment, no personal email collection.
- **User-supplied cookies only.** The optional `cookieStrings` field is encrypted at rest by Apify; values are never logged. Cookies are used to raise recall and rate-limit comfort on large batches — never to bypass authentication or access gated content.
- **No PII in output.** The signal records contain only company-level aggregates. No individual employee names, no applicant data, no recruiter contact info.
- **Residential proxy support** for compliance with platform fair-use norms; datacenter proxies trip rate limits and we recommend against them for production.
- Buyers running this commercially are responsible for downstream compliance with their own jurisdiction's data laws.

### Integrations & data export

The Actor integrates with your existing workflow tools:

- **Salesforce / HubSpot / Attio / Pipedrive** — Map `companyDomain` and push `hiringSignalScore` as a custom field
- **Slack** — Webhook on completed runs, or filter for `hiringSignalScore > 80` records to alert the SDR team
- **Zapier / Make / n8n** — Trigger downstream workflows on new high-score records
- **Snowflake / BigQuery / Postgres** — Push to your data warehouse via the Apify dataset API or CSV export
- **REST API** — Call the Actor programmatically from any language
- **Webhooks** — Get notified when a scheduled run finishes
- **Data formats** — Download as JSON, CSV, Excel, XML, or RSS

### Roadmap

- **Glassdoor headcount-trend join** — surface Glassdoor employee growth as a corroborating signal alongside hiring velocity
- **BuiltWith tech-stack join** — combine hiring signal with tech-stack adoption for tighter SDR targeting (e.g. "companies hiring Salesforce admins right now")
- **Per-domain explicit LinkedIn / Indeed slug overrides** — for the ~15% of company domains where the heuristic slug doesn't match
- **Wellfound / AngelList Talent integration** — full coverage of early-stage / startup hiring (currently underrepresented by LinkedIn + Indeed)
- **Ashby / Greenhouse / Lever ATS direct API integrations** — full coverage of companies that don't cross-post to LinkedIn / Indeed
- **Per-month historical trend output** — surface the last 6 months of `newJobsInPeriod` as a time series for trend dashboards
- **Per-engineer-level seniority sub-classification** — split senior into senior IC vs staff vs principal

### Built on zhorex's B2B suite

This Actor complements the other B2B intelligence tools in the same suite:

- 🆕 [Hiring Velocity Signal API](https://apify.com/zhorex/hiring-velocity-signal-api) — **(this Actor)** company-level hiring intent signals, $0.20/company
- [LinkedIn Jobs + Recruiter Enrichment](https://apify.com/zhorex) — raw LinkedIn jobs with recruiter contact for staffing / recruiter use cases
- [B2B SDR Enrichment Chain](https://apify.com/zhorex/b2b-sdr-enrichment-chain) — company + employees + tech stack + validated phones, pay-per-contact
- [Crunchbase Scraper](https://apify.com/zhorex/crunchbase-scraper) — funding rounds, founding year, employee counts
- [LinkedIn Company Enrichment](https://apify.com/zhorex) — company-level LinkedIn profile fields for CRM enrichment

If you need raw job listings (titles + descriptions + recruiter contact for direct outreach), use the LinkedIn Jobs + Recruiter Actor directly. This aggregator is for **company-level hiring intent signals** — the sales trigger layer, not the recruiter tool.

### Support

Found a bug? Want a new field? [Open an issue on the Actor page](https://apify.com/zhorex/hiring-velocity-signal-api/issues) — typical turnaround within 48 hours.

***

💡 **Found this Actor useful?** Please [leave a star rating](https://apify.com/zhorex/hiring-velocity-signal-api/reviews) — it helps other SDR / RevOps teams discover this tool instead of paying $37K/year for a Cognism Elevate seat. 30 seconds, one click.

***

*Last updated: May 2026 · Actively maintained · Built for B2B SDR Managers, RevOps Leads, VC analysts, M\&A scouts, and sales-trigger newsletter operators who need hiring-intent signals without an annual contract.*

# Actor input Schema

## `companyDomains` (type: `array`):

List of company domains to aggregate hiring signals for (e.g. `stripe.com`, `ramp.com`). Bare domains preferred — full URLs are accepted and normalized. Each domain produces one signal record.

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

Window for the `newJobsInPeriod` count and the velocity delta. Recommended: 30 for monthly cadence reports, 7 for weekly trigger alerts, 90 for hiring trend analysis.

## `includeRoleBreakdown` (type: `boolean`):

Per-role job counts: engineering / sales / marketing / product / ops / other. Lets you filter for companies hiring expansion roles (sales, engineering) vs replacement roles (ops).

## `includeSeniorityMix` (type: `boolean`):

Percentage breakdown across junior / mid / senior / executive. Companies hiring lots of senior roles signal expansion or a leadership build-out — high-intent for sales prospecting.

## `includeWeekOverWeekDelta` (type: `boolean`):

Compare current `lookbackDays` window vs the immediately preceding equivalent window. A `weekOverWeekDeltaPct > 100%` signals a hiring spike — the single most actionable B2B sales trigger.

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

Which platforms to aggregate. LinkedIn is the highest-recall source; Indeed adds breadth on mid-market and US-centric companies. Recommended: both.

## `cookieStrings` (type: `object`):

Optional cookie strings keyed by platform name (`linkedin`, `indeed`). Unlocks higher recall and reduces rate-limit risk on large batches. Format: paste the raw Cookie header value from your browser's DevTools (Application → Cookies). Field is encrypted at rest by Apify. Not required — the actor degrades gracefully when omitted.

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

Apify proxy configuration. RESIDENTIAL is strongly recommended for production batches — LinkedIn and Indeed apply IP-reputation rate-limiting that datacenter proxies trip immediately.

## Actor input object example

```json
{
  "companyDomains": [
    "stripe.com"
  ],
  "lookbackDays": 30,
  "includeRoleBreakdown": true,
  "includeSeniorityMix": true,
  "includeWeekOverWeekDelta": true,
  "platforms": [
    "linkedin",
    "indeed"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "companyDomains": [
        "stripe.com"
    ],
    "lookbackDays": 30,
    "platforms": [
        "linkedin",
        "indeed"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zhorex/hiring-velocity-signal-api").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 = {
    "companyDomains": ["stripe.com"],
    "lookbackDays": 30,
    "platforms": [
        "linkedin",
        "indeed",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("zhorex/hiring-velocity-signal-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companyDomains": [
    "stripe.com"
  ],
  "lookbackDays": 30,
  "platforms": [
    "linkedin",
    "indeed"
  ]
}' |
apify call zhorex/hiring-velocity-signal-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=zhorex/hiring-velocity-signal-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Hiring Velocity Signal API — PredictLeads Alternative",
        "description": "Company hiring intent signals from LinkedIn + Indeed in one API call. Per-company counts, week-over-week velocity, role breakdown, seniority mix, and composite hiring score (0-100). $0.20/company, no contract — the self-serve alternative to PredictLeads and Cognism Elevate.",
        "version": "0.3",
        "x-build-id": "T6yC3OOLa3btMvOmo"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/zhorex~hiring-velocity-signal-api/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-zhorex-hiring-velocity-signal-api",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/zhorex~hiring-velocity-signal-api/runs": {
            "post": {
                "operationId": "runs-sync-zhorex-hiring-velocity-signal-api",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/zhorex~hiring-velocity-signal-api/run-sync": {
            "post": {
                "operationId": "run-sync-zhorex-hiring-velocity-signal-api",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "companyDomains"
                ],
                "properties": {
                    "companyDomains": {
                        "title": "Company domains",
                        "type": "array",
                        "description": "List of company domains to aggregate hiring signals for (e.g. `stripe.com`, `ramp.com`). Bare domains preferred — full URLs are accepted and normalized. Each domain produces one signal record.",
                        "default": [
                            "stripe.com"
                        ]
                    },
                    "lookbackDays": {
                        "title": "Lookback window (days)",
                        "minimum": 1,
                        "maximum": 180,
                        "type": "integer",
                        "description": "Window for the `newJobsInPeriod` count and the velocity delta. Recommended: 30 for monthly cadence reports, 7 for weekly trigger alerts, 90 for hiring trend analysis.",
                        "default": 30
                    },
                    "includeRoleBreakdown": {
                        "title": "Include role breakdown",
                        "type": "boolean",
                        "description": "Per-role job counts: engineering / sales / marketing / product / ops / other. Lets you filter for companies hiring expansion roles (sales, engineering) vs replacement roles (ops).",
                        "default": true
                    },
                    "includeSeniorityMix": {
                        "title": "Include seniority mix",
                        "type": "boolean",
                        "description": "Percentage breakdown across junior / mid / senior / executive. Companies hiring lots of senior roles signal expansion or a leadership build-out — high-intent for sales prospecting.",
                        "default": true
                    },
                    "includeWeekOverWeekDelta": {
                        "title": "Include week-over-week delta",
                        "type": "boolean",
                        "description": "Compare current `lookbackDays` window vs the immediately preceding equivalent window. A `weekOverWeekDeltaPct > 100%` signals a hiring spike — the single most actionable B2B sales trigger.",
                        "default": true
                    },
                    "platforms": {
                        "title": "Job platforms to query",
                        "type": "array",
                        "description": "Which platforms to aggregate. LinkedIn is the highest-recall source; Indeed adds breadth on mid-market and US-centric companies. Recommended: both.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "linkedin",
                                "indeed"
                            ],
                            "enumTitles": [
                                "LinkedIn Jobs",
                                "Indeed Jobs"
                            ]
                        },
                        "default": [
                            "linkedin",
                            "indeed"
                        ]
                    },
                    "cookieStrings": {
                        "title": "Per-platform cookies (optional)",
                        "type": "object",
                        "description": "Optional cookie strings keyed by platform name (`linkedin`, `indeed`). Unlocks higher recall and reduces rate-limit risk on large batches. Format: paste the raw Cookie header value from your browser's DevTools (Application → Cookies). Field is encrypted at rest by Apify. Not required — the actor degrades gracefully when omitted."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. RESIDENTIAL is strongly recommended for production batches — LinkedIn and Indeed apply IP-reputation rate-limiting that datacenter proxies trip immediately.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
