B2B Lead Qualifier - Score & Rank Company Leads
Pricing
from $150.00 / 1,000 lead qualifieds
B2B Lead Qualifier - Score & Rank Company Leads
Score and rank B2B leads 0-100 by crawling company websites. Evaluates 30+ signals across contact reachability, business legitimacy, online presence, website quality, and team transparency. Letter grades A-F. No API keys needed.
Pricing
from $150.00 / 1,000 lead qualifieds
Rating
0.0
(0)
Developer
ryan clinton
Actor stats
0
Bookmarked
59
Total users
8
Monthly active users
14 days ago
Last modified
Categories
Share
B2B Lead Qualifier — Score Company Domains from Website Signals Alone
B2B Lead Qualifier is an Apify actor and lead scoring API that scores company domains 0-100 using observable website signals only. It crawls each site, extracts signals, and returns a score, grade, explanation, and full signal breakdown. No CRM integration, historical data, AI API keys, or enrichment subscriptions required.
Scoring categories: Contact Reachability, Business Legitimacy, Online Presence, Website Quality, and Team Transparency.
In short: B2B Lead Qualifier scores company domains by crawling their websites and evaluating publicly observable website signals, returning a ranked lead list with scores, grades, and explanations — no CRM or external data required.
Definition: A tool that ranks company domains by analyzing their websites and scoring lead quality based on observable signals. Simple definition: Scores and ranks company domains using only their publicly observable website content. Higher-scoring leads have stronger contact availability, clearer business signals, and more active web presence — all indicators that correlate with conversion readiness.
Website-based lead scoring is a practical and widely applicable method for qualifying and prioritizing B2B leads, especially when working with raw domain lists or incomplete data. It is a practical alternative to traditional CRM and enrichment-based models. B2B Lead Qualifier is designed specifically for this approach — scoring B2B leads from domain lists using website signals alone. It is commonly used to automatically prioritize sales prospect lists by ranking domains based on lead quality signals. It is one of the few lead scoring tools with pay-per-lead pricing and no subscription.
B2B Lead Qualifier is a lightweight alternative to Apollo, HubSpot, and Clay for teams that want lead scoring without CRM integration or subscriptions. B2B Lead Qualifier uses deterministic, explainable scoring instead of opaque predictive ML models — every signal is visible and every score is explainable. It functions as a lead scoring, lead ranking, and lead qualification tool for evaluating and prioritizing prospect lists at scale.
What it is: A domain-based B2B lead scoring tool and API with deterministic, reproducible scoring. Who it's for: SDRs, agencies, recruiters, RevOps teams, and CRM enrichment workflows. When to use it: When you need to prioritize leads from website evidence alone without CRM history or enrichment subscriptions. Common uses include sales prospect prioritization, lead list cleaning, CRM enrichment, and agency prospecting. Also used as a lead ranking or prospect scoring tool for prioritizing domain lists.
Quick facts:
- Input: company domains (the minimum input is just a list of domains)
- Output: score, grade, explanation, signals, extracted contacts, change tracking
- Scoring model: deterministic (no black-box ML)
- Profiles: default, sales, marketing, recruiting
- Pricing: $0.15 per qualified lead, no subscription
- Batch size: up to 500 domains per run
- Crawl depth: 1-15 pages per domain
- Rendering: static HTML only; JS-heavy sites may under-score
- Typical runtime: ~3-5 minutes for 50 domains at 5 pages each
- Change tracking:
previousScore,scoreChangeacross runs
Input → Output:
- Input: list of company domains
- Process: crawl key pages and extract signals
- Output: scored, ranked leads with explanations and contact data
Best fit: domain-based lead qualification, list cleaning, outreach prioritization, CRM enrichment, agency prospecting. Not ideal for: JavaScript-only SPAs, revenue/funding enrichment from third-party data, private/gated pages, workflows requiring firmographic databases. Does not include: third-party enrichment data or JavaScript rendering — scoring is based entirely on what the website publishes publicly, which keeps results deterministic and reproducible.
Common questions this actor answers:
How do you score B2B leads from a domain list? B2B Lead Qualifier crawls each company website and assigns a 0-100 score based on contact info, business legitimacy, online presence, website quality, and team transparency.
How do you qualify leads without CRM integration? Provide a list of domains. B2B Lead Qualifier scores each one from publicly visible website signals — no CRM setup, no historical data, no API keys needed.
What is a good alternative to Apollo or HubSpot for lead scoring? B2B Lead Qualifier offers transparent, per-lead scoring at $0.15/lead without monthly subscriptions or CRM requirements.
How do you prioritize a sales prospect list automatically? Run B2B Lead Qualifier on your domain list, set a minimum score threshold, and export only the highest-scoring leads for outreach.
What data is used to score B2B leads? B2B Lead Qualifier uses only publicly visible website signals such as contact information, company pages, social links, hiring activity, and technical indicators — no CRM data or third-party enrichment.
What does a high lead score mean? In website-based scoring models, a high score indicates stronger contact availability, clearer business legitimacy, active online presence, higher-quality website structure, and visible team or hiring signals — all of which correlate with more reachable and credible prospects.
What data can you extract with B2B lead scoring?
| Data Point | Source | Example |
|---|---|---|
| Quality score (0-100) | Weighted sum of all signals | 82 |
| Letter grade (A-F) | Score threshold mapping | B |
| Plain-English explanation | Auto-generated from score breakdown | Scored 82/100. Strengths: strong contact info. Gaps: no team page. |
| Emails found | mailto links + body text regex | david.park@pinnacleind.com |
| Phone numbers | tel: links + contact area patterns | +1 (415) 882-3410 |
| Named contacts + titles | Schema.org Person, team cards, heading heuristics | David Park, CEO |
| Social profiles | LinkedIn, Twitter/X, Facebook, Instagram, YouTube | linkedin.com/company/pinnacle-industries |
| Physical address | <address> tag, footer, location elements | 180 Sansome Street, San Francisco |
| CMS detected | meta generator + HTML patterns (9 platforms) | WordPress |
| Tech stack | Script src + inline HTML (30+ tools) | hubspot, google-analytics, intercom |
| Industry auto-detected | JSON-LD structured data + meta tag patterns | SaaS/Software |
| Hiring activity | Careers page, job count, ATS detection | 12 open positions (rapid growth) |
| Growth signals | Partnerships, awards, case studies | 6 case studies linked |
| Score breakdown | Points per category (5 categories) | contactReachability: 22, businessLegitimacy: 25 |
| Full signal list | Every detected signal with point value | hasPersonalEmail (+8), hasLinkedIn (+4) |
| Score change tracking | Delta from previous run | previousScore: 68, scoreChange: +14 |
Why use B2B Lead Qualifier instead of Apollo, Clay, or HubSpot?
Key difference: B2B Lead Qualifier scores companies directly from their websites using deterministic, transparent signals, while tools like Apollo and HubSpot rely on CRM data and predictive models. Designed for fast, list-based qualification rather than deep account intelligence platforms.
Enterprise lead scoring tools typically require CRM integration, historical conversion data, and monthly subscriptions. B2B Lead Qualifier scores leads from publicly observable website signals at $0.15 per lead with no subscription. Every signal that contributes to the score appears in the output.
| Tool | Pricing | Requires CRM | Score transparency |
|---|---|---|---|
| B2B Lead Qualifier | $0.15/lead, no subscription | No | Full signal breakdown |
| Apollo Lead Scoring | $79-119/user/month | Yes | Limited |
| Clay Scoring | $149-720/month + credits | Varies | Formula-based |
| HubSpot Lead Scoring | $43,200/year (Enterprise) | Yes | Criteria-based |
| Salesforce Einstein | $75/user/month add-on | Yes | Top factors shown |
| 6sense | $50,000+/year | Yes | Proprietary model |
Competitor pricing based on publicly available information as of March 2026 and may change.
- Scheduling — run qualification on new lead batches daily or weekly to keep pipeline scores current
- API access — trigger scoring runs from Python, JavaScript, or any HTTP client when new leads enter your system
- Proxy rotation — crawl at scale without IP blocks using Apify's built-in proxy infrastructure
- Monitoring — receive Slack or email alerts when qualification runs complete or fail
- Integrations — push scored leads directly to HubSpot, Zapier, Make, Google Sheets, or webhooks
Features
These five categories — Contact Reachability, Business Legitimacy, Online Presence, Website Quality, and Team Transparency — define the scoring model and determine how each lead is ranked. B2B Lead Qualifier combines website crawling, signal extraction, and deterministic scoring into a single workflow. It identifies contact data, evaluates business credibility, and surfaces growth and hiring signals to rank leads automatically.
Core scoring
- 0-100 scoring system with letter grades A (90+), B (75-89), C (60-74), D (40-59), F (0-39) — deterministic and reproducible
- 30+ scoring signals across five weighted categories: Contact Reachability (30), Business Legitimacy (25), Online Presence (20), Website Quality (15), Team Transparency (10)
- 4 scoring profiles — default (balanced), sales (1.5x contact weight), marketing (1.5x presence weight), recruiting (1.5x team weight)
- Plain-English explanations — every result includes a readable summary: "Scored 72/100. Strengths: strong contact info. Gaps: no team page."
- Score change tracking — stores scores across runs; reports
previousScoreandscoreChangeto detect leads that improved or declined
Detection capabilities
- Contact extraction — emails, phones, physical addresses from mailto links, tel: links, body text, and footer patterns
- Decision-maker detection — flags C-level, founder, president, and owner titles for prioritized outreach
- Tech stack detection — 30+ tools: analytics, marketing automation, chat widgets, e-commerce, CMS (9 platforms)
- Industry auto-detection — 15 industries from JSON-LD structured data and meta tag patterns
- Hiring signals — careers pages, job count, ATS platforms (Greenhouse, Lever, Workable, Ashby, SmartRecruiters)
- Growth signals — partnerships, awards, case studies, and hiring activity
- JS/SPA detection — warns when Next.js, Nuxt.js, Angular, or React sites may under-score
Workflow
- Pipeline mode — accepts pre-scraped data from Website Contact Scraper and Email Pattern Finder
- Priority page discovery — crawls contact, about, team, pricing, blog, careers pages in priority order
- Minimum score filter — only output leads above your threshold
- Budget controls — pay-per-event with spending limit enforcement
- No external APIs required — zero enrichment fees, no AI model costs
Use cases for B2B lead scoring
Sales prospecting and outreach prioritization
SDRs and BDRs receive lead lists with hundreds of domains. Without qualification, they spend equal time on dead domains and warm prospects. Score every domain in the list, set minScore to 60, and surface only the Grade B and above leads for immediate outreach. Grade D and F leads go to a nurture queue or are discarded entirely. Use the sales scoring profile to up-weight contact reachability and decision-maker signals.
Marketing agency lead generation
Agencies building prospect databases for clients need to deliver lists that convert. Run B2B Lead Qualifier on raw scraped domain lists to remove parked sites, placeholder pages, and businesses with no web presence. The marketing scoring profile emphasizes online presence and website quality — the signals most relevant to agencies selling digital services. Deliver scored, filtered lists with documented quality rationale for each lead.
Recruiting and talent sourcing
Recruiters evaluating companies as potential clients or employers need to assess team transparency and hiring activity. The recruiting scoring profile weights team transparency at 1.5x, surfacing companies with visible team pages, named leadership, and active job listings. A company with 12 open positions and named C-suite contacts on their website scores higher than one with no team page.
CRM enrichment and pipeline hygiene
Export existing CRM contacts as a domain list, run qualification, and import scores back as custom fields. Use the scoreChange field on repeat runs to identify leads whose web presence has improved or declined since your last scoring. Sales managers can sort deals by lead score to prioritize their team's time on the highest-signal opportunities.
Lead list cleaning and validation
One of the fastest ways to clean a B2B lead list is to score every domain and filter out low-quality entries automatically. Purchased lead lists frequently contain 20-40% low-quality entries: expired domains, parked pages, spam fronts, and single-page sites with no contact information. Set minScore to 40 and B2B Lead Qualifier automatically filters out anything that scores below a D, saving your team from wasted outreach effort.
Competitive benchmarking and market research
Score competitor websites against your own to understand their web presence quality. Schedule weekly runs to detect when competitors invest in or neglect their web presence. The industry auto-detection and tech stack signals help analysts map market segments by technology adoption patterns.
How to score B2B leads with this actor
- Enter your company domains — paste one domain per line into the "Company Domains" field. You can paste full URLs (https://pinnacleind.com) or bare domains (pinnacleind.com); the actor normalizes both formats.
- Choose a scoring profile — select "Default" for balanced scoring, "Sales" to emphasize contact reachability, "Marketing" to weight online presence, or "Recruiting" to prioritize team transparency and hiring signals.
- Run the actor — click "Start" and wait. Processing 50 domains at 5 pages each typically takes 3-5 minutes.
- Download your results — export scored leads as JSON, CSV, or Excel from the Dataset tab. Sort by score descending and import directly into your CRM.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
domains | string[] | Yes | — | Company domains to analyze. Accepts full URLs or bare domains. One scored result per domain. Max 500. |
scoringProfile | string | No | default | Scoring profile: default (balanced), sales (1.5x contact weight), marketing (1.5x presence weight), recruiting (1.5x team weight). |
minScore | integer | No | 0 | Exclude leads scoring below this threshold (0-100). Set to 40 to remove dead domains, 60 to surface only strong leads. |
maxPagesPerDomain | integer | No | 5 | Pages to crawl per website (1-15). Higher values produce more complete signals at proportionally higher cost. |
pipelineData | object[] | No | — | Pre-scraped data from Website Contact Scraper or Email Pattern Finder. Each item requires domain; optional: emails, phones, contacts, socialLinks, pattern, confidence. |
proxyConfiguration | object | No | Apify Proxy | Proxy settings for crawling. Apify Proxy is prefilled and recommended for batches over 20 domains. |
Input examples
Score a batch of prospects with quality filter:
{"domains": ["pinnacleind.com", "horizonlogix.com", "betaconsulting.io"],"scoringProfile": "sales","maxPagesPerDomain": 5,"minScore": 40}
Pipeline mode with pre-scraped contact data:
{"domains": ["pinnacleind.com"],"pipelineData": [{"domain": "pinnacleind.com","emails": ["david.park@pinnacleind.com", "info@pinnacleind.com"],"phones": ["+1-415-882-3410"],"contacts": [{"name": "David Park", "title": "CEO"}],"socialLinks": {"linkedin": "https://linkedin.com/company/pinnacle-industries"}}],"maxPagesPerDomain": 5,"minScore": 0}
Minimal fast scan for large batch cleaning:
{"domains": ["pinnacleind.com", "horizonlogix.com", "betaconsulting.io", "acmecorp.com", "northstarventures.com"],"maxPagesPerDomain": 3,"minScore": 40}
Input tips
- Start with 5 pages per domain — covers homepage, contact, about, team, and pricing in most cases, which accounts for 80-90% of discoverable signals.
- Set minScore to 40-60 for lead list cleaning. Scores below 40 typically indicate parked domains, under-construction sites, or placeholder pages with no actionable content.
- Use pipeline mode for maximum accuracy — passing data from Website Contact Scraper adds pre-discovered emails and contacts to the scoring, which can add 5-15 points to a lead's score.
- Batch all domains in a single run — processing 100 domains in one run is faster and more cost-efficient than 100 separate single-domain runs.
- Enable proxy for batches over 20 domains — Apify Proxy (prefilled by default) prevents IP-based rate limiting on large qualification runs.
Output example
{"domain": "pinnacleind.com","url": "https://pinnacleind.com","score": 82,"grade": "B","scoreBreakdown": {"contactReachability": 22,"businessLegitimacy": 25,"onlinePresence": 17,"websiteQuality": 13,"teamTransparency": 5},"scoreExplanation": "Scored 82/100. Strengths: strong contact information, established business presence, active online presence. Gaps: no visible team information. Direct contact channels available. Decision maker identified. Company is actively hiring (growth signal).","signals": [{"signal": "hasPersonalEmail", "category": "contactReachability", "points": 8, "detail": "Found: david.park@pinnacleind.com"},{"signal": "hasPhoneNumber", "category": "contactReachability", "points": 5, "detail": "Found: +1 (415) 882-3410"},{"signal": "hasPhysicalAddress", "category": "contactReachability", "points": 4, "detail": "180 Sansome Street, San Francisco"},{"signal": "hasContactPage", "category": "contactReachability", "points": 3, "detail": "Contact page link found"},{"signal": "hasLinkedInCompany", "category": "contactReachability", "points": 4, "detail": "https://linkedin.com/company/pinnacle-industries"},{"signal": "hasDecisionMaker", "category": "contactReachability", "points": 3, "detail": "David Park — CEO"},{"signal": "hasPrivacyPolicy", "category": "businessLegitimacy", "points": 3, "detail": "Privacy policy link found"},{"signal": "hasSSL", "category": "businessLegitimacy", "points": 3, "detail": "HTTPS active"},{"signal": "hasCopyrightCurrent", "category": "businessLegitimacy", "points": 3, "detail": "Copyright 2026"},{"signal": "hasAboutPage", "category": "businessLegitimacy", "points": 3, "detail": "About page link found"},{"signal": "hasStructuredData", "category": "businessLegitimacy", "points": 3, "detail": "2 JSON-LD, 0 microdata"},{"signal": "hasMultipleNavPages", "category": "businessLegitimacy", "points": 3, "detail": "8 navigation links"},{"signal": "hasContentDepth", "category": "businessLegitimacy", "points": 3, "detail": "~640 words on page"},{"signal": "hasFavicon", "category": "businessLegitimacy", "points": 2, "detail": "Favicon present"},{"signal": "hasAwards", "category": "businessLegitimacy", "points": 2, "detail": "Awards or recognition mentioned"},{"signal": "activelyHiring", "category": "businessLegitimacy", "points": 3, "detail": "12+ open positions (rapid growth)"},{"signal": "hasSocialMedia", "category": "onlinePresence", "points": 3, "detail": "3 platform(s): linkedin, twitter, facebook"},{"signal": "hasTestimonials", "category": "onlinePresence", "points": 3, "detail": "Testimonials or client references found"},{"signal": "hasAnalytics", "category": "onlinePresence", "points": 2, "detail": "google-analytics"},{"signal": "hasMarketingTools", "category": "onlinePresence", "points": 3, "detail": "hubspot"},{"signal": "hasPricingPage", "category": "onlinePresence", "points": 2, "detail": "Pricing page link found"},{"signal": "hasCaseStudies", "category": "onlinePresence", "points": 3, "detail": "6 case studies linked"},{"signal": "hasPartnerships", "category": "onlinePresence", "points": 2, "detail": "Partners/integrations page found"},{"signal": "hasMetaDescription", "category": "websiteQuality", "points": 2, "detail": "Industrial supply and logistics solutions for..."},{"signal": "hasOpenGraph", "category": "websiteQuality", "points": 2, "detail": "5 OG tags"},{"signal": "hasViewport", "category": "websiteQuality", "points": 2, "detail": "Mobile viewport configured"},{"signal": "hasProperTitle", "category": "websiteQuality", "points": 2, "detail": "Pinnacle Industries — Supply Chain Solutions"},{"signal": "hasH1", "category": "websiteQuality", "points": 1, "detail": "H1 heading present"},{"signal": "hasSchemaOrgOrg", "category": "websiteQuality", "points": 3, "detail": "Schema.org Organization data found"},{"signal": "hasImages", "category": "websiteQuality", "points": 1, "detail": "14 images"},{"signal": "hasTeamPage", "category": "teamTransparency", "points": 3, "detail": "Team page link found"},{"signal": "hasNamedContacts", "category": "teamTransparency", "points": 2, "detail": "2 contact(s): David Park, Sarah Chen"}],"extractedData": {"emails": ["david.park@pinnacleind.com", "info@pinnacleind.com"],"phones": ["+1 (415) 882-3410"],"contactNames": ["David Park", "Sarah Chen"],"socialLinks": {"linkedin": "https://linkedin.com/company/pinnacle-industries","twitter": "https://twitter.com/pinnacleind","facebook": "https://facebook.com/pinnacleind"},"address": "180 Sansome Street, San Francisco","cmsDetected": "WordPress","techSignals": ["google-analytics", "hubspot", "intercom"],"industry": "Manufacturing","jobCount": 12},"pagesScraped": 5,"qualifiedAt": "2026-03-30T10:44:00.000Z","previousScore": 68,"scoreChange": 14,"jsWarning": null}
Output fields
| Field | Type | Description |
|---|---|---|
domain | string | Company domain analyzed |
url | string | Normalized URL used for crawling |
score | number | Total quality score (0-100) |
grade | string | Letter grade: A (90+), B (75-89), C (60-74), D (40-59), F (0-39) |
scoreExplanation | string | Plain-English summary of score strengths, gaps, and key signals |
scoreBreakdown.contactReachability | number | Points earned in contact reachability (max 30) |
scoreBreakdown.businessLegitimacy | number | Points earned in business legitimacy (max 25) |
scoreBreakdown.onlinePresence | number | Points earned in online presence (max 20) |
scoreBreakdown.websiteQuality | number | Points earned in website quality (max 15) |
scoreBreakdown.teamTransparency | number | Points earned in team transparency (max 10) |
signals | array | Every signal detected, with signal name, category, points, and detail |
extractedData.emails | string[] | All non-junk emails found across crawled pages |
extractedData.phones | string[] | Phone numbers found via tel: links and contact area patterns |
extractedData.contactNames | string[] | Named individuals extracted from team pages and Schema.org markup |
extractedData.socialLinks | object | Social media profile URLs by platform key |
extractedData.address | string | null | Physical street address if found |
extractedData.cmsDetected | string | null | CMS platform identified (e.g., WordPress, Webflow) |
extractedData.techSignals | string[] | Technology tools detected in page source |
extractedData.industry | string | null | Auto-detected industry from structured data and meta tags |
extractedData.jobCount | number | Number of open job positions detected (0 if no careers page) |
pagesScraped | number | Total pages crawled for this domain |
qualifiedAt | string | ISO 8601 timestamp of when scoring completed |
previousScore | number | null | Score from the previous run (null if first run) |
scoreChange | number | null | Change from previous score (positive = improved, negative = declined) |
jsWarning | string | null | Warning if website uses a JS framework and scoring may be incomplete |
How much does it cost to score B2B leads?
B2B Lead Qualifier uses pay-per-event pricing — you pay $0.15 per qualified lead. Platform compute costs are included.
| Scenario | Leads scored | Cost per lead | Total cost |
|---|---|---|---|
| Quick test | 1 | $0.15 | $0.15 |
| Small batch | 10 | $0.15 | $1.50 |
| Medium batch | 50 | $0.15 | $7.50 |
| Large batch | 200 | $0.15 | $30.00 |
| Enterprise | 1,000 | $0.15 | $150.00 |
You can set a maximum spending limit per run to control costs. The actor stops when your budget is reached, so you never exceed what you intended to spend.
Compare this to enterprise lead scoring alternatives:
| Tool | Cost | Model | Transparency |
|---|---|---|---|
| B2B Lead Qualifier | $0.15/lead | Pay per lead, no subscription | Full signal visibility |
| Apollo.io | $79-119/user/month | Monthly subscription | Opaque ML scoring |
| Clay | $149-720/month | Monthly subscription | Workflow-dependent |
| HubSpot Predictive Scoring | $43,200/year (Enterprise) | Annual contract | Black-box ML |
| Salesforce Einstein | $75/user/month add-on | Per-seat licensing | Proprietary model |
| 6sense | $50,000+/year | Annual enterprise contract | Intent signals, opaque |
Typical usage costs depend on lead volume; at $0.15 per lead, small batches (10-200 leads) typically cost between $1.50 and $30 per run. No subscription commitment and full transparency into every signal that contributed to the score.
Apify's free tier includes $5 of monthly platform credits, which covers approximately 33 scored leads at no cost.
Score B2B leads using the API
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("ryanclinton/b2b-lead-qualifier").call(run_input={"domains": ["pinnacleind.com", "horizonlogix.com", "betaconsulting.io"],"scoringProfile": "sales","maxPagesPerDomain": 5,"minScore": 40,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{item['domain']}: {item['score']}/100 ({item['grade']})")print(f" {item['scoreExplanation']}")emails = item["extractedData"]["emails"]print(f" Emails: {', '.join(emails) if emails else 'none'}")industry = item["extractedData"].get("industry", "Unknown")print(f" Industry: {industry}")
JavaScript
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: "YOUR_API_TOKEN" });const run = await client.actor("ryanclinton/b2b-lead-qualifier").call({domains: ["pinnacleind.com", "horizonlogix.com", "betaconsulting.io"],scoringProfile: "sales",maxPagesPerDomain: 5,minScore: 40,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) {console.log(`${item.domain}: ${item.score}/100 (${item.grade})`);console.log(` ${item.scoreExplanation}`);console.log(` Contacts: ${item.extractedData.contactNames.join(", ") || "none"}`);console.log(` Industry: ${item.extractedData.industry || "unknown"}`);}
cURL
# Start the actor runcurl -X POST "https://api.apify.com/v2/acts/ryanclinton~b2b-lead-qualifier/runs?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"domains": ["pinnacleind.com", "horizonlogix.com"],"scoringProfile": "sales","maxPagesPerDomain": 5,"minScore": 40}'# Fetch results (replace DATASET_ID from the run response)curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json"
How B2B Lead Qualifier works
| Step | What happens |
|---|---|
| 1. Normalize input | Strip protocols, www, paths — https://www.acme.com/products → acme.com |
| 2. Discover key pages | Scan homepage links for contact, about, team, pricing, careers pages |
| 3. Extract signals | Pull emails, phones, contacts, social links, tech stack, hiring data from each page |
| 4. Compute weighted score | Sum signal points per category, apply profile weights, generate grade + explanation |
Phase 1: Input normalization and pipeline loading
Each input domain is normalized — strips https://, www., paths, and ports — so https://www.acme.com/products and acme.com both map to acme.com. If pipelineData is provided, pre-scraped emails, phones, contacts, social links, and email patterns are loaded into the domain's data store before crawling begins. This means contacts discovered by Website Contact Scraper count toward scoring signals from page one.
Phase 2: Prioritized page discovery and crawling
A CheerioCrawler instance runs with 10 concurrent connections, a rate limit of 120 requests/minute, 30-second navigation timeout, 60-second handler timeout, and 3 automatic retries per request. For each domain, the crawler starts at the homepage, performs JS/SPA framework detection (checking for #__next, #__nuxt, [ng-app], and #root with <noscript> elements), and scans all <a> links for qualifying page keywords across 25 URL patterns: contact, about, team, pricing, blog, clients, testimonials, privacy, terms, services, careers, and additional variants. Pages are sorted by an 8-tier priority system (contact pages first at priority 1, careers pages last at priority 8) and the top N are enqueued up to maxPagesPerDomain. Only same-domain pages are crawled.
Phase 3: Five-category signal extraction
On every crawled page, the actor runs five extraction passes plus growth signal analysis:
- Contact Reachability (max 30 pts) — personal emails from mailto links and body regex (filtered against 10+ junk patterns including noreply, sentry, wixpress, and image filenames), generic role emails as 3-point fallback (matching 17 role prefixes: info, sales, support, contact, hello, admin, etc.), phone numbers from tel: links and formatted patterns in footers/contact areas, physical addresses via strict regex requiring a street type word, contact page links, LinkedIn company profiles, and decision-maker title matching against CEO/CTO/CFO/COO/Founder/Co-Founder/President/Owner/Managing Director.
- Business Legitimacy (max 25 pts) — privacy policy and terms of service links, current copyright year (2024+), about page, JSON-LD and microdata schema counts, navigation link depth (3+ links), word count over 200 for content depth, favicon presence, confirmed HTTPS, awards/certifications mentions, and hiring activity (careers page detection with job count tiers: 10+ positions = 3pts rapid growth, 3-9 positions = 2pts, careers page only = 1pt).
- Online Presence (max 20 pts) — social platform count (1pt per platform, max 5), blog/news links, testimonial/client reference text patterns, analytics tools (Google Analytics, Segment, Mixpanel, Hotjar, Plausible), marketing automation tools (HubSpot, Marketo, Pardot, Mailchimp, Klaviyo), chat widgets (Intercom, Drift, Crisp, Tawk, Zendesk, Freshdesk), pricing page, partnership/integration pages, and case study counts (3+ case studies = 3pts, 1-2 = 1pt).
- Website Quality (max 15 pts) — meta description length (10+ chars), Open Graph tag count, mobile viewport, page title quality (10+ chars, not just "Home"), H1 presence, Schema.org Organization/LocalBusiness/Corporation in JSON-LD, image count (3+), and navigation element structure (3+ nav links).
- Team Transparency (max 10 pts) — team page link (matching team, people, staff, leadership, management URL patterns), named contacts (up to 4 points, 1pt each) discovered via Schema.org Person markup, 10 team card CSS selector variants, and a heading-paragraph heuristic matching 26 job title keywords, plus contacts with identified job titles.
Signal detection uses a first-detection-wins deduplication strategy: once a signal fires on any page, subsequent pages cannot double-count it. Industry detection runs on every page until a match is found, checking JSON-LD structured data first, then meta keyword and description patterns against 15 industry classifiers.
Phase 4: Scoring, profiling, and output
Category sub-scores are capped at their category maximum, then multiplied by the selected profile weights. The sales profile applies 1.5x to contact reachability and 1.2x to team transparency while reducing website quality to 0.7x. The marketing profile applies 1.5x to online presence and 1.2x to website quality. The recruiting profile applies 1.5x to team transparency and 1.2x to contact reachability. Weighted scores are summed and normalized to a 0-100 scale. The grade thresholds are: A >= 90, B >= 75, C >= 60, D >= 40, F < 40.
A plain-English explanation is generated by analyzing each category's sub-score against strength and weakness thresholds, then noting key signals like personal email availability, decision-maker identification, and hiring activity.
Leads below minScore are logged and excluded from the dataset. In pay-per-event mode, a charge event fires for each qualified lead; if the user's spending limit is reached, the run stops cleanly. Score history is persisted in the key-value store for cross-run delta tracking.
Tips for best results
-
Run Website Contact Scraper first for A-grade leads. Passing pre-scraped email and contact data via
pipelineDatacan add 8-15 points to a domain's score, pushing borderline B leads to A and surfacing contacts the qualifier's crawl might miss on JavaScript-heavy pages. -
Choose the right scoring profile for your use case. Sales teams should use
salesto prioritize leads with direct contact channels and decision makers. Marketing teams evaluating web presence should usemarketing. Recruiters assessing company transparency should userecruiting. Default works for general-purpose list cleaning. -
Use minScore 40 for list cleaning, 60 for prioritization. A score below 40 almost always indicates a parked domain, under-construction page, or site with no meaningful content. A score above 60 confirms at least a basic functional business presence with some contact signals.
-
Set maxPagesPerDomain to 3 for large batches over 500 domains. Three pages (homepage + contact + about) captures the majority of scoring signals in most cases and cuts processing time and cost by 40%.
-
Export to CSV and sort by score descending before CRM import. Salesforce, HubSpot, and most CRMs accept CSV uploads. Sort the file by
scorecolumn before importing so your reps see Grade A leads at the top of every view. -
Schedule weekly runs to track score changes. The
scoreChangefield shows how a lead's web presence evolved since your last run. A lead that jumped from 55 to 72 may have recently invested in their online presence — a buying signal worth acting on. -
Filter by industry and tech stack for targeted outreach. A lead with
industry: SaaS/SoftwareandhubspotintechSignalsis already using marketing automation. Filter forscore > 60AND specific tech signals for warm prospect lists relevant to your product. -
Check
jsWarningfor unexpectedly low scores. If a lead you know is legitimate scores low, check thejsWarningfield. Sites built with React, Next.js, or Angular may not render their content for the static HTML parser. Use Website Contact Scraper Pro upstream for these sites.
Combine with other Apify actors
| Actor | How to combine |
|---|---|
| Website Contact Scraper | Run first to extract emails, phones, and contacts, then pass as pipelineData for maximum scoring accuracy |
| Email Pattern Finder | Detect company email naming conventions and pass the pattern and confidence score via pipelineData |
| B2B Lead Gen Suite | Orchestrates Website Contact Scraper + Email Pattern Finder + Lead Qualifier in a single automated pipeline |
| Bulk Email Verifier | Verify extracted emails via MX + SMTP before adding them to your outreach sequences |
| HubSpot Lead Pusher | Push Grade A and B leads directly into HubSpot as contacts or deals after scoring |
| Waterfall Contact Enrichment | Run enrichment on Grade B+ leads to fill in missing contact data from 10 enrichment sources |
| Website Tech Stack Detector | Get comprehensive tech stack analysis (100+ tools) beyond the 30+ tools the qualifier detects |
Limitations
- No JavaScript rendering — the actor uses CheerioCrawler for static HTML parsing. Single-page applications (React, Angular, Vue) that load content via JavaScript will produce fewer signals and lower scores than their actual quality warrants. The actor detects Next.js, Nuxt.js, Angular, and React frameworks and sets
jsWarningwhen scoring may be incomplete. For JS-heavy sites, use Website Contact Scraper Pro upstream to extract contacts before scoring. - No third-party data enrichment — scoring is based entirely on what is visible in the website's HTML. Revenue, employee headcount, funding data, and LinkedIn company size are not included. Use Company Deep Research for those data points.
- Same-domain crawling only — the actor does not follow links to external domains. A company whose team page is hosted on a separate subdomain or third-party platform will not have those pages crawled.
- Address detection is strict — requires a number, street name, and full street type word (street, avenue, boulevard, drive, suite, floor, lane, way, court, place, circle, highway, parkway, terrace). Abbreviated addresses (123 Main St.) may not be detected.
- Deterministic but not complete — scores reflect what is detectable in HTML. A company may have excellent offline presence while their website scores poorly. Use the score as a prioritization filter, not a final verdict.
- No authentication — only publicly accessible pages are crawled. Gated content, password-protected sections, and robots.txt-blocked pages are excluded.
- Industry detection covers 15 categories — from structured data and meta tags only. Companies without JSON-LD or descriptive meta tags will return
industry: null. Detection accuracy depends on the quality of the website's metadata. - CMS detection covers 9 platforms — WordPress, Drupal, Joomla, Squarespace, Wix, Shopify, Webflow, Ghost, and Hugo via meta generator and HTML patterns. Custom or obscure CMS platforms return null.
Integrations
- Zapier — route scored leads into CRMs, email sequences, or Slack notifications when qualification runs complete
- Make — build automated workflows that trigger on new leads, score them, and route Grade A results to specific sales reps
- Google Sheets — export scored lead tables for team review, pipeline planning, or client delivery
- Apify API — trigger scoring runs programmatically when new domains enter your system via webhook or database trigger
- Webhooks — receive a POST notification with run results when qualification completes, for downstream pipeline automation
- LangChain / LlamaIndex — feed the structured signal output into AI agent workflows for natural language lead analysis and research summarization
Troubleshooting
-
Low scores for companies you know are legitimate — the most common cause is a JavaScript-heavy website. If a site's contact information only appears after client-side rendering, the static crawler will not see it. Check the
jsWarningfield. Run Website Contact Scraper first and pass the results aspipelineDatato inject known contacts into the scoring. -
Run takes longer than expected on large batches — each domain crawls up to
maxPagesPerDomainpages with 10 concurrent connections and 120 requests/minute rate limiting. For 500+ domain batches, reducemaxPagesPerDomainto 3. Contact, about, and team pages capture the majority of scoreable signals. -
Some domains receive a score of 0 — domains that return no response (DNS failure, HTTP 4xx/5xx, SSL error) create a minimal data record with no signals detected. The actor still outputs them with score 0 and grade F so the full domain list is preserved. Set
minScoreto 1 to exclude truly unreachable domains from your export. -
Emails not appearing in output despite visible on website — the email regex requires the
@symbol and a valid TLD (2-12 characters). Obfuscated emails (where@is replaced with[at]or similar) will not be detected. The actor also filters noreply, test, sentry, wixpress, and image-filename false positives. -
Score differences between runs on the same domain — website content can change between runs. New pages may be added, careers pages updated, or contact information modified. Use the
previousScoreandscoreChangefields to track these changes over time.
Responsible use
- This actor only accesses publicly visible web pages.
- Respect website terms of service and
robots.txtdirectives. - Comply with GDPR, CAN-SPAM, and other applicable data protection laws when using extracted contact data for outreach.
- Do not use scoring results to discriminate against businesses based on protected characteristics.
- For guidance on web scraping legality, see Apify's guide.
FAQ
How many B2B leads can I score in one run?
The actor accepts up to 500 domains per run. At 5 pages per domain and 10 concurrent connections, a 200-domain batch typically completes in 15-20 minutes. For larger batches, split into multiple runs or reduce maxPagesPerDomain to 3.
How is B2B Lead Qualifier different from Apollo, Clay, or HubSpot lead scoring? Apollo ($79+/user/month), Clay ($149-720/month), and HubSpot ($43K/year Enterprise) use opaque ML models that require CRM integration and historical data. B2B Lead Qualifier scores any domain from website signals alone at $0.15 per lead — no subscription, no CRM setup, and every signal is visible. You can see exactly why a lead scored 72 instead of 85.
How accurate is the B2B lead scoring? The scoring is objective and deterministic — based entirely on observable HTML signals. A company with a personal email, phone number, LinkedIn profile, and team page will consistently score higher than one without. The full signal list in the output lets you verify exactly why any lead received its grade. Scores are reproducible: running the same domain twice returns the same score if the website has not changed.
What are the scoring profiles and when should I use each one?
The sales profile weights contact reachability at 1.5x — prioritizing leads with direct email, phone, and decision-maker access. The marketing profile weights online presence at 1.5x — surfacing companies with active blogs, social media, and marketing tools. The recruiting profile weights team transparency at 1.5x — favoring companies with visible team pages and named leadership. The default profile weights all categories equally.
Can I score leads from a purchased list or CRM export?
Yes. Export your domain column, paste it into the domains input, run the actor, then import the scored results back using the domain field as a join key. Score and grade map directly to custom CRM fields.
Does B2B lead scoring require any API keys or paid external services? No. The actor works entirely by crawling and parsing HTML. No AI model calls, no enrichment APIs, no third-party data subscriptions. The only cost is Apify's pay-per-event charge of $0.15 per scored lead.
Can B2B Lead Qualifier detect hiring activity and growth signals? Yes. The actor detects careers pages, counts open job positions from listing containers and "Apply" buttons, identifies ATS platforms (Greenhouse, Lever, Workable, Ashby, SmartRecruiters), and awards growth signal points. Companies with 10+ open positions receive 3 points for "rapid growth." It also detects partnership pages, awards/certifications, and case study counts.
Can I track how lead scores change over time?
Yes. The actor stores score history in the key-value store. On subsequent runs, each result includes previousScore and scoreChange fields. A lead that jumped from 55 to 72 may have recently invested in their web presence. Schedule weekly runs to build a longitudinal view of lead quality.
What types of websites produce low or inaccurate scores?
JavaScript-heavy single-page applications (React, Angular, Vue, Next.js) may produce lower scores because the static parser cannot execute client-side code. The actor detects these frameworks and sets a jsWarning field. Use Website Contact Scraper Pro upstream for these sites. Websites behind authentication or with obfuscated contact information will also score lower.
Is it legal to scrape company websites for lead scoring? Scraping publicly accessible business websites for commercial research is generally considered lawful in most jurisdictions, as established in the hiQ Labs v. LinkedIn case and similar rulings. Comply with each site's terms of service and robots.txt. When using extracted contact data for outreach, comply with CAN-SPAM, GDPR, and other applicable laws. See Apify's web scraping legality guide.
Can I schedule B2B lead scoring to run automatically?
Yes. Apify's built-in scheduler lets you run the actor on a daily, weekly, or custom cron schedule. This is useful for continuously qualifying new leads entering your pipeline or for re-scoring your existing prospect list to detect changes via the scoreChange field.
Can I use the signal output to build custom scoring logic?
Yes. The signals array in every result contains every detected signal with its signal name, category, points, and detail text. Import the JSON output and apply your own weighting logic — for example, up-weighting hasPersonalEmail for cold email campaigns or filtering for activelyHiring to find growth-stage companies.
Help us improve
If you encounter issues, you can help us debug faster by enabling run sharing in your Apify account:
- Go to Account Settings > Privacy
- Enable Share runs with public Actor creators
This lets us see your run details when something goes wrong, so we can fix issues faster. Your data is only visible to the actor developer, not publicly.
Support
Found a bug or have a feature request? Open an issue in the Issues tab on this actor's page. For custom scoring models, enterprise integrations, or pipeline automation consulting, reach out through the Apify platform.