# Mexico Company Finder (DENUE, legal entities, English labels) (`latsouth/mexico-company-finder`) Actor

Search 846k Mexican legal entities from INEGI DENUE by SCIAN industry, state, municipality and employee size. English labels, +52 phones, websites and corporate e-mails. Public sector and natural persons filtered out. Fuente: INEGI.

- **URL**: https://apify.com/latsouth/mexico-company-finder.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

$3.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

## Mexico Company Finder: DENUE B2B database of Mexican companies, in English

**By [LatSouth](https://latsouth.com).** Search **846,778 Mexican legal entities** (private sector, DENUE edition
05/2026) from **INEGI's DENUE**, the national business directory, by industry, state, municipality and employee size.
Get clean records with **English industry labels**, normalized **+52 phones**, **websites** and **corporate e-mails**.
Legal entities only, public sector filtered out, personal contacts never returned. No DENUE token, no bulk download,
no Spanish codebook. Country overview and coverage: <https://latsouth.com/data/mexico/>.

*Fuente: INEGI, Directorio Estadístico Nacional de Unidades Económicas (DENUE) 05/2026.* Data transformed
(cleaned, normalized, English labels added); this is not an official INEGI product. Terms:
<https://www.inegi.org.mx/inegi/terminos.html>.

### Quick facts

| | |
|---|---|
| Rows | 846,778 establishments of private legal entities (449,124 distinct legal names) out of 6,138,075 in DENUE |
| Data as of | 2026-05-20 (DENUE 05/2026; INEGI refreshes roughly yearly) |
| Price | US$0.003 per company returned: **1,000 companies = US$3**; 10 = US$0.03 |
| Typical run | 5-15 s for a filtered query of up to a few thousand rows |
| Company data only | No natural persons (*personas físicas*), no personal e-mails or names |

### Who it's for

- **Sales and SDR teams** entering Mexico: "IT consultancies in Mexico City with 11+ employees and a
  website", "food manufacturers in Jalisco and Nuevo León".
- **Market sizing / TAM**: every run reports `total_matching` (all establishments that match), even if you
  only pull a sample.
- **Enrichment**: start from a SCIAN segment and feed the list to your enrichment waterfall or CRM.

### What makes it B2B

DENUE lists ~6.1 million establishments, and most of them are corner shops run by natural persons. This
actor turns it into a company list:

| | DENUE as published | This actor |
|---|---|---|
| Who | Every establishment, ~79% of them natural persons (no legal name) | **Legal entities only**, always (no switch: company data only) |
| Public sector | Mixed in (schools, offices, hospitals) | **Excluded** by default (`exclude_public_sector`) |
| Industry | SCIAN code + Spanish label | Spanish class label + **English** subsector and sector labels |
| Size | Text bracket ("11 a 30 personas") | Bracket filter + `min_employees` + numeric bounds |
| Phone | Free text | `+52` + 10 digits, junk dropped |
| E-mail | Free text, typos, Gmail/Hotmail/Prodigy | Validated, lower-cased; freemail/ISP never used as a website |
| Website | Free text (`WWW.X.COM`, Facebook pages) | `https://` URL; social pages split into `social_url`; `website_guess` from corporate e-mail domain |
| Branches | One row per establishment | Optional `one_per_company` (largest establishment per legal name) |

### Website filter

| Filter | Keeps an establishment when |
|---|---|
| none (default) | always; web fields may be empty |
| `only_with_website` | it has a **`website`** declared to INEGI **or** a **`website_guess`** (the domain of its corporate e-mail) |

Neither field is checked over HTTP in this actor (there is no "verified website" filter for Mexico yet), so a site may
be dead or parked. Free-mail, ISP, hosting, social-network and placeholder domains (gmail.com, prodigy.net.mx,
contacto.com, wix.com, …) never count as a website: they are blanked in `website`, `website_domain`, `website_guess`
and `email_domain` at output time. Social pages are in `social_url`.

### Input examples

**1. Professional services firms in Mexico City with an e-mail (the prefilled example)** (sector 54 = legal,
accounting, engineering, IT consulting, marketing…)

```json
{
  "scian_sectors": ["54"],
  "states": ["09"],
  "only_with_email": true,
  "max_results": 500
}
```

**2. Software and IT services (SCIAN 5415 + 5182) with 11+ employees and a website, one row per company**

```json
{
  "scian_codes": ["5415", "5182"],
  "min_employees": 11,
  "only_with_website": true,
  "one_per_company": true
}
```

**3. Plastics manufacturers in Nuevo León and Jalisco added to DENUE since 2024**

```json
{
  "scian_sectors": ["31-33"],
  "states": ["NLE", "Jalisco"],
  "keyword": "plastic",
  "registered_after": "2024-01-01",
  "sort_by": "registration_date_desc"
}
```

| Input | What it does |
|---|---|
| `scian_sectors` | SCIAN 2-digit sectors (`54`, `31-33`, `48-49`…; `31`/`32`/`33` also accepted) |
| `scian_codes` | 6-digit SCIAN classes or 3-5 digit prefixes |
| `keyword` | Substring in the English/Spanish activity label or the legal/trade name |
| `states` | `01`-`32`, ISO codes (`CMX`, `JAL`, `NLE`, `MX-CMX`) or names (`Ciudad de México`, `CDMX`). Selecting states makes runs faster |
| `municipalities` | Municipality / alcaldía names, accents optional |
| `size_brackets` | `0-5`, `6-10`, `11-30`, `31-50`, `51-100`, `101-250`, `251+` |
| `min_employees` | Whole bracket at or above N |
| `exclude_public_sector` | Default **true** |
| `only_with_website` | See "Website filter" above |
| `only_with_email`, `only_with_phone` | Contact completeness |
| `registered_after` | Month the establishment entered DENUE |
| `one_per_company` | Keep the largest establishment per legal name |
| `sort_by` | `size_desc` (default), `registration_date_desc`, `registration_date_asc`, `denue_id` |
| `max_results` | Default 1,000 via API (the Console form is prefilled with 10) |

### Output fields

| Field | Description |
|---|---|
| `denue_id`, `clee` | INEGI establishment id and CLEE key (RFC is not published by DENUE) |
| `legal_name`, `trade_name` | Razón social (INEGI usually strips "S.A. de C.V.") and establishment name |
| `is_legal_entity`, `legal_entity_basis` | Always `true`; which rule confirmed it is a company |
| `is_public_sector` | `false` unless you turn `exclude_public_sector` off |
| `scian_code`, `scian_label_es`, `scian_label_en` | SCIAN 2023 class, official Spanish label, English subsector label |
| `scian_sector`, `scian_subsector` (+ `_label_en`) | Sector and subsector codes with English labels |
| `size_bracket`, `size_bracket_en`, `employees_min`, `employees_max` | INEGI personnel bracket, as text and numbers |
| `establishment_type` | Fixed, semi-fixed, … |
| `state`, `state_iso`, `state_name`, `municipality_code`, `municipality`, `locality`, `address`, `zip`, `latitude`, `longitude` | Location |
| `phone`, `email` | Establishment contact (`+52` + 10 digits; e-mail validated, lower-cased) |
| `email_domain` | Domain of that e-mail; null for free-mail/ISP/placeholder domains |
| `website`, `website_domain`, `social_url` | Site declared to INEGI, its domain, social page |
| `website_guess` | `https://` + corporate e-mail domain, unchecked |
| `registration_date` | Month the establishment entered DENUE |
| `data_as_of`, `source` | Edition date and the INEGI credit line |

Illustrative row. The company, names and contacts below are made up.

```json
{
  "denue_id": 1234567,
  "clee": "09016541510000011000000000U0",
  "legal_name": "EJEMPLO SOLUCIONES DIGITALES",
  "trade_name": "EJEMPLO TECH",
  "is_legal_entity": true,
  "legal_entity_basis": "registered_legal_name",
  "is_public_sector": false,
  "scian_code": "541510",
  "scian_label_es": "Servicios de diseño de sistemas de cómputo y servicios relacionados",
  "scian_label_en": "Professional, Scientific, and Technical Services",
  "scian_sector": "54",
  "scian_sector_label_en": "Professional, Scientific, and Technical Services",
  "scian_subsector": "541",
  "scian_subsector_label_en": "Professional, Scientific, and Technical Services",
  "size_bracket": "11 a 30 personas",
  "size_bracket_en": "11-30",
  "employees_min": 11,
  "employees_max": 30,
  "establishment_type": "fixed",
  "state": "09",
  "state_iso": "MX-CMX",
  "state_name": "Ciudad de México",
  "municipality_code": "09016",
  "municipality": "Miguel Hidalgo",
  "locality": "Miguel Hidalgo",
  "address": "CALLE EJEMPLO 100 INT 5, COLONIA GRANADA",
  "zip": "11520",
  "latitude": 19.4401,
  "longitude": -99.2001,
  "phone": "+525500000000",
  "email": "contacto@ejemplotech.mx",
  "email_domain": "ejemplotech.mx",
  "website": "https://www.ejemplotech.mx",
  "website_domain": "ejemplotech.mx",
  "social_url": null,
  "website_guess": "https://ejemplotech.mx",
  "registration_date": "2019-11-01",
  "data_as_of": "2026-05-20",
  "source": "Fuente: INEGI, Directorio Estadistico Nacional de Unidades Economicas (DENUE) 05/2026, actualizado 2026-05-20. Datos transformados (limpieza, normalizacion, etiquetas en ingles); no es un producto oficial del INEGI."
}
```

The run's key-value store `OUTPUT` record holds `total_matching`, `pushed`, and whether the run stopped
at your spending limit.

### Coverage (DENUE 05/2026)

| Universe | Establishments |
|---|---:|
| All DENUE establishments | 6,138,075 |
| Legal entities, private sector (default) | 846,778 |
| … distinct companies (`one_per_company`) | 449,124 |
| … with 6+ employees | 369,677 |
| … with an e-mail | 411,683 |
| … with a website or website guess | 358,667 |
| Professional services (54) in Mexico City with an e-mail | 3,671 |
| Software/IT (5415, 5182), 11+ employees, with website, one per company | 880 |

### Field notes

- **Legal entities.** INEGI publishes the legal name (*razón social*) only for legal entities and usually
  strips the corporate suffix (S.A. de C.V., S. de R.L., …). `is_legal_entity` is true when the name carries a
  legal form, or when a legal name is present and doesn't look like a person's name or a placeholder.
  `legal_entity_basis` says which rule fired (every output row carries it). Rows with a person-like name are
  treated as uncertain and never returned.
- **`website`** is what the establishment declared to INEGI. **`website_guess`** is `https://` plus the
  corporate e-mail domain; free-mail, Mexican ISP (Prodigy/Telmex, Axtel, izzi, Megacable…), placeholder
  (contacto.com, correo.com.mx, …) and typo domains are never used. Neither is verified by an HTTP request, so check
  before using at scale.
- **`scian_label_en`** is the English label of the 3-digit subsector; `scian_label_es` is INEGI's official
  6-digit class label. SCIAN is Mexico's NAICS; codes are SCIAN 2023.
- **`registration_date`** is the month the establishment entered DENUE, not its incorporation date.
- **Rows are establishments.** A chain appears once per branch; use `one_per_company` to collapse.

### Limitations

- **Rows are establishments**, not companies: a retail chain has one row per store. `one_per_company` collapses by
  legal name (exact match).
- About 3% of the legal names that pass the legal-entity rules may still be a person's business; INEGI removes the
  corporate suffix, so this can't be fully separated.
- No RFC (tax id) in DENUE. No revenue; size is the INEGI personnel bracket of the establishment.
- DENUE is refreshed roughly once a year; some contacts are older than the edition date.
- Websites are not HTTP-verified in this actor.

### Data freshness

DENUE edition **05/2026** (published 2026-05-20; Sinaloa corrected 2026-07-01). INEGI refreshes DENUE
roughly yearly, mostly for large establishments. Every row carries `data_as_of` and `source`; the run log and
the `OUTPUT` record also show the `data_as_of` of the release that was queried.

### Privacy

Company data only. Establishments of natural persons (*personas físicas*) and rows that are not a confirmed
legal entity are never returned, and there is no input to change that (`legal_entities_only: false` is rejected
with an error). You are responsible for using the data lawfully (LFPDPPP, anti-spam rules,
opt-out requests).

### Pricing

Pay per event:

| Event | When it's charged | Price |
|---|---|---|
| `company-result` | Once per company row returned in the dataset | **US$0.003** (1,000 companies = US$3) |

The platform compute is included. Set a **maximum cost per run** and the actor stops pushing rows when it's reached;
you only pay for rows you receive. Need the full file, a custom segment or a refresh? See
<https://latsouth.com/products/> and <https://latsouth.com/pricing/>.

### More from LatSouth

- [LATAM Company Finder](https://apify.com/latsouth/latam-company-finder): Mexico plus Brazil, Chile, Colombia, Peru,
  Argentina and Ecuador in one schema (ISIC Rev.4 industries).
- [Brazil Company Finder](https://apify.com/latsouth/brazil-company-finder): 10.9M active CNPJ establishments with
  HTTP-verified websites.
- Methodology: <https://latsouth.com/methodology/> · Compliance: <https://latsouth.com/compliance/>

### FAQ

**Is this the official DENUE?** It is built from INEGI's open bulk download, cleaned and enriched. It is
not an INEGI product and INEGI does not endorse it.

**Why do some big companies have no legal name?** Some establishments are registered by INEGI without
*razón social*. Without it we can't tell a company from a natural person, so those rows are not returned.

**Can I look up an RFC?** DENUE does not publish RFCs.

**Questions, bugs, custom extracts?** hello@latsouth.com, or open an issue on this actor's Issues tab.

# Actor input Schema

## `scian_sectors` (type: `array`):

SCIAN sectors of the establishment's main activity (SCIAN is Mexico's version of NAICS). Combined with industry codes using OR.

## `scian_codes` (type: `array`):

6-digit SCIAN classes (e.g. 541510 = computer systems design services) or shorter prefixes (3 digits = subsector, 4 = industry group, 5 = industry).

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

Case- and accent-insensitive substring searched in the English and Spanish activity labels and in the legal and trade names (e.g. software, logistics, clinica).

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

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

## `municipalities` (type: `array`):

Municipality names as in DENUE, accents optional (e.g. Monterrey, Zapopan, Miguel Hidalgo, Benito Juarez).

## `size_brackets` (type: `array`):

INEGI personnel brackets (personal ocupado) of the establishment. Leave empty for all sizes.

## `min_employees` (type: `integer`):

Keep establishments whose whole size bracket is at or above this number (e.g. 11 keeps 11-30 and larger).

## `exclude_public_sector` (type: `boolean`):

Leave out government offices, public schools and hospitals, and other public-sector establishments.

## `only_with_website` (type: `boolean`):

Keep establishments with a `website` declared to INEGI OR a `website_guess` (the domain of a corporate e-mail, NOT checked over HTTP). Free-mail, ISP and placeholder domains (gmail, prodigy.net.mx, contacto.com, ...) never count. Mexico has no HTTP-verified website filter yet.

## `only_with_email` (type: `boolean`):

Keep only establishments with a syntactically valid e-mail.

## `only_with_phone` (type: `boolean`):

Keep only establishments with a valid +52 phone number.

## `registered_after` (type: `string`):

YYYY-MM-DD. DENUE records the month the establishment entered the directory (a proxy for new businesses).

## `one_per_company` (type: `boolean`):

Collapse branches: keep only the largest establishment of each legal name.

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

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

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

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

## Actor input object example

```json
{
  "scian_sectors": [
    "54"
  ],
  "states": [
    "09"
  ],
  "exclude_public_sector": true,
  "only_with_website": false,
  "only_with_email": false,
  "only_with_phone": false,
  "one_per_company": false,
  "sort_by": "size_desc",
  "max_results": 10
}
```

# Actor output Schema

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

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

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

Counts, applied filters, data_as_of 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 = {
    "scian_sectors": [
        "54"
    ],
    "states": [
        "09"
    ],
    "max_results": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("latsouth/mexico-company-finder").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 = {
    "scian_sectors": ["54"],
    "states": ["09"],
    "max_results": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("latsouth/mexico-company-finder").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 '{
  "scian_sectors": [
    "54"
  ],
  "states": [
    "09"
  ],
  "max_results": 10
}' |
apify call latsouth/mexico-company-finder --silent --output-dataset

```

## MCP server setup

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

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/5gWSsXJb80XjipH3S/builds/7Wvn0g0kWSqM23bJU/openapi.json
