Hiring Leads Finder — Company Contacts & Growth Signals avatar

Hiring Leads Finder — Company Contacts & Growth Signals

Pricing

from $10.00 / 1,000 results

Go to Apify Store
Hiring Leads Finder — Company Contacts & Growth Signals

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

QualifyOps

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

13 hours ago

Last modified

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 scraperGeneric "hiring lead" actorsHiring Leads Finder
Output unitone row per jobone row per leadone row per company (deduplicated)
Hiring signalnoneopaquedeterministic, auditable classes
Scorenoneblack-boxtransparent — every point explained
Public contactsnonesometimesemails + phones + contact page, one pass
Evidencesource 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

  1. Calls the proven upstream LinkedIn Jobs Scraper (curious_coder/linkedin-jobs-scraper) to fetch fresh public job rows for your search URL(s).
  2. Normalizes company identity (website domain → LinkedIn URL → cleaned name).
  3. Groups job rows into one record per company and collapses duplicate rows.
  4. Determines the latest posting date and the number of matching roles.
  5. Applies optional role-keyword and freshness filters.
  6. Classifies the hiring signal with deterministic, auditable rules.
  7. Scans the public company website for emails, phones, a contact page and social links.
  8. Calculates a transparent opportunity score (every point is explained).
  9. Returns one dataset row per company, sorted by score.

No CRM, no historical monitoring, no AI-written outreach, no opaque score.


Input

FieldTypeNotes
jobSearchUrls (required)arrayOne or more public LinkedIn job-search URLs.
maxJobsintegerUpper bound on raw rows from upstream.
roleKeywordsarrayKeep only titles containing one of these (case-insensitive).
freshnessDaysintegerKeep only jobs posted within N days. Unparseable dates are kept and flagged.
includeWebsiteContactsbooleanDefault true. Scan company websites for public contacts.
maxCompaniesintegerReturn only the top N by score.
requestTimeoutSecs, maxPagesPerSite, maxConcurrencyintegerWebsite-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:

ComponentWeightFires when
Multiple related vacancies+152 or more current roles
High vacancy volume+104 or more current roles
Senior / expansion-linked role+15a senior/leadership title is present
Recent posting+15latest matching role within the freshness window (default 7 days)
Company website resolved+10a website was found
Public email found+20at least one public email
Public phone found+10at least one public phone
Dedicated contact page+10a contact page was found
Clear signal classification+10signal is not general_hiring
Multiple evidence URLs+52 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.


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/activate
pip install beautifulsoup4 httpx pytest
python -m pytest -q # unit + fixture tests
python 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_xxx
pip install apify-client
python scripts/live_run.py --url "<linkedin job-search url>" --max-jobs 40 --freshness-days 14