B2B Leads Finder: Verified Emails, No Login avatar

B2B Leads Finder: Verified Emails, No Login

Pricing

from $4.00 / 1,000 lead with verified emails

Go to Apify Store
B2B Leads Finder: Verified Emails, No Login

B2B Leads Finder: Verified Emails, No Login

B2B leads finder for public LinkedIn profiles by title, company and location, with email evidence when an email can be derived. No login. $0.004 verified, $0.002 probable, $0.0005 without email.

Pricing

from $4.00 / 1,000 lead with verified emails

Rating

0.0

(0)

Developer

Agnes Maina

Agnes Maina

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

This B2B leads finder turns job titles, seniority, companies and locations into public LinkedIn lead rows with a work email when one can be derived, the evidence behind that email, and the company domain and logo. You pay per lead: $0.004 per lead with a verified email, $0.002 per lead with a probable email and $0.0005 per lead with no email. No login, no cookies, no LinkedIn API call and no paid enrichment API.

Limits before you run it: up to 5,000 delivered leads per run, 30 job titles, 200 company names, 20 locations and 20 company keywords, and at most 2,000 search jobs per run. It returns no phone numbers, and company size, revenue and industry are always null. Emails are pattern-derived unless email_status is verified: only that tier passed an SMTP check and a negative catch-all check, and if the mailbox check server is unreachable, every row that has mail servers drops to probable.

What you get

One flat row per person, with snake_case keys:

GroupFields
Personfirst_name, last_name, full_name, job_title, headline
Roleseniority_level, functional_level, decision_maker
Placelinkedin, city, state, country, location_raw
Emailemail, email_status, email_pattern, email_evidence
Companycompany_name, company_domain, company_website, company_linkedin, company_logo
Always nullcompany_size, company_revenue, company_industry
Provenancesource (google-serp), scraped_at

Company LinkedIn URLs appear only when a company link occurred inside that person's Google result. The company name comes from the headline when it says "at Company", otherwise from the current employer in the profile's structured data when exactly one shows, then from the segment after the matched title, such as "CFO | Acme", and last from the Google byline. Strict mode reads the profile anyway, while with strict match off it reads only for billable rows whose headline and byline name no employer.

A free company suggestion endpoint supplies names, domains and logos when an exact normalized company name matches, including a company's own social or directory domain, so Google staff get google.com. Otherwise a Google official site query uses the same Apify GOOGLE_SERP proxy and rejects social and directory hosts. Placeholder employers such as Freelance or Stealth get no domain.

The actor also writes RUN_SUMMARY with delivered and filtered counts, charge-bar reasons, email status counts, SMTP availability and chargedEventCount.

Email evidence

StatusMeaning
verifiedAn MX server accepted RCPT TO for the candidate and explicitly rejected a random recipient. Evidence smtp-accepted. This is an SMTP check, not proof of identity or delivery
probableMX exists and a learned or common pattern is used. Catch-all servers and inconclusive checks stay probable. Evidence mx+pattern, or smtp-blocked when the server refused the checking IP
unknownNo domain, no usable MX, no usable name, or all candidates were rejected. Email is null. Evidence no-domain, no-mx, no-name, smtp-rejected

Candidates are tried in order: first.last, first, flast, f.last, firstlast, last. A pattern confirmed earlier in the run for the same domain is tried first, and catch-all checks never teach one. Each SMTP connection gets five seconds, or eight on the mailbox check server. If connections fail across three consecutive distinct domains, SMTP stops for the run and one warning is logged.

Apify blocks outbound TCP port 25, so the checks run on the developer's own mailbox check server. That server receives each lead's first name, last name and company domain, and logs only the domain and the outcome. If it cannot be reached, the actor checks from the platform instead, where the three domain breaker disables SMTP and every row with MX becomes probable. RUN_SUMMARY.emailRelay reports which path ran.

Try it in 30 seconds

  1. Open the Actor page in the Apify Store and click Try for free.
  2. Put your titles in jobTitles, one per line, for example Head of Marketing.
  3. Add companies in companyNames as names (Stripe) or URLs, set maxLeads to 20 and click Start.

Example output

Illustrative row with a probable email, not a claim about a real address:

{
"first_name": "Jane",
"last_name": "Doe",
"full_name": "Jane Doe",
"job_title": "Head of Marketing",
"headline": "Head of Marketing at Example Company",
"seniority_level": "director",
"functional_level": "marketing",
"decision_maker": true,
"linkedin": "https://www.linkedin.com/in/jane-doe/",
"city": "Austin",
"state": "Texas",
"country": "United States",
"location_raw": "Austin, Texas, United States",
"email": "jane.doe@example.com",
"email_status": "probable",
"email_pattern": "first.last",
"email_evidence": "mx+pattern",
"company_name": "Example Company",
"company_domain": "example.com",
"company_website": "https://example.com",
"company_linkedin": null,
"company_logo": null,
"company_size": null,
"company_revenue": null,
"company_industry": null,
"source": "google-serp",
"scraped_at": "2026-10-06T00:00:00.000Z"
}

Pricing

Pay per event, no subscription:

EventPriceYou pay when
Actor start$0.00005once per run
lead-with-verified-email$0.004the email passed the SMTP and catch-all checks
lead-with-probable-email$0.002a pattern guess on a domain with mail servers
lead-without-email$0.0005a LinkedIn profile with no derivable email

That is $4 per 1,000 verified and $2 per 1,000 probable leads.

Only matches that clear the headline charge bar are billed. With strictMatch, the profile must be readable and list a searched company as a current employer. Other rows that pass your filters come back free, and a row with neither a LinkedIn URL nor an email is free. The emailStatus, seniority and department filters run before charging, and the actor checks the budget before each charge.

When the next charge does not fit your spending limit the run stops, even if a cheaper tier could still fit.

Input

{
"jobTitles": ["Head of Marketing", "VP Marketing"],
"seniority": ["vp", "director"],
"department": ["marketing"],
"locations": ["United States"],
"companyNames": ["Stripe", "Asana"],
"companyKeywords": [],
"maxLeads": 20,
"emailStatus": ["verified", "probable", "unknown"],
"strictMatch": true
}
InputBehavior
jobTitlesRequired, 1 to 30 titles. C level acronyms and title variants match
seniorityOptional list: owner, partner, cxo, vp, director, manager, senior, entry, training, unpaid, unknown. Empty means all
departmentOptional list: executive, data, engineering, product, design, sales, marketing, finance, hr, legal, support, operations, other. Empty means all
locationsUp to 20 query locations. Narrows the search without verifying residence
companyNamesUp to 200 names or company URLs, which must hold the current-employer position to clear the charge bar
companyKeywordsUp to 20 quoted terms, searched separately. They do not prove an industry
maxLeadsDefault 50, range 1 to 5,000. Counts leads after filters, free rows included
emailStatusDefaults to all three tiers. An empty list also means all
strictMatchDefault true. False allows charging from headline evidence alone

Inputs are limited to 2,000 search jobs: companies times title groups (ceil(jobTitles.length / 3)) times locations times company keywords, and larger combinations are rejected.

Use cases

  • Outbound lists: find decision makers at each named account and send only charged rows to your sequencer.
  • Cold email: take the verified tier only and skip the guesses.
  • Recruiting: find CTOs and heads of engineering in one city.
  • CRM enrichment: write company_domain and company_website back to each account.

Integrations

Run it from the Apify API and read the dataset back in the same call:

curl -X POST \
"https://api.apify.com/v2/acts/agnes.developer.queen~b2b-leads-finder/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"jobTitles":["Head of Marketing"],"companyNames":["Stripe"],"maxLeads":20}'

The same call works from Python, Node.js, Make, n8n or Zapier, and AI assistants and MCP clients can call the Actor through the Apify MCP server:

https://mcp.apify.com/?tools=agnes.developer.queen/b2b-leads-finder

FAQ

Are all emails verified?

No. Only the verified tier passed the SMTP and catch-all checks. Pattern-derived emails can be wrong, and acceptance can still precede a bounce.

What happens if the mailbox check server is down?

The actor stops SMTP after three blocked domains and keeps MX based probable emails, so verified only returns few leads.

Do you have phone numbers, company industry, size or revenue?

No phone numbers. Industry, size and revenue are null, because these sources do not establish them.

Can it find everyone at a company?

No. Google indexing, public headlines and profile readability limit coverage. Each search reads at most five pages and stops when a page yields nothing.

How accurate are company domains?

A suggestion lookup needs an exact match after normalization. The Google fallback takes the first eligible organic host, so similarly named companies can still give a wrong domain. A domain is not identity verification.

How are locations split?

Three comma-separated parts become city, state and country. Two become city and country. One is kept as country, with location_raw preserved.

What does strict match verify?

That the public LinkedIn profile is readable and names a requested current employer, after its headline clears the title and company bar. It does not verify with the employer or establish email ownership.

Why are some leads free?

Their headline or profile did not prove the requested match, or they have neither a LinkedIn URL nor an email. Reasons appear in RUN_SUMMARY.

Support

Open an issue on the Issues tab of the Store page with the run ID and RUN_SUMMARY.