Hiring Signal Feed – Company Job Board Tracker
Pricing
from $10.00 / 1,000 company rows
Hiring Signal Feed – Company Job Board Tracker
Job postings API and hiring-signal scraper for Greenhouse, Lever, Ashby and SmartRecruiters job boards. Per company: open roles by department and seniority, new roles in 7/30 days, growth since last run, salary bands. For sales triggers, Clay, recruiters, VCs and AI agents (MCP).
Pricing
from $10.00 / 1,000 company rows
Rating
0.0
(0)
Developer
Offladder
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 hours ago
Last modified
Categories
Share
Hiring Signal Feed: Job Postings API & Hiring Signals from Greenhouse, Lever, Ashby & SmartRecruiters
Hiring Signal Feed is a job postings API and hiring-signals scraper for sales, recruiting and investing. Give it companies or career-page URLs and it pulls every open role from their Greenhouse, Lever, Ashby or SmartRecruiters job board. You get back one hiring-signal row per company: open roles by department and seniority, new roles in the last 7 and 30 days, headcount growth since your last run, salary bands, and the ATS they use. Every job can also come back as a normalized row. It reads the official public job-board JSON APIs only (no LinkedIn scraping, no login, no proxies), and it costs $0.01 per company signal.
Built for GTM engineers and SDR teams (trigger-based outbound: "they're hiring 5 SDRs, so they need X"), Clay users who want hiring-signal enrichment, recruiters and staffing agencies, VCs tracking headcount momentum, and job-board builders who need a jobs feed.
Why this Actor
- Official public endpoints only. It uses each ATS's documented public job-board JSON API. No login, no cookies, no proxies, no headless browser, so runs are fast and cheap.
- Company-level signals, not just rows. Department and seniority mix, 7- and 30-day new roles, remote share, salary bands.
- Growth tracking built in. A named key-value store remembers the previous run, so scheduled runs report
open_roles_change,roles_added_since_last_run,roles_closed_since_last_run, andis_new_since_last_runon each job. - Auto-detects the platform from a URL or a bare slug.
- Fair pay-per-event pricing, and runs stop cleanly at your max-charge limit.
Input
| Field | Description |
|---|---|
companies (required) | Board URLs (https://job-boards.greenhouse.io/stripe, https://jobs.lever.co/spotify, https://jobs.ashbyhq.com/ramp, https://jobs.smartrecruiters.com/BoschGroup), prefixed ids (greenhouse:stripe, lever:palantir, ashby:notion, smartrecruiters:Experian), or bare slugs (tried in order: Greenhouse → Lever → Ashby → SmartRecruiters). |
outputMode | both (default), companies, or jobs |
titleKeywords | Optional: keep only matching titles (e.g. sales, SDR). Signals are computed on the filtered set. |
includeDescriptions | Add plain-text job descriptions (default off) |
maxJobsPerCompany | Cap on job rows per company (0 = all). Company signals always use every job. |
snapshotStoreName | Key-value store for growth tracking. Keep it the same across scheduled runs. |
maxConcurrency, requestDelaySecs | Polite pacing (defaults 3 boards and 0.5 s between requests) |
{ "companies": ["greenhouse:stripe", "https://jobs.lever.co/spotify", "ashby:ramp", "smartrecruiters:Experian"], "outputMode": "both" }
Output
Company row (row_type: "company")
{"row_type": "company", "company": "Ramp", "company_slug": "ramp", "ats": "ashby","open_roles": 167, "new_roles_7d": 12, "new_roles_30d": 47, "remote_roles": 150,"roles_by_department": {"Engineering": 60, "Sales": 30},"roles_by_seniority": {"mid/unspecified": 72, "manager": 51, "senior": 12},"previous_open_roles": 160, "open_roles_change": 7, "open_roles_change_pct": 4.4,"roles_added_since_last_run": 11, "roles_closed_since_last_run": 4,"jobs_with_salary": 160,"salary_bands": [{"currency": "USD", "interval": "year", "count": 150, "min": 90000, "max": 400000}],"board_url": "https://jobs.ashbyhq.com/ramp", "scraped_at": "2026-10-18T02:34:40+00:00"}
(Illustrative values. See samples/ for real output.)
Job row (row_type: "job"): company, ats, job_id, title, department, seniority, location, remote, employment_type, posted_at, salary{min,max,currency,interval,source}, url, is_new_since_last_run, description?
Error row (row_type: "error"): written for an entry that can't be processed. Error rows are never charged. Codes:
BOARD_NOT_FOUND: no public Greenhouse/Lever/Ashby/SmartRecruiters board for this company.INVALID_COMPANY: malformed entry, an unsupported ATS (Workday, iCIMS, Workable, BambooHR) or a non-board URL. Themessagesays how to fix it.INVALID_INPUT: the whole input is unusable (e.g. emptycompanies, unknownoutputMode). The run stops before any result is charged.INTERNAL_ERROR: unexpected failure for one company; the rest of the run continues.
Pricing (pay per event)
| Event | Price |
|---|---|
| Actor start | $0.02 per run at the default 1 GB memory (charged by Apify per GB of memory) |
| Job row | $0.0015 ($1.50 / 1,000) |
| Company hiring-signal row | $0.01 |
Tip: use outputMode: "companies" to watch 1,000 companies for about $10 per run.
Data notes and limitations
- Coverage: Greenhouse, Lever (US and EU), Ashby, SmartRecruiters. Workday, iCIMS and others are not supported yet.
- Salary:
- Lever and Ashby: structured, when the company publishes it.
- Greenhouse: parsed from description text, best-effort.
- SmartRecruiters: the list API exposes no salary.
- Seniority: inferred from the job title (SmartRecruiters also provides experience level). It's a heuristic.
- Posting dates:
- Greenhouse uses
first_published, falling back toupdated_at. - Lever uses
createdAt. - Ashby uses
publishedAt. - SmartRecruiters uses
releasedDate.
- Greenhouse uses
- Company names: for Lever and Ashby, the name is the board slug in title case.
- Growth metrics appear from the second run onward with the same snapshot store.
Legal
The Actor reads only job postings that companies publish through their ATS's public job-board API for syndication. It collects no personal profiles. You are responsible for how you use the data.
Use cases
- Sales triggers: set
titleKeywords: ["SDR","account executive"]to find accounts building out a sales team. Use["data engineer"]if you sell data tools. - Account scoring in Clay / HubSpot / Salesforce: pull
open_roles,new_roles_30dandopen_roles_change_pctas columns. - Recruiting and staffing agencies: get a daily list of companies opening roles in your niche, with the posting URLs.
- Investors and market research: track hiring velocity and department mix across a portfolio or a list of competitors.
- Job boards and aggregators: run with
outputMode: "jobs"for clean, de-duplicated postings with salary where it's published.
API & integration examples
Python
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("eligible_fame/hiring-signal-feed").call(run_input={"companies": ["greenhouse:stripe", "ashby:ramp", "lever:palantir"],"outputMode": "companies", "titleKeywords": ["sales", "SDR"]})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["company"], row.get("open_roles"), row.get("new_roles_30d"))
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('eligible_fame/hiring-signal-feed').call({ companies: ['greenhouse:discord'], outputMode: 'both' });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.filter(r => r.row_type === 'company'));
cURL
curl -X POST "https://api.apify.com/v2/acts/eligible_fame~hiring-signal-feed/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"companies":["greenhouse:stripe","ashby:ramp"],"outputMode":"companies"}'
No-code: the Apify app works in n8n, Make and Zapier (Run Actor, then Get dataset items). For a weekly hiring-signal sheet, schedule the Actor in Apify with the same snapshotStoreName so each run reports growth since the last one.
Use it from AI agents and MCP clients (Claude, Cursor, ChatGPT, n8n AI Agent)
This Actor works as a tool in Apify's MCP server (https://mcp.apify.com), so an LLM agent can ask "which of these companies are hiring SDRs right now?" and get structured rows back.
Add only this Actor as an MCP tool (Claude Desktop, Cursor, VS Code, Windsurf):
{"mcpServers": {"hiring-signals": { "url": "https://mcp.apify.com?tools=eligible_fame/hiring-signal-feed" }}}
On first connection the client opens an Apify sign-in (OAuth). Alternatively add the header "Authorization": "Bearer <APIFY_TOKEN>". With the default server (https://mcp.apify.com) the agent can also find it via search-actors ("hiring signals Greenhouse") and run it with call-actor.
Prompt examples for an agent
- "Use hiring-signal-feed on greenhouse:stripe, ashby:ramp and lever:palantir in
companiesmode and tell me who added the most roles in the last 30 days." - "Run hiring-signal-feed for these 50 career-page URLs with titleKeywords ['SDR','account executive'] and return only companies with new_roles_30d ≥ 3."
Tips for agents
- Use
outputMode: "companies"for compact, cheap answers (one row per company, $0.01 each); switch tojobsonly when the posting list is needed. - Set
maxTotalChargeUsdin the MCPcallOptionsto cap spend per call. - Read
row_type:company,joborerror. Error rows carry a human-readablemessagethe agent can relay, and are free. - Pay-per-event pricing makes it usable with Apify agentic payments (e.g. Skyfire), so an agent without an Apify account can pay per run.
FAQ
Does it scrape LinkedIn or Indeed? No. It reads only the public job-board APIs that Greenhouse, Lever, Ashby and SmartRecruiters publish for career pages. Those are the employer's own systems of record, and they're often fresher than aggregators.
How do I find a company's board? Paste its careers URL, or just the name or slug. The Actor tries each ATS in turn. If no board is found, you get a free error row.
How is growth calculated? Each run saves a snapshot to a named key-value store. The next run compares job IDs against it to compute roles added, roles closed and percentage change.
How much does monitoring 500 companies cost? In companies mode it's about $0.02 + 500 × $0.01 ≈ $5 per run. Set a maximum charge per run in the Apify console.
Are salaries included? Yes, where the employer publishes them (common in US pay-transparency states). They come from structured fields or are parsed from the posting.
What if I pass a Workday URL, a typo or an empty list? You get a free error row explaining what's wrong (INVALID_COMPANY / BOARD_NOT_FOUND). If nothing in the input is usable, the run stops with an INVALID_INPUT message before any result is charged. Common mistakes are fixed automatically: a single text block instead of a list, duplicates, numbers sent as strings.
Is this legal? It reads public, employer-published job listings through endpoints intended for public career pages. It collects no personal data.