Hiring Signal Lead Scraper - Job Boards + Email Enrichment
Pricing
from $3.00 / 1,000 lead founds
Hiring Signal Lead Scraper - Job Boards + Email Enrichment
Scrapes job boards to find companies actively hiring in target roles — the top B2B buying signal. Returns leads with verified emails via Hunter.io. Covers Indeed, LinkedIn, Greenhouse, Lever, and Workable. Built for cold email agencies, SDR teams, and n8n/Make workflows.
Pricing
from $3.00 / 1,000 lead founds
Rating
0.0
(0)
Developer
joseph fadero
Maintained by CommunityActor stats
1
Bookmarked
3
Total users
0
Monthly active users
17 days ago
Last modified
Categories
Share
Hiring Signal Lead Scraper
Turn job postings into your highest-intent B2B leads.
When a company posts a "VP of Sales" or "Head of Marketing" role, they have budget, they're growing, and they're making buying decisions. That's the best time to reach them. This actor automates finding those signals — across Indeed, LinkedIn Jobs, Greenhouse, Lever, and Workable — and delivers enriched leads with verified emails ready for outreach.
What does Hiring Signal Lead Scraper do?
It searches five major job boards simultaneously for any job title keywords you specify and returns structured company data for every match. Optionally, it enriches each result with up to 3 verified contact emails per company via the Hunter.io API, giving you a complete outbound-ready lead record in a single run.
All results are stored in an Apify Dataset that you can download as JSON, CSV, Excel, or HTML, or stream directly into your outreach stack via the Apify API.
Two modes, one dataset, two very different buyers
The same underlying job-posting collection engine now powers two output modes — pick the one that matches who you are:
| Mode | Output | Buyer |
|---|---|---|
lead_generation (default) | Individual company hiring events — "this company is hiring, here's a contact" | Cold email agencies, SDR teams, sales-intent buyers |
market_intelligence | Aggregated by location: hiring velocity, skills trends, salary trends, remote-vs-onsite ratio, plain-English summary | Recruiters, investors, HR/People teams, labour-market analysts |
If you want a list of companies to email, use lead_generation. If you want to know "is engineering hiring accelerating in London, and what skills are in demand right now," use market_intelligence — you don't get individual leads back, you get a trend read on the market itself.
Why use Hiring Signal Lead Scraper?
- Intent-based leads without the enterprise price tag — 6sense costs $40K+/year. This actor gives you the same hiring signal data for cents per run.
- Five sources, one run — Indeed, LinkedIn Jobs, Greenhouse, Lever, and Workable scraped simultaneously.
- Email enrichment built in — Connect your Hunter.io API key and get verified contact emails without leaving the workflow.
- n8n / Make / Zapier ready — Output flows directly into automation platforms. No custom glue code needed.
- Deduplication & date filtering — No duplicate companies, no stale postings cluttering your list.
How to use Hiring Signal Lead Scraper
- Click Try for free on this Actor page
- Enter your target job title keywords (e.g.
VP Sales,CTO,Head of Product) - Set your target locations (e.g.
United Kingdom,London,Remote) - Choose which job boards to scrape (default: Indeed + LinkedIn Jobs)
- Optionally toggle Enrich with Verified Emails and paste your Hunter.io API key
- Click Start — get structured lead results in minutes
Input
Configure the actor via the Input tab in Apify Console, or pass a JSON payload via the API.
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | "lead_generation" | lead_generation or market_intelligence — see above |
keywords | string[] | — | Job title keywords to search (required, both modes) |
locations | string[] | ["United Kingdom", "Remote"] | Locations to search (lead_generation only) |
sources | string[] | ["indeed", "linkedin"] | Job boards to scrape (lead_generation only) |
maxResultsPerSource | integer | 25 | Max results per source per keyword (lead_generation only) |
enrichEmails | boolean | false | Enable Hunter.io email enrichment (lead_generation only) |
hunterApiKey | string | — | Hunter.io API key (required if enrichEmails = true) |
filterPostedWithinDays | integer | 30 | Only return postings newer than N days (lead_generation only) |
deduplicateByCompany | boolean | true | One result per company per keyword (lead_generation only) |
intelligenceFilters | object | — | market_intelligence only — see below |
Example input (lead_generation):
{"keywords": ["VP Sales", "Head of Marketing"],"locations": ["United Kingdom", "Remote"],"sources": ["indeed", "greenhouse", "lever"],"maxResultsPerSource": 50,"enrichEmails": true,"hunterApiKey": "your_hunter_api_key_here","filterPostedWithinDays": 14,"deduplicateByCompany": true}
Example input (market_intelligence):
{"mode": "market_intelligence","keywords": ["Engineer"],"intelligenceFilters": {"locations": ["San Francisco", "New York", "London"],"trackSalaryData": true,"trackRemoteVsOnsite": true}}
intelligenceFilters fields: locations (string[], narrows aggregation to matching locations), industries (string[], see honesty note below), skillCategories (currently informational — skill extraction always runs across the full taxonomy), trackSalaryData (boolean, off by default — see the salary honesty note below), trackRemoteVsOnsite (boolean, off by default).
Output
Each item in the Dataset represents one hiring signal lead. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
Example output record:
{"keyword": "VP Sales","jobTitle": "VP of Sales - EMEA","jobUrl": "https://uk.indeed.com/viewjob?jk=abc123","postedAt": "2026-05-08T00:00:00.000Z","source": "indeed","location": "London, United Kingdom","companyName": "Acme SaaS Ltd","companyDomain": "acmesaas.com","companyLinkedinUrl": null,"contacts": [{"email": "james.smith@acmesaas.com","firstName": "James","lastName": "Smith","title": "CEO","confidence": 92}],"scrapedAt": "2026-05-12T06:00:00.000Z","enriched": true}
Data fields
| Field | Description |
|---|---|
keyword | The keyword that triggered this result |
jobTitle | Exact job title from the posting |
jobUrl | Direct link to the job posting |
postedAt | ISO date the job was posted |
source | Which job board it came from |
location | Job location as listed |
companyName | Company name |
companyDomain | Company website domain |
companyLinkedinUrl | LinkedIn company page URL (LinkedIn source only) |
contacts | Array of verified email contacts (if enriched) |
contacts[].email | Verified email address |
contacts[].firstName | Contact first name |
contacts[].lastName | Contact last name |
contacts[].title | Contact job title |
contacts[].confidence | Hunter.io confidence score (0–100) |
scrapedAt | Timestamp of when this record was scraped |
enriched | Whether email enrichment was successful |
Market intelligence output
Example output record (market_intelligence mode):
{"location": "San Francisco","industry": "All industries","hiringVelocityChangePercent": 0,"topSkillsInDemand": ["Go", "Python", "AWS", "Figma", "TypeScript"],"emergingSkillCategories": [],"salaryTrendDirection": "flat","remoteVsOnsiteRatio": 0.02,"plainEnglishSummary": "San Francisco has 126 matching vacancies, unchanged from the previous period. Top skills in demand: Go, Python, AWS, Figma, TypeScript. Salary data (where disclosed) is holding roughly flat. 2% of these roles are remote or hybrid."}
Confirmed live during this addendum's build: hiringVelocityChangePercent and emergingSkillCategories are 0/[] on a real first run (no baseline exists yet to compare against — the summary says "baseline run" explicitly rather than implying a false 0% change), then compute real values from the second run onward. Re-running against real Stripe/Datadog/Cloudflare postings a few minutes apart correctly showed 0% change (genuinely unchanged real job counts) and a flat salary trend backed by a real 5-point salary sample from Stripe's own San Francisco engineering postings.
Three honesty notes on real data limitations
Industry is not independently derived. None of the 3 real sources (Greenhouse, Lever, Workable) expose a reliable per-job industry field. industry in the output is either the industries filter value you supplied, or the literal string "All industries" — not a real classification inferred from the posting. Documented here rather than fabricating a false taxonomy from data that doesn't support one.
Salary data is genuinely sparse, not "increasingly common." Regex-extracting real salary ranges from job description text found real matches in roughly 2 of every 100 postings sampled during this build (mostly US postings under state salary-transparency laws). It's real when present, and salaryTrendDirection only computes a trend once at least 3 real salary points exist in a period — otherwise it honestly reports insufficient_data rather than a trend built on 1 data point. trackSalaryData defaults to false for this reason.
market_intelligence mode currently draws from Greenhouse, Lever, and Workable only — the 3 sources that return real structured job description text and (for Lever/Workable) a real remote-work field in the same request lead_generation mode already makes. Indeed's real data would need a separate detail-page visit per job for description text (not present on its search-result cards) and LinkedIn goes through a paid third-party Actor call — both would add real per-run cost beyond what this addendum asked for, so they're in scope for lead_generation mode only for now.
Pricing
This actor uses Pay Per Event billing — you only pay for what you get.
| Event | Price |
|---|---|
| Run started | $0.10 (flat, per run) |
| Lead returned (no email) | $0.003 per lead |
| Lead returned (with email) | $0.008 per lead |
Market intelligence record (market_intelligence mode) | $0.003 per location/industry record |
Cost examples:
- 3 keywords × 2 locations × 2 sources, 150 unenriched leads:
$0.10 + (150 × $0.003)= $0.55 - Same run with email enrichment on 150 leads:
$0.10 + (150 × $0.008)= $1.30 - Daily run with 500 leads (no enrichment):
$0.10 + (500 × $0.003)= $1.60/day
Integration examples
n8n workflow
Use the Apify node in n8n, select this actor, and map the output fields to your CRM or outreach tool (Instantly, Lemlist, Smartlead, HubSpot, etc.).
Direct API call
curl -X POST \"https://api.apify.com/v2/acts/YOUR_USERNAME~hiring-signal-lead-scraper/runs" \-H "Authorization: Bearer YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords": ["VP Sales"], "locations": ["UK"], "enrichEmails": false}'
Zapier / Make
Use the Apify integration in Zapier or Make to trigger runs on a schedule and pipe results into any downstream app.
Tips
- Start with Greenhouse + Lever — These use public APIs (no browser needed), making runs faster and cheaper. Add Indeed for broader coverage.
- Use
filterPostedWithinDays: 7for the freshest signals — companies that posted this week are in active hiring mode right now. - Set
deduplicateByCompany: true(default) to avoid spamming the same company across multiple keywords. - Hunter.io free tier gives 25 searches/month — enough for testing. Paid plans from $49/month for production volumes.
- LinkedIn scraping uses a sub-actor (
bebity/linkedin-jobs-scraper) which has its own billing on top of this actor's PPE cost.
FAQ
Is this legal? This actor only scrapes publicly available job posting pages. Scraping publicly accessible data is generally permissible under fair use principles. You are responsible for complying with the terms of service of each job board and applicable data protection laws in your jurisdiction.
Why didn't LinkedIn return results?
LinkedIn aggressively rate-limits scrapers. The actor delegates LinkedIn scraping to a proven sub-actor (bebity/linkedin-jobs-scraper). If it fails, the actor logs a warning and continues with other sources rather than crashing.
The Indeed results look different from what I expected. Indeed changes its DOM structure periodically. If selectors break, open an issue on this actor's page and we'll push an update.
Can I add more companies to the Greenhouse/Lever/Workable boards list?
Yes — fork this actor and extend the getGreenhouseBoards(), getLeverBoards(), and getWorkableBoards() functions in the scrapers. The longer those lists, the more leads you'll get. Worth knowing: these lists were live-audited (real HTTP checks, not assumed) during the market_intelligence addendum build, and board slugs drift as companies switch ATS providers — Lever's original 30-company list had collapsed to 3 real live boards (most had migrated off Lever entirely), so Greenhouse is now the dominant real source of the two. Workable was fixed separately: its scraper was calling a dead API path (/api/v3/..., now 404 on every board) instead of the real current one (/api/v1/widget/...) — a genuine bug, not company churn, now fixed. Re-audit periodically rather than assuming any board list stays accurate indefinitely.
I need a custom integration or a higher-volume solution. Open an issue or contact us via the Apify Console — we offer custom actor development and managed scraping pipelines.