Lead Scorer and Enricher avatar

Lead Scorer and Enricher

Pricing

Pay per usage

Go to Apify Store
Lead Scorer and Enricher

Lead Scorer and Enricher

Score a list of company URLs against your own scoring rules, then enrich the qualified ones with department-specific contacts (name, title, email, LinkedIn). Turns a raw domain list into an SDR-ready pitch list in one Run.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Fabian Maume

Fabian Maume

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

7 days ago

Last modified

Share

Score a list of company URLs against your own scoring rules, then enrich the qualified ones with department-specific contacts (name, title, email, LinkedIn). Turns a raw domain list into an SDR-ready pitch list in one Run.

Under the hood the Actor chains four Apify Actors and one OpenRouter LLM step:

  1. builtwith/builtwith-official-technology-scraper — detects the tech stack.
  2. apify/website-content-crawler — pulls the homepage markdown.
  3. apify/openrouter (Standby) — evaluates yes/no questions against the homepage.
  4. vdrmota/contact-info-scraper — finds contacts in the requested departments.
  5. scalelist/email-finder — optional fallback for leads that come back without an email.

Steps 1 and 2 run in parallel to keep wall-clock time down.

Why use this Actor?

  • One-shot pipeline, no glue code. Point it at a CSV column of URLs and it emits a per-contact dataset ready for import into Apollo, Instantly, or a Google Sheet.
  • Auditable scoring. Every score decomposes into tech_score + content_score, and unqualified companies are preserved in a separate dataset so you can inspect what was dropped and why.
  • Cost-capped. Set maxTotalChargeUsd on the Run and the orchestrator refuses to overshoot.

How to use it

  1. Open the Actor in the Apify Console.
  2. Paste your company URLs into Company URLs (one per line, full URLs or bare domains).
  3. Pick the Target departments for the contact hunt (multi-select).
  4. Define Tech-stack scoring rules (e.g. Shopify +10) and/or Website-content scoring rules (e.g. "Does the homepage describe a SaaS business?" +8). Leave a set empty to skip that scoring step.
  5. Set the Qualification threshold — companies at or above pass to enrichment.
  6. On the Run configuration screen set Max total charge (USD) to your budget ceiling. This is a Run option, not an input field. See Apify docs on Run options.
  7. Start the Run. Watch the Storages tab — three datasets appear as the Run progresses.

Input

FieldTypeNotes
companyUrlsarray of strings, requiredFull URLs or bare domains.
targetDepartmentsarray of enum14 department options mirroring vdrmota/contact-info-scraper. Default [marketing, sales].
maxLeadsPerCompanyintegerCap on contacts discovered per qualified company. Cost multiplier. Default 3.
useScalelistFallbackbooleanRetry name-only leads via Scalelist. Default true.
techScoringRulesarray of {tech, weight}Empty ⇒ skip BuiltWith.
contentScoringRulesarray of {question, weight}Empty ⇒ skip WCC + LLM. Each question is yes/no; weight added on yes.
qualificationThresholdnumberThreshold at or above which a company is enriched. Default 0.
llmModelstringOpenRouter model id for content scoring. Default openai/gpt-4o-mini.

Example input JSON:

{
"companyUrls": ["https://apify.com", "https://vercel.com"],
"targetDepartments": ["marketing", "product"],
"maxLeadsPerCompany": 3,
"useScalelistFallback": true,
"techScoringRules": [
{ "tech": "Shopify", "weight": 10 },
{ "tech": "HubSpot", "weight": 5 }
],
"contentScoringRules": [
{ "question": "Does the homepage describe a SaaS or platform business?", "weight": 8 },
{ "question": "Does the homepage mention developers or API?", "weight": 3 }
],
"qualificationThreshold": 5,
"llmModel": "openai/gpt-4o-mini"
}

Output

Three datasets per Run:

qualified_leads (default dataset)

One row per discovered contact at a qualified company. Company scoring columns are duplicated per contact so a CSV export is directly usable. A qualified company that returns zero contacts still gets one placeholder row so it doesn't silently vanish.

{
"company_url": "https://apify.com",
"first_name": "Ada",
"last_name": "Lovelace",
"title": "Head of Growth",
"email": "ada@apify.com",
"email_source": "contact-info-scraper",
"linkedin": "https://linkedin.com/in/ada",
"score": 13,
"tech_score": 5,
"content_score": 8,
"detected_tech": ["HubSpot", "Segment", "Cloudflare"]
}

qualified_companies (named dataset)

One row per qualified company — the scorecard view.

{
"company_url": "https://apify.com",
"tech_score": 5,
"content_score": 8,
"score": 13,
"qualified": true,
"detected_tech": ["HubSpot", "Segment", "Cloudflare"],
"lead_count": 3
}

droped_companies (named dataset)

One row per unqualified company — the audit trail.

{
"company_url": "https://someagency.example",
"tech_score": 0,
"content_score": -5,
"score": -5,
"qualified": false,
"detected_tech": ["WordPress"]
}

You can download any dataset as JSON, HTML, CSV, or Excel from the Storages tab or via the Apify API.

Data table (default dataset)

ColumnTypeMeaning
company_urllinkNormalized https://<domain> for the company.
first_name, last_name, title, email, linkedintextContact fields.
email_sourcetextcontact-info-scraper, scalelist-fallback, or blank.
score, tech_score, content_scorenumbernull for skipped sources.
detected_techarrayTechnologies BuiltWith detected.

Pricing / cost estimation

The parent Actor itself is thin — cost is dominated by the sub-Actors.

Cost driverRough figure
BuiltWith$0.50–$2 per 100 URLs
Website Content Crawler (homepage only)$0.20–$1 per 100 URLs
OpenRouter (gpt-4o-mini, ~3k tokens/homepage)~$0.001 per company
Contact Info Scraper (add-on ON)$0.03–$0.10 per found lead × qualified companies
Scalelist (fallback)$0.01–$0.04 per resolved email

Ballpark: ~$3–$10 per 100 companies with default settings (3 leads/company, both scoring sources on, Scalelist fallback on). Half of that if you skip content scoring.

Set a hard ceiling by supplying maxTotalChargeUsd on the Run. The orchestrator splits it evenly across four steps and refuses to launch a step if the running total would exceed the cap.

Advanced tips

  • Skip a scoring source by passing an empty array for its rules. The corresponding sub-Actor is not launched, and its share of the cost cap is not spent.
  • Start with a small batch (10–20 URLs) to calibrate the qualification threshold before running the full list.
  • Broaden departments if enrichment returns few contacts. Some domains (large chains, consumer platforms) are excluded by Contact Info Scraper's internal filter — add c_suite alongside a functional department for better coverage.
  • BuiltWith empty output on a URL usually means it's Cloudflare-protected or newly registered. Retry once with the bare domain if the site is reachable in a browser.

FAQ, disclaimers, and support

Is this legal? The Actor uses publicly available data. Complying with each target site's Terms of Service and applicable privacy law (GDPR/CCPA) is your responsibility, including any B2B outreach based on emails the enrichment step returns.

Why do some qualified companies have zero contacts? Contact Info Scraper filters certain enterprise chains and consumer platforms silently. The company still appears once in qualified_leads with blank contact fields, and its scoring is still audit-visible in qualified_companies.

Can I run this workflow as a Claude skill? Yes. You can use this skill.