Lead Scorer and Enricher
Pricing
Pay per usage
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
7 days ago
Last modified
Categories
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:
builtwith/builtwith-official-technology-scraper— detects the tech stack.apify/website-content-crawler— pulls the homepage markdown.apify/openrouter(Standby) — evaluates yes/no questions against the homepage.vdrmota/contact-info-scraper— finds contacts in the requested departments.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
maxTotalChargeUsdon the Run and the orchestrator refuses to overshoot.
How to use it
- Open the Actor in the Apify Console.
- Paste your company URLs into Company URLs (one per line, full URLs or bare domains).
- Pick the Target departments for the contact hunt (multi-select).
- 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. - Set the Qualification threshold — companies at or above pass to enrichment.
- 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.
- Start the Run. Watch the Storages tab — three datasets appear as the Run progresses.
Input
| Field | Type | Notes |
|---|---|---|
companyUrls | array of strings, required | Full URLs or bare domains. |
targetDepartments | array of enum | 14 department options mirroring vdrmota/contact-info-scraper. Default [marketing, sales]. |
maxLeadsPerCompany | integer | Cap on contacts discovered per qualified company. Cost multiplier. Default 3. |
useScalelistFallback | boolean | Retry name-only leads via Scalelist. Default true. |
techScoringRules | array of {tech, weight} | Empty ⇒ skip BuiltWith. |
contentScoringRules | array of {question, weight} | Empty ⇒ skip WCC + LLM. Each question is yes/no; weight added on yes. |
qualificationThreshold | number | Threshold at or above which a company is enriched. Default 0. |
llmModel | string | OpenRouter 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)
| Column | Type | Meaning |
|---|---|---|
company_url | link | Normalized https://<domain> for the company. |
first_name, last_name, title, email, linkedin | text | Contact fields. |
email_source | text | contact-info-scraper, scalelist-fallback, or blank. |
score, tech_score, content_score | number | null for skipped sources. |
detected_tech | array | Technologies BuiltWith detected. |
Pricing / cost estimation
The parent Actor itself is thin — cost is dominated by the sub-Actors.
| Cost driver | Rough 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_suitealongside 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.
