# Lead Enricher & ICP Scorer (`gangary/lead-enricher-icp`) Actor

Recebe uma lista crua de leads e devolve normalizada, deduplicada, com email e site verificados, telefone BR em E.164 e score ICP 0-100 configuravel.

- **URL**: https://apify.com/gangary/lead-enricher-icp.md
- **Developed by:** [Gangary](https://apify.com/gangary) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 per enriched leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Lead Enricher & ICP Scorer

Send a raw list of leads — get it back **clean, verified, deduplicated and scored**. Built for teams that already have leads (scraping, spreadsheets, CRM exports, event lists) and need to know **which ones are worth contacting** — without scraping anything, just qualifying what you already have.

![Cover](https://empresas-por-cnae.vercel.app/covers/lead-enricher-icp.png)

**No scraping. No login. No API keys.** The Actor only processes the data you send it.

### What it does with every lead

1. **Normalizes the company name** — strips legal suffixes (LTDA, ME, S.A., Inc.), fixes casing
2. **Verifies the email domain** — real DNS MX lookup: does this domain actually receive email?
3. **Checks the website** — is it alive and responding?
4. **Formats the phone number** — Brazilian numbers normalized to E.164 with the 9th digit applied
5. **Deduplicates** — repeated email/phone/company across the list gets flagged (and not charged)
6. **Scores 0–100 against your ICP** — configurable weights, so the score reflects *your* ideal customer

### Input example

```json
{
  "leads": [
    { "company": "Empresa X LTDA", "email": "contato@empresax.com.br", "site": "empresax.com.br", "phone": "(11) 98765-4321" },
    { "company": "Padaria do Zé ME", "phone": "11 91234-5678" }
  ]
}
```

Every field is optional per lead — the Actor works with whatever you have and never crashes on messy input (numbers where strings should be, missing fields, garbage rows).

### Output example

```json
{
  "input": { "company": "Empresa X LTDA", "email": "contato@empresax.com.br", "site": "empresax.com.br", "phone": "(11) 98765-4321" },
  "company_normalized": "Empresa X",
  "email":  { "value": "contato@empresax.com.br", "status": "valid", "domain": "empresax.com.br" },
  "site":   { "value": "https://empresax.com.br/", "alive": true, "status": 200 },
  "phone":  { "value": "(11) 98765-4321", "e164": "+5511987654321", "valid": true, "type": "mobile" },
  "signals": { "has_corp_email": true, "has_live_site": true, "has_valid_phone": true, "size_signal": 0 },
  "score_icp": 85,
  "is_duplicate": false
}
```

### Output fields

| Field | Type | Description |
|---|---|---|
| `company_normalized` | string | null | Clean company name (legal suffixes removed, title case). |
| `email.status` | `valid` | `invalid` | `unknown` | Domain-level verification via MX records. `unknown` = DNS unavailable (neither confirms nor denies). |
| `site.alive` | boolean | Website responded with 2xx. |
| `phone.e164` | string | null | Brazilian phone in E.164 format, 9th digit applied. |
| `score_icp` | number | 0–100. Weights configurable via input. |
| `is_duplicate` | boolean | Flagged when the lead repeats another lead's email/phone/company. |

### Use cases

- **Clean a scraped list before outreach** — drop dead domains and broken numbers before your SDRs waste time
- **Score inbound leads against your ICP** — route the 80+ to sales, nurture the rest
- **Dedupe merged lists** — combine sources without contacting the same company twice
- **Refresh an old CRM export** — sites die and domains lapse; re-verify before a reactivation campaign

### Pricing (Pay per event)

| Event | When | Price |
|---|---|---|
| `actor-start` | once per run | $0.01 |
| `lead-enriched` | once per **unique** lead enriched | $0.02 |

**Duplicates are flagged but never charged.** A 1,000-lead list with 100 duplicates costs $0.01 + 900 × $0.02 = **$18.01**.

### Is this compliant?

Yes — the Actor **scrapes nothing**. It only processes data **you** provide: normalizes text, performs a public DNS MX lookup, sends one HTTP request to check the site is alive, and computes a score. No logins, no third-party data collection.

### Limitations

- Email verification is **domain-level** (does the domain receive mail?), not mailbox-level — confirming an individual inbox would require an SMTP probe, which is outside this version. `valid` means the domain has working MX records.
- Phone normalization targets **Brazilian numbers** (E.164 `+55`). Other countries pass through unmodified.
- `size_signal` (company size) is not populated in this version.

### From the same maker

- **[Brazilian Companies Finder (CNPJ Discovery)](https://apify.com/gangary/cnpj-discovery)** — search 27.8M active Brazilian companies by CNAE activity + state and build a fresh prospecting list from the official registry.
- **[CNPJ Lookup — Brazilian Company Registry Data](https://apify.com/gangary/cnpj-lookup)** — official registry data per CNPJ: legal name, status, activity, partners, capital.
- **[B2B Leads Brazil — Find, Enrich & Score in One Run](https://apify.com/gangary/b2b-leads-brazil)** — don't have a list to score yet? This one discovers Brazilian companies by activity + state, pulls their contact data and applies this Actor's scoring, all in a single run.

**Full pipeline:** Discovery finds the companies → Lookup pulls the official record → this Actor verifies, dedupes and scores what's worth contacting. **Want all three in one step?** [B2B Leads Brazil](https://apify.com/gangary/b2b-leads-brazil) runs the whole funnel and returns the finished list.

# Actor input Schema

## `leads` (type: `array`):

Lista de leads a enriquecer. Campos aceitos por item: name, company, email, site, phone, uf.

## `weights` (type: `object`):

Calibra o peso de cada sinal no score. Chaves: corp\_email, live\_site, valid\_phone, size. Default: 35/30/20/15.

## Actor input object example

```json
{
  "leads": [
    {
      "company": "Empresa X LTDA",
      "email": "contato@empresax.com.br",
      "site": "empresax.com.br",
      "phone": "(11) 98765-4321"
    }
  ],
  "weights": {}
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "leads": [
        {
            "company": "Empresa X LTDA",
            "email": "contato@empresax.com.br",
            "site": "empresax.com.br",
            "phone": "(11) 98765-4321"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gangary/lead-enricher-icp").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "leads": [{
            "company": "Empresa X LTDA",
            "email": "contato@empresax.com.br",
            "site": "empresax.com.br",
            "phone": "(11) 98765-4321",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("gangary/lead-enricher-icp").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "leads": [
    {
      "company": "Empresa X LTDA",
      "email": "contato@empresax.com.br",
      "site": "empresax.com.br",
      "phone": "(11) 98765-4321"
    }
  ]
}' |
apify call gangary/lead-enricher-icp --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=gangary/lead-enricher-icp",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/C5wxx0woSpUvkfPkA/builds/f14DhbswUkg2POuMR/openapi.json
