B2b Lead Gen Suite
Pricing
Pay per usage
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
Actor stats
0
Bookmarked
2
Total users
0
Monthly active users
6 days ago
Last modified
Categories
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:
- Scrapes contact info — emails, phone numbers, team member names/titles, social links (Website Contact Scraper)
- 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) - 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
- Go to the B2B Lead Generation Suite on Apify
- Paste company websites or domains into the URLs field
- Click Start — the pipeline runs all 3 steps automatically
- 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
| Field | Type | Description |
|---|---|---|
domain | String | Company domain |
url | String | Website URL |
emails | Array | All discovered email addresses |
phones | Array | Phone numbers found |
contacts | Array | Named contacts with name, title |
socialLinks | Object | Social media profile URLs |
emailPattern | String | Detected email pattern (e.g., {first}.{last}@domain) |
emailPatternConfidence | Number | Pattern confidence 0-1 (1 = all emails match) |
generatedEmails | Array | Generated emails for team contacts using the detected pattern |
score | Integer | Lead quality score (0-100) |
grade | String | Letter grade: A, B, C, D, F |
scoreBreakdown | Object | Score per category (contactReachability, businessLegitimacy, onlinePresence, websiteQuality, teamTransparency) |
signals | Array | Business quality signals that contributed to the score |
address | String | Physical address if found |
cmsDetected | String | CMS/platform detected |
techSignals | Array | Technologies detected (analytics, marketing tools, etc.) |
pipelineSteps | Array | Which pipeline steps were executed |
processedAt | String | ISO timestamp |
Input
| Field | Type | Description | Default |
|---|---|---|---|
urls | Array of strings | Website URLs or bare domains (required) | — |
maxPagesPerDomain | Integer (1-20) | Pages to crawl for contact scraping | 5 |
maxQualifierPagesPerDomain | Integer (1-15) | Pages to crawl for lead qualification | 5 |
minScore | Integer (0-100) | Only output leads at or above this score | 0 |
skipEmailPatternFinder | Boolean | Skip email pattern detection step | false |
skipLeadQualifier | Boolean | Skip lead qualification step | false |
proxyConfiguration | Object | Proxy settings for all pipeline steps | Apify 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 ApifyClientclient = 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
- Run Google Maps Scraper for "dentists in Austin, TX"
- Feed the website URLs into this Suite
- Get back scored, ranked leads with decision-maker contacts and emails
# Step 1: Get businesses from Google Mapsmaps_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 pipelinesuite_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.
| Websites | Estimated time | Estimated 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
- Website Contact Scraper — extract emails, phones, names, social links
- Email Pattern Finder — detect email formats, generate addresses
- B2B Lead Qualifier — score and rank leads by website signals
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)