B2b Lead Gen Suite avatar
B2b Lead Gen Suite

Pricing

Pay per usage

Go to Apify Store
B2b Lead Gen Suite

B2b Lead Gen Suite

All-in-one B2B lead pipeline. Scrape contacts, detect email patterns, and score leads in a single run. Chains Website Contact Scraper, Email Pattern Finder, and B2B Lead Qualifier automatically — one input, one output, no manual data piping. Results sorted by lead quality score.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

ryan clinton

ryan clinton

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

6 days ago

Last modified

Share

B2B Lead Generation Suite

All-in-one B2B lead pipeline. Give it a list of company websites and get back fully enriched leads — contact info, email patterns, and quality scores — in a single run.

Why this over running 3 separate actors? This Suite orchestrates 3 specialized actors into one seamless pipeline. No manual chaining, no copy-pasting between actors, no data transformation. One input, one output, one click.

What it does

Your URLs → Contact Scraper → Email Pattern Finder → Lead Qualifier → Enriched Leads

For each company website you provide, the pipeline:

  1. Scrapes contact info — emails, phone numbers, team member names/titles, social links (Website Contact Scraper)
  2. Detects email patterns — analyzes discovered emails to find the company's format (e.g., first.last@company.com), then generates email addresses for every team member (Email Pattern Finder)
  3. Scores and ranks leads — analyzes 30+ business quality signals and assigns a score (0-100) with letter grade so you can prioritize outreach (B2B Lead Qualifier)

You get back one comprehensive record per company with everything you need for outreach.

How to use it

  1. Go to the B2B Lead Generation Suite on Apify
  2. Paste company websites or domains into the URLs field
  3. Click Start — the pipeline runs all 3 steps automatically
  4. Download your enriched leads as JSON, CSV, or export to Google Sheets

Output

Each domain produces one enriched record. Here's a real example:

{
"domain": "apify.com",
"url": "https://apify.com",
"emails": ["hello@apify.com"],
"phones": [],
"contacts": [],
"socialLinks": {
"linkedin": "http://linkedin.com/company/apify/",
"twitter": "https://x.com/apify"
},
"emailPattern": "{first}.{last}@apify.com",
"emailPatternConfidence": 0.8,
"generatedEmails": [
{ "name": "Jan Curn", "email": "jan.curn@apify.com" }
],
"score": 62,
"grade": "C",
"scoreBreakdown": {
"contactReachability": 10,
"businessLegitimacy": 22,
"onlinePresence": 15,
"websiteQuality": 12,
"teamTransparency": 3
},
"signals": [
{ "signal": "hasLinkedInCompany", "category": "contactReachability", "points": 4, "detail": "http://linkedin.com/company/apify/" },
{ "signal": "hasContactPage", "category": "contactReachability", "points": 3, "detail": "Contact page link found" },
{ "signal": "hasGenericEmail", "category": "contactReachability", "points": 3, "detail": "Found: hello@apify.com" }
],
"address": null,
"cmsDetected": null,
"techSignals": ["google-analytics", "segment", "hubspot"],
"pipelineSteps": ["contact-scraper", "email-pattern-finder", "lead-qualifier"],
"processedAt": "2026-02-07T12:00:00.000Z"
}

Output fields

FieldTypeDescription
domainStringCompany domain
urlStringWebsite URL
emailsArrayAll discovered email addresses
phonesArrayPhone numbers found
contactsArrayNamed contacts with name, title
socialLinksObjectSocial media profile URLs
emailPatternStringDetected email pattern (e.g., {first}.{last}@domain)
emailPatternConfidenceNumberPattern confidence 0-1 (1 = all emails match)
generatedEmailsArrayGenerated emails for team contacts using the detected pattern
scoreIntegerLead quality score (0-100)
gradeStringLetter grade: A, B, C, D, F
scoreBreakdownObjectScore per category (contactReachability, businessLegitimacy, onlinePresence, websiteQuality, teamTransparency)
signalsArrayBusiness quality signals that contributed to the score
addressStringPhysical address if found
cmsDetectedStringCMS/platform detected
techSignalsArrayTechnologies detected (analytics, marketing tools, etc.)
pipelineStepsArrayWhich pipeline steps were executed
processedAtStringISO timestamp

Input

FieldTypeDescriptionDefault
urlsArray of stringsWebsite URLs or bare domains (required)
maxPagesPerDomainInteger (1-20)Pages to crawl for contact scraping5
maxQualifierPagesPerDomainInteger (1-15)Pages to crawl for lead qualification5
minScoreInteger (0-100)Only output leads at or above this score0
skipEmailPatternFinderBooleanSkip email pattern detection stepfalse
skipLeadQualifierBooleanSkip lead qualification stepfalse
proxyConfigurationObjectProxy settings for all pipeline stepsApify Proxy

Example input

{
"urls": [
"https://stripe.com",
"https://basecamp.com",
"https://buffer.com"
],
"maxPagesPerDomain": 5,
"minScore": 50
}

How to use the API

Python

from apify_client import ApifyClient
client = ApifyClient(token="YOUR_API_TOKEN")
run = client.actor("ryanclinton/b2b-lead-gen-suite").call(
run_input={
"urls": [
"https://stripe.com",
"https://basecamp.com",
"https://buffer.com",
],
"maxPagesPerDomain": 5,
"minScore": 50,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{item['domain']}: {item['score']}/100 ({item['grade']})")
print(f" Emails: {item['emails']}")
print(f" Pattern: {item['emailPattern']} (confidence: {item['emailPatternConfidence']})")
print(f" Contacts: {len(item['contacts'])} people, {len(item['generatedEmails'])} generated emails")

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('ryanclinton/b2b-lead-gen-suite').call({
urls: [
'https://stripe.com',
'https://basecamp.com',
'https://buffer.com',
],
maxPagesPerDomain: 5,
minScore: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => {
console.log(`${item.domain}: ${item.score}/100 (${item.grade})`);
console.log(` Emails: ${item.emails.join(', ')}`);
console.log(` Pattern: ${item.emailPattern}`);
});

Pipeline architecture

┌─────────────────────────────────────────────────────────────────────┐
│ B2B Lead Generation Suite │
│ │
│ Input: ["stripe.com", "buffer.com", "basecamp.com"]
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Step 1: Website Contact Scraper │ │
│ │ Scrape emails, phones, names, socials │ │
│ └──────────────────────┬──────────────────────────┘ │
│ │ emails + contact names │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Step 2: Email Pattern Finder │ │
│ │ Detect format, generate emails for contacts │ │
│ └──────────────────────┬──────────────────────────┘ │
│ │ patterns + generated emails │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Step 3: B2B Lead Qualifier │ │
│ │ Score 30+ signals, grade A-F │ │
│ └──────────────────────┬──────────────────────────┘ │
│ │ │
│ ▼ │
│ Output: Merged enriched leads sorted by score │
└─────────────────────────────────────────────────────────────────────┘

Use cases

One-click lead generation

Paste 100 company websites and get a complete lead database: who works there, their email addresses, and which companies are worth contacting first — all from a single run.

Google Maps to qualified leads

  1. Run Google Maps Scraper for "dentists in Austin, TX"
  2. Feed the website URLs into this Suite
  3. Get back scored, ranked leads with decision-maker contacts and emails
# Step 1: Get businesses from Google Maps
maps_run = client.actor("compass/crawler-google-places").call(
run_input={"searchStringsArray": ["dentists in Austin TX"]}
)
websites = []
for biz in client.dataset(maps_run["defaultDatasetId"]).iterate_items():
if biz.get("website"):
websites.append(biz["website"])
# Step 2: Run the full pipeline
suite_run = client.actor("ryanclinton/b2b-lead-gen-suite").call(
run_input={"urls": websites, "minScore": 50}
)
for lead in client.dataset(suite_run["defaultDatasetId"]).iterate_items():
print(f"{lead['domain']}: {lead['score']}/100 — {lead['emails']}")

Skip steps for speed

Only need contact info? Set skipEmailPatternFinder and skipLeadQualifier to true — you get the Contact Scraper's output in the combined format, faster and cheaper.

Only need contacts + patterns (no scoring)? Set skipLeadQualifier to true.

Performance and cost

This Actor orchestrates 3 sub-actors. Each runs as a separate Apify run.

WebsitesEstimated timeEstimated platform cost
10~1 minute~$0.05
100~10 minutes~$0.50
1,000~1 hour~$5.00

Estimates include all 3 pipeline steps with datacenter proxies. Skipping steps reduces cost proportionally.

Cost breakdown per pipeline step:

  • Website Contact Scraper: ~$0.50 per 1,000 sites
  • Email Pattern Finder: ~$1.00 per 1,000 domains
  • B2B Lead Qualifier: ~$1.00 per 1,000 domains
  • Orchestrator: minimal (no crawling, just API calls)

Tips

  • Start small — test with 5-10 URLs before running large batches.
  • Use minScore — set to 50+ to filter out low-quality leads and reduce noise.
  • Skip steps for speed — if you only need contact info, disable the other steps.
  • Enable proxies for large runs — recommended for 50+ websites.

FAQ

How does billing work?

This Actor calls 3 sub-actors (Contact Scraper, Email Pattern Finder, Lead Qualifier) as separate Apify runs. You'll see 4 runs in your dashboard: the orchestrator (minimal cost) plus 3 sub-actor runs. Total cost is the sum of all runs.

Why not just use the individual actors?

You can! The individual actors give you more control. This Suite is for convenience — one input, one output, no manual data piping between steps. The results are identical to running the 3 actors manually in sequence.

Can I skip some pipeline steps?

Yes. Set skipEmailPatternFinder: true to skip pattern detection, or skipLeadQualifier: true to skip lead scoring. Fields from skipped steps will be null in the output.

What if a step fails?

Step 1 (Contact Scraper) is required — if it fails, the run stops. Steps 2 and 3 are fault-tolerant — if they fail, the pipeline continues with whatever data was collected. Failed steps are excluded from the pipelineSteps array in the output.

Does this work on JavaScript-heavy sites?

The contact scraping step uses HTTP requests (CheerioCrawler), not a browser. Sites that render content entirely with JavaScript won't yield contact data. Most business websites serve contact info as static HTML.

Actors in this pipeline

Responsible use

This Actor processes publicly available website content. By using it, you agree to:

  • Comply with all applicable laws, including GDPR, CAN-SPAM, and CCPA
  • Respect each website's Terms of Service
  • Use extracted data only for legitimate business purposes
  • Not use this tool for unsolicited bulk email or spam

Changelog

v1.0 (2026-02-07)

  • Initial release
  • Orchestrates Website Contact Scraper → Email Pattern Finder → B2B Lead Qualifier
  • Combined output with all contact info, email patterns, and lead scores
  • Skip toggles for individual pipeline steps
  • Fault-tolerant: steps 2-3 can fail without breaking the pipeline
  • Results sorted by lead score (highest first)