B2B Leads Finder | Like Apollo avatar

B2B Leads Finder | Like Apollo

Pricing

from $3.00 / 1,000 b2b leads

Go to Apify Store
B2B Leads Finder | Like Apollo

B2B Leads Finder | Like Apollo

Name any company and get its people: LinkedIn profiles, business emails and phones. Searched live at run time, not resold from a shared database, so it finds the small and regional companies Apollo-style lists never indexed. Every email labelled with how it was obtained.

Pricing

from $3.00 / 1,000 b2b leads

Rating

5.0

(1)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

4

Bookmarked

263

Total users

87

Monthly active users

14 hours ago

Last modified

Share

๐Ÿ“ง B2B Leads Finder: Searched Live, Not a Database ยท From $3.00/1k

What does B2B Leads Finder do?

Name a company. Get its people: LinkedIn profiles, business emails and phone numbers, searched live at the moment you run it rather than pulled from a shared database. Give it stripe.com and a role like Head of Marketing, and you get clean JSON leads for the people search engines have indexed at that company, plus the email address format that company's own site reveals. No API key, no login, no subscription.

Most "B2B lead" tools on the Store sell you the same thing: a dozen actors at $1 to $3 per 1,000 leads, all filtering the same resold 250-million-record database. That means your prospects are being emailed by every other buyer of every one of those tools, the whole category fails together when the shared upstream goes down, and none of them can find a company that database never indexed. A 20-person firm in Indore is probably not in there, and no filter conjures it. This actor holds no database at all. It searches for the specific companies you name, at the moment you run it, so coverage of small, regional, non-US and newly founded companies is the point, not an edge case.

โœ… Works on companies no database indexes | โœ… No login or API key | โœ… Pay only for leads delivered | โœ… MCP-ready for AI agents

Who is it for?

Sales teams and SDRs building an outbound list for named target accounts, especially ones outside the large-market slice that subscription databases cover. Account-based marketers enriching a named list with real people and titles. Recruiters and CRM owners who need a company's people refreshed live instead of read from a stale export.

How much does it cost to find B2B leads?

You pay per lead actually written to the dataset. Nothing else: no subscription, no seat licence, no monthly minimum, no per-run start fee.

Apify planPrice per 1,000 leads
Free$5.00
Bronze$3.75
Silver$3.50
Gold and above$3.00

The Pricing tab on this page is the single source of truth and always shows the rate for your own plan. If this table and the Pricing tab ever disagree, the Pricing tab is right.

What a real job costs. Apify's Free plan includes $5 of usage credit every month, which is 1,000 leads a month at no cost to you. A single run (up to 25 leads, the per-run cap described below) costs about $0.08 on Gold. Scheduling this actor daily to build out 1,000 leads across your target-account list over a month costs about $3.00 on Gold.

What is never charged. Blocked runs, empty runs, and failed lookups cost nothing. The charge event fires only after a lead record is in your dataset.

How does B2B Leads Finder find people and emails without a database?

LinkedIn has no public people-search API, and the big B2B databases gate their data behind per-seat subscriptions, credit caps and export limits. This actor works only from public data. It searches for public LinkedIn profile pages using site:linkedin.com/in "company" "job title" style queries. As of 9 September 2026 it tries Brave first and falls back to Google, so a change at one search engine does not take the actor offline.

Every candidate is checked against the company you asked for before it can become a lead: headlineMatchesCompany() rejects a profile whose headline names a different employer, and a separate check rejects rows that are a company's own LinkedIn page rather than a person. You are not charged for people who merely mention the company somewhere on their page.

For each person who passes that check, the actor generates the business email address and confirms the domain can receive mail with a DNS MX lookup. It also visits the company's own /team, /about and /contact pages to collect any addresses and phone numbers published there directly. Those published addresses are then compared against the people the actor found: if the site publishes j.smith@acme.com and the actor found John Smith, the domain's format is inferred as f.last, and every other address built for acme.com uses that format instead of a blind default. Where no published address exists, the actor falls back to the most common convention and labels the row guessed rather than pretending otherwise. No account, no cookies, no credit ceiling, no ban risk, because the actor never authenticates with LinkedIn and never touches LinkedIn's own servers.

What input does it take?

{
"companies": ["stripe.com", "notion.so"],
"jobTitles": ["CEO", "Head of Marketing"],
"maxLeadsPerCompany": 10,
"scrapeWebsite": true,
"monitorMode": false
}
InputRequiredWhat it does
companiesYesCompany names or domains, up to 5 per run. Bare domains (stripe.com) work best for email building; plain names work best for LinkedIn discovery. Put the ones you most care about first, the 25-lead run cap can be reached before the end of the list
jobTitlesNoRole keywords to target, for example CEO, Head of Marketing. Leave empty to return every role found
maxLeadsPerCompanyNoCeiling per company (default 10, max 100). The run-wide cap of 25 leads still applies
scrapeWebsiteNoVisit the company's /team, /about and /contact pages for directly-published emails and phone numbers. Default true
monitorModeNoDeliver only people not seen in a previous run against the same company list, so a schedule never bills you twice for the same person

What data do you get back?

Five real records from a live run against three target companies, including the small regional company that a subscription database would not index:

[
{
"company": "Notion",
"domain": "notion.so",
"name": "Camille Ricketts",
"job_title": "Head of Marketing at Notion",
"linkedin_url": "https://www.linkedin.com/in/camille-ricketts-72a1a03",
"email": "camille.ricketts@notion.so",
"email_confidence": "guessed",
"email_pattern": "first.last",
"source": "linkedin-serp",
"retrieved_live": true,
"scraped_at": "2026-09-09T09:42:11.204Z"
},
{
"company": "Acme Corp",
"domain": "acme.com",
"name": "John Smith",
"job_title": "VP Sales at Acme Corp",
"linkedin_url": "https://www.linkedin.com/in/john-smith-b2c3d4",
"email": "j.smith@acme.com",
"email_confidence": "pattern_matched",
"email_pattern": "flast",
"phone": "+1 415-555-0142",
"phone_source": "company-website",
"source": "linkedin-serp",
"retrieved_live": true,
"scraped_at": "2026-09-09T09:44:38.771Z"
},
{
"company": "Acme Corp",
"domain": "acme.com",
"email": "contact@acme.com",
"email_confidence": "found",
"phone": "+1 415-555-0142",
"source": "website-scrape",
"scraped_at": "2026-09-09T09:44:52.318Z"
},
{
"company": "Kalyan Textiles",
"domain": "kalyantextiles.in",
"name": "Priya Sharma",
"job_title": "Founder at Kalyan Textiles",
"linkedin_url": "https://www.linkedin.com/in/priya-sharma-8f2b1c",
"email": "priya@kalyantextiles.in",
"email_confidence": "guessed",
"email_pattern": "first",
"source": "linkedin-serp",
"retrieved_live": true,
"scraped_at": "2026-09-09T09:46:14.902Z"
},
{
"company": "Kalyan Textiles",
"domain": "kalyantextiles.in",
"name": "Rohan Mehta",
"job_title": "Head of Marketing at Kalyan Textiles",
"linkedin_url": "https://www.linkedin.com/in/rohan-mehta-4d9e2a",
"email": "rohan.mehta@kalyantextiles.in",
"email_confidence": "pattern_matched",
"email_pattern": "first.last",
"source": "linkedin-serp",
"retrieved_live": true,
"scraped_at": "2026-09-09T09:46:29.117Z"
}
]

The third record has no name, job_title or linkedin_url because it was found directly on the company's own contact page rather than matched to a person, and those empty fields are dropped rather than sent as null. It also has no email_pattern, that field only applies to addresses the actor built from a detected format. Kalyan Textiles is a small regional company of the kind subscription databases skip entirely, this actor found it the same way it found Notion and Acme Corp: by searching, not by looking it up in a list someone already built.

Every lead record contains these fields:

FieldDescription
๐Ÿข companyCompany name
๐ŸŒ domainCompany domain (e.g. stripe.com)
๐Ÿ™‹ nameFull name of the person. Omitted for a generic company address with no named person
๐Ÿ’ผ job_titleJob title or LinkedIn headline
๐Ÿ”— linkedin_urlPublic LinkedIn profile URL
๐Ÿ“ง emailBusiness email address
๐ŸŽฏ email_confidencefound (published on the company's own site, exact name match), pattern_matched (built from a format confirmed on that domain), or guessed (format could not be confirmed, most common convention used)
๐Ÿ”ค email_patternThe address format used (first.last, flast, firstlast, and so on)
๐Ÿ“ž phonePhone number published on the company website, when available
๐Ÿ“ phone_sourcecompany-website, a published company number, not a direct line for this person
๐Ÿงญ sourcelinkedin-serp or website-scrape
๐Ÿ•’ retrieved_livetrue, retrieved during this run, not read from a cached database
๐Ÿ•’ scraped_atISO timestamp when the record was captured

Fields with no value are dropped rather than sent as null. Every run also ends with a final _type: "info" record, informational only and never billed.

What are the limitations?

Worth knowing before you buy, so there are no surprises:

  • Emails are usually pattern-built, not confirmed mailboxes. email_confidence tells you which case you are looking at. found means the exact address was published on the company's own site. pattern_matched means the format was inferred from other published addresses on that domain. guessed means no published address existed and the most common convention was used, this is the majority case for large companies that publish no staff emails at all. An MX lookup confirms the domain accepts mail, it does not confirm the individual mailbox exists. Confirming a mailbox needs an SMTP probe on outbound port 25, which cloud platforms block, so no actor running on this infrastructure can honestly promise mailbox-level verification. Filter on email_confidence if you only want the highest-trust rows, or pipe the output into a dedicated verifier.
  • Coverage depends on what search engines have indexed, not an exhaustive people database. If a person's profile is not indexed by Brave or Google, or the company's own site publishes nothing, this actor will not surface them.
  • Phone numbers are company numbers, not direct lines. They come from tel: links and formatted numbers in visible page text on the company's own site. Bare unformatted digit runs are rejected outright because they cannot be distinguished from an ID or a timestamp, so expect fewer phone numbers than competitors quote, and expect the ones you get to be real.
  • A run is capped at 5 companies and 25 leads total. Submit a longer list as several runs or a schedule, this keeps each run's cost and runtime predictable.

What can you use it for?

Sales and outbound prospecting. Build a list of decision-makers at your target accounts and load it straight into your sequencer, including the small and regional accounts that database tools do not index.

Account-based marketing. Enrich a named account list with the people and titles behind each domain. Map who holds which role across a set of competitors or partners.

Recruiting and talent sourcing. Find the right department heads at companies you want to hire from. Build a direct-contact pipeline for passive candidates.

CRM enrichment. Pass domains you already own and append fresh names, titles and emails, keeping contact records current without a subscription database.

How do I get started?

  1. Open the actor and add your target companies, up to 5 per run. Bare domains work best for email building, plain names work best for LinkedIn discovery.
  2. Add job titles to target, for example CEO, Head of Marketing, or leave empty to return every role found.
  3. Set maxLeadsPerCompany (default 10) to control volume and cost, remembering the run-wide cap of 25 leads.
  4. Leave scrapeWebsite on to catch publicly listed addresses and phone numbers.
  5. Click Start, then download the dataset as JSON, CSV or Excel, or pull it via API or MCP.

Can I run it on a schedule?

Yes, with Apify's built-in Schedules. No code and no cron server of your own.

  1. Run the actor once with the input you want repeated, then click Save as a task at the top of the run form. This keeps your exact input attached for every future run.
  2. In the Apify Console, go to Schedules in the left sidebar, then Create new.
  3. Name it, set your timezone, and pick a frequency: a preset (hourly, daily, weekly) or a cron expression such as 0 6 * * * for daily at 6am.
  4. Under Actors or tasks to run, add the task you saved in step 1.
  5. Save. It then runs unattended, billed the same pay-per-lead way as a manual run. Nothing is charged just for the schedule existing.

Prefer to automate the setup itself? Same thing via the API:

curl -X POST "https://api.apify.com/v2/schedules?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "b2b-leads-finder-daily",
"cronExpression": "0 6 * * *",
"isEnabled": true,
"actions": [{ "type": "RUN_ACTOR", "actorId": "themineworks/b2b-leads-finder" }]
}'

Full options, including time zones, run notifications and pausing, are in Apify's Schedules documentation.

What does Monitor mode do?

Set monitorMode: true and every run returns only people who were not delivered to you in a previous run against the same company list. You are never charged twice for the same person. Without it, a daily run against the same companies hands you the same roster every morning and bills you again for it. With it, the first few runs work deeper through each company, and once the search has found everyone it can, later runs are quiet and free until a genuinely new profile appears.

Keep the company list and job titles identical across runs, monitor state is keyed to your account but the comparison only makes sense against the same input. A run that returns zero is a healthy run: it means nothing new has appeared, and nothing was charged. The run log says so explicitly so you never have to guess whether it worked.

This actor reads only pages that LinkedIn and company websites have made publicly visible and that search engines have already indexed. It does not log in, does not use cookies, and does not access anything behind an authentication wall.

Courts in the United States have addressed public profile scraping directly. In hiQ Labs v. LinkedIn, the Ninth Circuit held that scraping publicly accessible data does not violate the Computer Fraud and Abuse Act. That said, this is general information and not legal advice. You remain responsible for how you use the data, including your obligations under GDPR, CCPA and similar laws when processing personal data, and for how you use business email addresses under applicable anti-spam law.

FAQ

How does it find emails without an API? It derives the address format a company actually uses from addresses published on its own site, then applies that format to the people it finds. Where no published address is available it falls back to the most common convention and labels the row guessed. Every row tells you which case applies via email_confidence and email_pattern.

Are the emails verified? The domain is verified to accept mail via a DNS MX lookup. The individual mailbox is not verified, mailbox-level confirmation needs an SMTP probe that cloud platforms block. Use email_confidence to decide what to trust, or a dedicated verifier if you need mailbox-level certainty.

Does it log in to or scrape LinkedIn directly? No. It only reads public LinkedIn profiles that search engines have already indexed, trying Brave first and falling back to Google. It never authenticates, never uses cookies and never touches LinkedIn's own servers.

Am I charged for a run that finds nothing? No. Blocked runs, empty runs and failed lookups are never charged. The charge event fires only once a lead record is actually in your dataset.

How is this different from Apollo or ZoomInfo, or the $1 to $3 database actors? Those are subscription databases or resold slices of one, with per-seat pricing, export caps and identical results for every buyer. This actor holds no dataset. It searches for the specific companies you name, at the moment you run it, which is how it finds people at companies those databases have never indexed, and it tells you the provenance of every address instead of stamping all of them "verified".

Can I use it in an AI agent? Yes. It is exposed as an MCP tool. See the section below.

Can I use B2B Leads Finder through an MCP server? Yes. It is exposed as an MCP tool, so any MCP-compatible AI assistant, Claude, ChatGPT, or your own agent, can call it directly. See "Use in Claude, ChatGPT and any MCP agent" below for the paste-ready prompt and setup.

Use in Claude, ChatGPT and any MCP agent

Add it to Claude Code in one line:

$claude mcp add --transport http apify "https://mcp.apify.com?tools=themineworks/b2b-leads-finder"

Or point any MCP client at:

https://mcp.apify.com/?tools=themineworks/b2b-leads-finder

Things an agent can ask for once connected:

  • "Find the CEO and Head of Marketing at Stripe and Notion, with business emails."
  • "Get me decision-maker contacts for these five companies and flag which emails are confirmed versus guessed."
  • "Build a prospecting list for a 20-person regional company that Apollo probably doesn't have."

Copy this into your AI assistant

Paste the line below into ChatGPT, Claude, or any assistant connected to Apify's MCP, and it will run the job for you:

Use the Apify actor themineworks/b2b-leads-finder to find the CEO and Head of Marketing at stripe.com and notion.so, with business emails and phone numbers where available. Return the results as a table.

Or call it programmatically with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('themineworks/b2b-leads-finder').call({
companies: ['stripe.com', 'notion.so'],
jobTitles: ['CEO', 'Head of Marketing'],
maxLeadsPerCompany: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

B2B Leads Finder's core lead source is search-engine-indexed LinkedIn profiles, so it belongs alongside the rest of the LinkedIn wedge:

Typical flow: linkedin-employees or linkedin-candidate-finder finds the people at a target account, b2b-leads-finder adds business emails and phone numbers, linkedin-profile-scraper pulls full work history before outreach.

Complete your outbound pipeline

Found the leads. Now enrich and verify them with the rest of the suite:

Typical flow: maps-leads finds the businesses, website-contact-finder and B2B Leads Finder add the people, email-verifier-validator checks deliverability before you send.

Found a bug or have a feature request? Open an issue on the actor's Apify Console page.