# Website Email & Contact Finder — Phone, WhatsApp & Socials (`joaosbp/website-contact-finder-br`) Actor

Bulk website email finder and contact scraper for public phones, WhatsApp links, contact pages, forms, and social profiles, optimized for Brazilian B2B lead enrichment.

- **URL**: https://apify.com/joaosbp/website-contact-finder-br.md
- **Developed by:** [João Victor](https://apify.com/joaosbp) (community)
- **Categories:** Lead generation, Automation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Website Email & Contact Finder — Phone, WhatsApp & Socials

**Bulk website email finder and contact scraper for public phones, WhatsApp links, contact pages, forms, and social profiles — optimized for Brazilian B2B lead enrichment.**

Turn a list of company websites into structured contact profiles for prospecting, CRM enrichment, local SEO audits, and agency workflows.

### Verified in production

- 10 Brazilian websites processed in one real remote batch.
- 10 useful Dataset rows and 0 item errors.
- Approximately `$0.000130` platform cost per useful website in HTTP mode without proxy.
- Emails, phones, WhatsApp links, forms, contact pages, and social profiles supported.
- Real regression fixed: truncated email suffixes are removed while the complete address is preserved.

> Cost evidence applies to HTTP mode without proxy. Browser rendering and proxies can materially increase cost.

### At a glance

| Capability | Output |
|---|---|
| Emails | `emails[]`, `hasEmail` |
| Phones | `phones[]`, normalized digits, source |
| WhatsApp | `whatsAppLinks[]`, number, source, pre-filled message |
| Contact pages | `/contato`, support/help/contact URLs |
| Forms | form action, method, field names |
| Social profiles | Instagram, LinkedIn, Facebook, YouTube, TikTok, X |
| Lead quality | `contactScore` 0-100 + `contactCompleteness` |

### Best for

- Brazilian B2B sales agencies
- SDR and outbound prospecting teams
- Local marketing and SEO agencies
- CRM enrichment builders
- SaaS founders selling to SMBs
- Automation builders using Make, n8n, Zapier

### What this Actor does

1. Accepts public website URLs.
2. Fetches pages with cheap HTTP-first defaults.
3. Extracts public contact channels.
4. Filters common false positives like Sentry/error-reporting emails and noisy numeric IDs.
5. Scores contact completeness from `NONE` to `HIGH`.
6. Writes clean JSON rows to an Apify Dataset.

### Example input

```json
{
  "startUrls": [
    { "url": "https://www.rdstation.com" },
    { "url": "https://portaldascorridas.com.br" }
  ],
  "maxItems": 10,
  "useBrowser": false
}
````

### Example output

```json
{
  "url": "https://portaldascorridas.com.br",
  "emails": ["contato@portaldascorridas.com.br"],
  "phones": [],
  "whatsAppLinks": [
    {
      "number": "5535987127477",
      "source": "wa.me",
      "url": "https://wa.me/5535987127477",
      "confidence": "HIGH"
    }
  ],
  "socialProfiles": [
    { "platform": "instagram", "url": "https://www.instagram.com/portaldascorridas" }
  ],
  "hasEmail": true,
  "hasPhone": false,
  "hasWhatsApp": true,
  "contactScore": 60,
  "contactCompleteness": "MEDIUM"
}
```

### Buyer workflows

```text
Website list → Website Contact Finder → Dataset/CSV → CRM
CNPJ/domain list → Website Contact Finder → n8n or Make → sales pipeline
Agency audit → contact completeness score → outreach prioritization
```

A **successful row** means the website was processed without a request error. `usefulProfiles` in the run summary is narrower: it counts successful rows with at least one actionable contact signal (`contactScore > 0`). Empty contact fields are not automatically request failures; inspect `error`, `successful`, and the HTTP result.

The `OUTPUT` run summary includes:

```json
{
  "processed": 10,
  "successful": 9,
  "usefulProfiles": 7,
  "emailsFound": 8,
  "phonesFound": 6,
  "whatsAppLinksFound": 3,
  "contactPagesFound": 5,
  "formsFound": 4,
  "socialProfilesFound": 12,
  "failed": 1
}
```

Channel counters report total occurrences across successful profiles, not only the number of websites containing each channel.

### Optional contact-page discovery

Enable `followContactPages` to fetch same-origin contact/support links discovered on each primary page. `maxSecondaryPages` is a strict per-domain budget from 0 to 5 (default 2). Contacts are merged into the primary Dataset row and deduplicated; secondary-page failures are reported without failing an otherwise valid primary profile.

The feature is disabled by default because every secondary page adds crawling cost. Inspect `secondaryPagesScanned`, `secondaryPageErrors`, and `secondaryPageUrls` to measure the gain.

### Use cases

- Enrich CRM leads from website URLs.
- Audit whether local business websites expose contact channels.
- Build prospecting lists with emails, WhatsApp, forms, and social profiles.
- Score company websites by contact completeness.
- Feed clean contact data into Sheets, Make, n8n, Zapier, CRMs, or BI tools.

### Safety and limitations

- Uses public website data only.
- Does **not** log in, bypass protections, send WhatsApp messages, or scrape private conversations.
- Phone extraction is conservative to reduce false positives.
- JavaScript-heavy contact widgets may require `useBrowser: true`, which costs more.

### API usage

Run through Apify API, CLI, Tasks, Schedules, webhooks, Make, n8n, Zapier, or your own backend.

### Support and feedback

Run 5–20 websites first. If a public contact channel is missing or incorrectly extracted, send the run ID and target URL through the Apify support tab so the parser can be improved. Do not include private credentials, cookies, or personal data in support requests.

# Actor input Schema

## `startUrls` (type: `array`):

Public business website URLs to scan for contact channels.

## `maxItems` (type: `integer`):

Maximum number of websites processed in one run.

## `maxConcurrency` (type: `integer`):

Number of websites processed concurrently. Use a lower value with browser rendering.

## `useBrowser` (type: `boolean`):

Use Playwright for JavaScript-heavy websites. Keep disabled for faster and cheaper HTTP processing.

## `followContactPages` (type: `boolean`):

Follow same-domain contact/support links discovered on each homepage and merge their contact channels into one result.

## `maxSecondaryPages` (type: `integer`):

Strict per-domain budget for discovered contact pages. Only used when contact-page following is enabled.

## `maxRetries` (type: `integer`):

Retry attempts for transient network, timeout, 429, or server errors.

## `requestTimeoutSecs` (type: `integer`):

Maximum time to wait for each website request or browser navigation.

## `maxContentBytes` (type: `integer`):

Maximum bytes read from each website to protect memory and control cost.

## `proxy` (type: `object`):

Optional Apify Proxy configuration. Most public business websites do not require a proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://portaldascorridas.com.br"
    },
    {
      "url": "https://www.apify.com"
    }
  ],
  "maxItems": 10,
  "maxConcurrency": 3,
  "useBrowser": false,
  "followContactPages": false,
  "maxSecondaryPages": 2,
  "maxRetries": 2,
  "requestTimeoutSecs": 20,
  "maxContentBytes": 2000000,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Structured website contact profiles.

## `summary` (type: `string`):

Counts of processed, emitted, successful, useful profiles, channel occurrences, secondary-page discovery, change states, and failed pages.

# 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 = {
    "startUrls": [
        {
            "url": "https://portaldascorridas.com.br"
        },
        {
            "url": "https://www.apify.com"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("joaosbp/website-contact-finder-br").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 = { "startUrls": [
        { "url": "https://portaldascorridas.com.br" },
        { "url": "https://www.apify.com" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("joaosbp/website-contact-finder-br").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 '{
  "startUrls": [
    {
      "url": "https://portaldascorridas.com.br"
    },
    {
      "url": "https://www.apify.com"
    }
  ]
}' |
apify call joaosbp/website-contact-finder-br --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=joaosbp/website-contact-finder-br",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Email & Contact Finder — Phone, WhatsApp & Socials",
        "description": "Bulk website email finder and contact scraper for public phones, WhatsApp links, contact pages, forms, and social profiles, optimized for Brazilian B2B lead enrichment.",
        "version": "0.1",
        "x-build-id": "Dh2XrKAbBz83W9wbY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/joaosbp~website-contact-finder-br/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-joaosbp-website-contact-finder-br",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/joaosbp~website-contact-finder-br/runs": {
            "post": {
                "operationId": "runs-sync-joaosbp-website-contact-finder-br",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/joaosbp~website-contact-finder-br/run-sync": {
            "post": {
                "operationId": "run-sync-joaosbp-website-contact-finder-br",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Business websites",
                        "type": "array",
                        "description": "Public business website URLs to scan for contact channels.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Maximum websites",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of websites processed in one run.",
                        "default": 10
                    },
                    "maxConcurrency": {
                        "title": "Concurrent websites",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of websites processed concurrently. Use a lower value with browser rendering.",
                        "default": 3
                    },
                    "useBrowser": {
                        "title": "Render JavaScript pages",
                        "type": "boolean",
                        "description": "Use Playwright for JavaScript-heavy websites. Keep disabled for faster and cheaper HTTP processing.",
                        "default": false
                    },
                    "followContactPages": {
                        "title": "Follow contact pages",
                        "type": "boolean",
                        "description": "Follow same-domain contact/support links discovered on each homepage and merge their contact channels into one result.",
                        "default": false
                    },
                    "maxSecondaryPages": {
                        "title": "Maximum secondary pages per website",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Strict per-domain budget for discovered contact pages. Only used when contact-page following is enabled.",
                        "default": 2
                    },
                    "maxRetries": {
                        "title": "Maximum retries",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Retry attempts for transient network, timeout, 429, or server errors.",
                        "default": 2
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout seconds",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Maximum time to wait for each website request or browser navigation.",
                        "default": 20
                    },
                    "maxContentBytes": {
                        "title": "Maximum response size",
                        "minimum": 50000,
                        "maximum": 5000000,
                        "type": "integer",
                        "description": "Maximum bytes read from each website to protect memory and control cost.",
                        "default": 2000000
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy configuration. Most public business websites do not require a proxy.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
