Multi-Source Lead Enrichment
Pricing
Pay per event
Multi-Source Lead Enrichment
Enrich business leads with normalized company data, contact scoring, industry classification, seniority detection, email validation, and smart deduplication. Accepts leads as JSON from any source — CRM exports, scrapers, spreadsheets, or APIs. No scraping or external API calls.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Actor stats
0
Bookmarked
4
Total users
2
Monthly active users
a day ago
Last modified
Categories
Share
Enrich business leads with normalized company data, contact scoring, industry classification, and data completeness analysis. Provide leads as JSON from any source — CRM exports, scrapers, spreadsheets, or APIs.
What does Multi-Source Lead Enrichment do?
Multi-Source Lead Enrichment takes raw lead data and produces clean, structured, scored records ready for sales outreach or CRM import. It normalizes messy fields, infers missing information, scores leads by quality, and deduplicates records from multiple sources.
You provide lead data as JSON. The actor analyzes each record, normalizes names/domains/phones/emails, infers industry/seniority/department, calculates a lead score and data completeness percentage, and tags leads for easy filtering.
This actor does not scrape or fetch any websites. All processing is done on data you provide.
Why use Multi-Source Lead Enrichment?
- Source-agnostic — Works with leads from any CRM, scraper, spreadsheet, or API
- Smart deduplication — Merge duplicate leads by domain, email, or company name, keeping the most complete record
- Lead scoring — 0-100 score based on company data, contact quality, seniority, and multi-source signals
- Data normalization — Cleans up domains, phone numbers, company names, email validation, company sizes
- Industry & seniority inference — Automatically classifies leads by industry (20 categories) and seniority level
- Automatic tagging — Tags like
hot-lead,decision-maker,has-business-email,multi-source
Use cases
- Sales prospecting — Score and prioritize leads before outreach
- CRM cleanup — Normalize and deduplicate messy lead data from multiple sources
- Lead qualification — Automatically tag hot leads and decision-makers
- Data enrichment pipeline — Enrich leads collected by other scrapers or APIs before importing to your CRM
- Market segmentation — Classify leads by industry, company size, and seniority for targeted campaigns
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
leads | object[] | Yes | — | Business leads as JSON objects. Each lead should have at least one identifiable field (companyName, domain, email, or contactName) |
maxLeads | integer | No | 500 | Maximum number of leads to process |
deduplicateBy | string | No | domain | Deduplication field: domain, email, companyName, or none |
Lead object format
{"companyName": "Stripe","domain": "stripe.com","contactName": "Jane Smith","contactTitle": "VP of Engineering","email": "jane@stripe.com","phone": "+1-555-0123","location": "San Francisco, CA","industry": "Financial Services","companySize": "5000","source": "LinkedIn"}
All fields are optional. The more you provide, the higher the lead score and data completeness.
Supported fields: companyName, domain, website, industry, companySize, companyDescription, revenue, founded, headquarters, contactName, firstName, lastName, contactTitle, email, phone, linkedinUrl, location, city, state, country, address, source, sourceUrl, scrapedAt. Any extra fields are passed through.
Output example
{"companyName": "Stripe","domain": "stripe.com","website": "https://stripe.com","industry": "Financial Services","companySize": "1001-5000","companyType": "company","contactName": "Jane Smith","firstName": "Jane","lastName": "Smith","contactTitle": "VP of Engineering","seniorityLevel": "vp","department": "Engineering","email": "jane@stripe.com","emailStatus": "business","phone": "+1-555-0123","phoneFormatted": "(555) 012-3000","linkedinUrl": null,"location": "San Francisco, CA","city": "San Francisco","state": "CA","country": "US","leadScore": 88,"dataCompleteness": 83,"sources": ["LinkedIn"],"sourceCount": 1,"tags": ["hot-lead", "has-business-email", "decision-maker"],"enrichedAt": "2026-03-01T12:00:00.000Z"}
Enrichment fields explained
| Field | Description | Values |
|---|---|---|
domain | Normalized domain extracted from URL, website, or email | e.g., stripe.com |
industry | Inferred or provided industry classification | 20 categories (Technology, Healthcare, Financial Services, etc.) |
companySize | Normalized employee count range | 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10000+ |
companyType | Inferred organization type | company, startup, agency, nonprofit, education, government |
seniorityLevel | Inferred from contact title | junior, mid, senior, lead, manager, director, vp, c-level |
department | Inferred from contact title | Engineering, Product, Design, Marketing, Sales, etc. (12 departments) |
emailStatus | Email classification | business, free-provider, role-account, invalid |
phoneFormatted | Cleaned phone number | US format: (XXX) XXX-XXXX |
leadScore | Overall lead quality score | 0-100 (company data 30pts + contact 40pts + seniority 15pts + multi-source 15pts) |
dataCompleteness | Percentage of key fields filled | 0-100 (checks 12 key fields) |
tags | Automatic labels | hot-lead, warm-lead, cold-lead, has-business-email, has-phone, has-linkedin, decision-maker, multi-source, high-completeness |
How deduplication works
When deduplicateBy is set (default: domain), leads sharing the same key are merged:
- Non-null fields from both records are kept (first record wins if both have data)
- Sources are combined and deduplicated
- Scores are recalculated after merge
This is useful when combining lead lists from different sources where the same company or contact may appear multiple times.
How to enrich and score business leads
- Go to Multi-Source Lead Enrichment on Apify Store.
- Add your lead data as JSON objects in the
leadsfield -- each lead needs at least one identifiable field (companyName, domain, email, or contactName). - Choose a
deduplicateBystrategy (domain, email, companyName, or none). - Optionally set
maxLeadsto limit the number of leads processed. - Click Start and wait for the run to finish.
- Download enriched, scored, and tagged leads as JSON, CSV, or Excel from the Dataset tab.
How much does it cost to enrich leads?
Multi-Source Lead Enrichment uses pay-per-event pricing:
| Event | Price | Description |
|---|---|---|
| Actor start | $0.035 | Charged once per run |
| Lead enriched | $0.005 | Charged per successfully enriched lead |
Example costs:
- 10 leads: $0.035 + (10 x $0.005) = $0.085
- 100 leads: $0.035 + (100 x $0.005) = $0.535
- 1,000 leads: $0.035 + (1,000 x $0.005) = $5.035
No proxy or browser costs — pure data processing.
Using the Apify API
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('automation-lab/multi-source-lead-enrichment').call({leads: [{companyName: 'Stripe',domain: 'stripe.com',contactName: 'Jane Smith',contactTitle: 'VP of Engineering',email: 'jane@stripe.com',source: 'LinkedIn',},],deduplicateBy: 'domain',});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach((lead) => {console.log(`${lead.contactName} at ${lead.companyName} — Score: ${lead.leadScore}`);console.log(`Tags: ${lead.tags.join(', ')}`);});
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("automation-lab/multi-source-lead-enrichment").call(run_input={"leads": [{"companyName": "Stripe","domain": "stripe.com","contactName": "Jane Smith","contactTitle": "VP of Engineering","email": "jane@stripe.com","source": "LinkedIn",},],"deduplicateBy": "domain",})for lead in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{lead['contactName']} at {lead['companyName']} — Score: {lead['leadScore']}")print(f"Tags: {', '.join(lead['tags'])}")
Integrations
Connect Multi-Source Lead Enrichment with your sales stack:
- Google Sheets — Export enriched, scored leads directly to a shared spreadsheet for your sales team
- Zapier — Auto-route hot leads (score 80+) to Salesforce, HubSpot, or Pipedrive
- Make — Build multi-step pipelines: scrape leads with Google Maps Lead Finder, enrich and score them, then push to your CRM
- Webhooks — Send enriched results to your own API endpoint for custom routing
- Other Apify actors — Chain with scraping actors to enrich their output before CRM import
Use with cURL
curl -X POST "https://api.apify.com/v2/acts/automation-lab~multi-source-lead-enrichment/runs?token=YOUR_API_TOKEN&waitForFinish=120" \-H "Content-Type: application/json" \-d '{"leads": [{"companyName": "Stripe","domain": "stripe.com","contactName": "Jane Smith","contactTitle": "VP of Engineering","email": "jane@stripe.com","source": "LinkedIn"}],"deduplicateBy": "domain"}'
Use with AI agents via MCP
Multi-Source Lead Enrichment is available as a tool for AI assistants that support the Model Context Protocol (MCP).
Setup for Claude Code
$claude mcp add --transport http apify "https://mcp.apify.com"
Setup for Claude Desktop, Cursor, or VS Code
Add this to your MCP config file:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com"}}}
Example prompts
Once connected, try asking your AI assistant:
- "Enrich this list of business leads with social profiles and contact info"
- "Score and enrich these 100 leads from my CRM export"
Learn more in the Apify MCP documentation.
Tips and best practices
- The more fields you provide per lead, the higher the lead score and data completeness
- Use
deduplicateBy: "domain"when merging leads from multiple sources about the same companies - Filter results by
leadScore >= 80to focus on hot leads - The
tagsarray lets you quickly segment leads (e.g., alldecision-maker+has-business-emailleads) - Use
maxLeadsto control costs when processing large batches
Compliance
This actor processes only data that you provide as input. It does not scrape, fetch, or access any third-party websites. You are responsible for ensuring that you have the right to process the lead data you supply.
Legality
This actor accesses publicly available data through official or public APIs. API usage is subject to each service's Terms of Service and rate limits. Always review the API provider's usage policies before running at scale.
FAQ
What happens if my leads have different field names than expected?
The actor recognizes common field variations (e.g., company maps to companyName, name maps to contactName, url or website maps to domain). Extra fields not in the supported list are passed through unchanged.
How does deduplication handle conflicts? When two leads share the same deduplication key, the first record's non-null fields take priority. Sources are merged so you can see which sources contributed data. Lead scores are recalculated after the merge.
Can I chain this with scraping actors? Yes. A common pipeline is: scrape leads with Google Maps Lead Finder or Indeed Scraper, then feed the results into Multi-Source Lead Enrichment for scoring, normalization, and tagging before CRM import. Use Make or Zapier to automate the pipeline.
Why is my lead score lower than expected? Lead score depends on multiple factors: company data (30 pts), contact info (40 pts), seniority (15 pts), and multi-source signals (15 pts). Missing fields like email, phone, or title significantly reduce the score. Provide as many fields as possible for higher scores.
Other lead generation tools
- Email Enrichment -- enrich email addresses with domain, provider, and validation data
- Email Finder -- find email addresses for companies and contacts
- Google Maps Lead Finder -- extract business leads from Google Maps search results
- Job Posting Enrichment -- enrich job postings with structured skills, seniority, and salary data
- Lead Enrichment Confidence Scorer -- score lead data quality and completeness
- Website Contact Finder -- extract contact information from company websites

