# Brazil Verified Company Contacts (CNPJ, website, email) (`latsouth/brazil-verified-contacts`) Actor

Brazilian companies (CNPJ) with an HTTP-verified website and a public role e-mail and/or phone read from their own homepage, with source URL and date. Filter by CNAE industry, state, city, size and age. Company data only: no MEI, no CPF, no personal mailboxes.

- **URL**: https://apify.com/latsouth/brazil-verified-contacts.md
- **Developed by:** [LatSouth Data](https://apify.com/latsouth) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 company results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Brazil Verified Company Contacts: CNPJ + live website + the company's own public e-mail and phone

**By [LatSouth](https://latsouth.com).** **115,148 Brazilian companies** (CNPJ) that have an **HTTP-verified website**
**and** publish a **company e-mail and/or phone on their own homepage**. Every contact comes with the page it was read
from and the date it was read. Filter by CNAE industry, state, city, size and opening date; pay only for the rows you get.

This is the shortlist of Brazil's 10.9M active companies that you can actually reach through a channel the company
itself publishes, not the registry contact that is often years old or belongs to the company's accountant.

### Quick facts

| | |
|---|---|
| Rows | 115,148 companies (CNPJ establishments), one row per company |
| With a role e-mail | 81,621 (`require_email`) |
| With a phone | 67,002 (`require_phone`) |
| With both | 33,475 |
| Registry data as of | 2026-10-10 (Receita Federal release published 2026-10-13) |
| Homepages read | 2026-10-22 / 2026-10-23 (`contact_fetched_at` on every row) |
| Phones | Only from the page's visible text and `tel:` links (homepages re-read 2026-10-23) |
| Price | **US$0.01 per company returned: 1,000 companies = US$10**; 10 = US$0.10 |
| Company data only | No MEI / individual entrepreneurs, no CPF, no partners, no personal mailboxes |

### Who it's for

- **Outbound and SDR teams** selling into Brazil who need accounts with a working, company-published channel:
  "software companies in São Paulo with a sales e-mail", "logistics companies in the South with a phone".
- **Agencies and data teams** who would otherwise scrape and clean thousands of Brazilian homepages themselves.
- **Market sizing**: every run reports `total_matching` in `OUTPUT`, even if you pull only 10 rows.

### How it is built

1. **Registry.** Every active Brazilian legal entity from the Receita Federal open CNPJ data (MEI and other
   natural-person legal natures excluded), with English industry labels.
2. **Website verification.** The company's domain (from its registered corporate e-mail) gets a DNS lookup and an
   HTTP GET; it counts only if it answers 2xx/3xx and the page is not parked, for sale, suspended, expired, "under
   construction" or a hosting default page.
3. **Homepage contacts.** The verified homepage is read once (one page; no crawling, no login, no forms) and the
   company's role e-mails, phone numbers and company social pages are extracted.
4. **Company-only rules** (below), then the contact is matched back to its CNPJ.

### Compliance rules (what is never returned)

- **Personal mailboxes**: every word of an output address must be a department or generic word (contato@,
  financeiro.sp@, ola@), so a role plus a name (comercial.rodrigo@...) counts as a person's mailbox and is never output;
  a company whose homepage shows a name.surname@ mailbox is left out of this product altogether.
- **Free-mail addresses** (Gmail, Hotmail, UOL, ...): never output. Only role/generic mailboxes on the company's own
  domain (contato@, vendas@, comercial@, sac@, atendimento@, financeiro@, rh@, ...).
- **Shared or accountant domains**: when a domain is used by several companies or belongs to an accountant, its
  contacts are not this company's, so the company is not returned.
- **Template and agency values**: an e-mail, phone or social link that appears on more than 3 different homepages (a
  web agency's footer, a theme placeholder) is dropped.
- **Phones** must be valid Brazilian numbers (area code + 8-digit landline or 9-digit mobile). Nothing is added or
  rewritten. On a homepage outside `.br`, a phone must also carry an area code of the company's registered state.
  Phones are read only from the page's visible text and `tel:` links (never from scripts or page code); homepages
  not yet re-read with this extractor keep their role e-mail and social pages but return no phone.
- **No natural persons**: no MEI, no CPF (a CPF registered inside a company name is removed), no partner (QSA) data,
  and no owner-named legal form (EIRELI 230-5/231-3, single-member law firm 232-1, whose name is the owner's). Social
  links are company pages only (LinkedIn `/company/`, brand Instagram/Facebook).

You are responsible for lawful use in your jurisdiction (LGPD, anti-spam rules, honouring opt-out requests).

### Input

```json
{
  "cnae_divisions": ["62"],
  "states": ["SP"],
  "require_email": true,
  "max_results": 500
}
```

| Input | What it does |
|---|---|
| `cnae_divisions` | 2-digit CNAE divisions of the main activity (62 = IT services, 47 = retail, 86 = health, ...) |
| `cnae_codes` | 7-digit CNAE subclasses (`6201501` or `6201-5/01`) or shorter prefixes |
| `keyword` | Substring in the English activity label or the legal/trade name |
| `states`, `cities` | UF codes and city names (accents optional). Selecting states makes runs faster |
| `company_size` | `micro`, `small`, `other` (Receita *porte*) |
| `opened_after` | Opening date (YYYY-MM-DD) |
| `require_email` / `require_phone` | Only companies with a role e-mail / a phone on their homepage (default: e-mail **or** phone) |
| `sort_by` | `share_capital_desc` (default), `opening_date_desc`, `opening_date_asc`, `cnpj` |
| `max_results` | Default 1,000 via API (the Console form is prefilled with 10) |

### Output

| Field | Description | Source / date |
|---|---|---|
| `cnpj`, `cnpj_root`, `is_headquarters` | CNPJ of the establishment, its 8-char root, head office flag | Receita, `data_as_of` |
| `legal_name`, `trade_name`, `legal_nature_code`, `legal_nature` | Names and legal form (English label) | Receita, `data_as_of` |
| `company_size`, `share_capital_brl`, `opening_date` | Size class, declared share capital, opening date | Receita, `data_as_of` |
| `cnae_code`, `cnae_label_en`, `cnae_label_pt`, `cnae_division(_en)`, `cnae_section(_en)` | Main activity | Receita, `data_as_of` |
| `state`, `city`, `zip`, `address` | Registered address | Receita, `data_as_of` |
| `website`, `website_checked_at` | Verified site (final URL after redirects) and check time (UTC) | HTTP check |
| `email` | First role e-mail on the homepage | homepage, `contact_fetched_at` |
| `public_role_emails`, `public_phones` | All role e-mails and phones on the homepage (up to 6 phones) | homepage, `contact_fetched_at` |
| `linkedin_url`, `instagram_url`, `facebook_url` | Company social pages linked from the homepage | homepage, `contact_fetched_at` |
| `contact_source`, `contact_source_url`, `contact_fetched_at` | `company_homepage`, the exact page read, and when (UTC) | |
| `data_as_of`, `source` | Receita release date and the attribution line | |

Illustrative row (company and contacts are made up):

```json
{
  "cnpj": "12345678000190",
  "legal_name": "EXEMPLO SISTEMAS LTDA",
  "trade_name": "EXEMPLO TECH",
  "company_size": "small",
  "cnae_code": "6202300",
  "cnae_label_en": "Development and licensing of customizable software",
  "state": "SP",
  "city": "CAMPINAS",
  "website": "https://www.exemplotech.com.br/",
  "website_checked_at": "2026-10-22T14:40:05Z",
  "email": "contato@exemplotech.com.br",
  "public_role_emails": ["contato@exemplotech.com.br", "vendas@exemplotech.com.br"],
  "public_phones": ["+551930000000", "+5519990000000"],
  "linkedin_url": "https://www.linkedin.com/company/exemplotech",
  "contact_source": "company_homepage",
  "contact_source_url": "https://www.exemplotech.com.br/",
  "contact_fetched_at": "2026-10-22T22:41:10Z",
  "data_as_of": "2026-10-10"
}
```

### Coverage

| Segment | Companies |
|---|---:|
| All of Brazil | 115,148 |
| ... with a role e-mail | 81,621 |
| ... with a phone | 67,002 |
| ... with both | 33,475 |
| São Paulo state | 47,902 |
| Software/IT (CNAE division 62) in São Paulo | 2,764 |

Numbers are for the 2026-10-10 registry release and homepages read 2026-10-22/23 (`OUTPUT.total_matching`, measured
2026-10-23). 408,376 verified homepages are in the contact layer; 220,457 were re-read on 2026-10-23 with the
visible-text phone extractor (152,872 show some contact, 113,346 a phone) and the other 187,919 contribute role
e-mails and social pages only. The rules above keep the contacts that are clearly the company's own.

### Pricing

Pay per event: **US$0.01 per company returned** (`company-result`). **1,000 companies = US$10**; 10,000 = US$100.
Platform compute is included. Set a maximum cost per run and the actor stops when it is reached; you only pay for rows
you receive. `OUTPUT.total_matching` tells you the size of a segment before you pull it.

Need the full file, a custom segment or a monthly refresh? <https://latsouth.com/products/> · <https://latsouth.com/pricing/>

### Limitations

- One homepage per company is read; contacts that only appear on a "Contato" subpage are not captured.
- Phone numbers are parsed from the page; on a foreign-language site a non-Brazilian number can occasionally look like
  a valid Brazilian one.
- A role mailbox can still be read by one person; it is the channel the company publishes, not a personal address.
- Branches are separate CNPJs; a branch whose e-mail domain is shared with its head office is left out (shared domain).

### Source and attribution

Company fields: *Fonte: Receita Federal do Brasil, Dados Abertos do CNPJ*, release 2026-10-10, transformed (filtered
to active legal entities, cleaned, English labels added); not an official Receita Federal product. Contact fields: the
company's own public homepage, `contact_source_url`, read on `contact_fetched_at`.

### More from LatSouth

- [Brazil Company Finder](https://apify.com/latsouth/brazil-company-finder): all 10.9M active CNPJs (US$0.003/row),
  with the same public-contact fields as an option.
- [Mexico Company Finder](https://apify.com/latsouth/mexico-company-finder) ·
  [LATAM Company Finder](https://apify.com/latsouth/latam-company-finder)
- Methodology: <https://latsouth.com/methodology/> · Compliance: <https://latsouth.com/compliance/>

Questions, custom extracts or an opt-out request: **hello@latsouth.com**.

# Actor input Schema

## `cnae_divisions` (type: `array`):

Two-digit CNAE divisions of the main activity, e.g. 62 = IT services (software development, IT consulting), 47 = retail trade, 86 = human health. Combined with industry codes using OR.

## `cnae_codes` (type: `array`):

Full 7-digit CNAE subclasses (6201501 or 6201-5/01) or shorter prefixes (4-5 digits = class or group).

## `keyword` (type: `string`):

Case- and accent-insensitive substring searched in the English activity label and in the legal and trade names (e.g. software, clinic, logistica).

## `states` (type: `array`):

Leave empty for all of Brazil. Selecting states makes runs faster.

## `cities` (type: `array`):

City names as in the federal registry, accents optional (e.g. Sao Paulo, Campinas, Belo Horizonte).

## `company_size` (type: `array`):

Leave empty for all sizes.

## `opened_after` (type: `string`):

YYYY-MM-DD

## `require_email` (type: `boolean`):

Keep only companies whose homepage publishes a role/generic company e-mail (contato@, vendas@, comercial@, ...).

## `require_phone` (type: `boolean`):

Keep only companies whose homepage publishes a valid Brazilian phone number.

## `sort_by` (type: `string`):

Order of results. Largest share capital first is a good default for B2B prospecting.

## `max_results` (type: `integer`):

You pay per company returned (US$0.01 each: 1,000 companies = US$10). The run also stops at your spending limit. Default 1,000 when called via API without this field.

## Actor input object example

```json
{
  "cnae_divisions": [
    "62"
  ],
  "states": [
    "SP"
  ],
  "require_email": false,
  "require_phone": false,
  "sort_by": "share_capital_desc",
  "max_results": 10
}
```

# Actor output Schema

## `companies` (type: `string`):

Matching companies with their public contacts, one item per row. Download as JSON, CSV, Excel or XML via the dataset API.

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

Counts, applied filters, registry and homepage dates, and whether the run stopped at the buyer's budget cap.

# 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 = {
    "cnae_divisions": [
        "62"
    ],
    "states": [
        "SP"
    ],
    "max_results": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("latsouth/brazil-verified-contacts").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 = {
    "cnae_divisions": ["62"],
    "states": ["SP"],
    "max_results": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("latsouth/brazil-verified-contacts").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "cnae_divisions": [
    "62"
  ],
  "states": [
    "SP"
  ],
  "max_results": 10
}' |
apify call latsouth/brazil-verified-contacts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,latsouth/brazil-verified-contacts"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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