Hiring-Signal & Job-Postings Intel - ATS, Surge, Tech Stack avatar

Hiring-Signal & Job-Postings Intel - ATS, Surge, Tech Stack

Pricing

from $2.00 / 1,000 job-posting records

Go to Apify Store
Hiring-Signal & Job-Postings Intel - ATS, Surge, Tech Stack

Hiring-Signal & Job-Postings Intel - ATS, Surge, Tech Stack

Live job-postings intel from public ATS endpoints (Greenhouse, Lever, Ashby, Workday & more). Normalized postings plus a hiring-signal engine: net-new roles, role-count deltas, dept expansion, surge flags, and JD tech-stack detection. For B2B sales, recruiting, and alt-data. Public data only.

Pricing

from $2.00 / 1,000 job-posting records

Rating

0.0

(0)

Developer

Seibs.co

Seibs.co

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 hours ago

Last modified

Share

Hiring-Signal & Job-Postings Intel

TL;DR for sales-intelligence, RevOps, recruiting, and alt-data teams: Pulls live job postings straight off companies' public ATS feeds (Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Workable, Workday), normalizes them into one clean schema, and layers a hiring-signal engine on top - net-new roles, role-count deltas, department expansion, and a hiring-surge flag per company, plus tech-stack detection parsed from each job description. Job postings are the richest intent signal in B2B (a surge in "ServiceTitan administrator" reqs = a home-services firm scaling). Indeed killed its public API in 2023 and LinkedIn Jobs is auth-walled, so there is no unified public job-market API - this actor uses the open-but-unmarketed ATS endpoints instead. Logged-out, public-data only. Free Apify plan covers exploration runs on your $5 platform credit.

Run it in 30 seconds

# Via the Apify Python SDK
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("seibs.co/hiring-signal-intel").call(run_input={
"mode": "hiring_signals",
"companies": ["stripe", "ramp", "notion"],
"include_tech_stack": True
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Or via curl:

curl -X POST "https://api.apify.com/v2/acts/seibs.co~hiring-signal-intel/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"mode": "hiring_signals", "companies": ["stripe", "ramp", "notion"], "include_tech_stack": true}'

Or click "Try for free" on this page if you prefer the no-code UI.

What you get

Each run produces:

  • A clean dataset, filterable in the Apify console and downloadable as CSV or JSON
  • An OUTPUT.html dashboard preview of your top records
  • A sample-output preview at ./.actor/sample-output.json

Per-archetype custom artifacts shipped with this actor:

  • hiring.csv - every posting with company, role, department, seniority, remote flag, comp, tech stack, apply URL
  • hiring-followup.html - per-company hiring-signal worksheet (which surge to route to which AE)

Live example output

Real, unmodified output from runs against live company boards (no login required to view):

  • Hiring-surge showcase (hiring_signals over Stripe, Ramp, Mistral, Notion, GitLab - spanning Greenhouse, Lever, and Ashby): every company surging with net-new roles flagged against its trailing baseline. View the JSON
  • Clean job-postings feed (company_jobs, same companies): normalized postings with department, seniority, remote flag, comp where exposed, and detected tech stack. View the JSON

What does Hiring-Signal Intel do?

It hits the public ATS JSON endpoints that companies expose for their own careers pages - the same feeds that power their public job boards - and normalizes every open role into one schema: company, title, department (+ a normalized function bucket), location, remote_flag, seniority, comp_min/max (where the ATS exposes pay-transparency ranges), posted_at, apply_url, and ats_source. Then it computes the hiring-signal layer: how many roles are net-new since the last run, which departments are expanding, and whether the company crossed a hiring-surge threshold. Finally it parses each job description for named software (Salesforce, ServiceTitan, Snowflake, Procore, ...) - the tech-stack buying signal B2B sellers key off.

Responsible use / data scope

This actor is a public-data tool. It reads only logged-out, publicly-served ATS endpoints (a company's own careers feed) - no accounts, no cookies, no paywalls, no login walls. It minimizes PII: records carry role / department / location, not personal data, and recruiter names are never stored. You are responsible for lawful use of the outputs (GDPR / CCPA apply to personal data even when public). We deliberately scope to public job postings and government/open sources rather than auth-walled platforms.

AI / RAG / Agent

A turn-key intent feed for sales-AI agents, RevOps copilots, and recruiting bots. Postings arrive pre-normalized with seniority, department_normalized, remote_flag, and tech_stack so an agent can filter on "Sales roles mentioning Salesforce at companies hiring 3+ net-new this week" without parsing raw HTML. Compatible with LangChain, LlamaIndex, Pinecone, Weaviate, Chroma, and any MCP-aware agent runtime (see the sibling mcp-hiring-signal-intel actor for direct tool-call wiring with agentic payments).

Features

  • 7 public ATS connectors - Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Workable, Workday. No auth, no anti-bot.
  • Auto-resolve - pass a bare company slug and the actor tries each ATS in order until it finds the board. Or pass explicit ats_boards, or a careers-page URL to sniff.
  • Normalized schema - one shape across all sources, with seniority and department_normalized inferred.
  • Hiring-signal engine - net-new roles, removed roles, role-count delta (absolute + %), department expansion, new departments, and a hiring_surge_flag vs a trailing baseline persisted between runs.
  • Tech-stack detection - 45+ named software products parsed from each JD (CRM, ERP, data/cloud, vertical ops, languages).
  • Comp extraction - pay-transparency ranges where the ATS exposes them (Lever salaryRange, Ashby compensation, Greenhouse pay metadata).
  • Monitor mode - run under an Apify Schedule and get only the change-delta (new / changed / removed) plus an optional Slack digest.
  • Cost-control - per-run budget guard + demo-mode soft-fail so runs finish SUCCEEDED.

Use cases

  • B2B sales intelligence - a hiring surge = budget + a team being built; route surging companies to the AE who owns them. This is the live-data engine behind the b2b-sales-triggers actor.
  • Tech-stack targeting - find every company hiring for "Procore" / "Salesforce admin" / "Snowflake" and sell the adjacent / displacement product.
  • Recruiting & staffing - a live req feed across a watchlist of target companies, deduped by job_id.
  • Headcount / alt-data research - track open-role counts and department mix over time as a growth proxy.
  • Vertical lead-gen - a posting is a buying signal for every vertical lead-finder in the portfolio.

Modes

ModeWhat it returns
company_jobsEvery current open role for the given companies/boards.
hiring_signalsPostings plus a per-company hiring-signal rollup (net-new roles, role-count delta, department expansion, surge flag) vs a trailing baseline.
new_rolesOnly the postings that are net-new since the last run (a clean delta feed), plus the rollup.

Resolving companies (three ways)

  1. companies - bare slugs, auto-resolved across ATS providers: ["stripe", "ramp"]. The slug is the company id in its careers URL (e.g. stripe in boards.greenhouse.io/stripe).
  2. ats_boards - explicit when you know the ATS: [{"ats": "greenhouse", "slug": "stripe"}]. Workday needs {"ats": "workday", "host": "company.wd1.myworkdayjobs.com", "tenant": "company", "site": "External", "slug": "company"}.
  3. careers_urls - paste a company careers page; the actor sniffs the embedded ATS board: ["https://www.example.com/careers"].

Input

See ./.actor/input_schema.json for the full form. Key fields:

{
"mode": "hiring_signals",
"companies": ["stripe", "ramp", "notion"],
"departments": ["Sales", "Engineering"],
"keywords": ["salesforce", "revenue operations"],
"include_tech_stack": true,
"remote_only": false,
"max_results_per_company": 200
}

No API key or login is required - ATS endpoints are public.

Output

One hiring_signal record per company (in signal modes) followed by one posting record per open role.

{
"record_type": "hiring_signal",
"company": "Ramp",
"ats_source": "greenhouse",
"current_open_roles": 71,
"baseline_open_roles": 58,
"net_new_role_count": 13,
"role_count_delta_pct": 0.2241,
"department_expansion": [{"department": "Sales", "from": 14, "to": 22, "delta": 8}],
"hiring_surge_flag": true,
"surge_reason": "13 net-new roles since last run (>= 3)"
}
{
"record_type": "posting",
"company": "Ramp",
"title": "Revenue Operations Manager",
"department_normalized": "Sales",
"seniority": "manager",
"location": "New York, NY",
"remote_flag": false,
"comp_min": 145000,
"comp_max": 185000,
"comp_currency": "USD",
"tech_stack": ["Salesforce", "Looker", "Outreach"],
"apply_url": "https://boards.greenhouse.io/ramp/jobs/7412931"
}

Failed board lookups still emit a fetch_error record with a reason for completeness audit.

Pricing

Pay-per-event:

EventPriceWhen charged
posting_record$0.002 ($2/1k)Per normalized open role returned (the public ATS base layer, priced at the competitive market band).
tech_stack_signal$0.007When include_tech_stack=true and >= 1 named tool is detected in a JD.
hiring_surge_flag$0.012Once per company that crosses the surge threshold vs its baseline (the premium B2B trigger).
scheduled_delta_run$0.050Once per scheduled monitor-mode run.

A run that returns nothing costs nothing. A typical 3-company hiring_signals run (~50 roles each) with tech detection costs roughly $0.30 - $0.70 depending on how many roles each company has open and how many mention named software.

FAQ

Q: Is this legal? A: This actor reads only logged-out, public ATS endpoints - the same data a company serves on its own public careers page. No login, no cookies, no paywall. It minimizes PII (no personal/candidate data, no recruiter names). You remain responsible for lawful use of the outputs (GDPR/CCPA apply to personal data even when public). See the "Responsible use / data scope" note above.

Q: How is this different from an Indeed or LinkedIn jobs scraper? A: Those hit auth-walled, anti-bot platforms (Indeed deprecated its public API in 2023; LinkedIn requires login). This actor uses companies' own public ATS feeds - no auth, no anti-bot - and adds the intelligence layer: hiring-surge detection, department-expansion deltas, and JD tech-stack parsing that a raw scraper doesn't give you.

Q: How do I find a company's ATS slug? A: Look at its careers URL. boards.greenhouse.io/<slug>, jobs.lever.co/<slug>, jobs.ashbyhq.com/<slug>, jobs.smartrecruiters.com/<slug>, <slug>.recruitee.com, <slug>.workable.com. Or just pass the careers-page URL in careers_urls and let the actor detect it.

Q: How does the hiring-surge flag work? A: The actor stores a small per-company baseline (job ids + department counts) between runs in a persistent KVStore. On the next run it compares the current open roles against that baseline. A company is flagged when it has >= surge_abs_threshold net-new roles (default 3) OR its open-role count grew by >= surge_pct_threshold (default 20%). The first run for a company establishes the baseline (first_run: true, no surge).

Q: Why might a run return a fetch_error? A: Usually a renamed/typo'd ATS slug, or a company that uses an ATS this actor doesn't support yet. The run still finishes SUCCEEDED and emits a fetch_error record naming the board so you can correct it.

Q: Can I schedule this? A: Yes. Daily or weekly cron on a saved Task gives you a hands-off hiring-surge feed. Pair with monitor mode (below) so you only get the delta.

Save your input as an Apify Task

Apify Tasks let you save a configured input once and re-run it with one click - the foundation for schedules, monitor mode, and the hiring-surge baseline (the baseline is most useful when the same company list runs on a cadence).

  1. Click Run with your input configured.
  2. Click Save as task.
  3. Name it (e.g. target-account hiring surge - weekly).
  4. Reload the task page and click Start anytime.

Run this weekly with Apify Schedules

  1. Save your input as a Task (above).
  2. Go to https://console.apify.com/schedules and Create new schedule.
  3. Pick your Task and set a cron expression (weekly Mondays 9am: 0 9 * * 1).
  4. Save. Each run refreshes the baseline and surfaces the week's net-new roles and surging companies.

Monitor mode (beta)

When this actor runs under an Apify Schedule, monitor mode emits only the change-delta (new / changed / removed postings) instead of the full set, with a digest record at the top. Provide monitor_webhook_url and the digest also fires to your Slack channel. Cost: one scheduled_delta_run event ($0.05) per scheduled run plus standard PPE on emitted delta records only.

  • b2b-sales-triggers - turn a hiring surge into an outbound sales trigger for your AE/SDR team. This actor is its live job-postings engine.
  • sec-edgar-intel - pair hiring surges with Form D raises and 8-K events for a full "this company is scaling" picture.
  • local-leads-without-websites - SMB prospects to layer hiring + intent signals on top of.

Support

Open an issue via the Apify Store contact link. Include the run ID and input config so the issue is reproducible.

Changelog

See ./CHANGELOG.md.

Found this useful?

If this actor saved you time or money, please leave a quick review on the Apify Store. Reviews help other buyers find work that solves their problem: https://apify.com/seibs.co/hiring-signal-intel#reviews