Hiring Leads Finder — Company Contacts & Growth Signals
Pricing
from $10.00 / 1,000 results
Hiring Leads Finder — Company Contacts & Growth Signals
Turn LinkedIn job-search results into one deduplicated record per company: roles hiring, a deterministic hiring signal, the likely commercial event, public emails/phones/contact page, and a transparent opportunity score with evidence.
Pricing
from $10.00 / 1,000 results
Rating
0.0
(0)
Developer
QualifyOps
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
13 hours ago
Last modified
Categories
Share
Try it in 60 seconds
You give: a public LinkedIn job-search URL (a role + location). You get: one scored record per company that is hiring — roles, a deterministic hiring signal, the likely commercial reason, public emails/phones, contact page, and the evidence job URLs. Price: $0.01 per company (intro). A 100-company run costs about $1. Run it now: press Start above and paste a job-search URL — results stream to the dataset (export JSON/CSV/Excel).
Real sample — live run, 8 companies, total cost $0.0099:
- Albury Wodonga Health — signal
general_hiring,awh.foundation@awh.org.au, +61 2 6051 7111 - Cairns Family & Cosmetic Dental — +61 7 4036 4391
- Ramsay Health Care — +61 2 9433 3444 Deduped to one row per company, junk-filtered (no copyright-date phones, no widget emails).
For agents & automation: call it via the Apify API/MCP — one run returns deduped, CRM-ready company records with contacts + signal. Schedule it for a recurring hiring-signal feed.
Hiring Leads Finder — Company Contacts & Growth Signals
Turn fresh LinkedIn job-search results into one deduplicated record per company: which roles they're hiring, what the hiring most likely means commercially, public contact routes, and a transparent opportunity score — with evidence.
The dominant LinkedIn Jobs scraper already gives you raw job rows. This Actor completes the chain those rows leave to you:
raw job rows → unique companies actively hiring → what the hiring implies → public contact routes → evidence → transparent score
Why this instead of a raw job scraper
A LinkedIn/Indeed job scraper returns one row per posting — 30 postings from the same company, no contacts, and no way to tell what the hiring means. You still have to collapse rows to companies, find contacts, and decide who to reach first.
| Raw job scraper | Generic "hiring lead" actors | Hiring Leads Finder | |
|---|---|---|---|
| Output unit | one row per job | one row per lead | one row per company (deduplicated) |
| Hiring signal | none | opaque | deterministic, auditable classes |
| Score | none | black-box | transparent — every point explained |
| Public contacts | none | sometimes | emails + phones + contact page, one pass |
| Evidence | — | — | source job URLs per company |
Pair it with any LinkedIn jobs scraper (it calls a proven one for you) and it returns the part you actually wanted: which companies are hiring, what it implies, and how to reach them.
What it does
- Calls the proven upstream LinkedIn Jobs Scraper (
curious_coder/linkedin-jobs-scraper) to fetch fresh public job rows for your search URL(s). - Normalizes company identity (website domain → LinkedIn URL → cleaned name).
- Groups job rows into one record per company and collapses duplicate rows.
- Determines the latest posting date and the number of matching roles.
- Applies optional role-keyword and freshness filters.
- Classifies the hiring signal with deterministic, auditable rules.
- Scans the public company website for emails, phones, a contact page and social links.
- Calculates a transparent opportunity score (every point is explained).
- Returns one dataset row per company, sorted by score.
No CRM, no historical monitoring, no AI-written outreach, no opaque score.
Input
| Field | Type | Notes |
|---|---|---|
jobSearchUrls (required) | array | One or more public LinkedIn job-search URLs. |
maxJobs | integer | Upper bound on raw rows from upstream. |
roleKeywords | array | Keep only titles containing one of these (case-insensitive). |
freshnessDays | integer | Keep only jobs posted within N days. Unparseable dates are kept and flagged. |
includeWebsiteContacts | boolean | Default true. Scan company websites for public contacts. |
maxCompanies | integer | Return only the top N by score. |
requestTimeoutSecs, maxPagesPerSite, maxConcurrency | integer | Website-scan tuning. |
See ./sample_input.json.
Output (one row per company)
company_name, company_website, company_linkedin, company_domain,
new_jobs_count, roles_hiring, latest_job_date, hiring_signal,
commercial_reason, classification_reasons, matched_titles,
public_emails, public_phones, contact_page, social_links,
signal_score, score_reasons, evidence_job_urls, upstream_actor,
upstream_run_id, status, error, processed_at.
See ./sample_output.json.
Hiring-signal classes
sales_expansion, marketing_expansion, technical_product_investment,
operations_expansion, new_location_or_service_capacity,
clinical_practitioner_expansion, general_hiring.
The dominant class is the one matching the most distinct job titles; ties break by a fixed priority order. Every record carries the matched titles and the reasons, so the classification is auditable.
Opportunity score (transparent weights)
The score measures actionability, not generic company quality. It is the sum of the fired components below, capped at 100:
| Component | Weight | Fires when |
|---|---|---|
| Multiple related vacancies | +15 | 2 or more current roles |
| High vacancy volume | +10 | 4 or more current roles |
| Senior / expansion-linked role | +15 | a senior/leadership title is present |
| Recent posting | +15 | latest matching role within the freshness window (default 7 days) |
| Company website resolved | +10 | a website was found |
| Public email found | +20 | at least one public email |
| Public phone found | +10 | at least one public phone |
| Dedicated contact page | +10 | a contact page was found |
| Clear signal classification | +10 | signal is not general_hiring |
| Multiple evidence URLs | +5 | 2 or more source job URLs |
Each fired component appears verbatim in score_reasons (e.g. +20 Public email found).
Example uses
General B2B. Australian companies hiring several sales, marketing, operations or technical roles in the last seven days → contactable company opportunities.
Aesthetic clinics. Filter roleKeywords for cosmetic nurse,
dermal therapist, laser therapist, clinic manager, women's health to
surface clinics showing likely service-capacity or location expansion.
Limitations & compliance boundary
- Public data only. Contacts come from publicly published company web pages and the upstream's public LinkedIn job data. No email verification, no private-data access, no gated profiles.
- Hiring is a signal, not proven purchase intent. The commercial reason is an interpretation, presented as a hypothesis to prioritise outreach — not a guarantee.
- Some public pages embed third-party widget emails (e.g. support vendors);
these can appear among
public_emails. Review before outreach. - Posting dates from the source vary in format; unparseable dates are kept and
flagged (
status: partial) rather than guessed. - Respect LinkedIn's and each website's terms; use results for legitimate B2B outreach consistent with applicable law (e.g. the Australian Spam Act — include identification and an unsubscribe path in any email).
Pricing (recommendation — not validated)
Working hypothesis: $0.02 per qualified company opportunity, or $20 per 1,000 output companies.
This is an unvalidated starting point, stated separately from technical completion. It should be confirmed by real transactions, not by this document.
Related actor
Working from a list of company websites instead of job searches? See Website Lead Qualifier & Contact Finder (same author) — it turns any list of company sites into clean, scored lead records with public emails, phones and socials: https://apify.com/qualifyops/website-lead-qualifier-contact-finder
Upstream dependency
See ./CONTRACT.md. Requires APIFY_TOKEN at runtime so the
platform can call the upstream Actor. The upstream call uses scrapeCompany: true
to resolve company websites for contact extraction.
Development
python -m venv .venv && . .venv/bin/activatepip install beautifulsoup4 httpx pytestpython -m pytest -q # unit + fixture testspython scripts/dry_run.py # offline end-to-end on the bundled fixture# Live end-to-end against the Apify platform (needs a token):export APIFY_TOKEN=apify_api_xxxpip install apify-clientpython scripts/live_run.py --url "<linkedin job-search url>" --max-jobs 40 --freshness-days 14