Mexico Company Data — DENUE Business Directory (5M+)
Pricing
from $4.00 / 1,000 results
Mexico Company Data — DENUE Business Directory (5M+)
Search ~5M Mexican businesses from INEGI's official DENUE directory by keyword, location or activity. Name, economic activity, size band, full address, geo-coordinates + phone/email/website. Official open data — commercial reuse permitted. No API key needed.
Pricing
from $4.00 / 1,000 results
Rating
0.0
(0)
Developer
Berkan Kaplan
Maintained by CommunityActor stats
0
Bookmarked
12
Total users
9
Monthly active users
9 days ago
Last modified
Categories
Share
Mexico Company Data — DENUE Business Directory (5M+)
Need real, geo-located B2B data for the Mexican market — not a scraped directory that breaks next week? This Actor turns DENUE — INEGI's official Directorio Estadístico Nacional de Unidades Económicas — into ready-to-use records: ~5 million business establishments with name, economic activity, size band, full address, exact geo-coordinates, and self-reported phone / email / website.
Built on INEGI's official REST API — no scraping, no fragile HTML, no API key to set up (a working token is built in). Data is released under INEGI's Términos de Libre Uso, which explicitly permit commercial reuse (attribution: Fuente: INEGI).
- 🇲🇽 ~5M establishments — DENUE's whole national directory, not a sample
- 📍 Exact geo-coordinates on every record — map, cluster or radius-search out of the box
- 📇 Self-reported contact — phone / email / website; ~62% have at least one (measured)
- ⚡ Official REST API, built-in token — no scraping, no key setup, one clean flat dataset (JSON / CSV / Excel / API)
Quick start (API)
Get 100 pharmacies in Jalisco that list contact info, in one call:
curl -X POST "https://api.apify.com/v2/acts/foxlabs~mexico-denue-company-data/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{ "keywords": ["farmacia"], "states": ["Jalisco"], "onlyWithContact": true, "maxResults": 100 }'
Prefer no code? Open the Input tab, set your filters, and click Start — then download the results.
What you get
One clean, flat record per establishment:
| Field | Type | Description |
|---|---|---|
name | string | Establishment / business name |
legalName | string | Razón social (legal entity name), where reported |
id / clee | string | INEGI establishment id + CLEE unique-establishment key |
activity | string | Economic activity — SCIAN class (e.g. Restaurantes con servicio de preparación de alimentos) |
sizeBand | string | Employee size stratum (e.g. 11 a 30 personas) |
establishmentType | string | Fixed / semi-fixed / mobile (Fijo / Semifijo / Móvil) |
street / exteriorNumber / interiorNumber | string | Street address parts |
neighborhood / postalCode | string | Colonia + CP (postal code) |
municipality / state | string | Municipality + state |
fullAddress | string | Ready-to-use single-line address |
latitude / longitude | number | Exact geo-coordinates |
phone / email / website | string | Self-reported contact (conservatively normalised; malformed values dropped) |
hasContact / contactMethods[] | bool / array | Contact presence + which channels are populated |
source / sourceUrl / license | string | Provenance: INEGI, a deep link that opens this establishment on INEGI's interactive DENUE map, licence string |
scrapedAt | string | ISO timestamp of the run |
Missing values come back as null, never a guess.
sourceUrl opens that exact establishment on INEGI's interactive DENUE map (default.aspx?idee=<id>). The map is a JavaScript application, so open it in a browser — fetching the URL with curl returns the map shell, not the record.
Sample output
A real record from a live run (keywords: ["restaurante"], states: ["Ciudad de México"]), unedited:
{"id": "1014897","clee": "09003722219012102000000000U8","name": "100 MONTADITOS","legalName": "FRATELICORP","activity": "Restaurantes con servicio de preparación de alimentos a la carta o de comida corrida","sizeBand": "11 a 30 personas","establishmentType": "Fijo","street": "AVENIDA MIGUEL HIDALGO","exteriorNumber": "306","interiorNumber": null,"neighborhood": "VILLA COYOACÁN","postalCode": "04000","municipality": "Coyoacán","state": "CIUDAD DE MÉXICO","fullAddress": "AVENIDA MIGUEL HIDALGO 306, VILLA COYOACÁN, 04000, Coyoacán, CIUDAD DE MÉXICO, México","latitude": 19.34954372,"longitude": -99.16146372,"phone": "2717407112","email": "coyoacan100montaditos@gmail.com","website": "https://100montaditos.com","hasContact": true,"contactMethods": ["phone", "email", "website"],"source": "INEGI DENUE (Directorio Estadístico Nacional de Unidades Económicas)","sourceUrl": "https://www.inegi.org.mx/app/mapa/denue/default.aspx?idee=1014897","license": "INEGI Términos de Libre Uso — Fuente: INEGI","scrapedAt": "2026-07-27T22:31:31.110Z"}
Example inputs (copy & paste)
// 1) Lead list: pharmacies in Jalisco that list contact info{ "keywords": ["farmacia"], "states": ["Jalisco"], "onlyWithContact": true, "maxResults": 1000 }// 2) Everything around a point (≤ 5 km radius) — e.g. central Mexico City{ "location": { "latitude": 19.4326, "longitude": -99.1332, "radiusMeters": 1000 }, "maxResults": 2000 }// 3) A whole sector by SCIAN — accommodation & food services (72) across two states{ "scianCode": "72", "states": ["Nuevo León", "Jalisco"], "maxResults": 5000 }// 4) Nationwide — hotels across all of Mexico (no states = whole country), contact only{ "keywords": ["hotel"], "onlyWithContact": true, "maxResults": 3000 }// 5) Multi-keyword lead list in one state — hardware & construction suppliers{ "keywords": ["ferretería", "materiales para construcción"], "states": ["Ciudad de México"], "onlyWithContact": true, "maxResults": 1500 }// 6) Browse a broad sector by 2-digit SCIAN — all retail (46) in a state by INEGI code (19 = Nuevo León){ "scianCode": "46", "states": ["19"], "maxResults": 10000 }// 7) Field-sales radius around Guadalajara — reachable prospects only{ "location": { "latitude": 20.6597, "longitude": -103.3496, "radiusMeters": 2000 }, "onlyWithContact": true, "maxResults": 1000 }
Input & filters
There are three ways to search — pick one, or combine a keyword/activity with states:
- Keywords — one or more business terms (Spanish works best):
restaurante,farmacia,hotel,ferretería. Combine with States to scope by region. - States — a Mexican state name or 2-digit INEGI code (
Jalisco,Ciudad de México,19). Leave empty to search the whole country. - Location radius —
{ latitude, longitude, radiusMeters }to pull every business around a point. Radius is capped at 5 km by the source API. - Activity (SCIAN) — a 2-digit SCIAN sector code to browse an entire industry (
72= accommodation & food services,46= retail trade), with or without a keyword; combine with States. Pick one from the dropdown in the Input tab (23 SCIAN 2018 sectors). - Only businesses with contact info — keep only rows that reported at least one of phone / email / website (best for lead lists).
- Max results — 1–100,000.
- INEGI API token (optional) — a working token is built in; paste your own free token for heavy use.
Use cases
- B2B lead generation. You sell POS, delivery or supplies to restaurants. Filter
keywords: ["restaurante"]+ a state +onlyWithContact: true→ a CRM-ready list with phone/email/website and a size band to prioritise larger accounts — no manual list-building. - Local competitor mapping. Opening or benchmarking a store? Run a
locationradius around the site → every competitor in the catchment, each with exact coordinates and size band, ready to plot on a map. - Territory & site selection. Pull a whole
scianCodesector across your target states → measure density and mix of businesses by municipality and colonia to choose where to open. - Field-sales route planning. Query by keyword + state (or a location radius) and use the
latitude/longitudeon every record to cluster prospects by neighbourhood and build efficient visit routes. - Market sizing & research. Browse an entire SCIAN sector nationally → count establishments by state, size band and establishment type to size a market and spot where the players concentrate.
- Franchise & expansion scouting. Filter a category + states, then map where it is already dense versus underserved to guide expansion decisions.
Performance & throughput
Each search hits INEGI's official REST API directly — no proxies, no CAPTCHAs. A location-radius query is a single dense call, so it returns almost instantly. Keyword + state and SCIAN searches page through results in blocks of 1,000, so throughput scales with the size of your pull: a few thousand records complete in a minute or two, and large national pulls stream in steadily until they hit your maxResults. Throughput is bounded only by INEGI's API and your Apify plan; for sustained heavy volume, paste your own free INEGI token.
Integrations
JavaScript (apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('foxlabs/mexico-denue-company-data').call({keywords: ['farmacia'], states: ['Jalisco'], onlyWithContact: true, maxResults: 500,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python (apify-client):
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("foxlabs/mexico-denue-company-data").call(run_input={"keywords": ["farmacia"], "states": ["Jalisco"], "onlyWithContact": True, "maxResults": 500,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["name"], item.get("phone"))
Also works with Make / n8n / Zapier (Apify app → run this Actor, map the input), scheduled runs, webhooks, and the Apify MCP server for AI agents.
Data quality (measured, not promised)
Live-measured on a 1,799-establishment sample across Mexico City, Guadalajara, Monterrey and Cancún:
| Field group | Fill rate |
|---|---|
| Core (name, activity, size band, full address, geo) | 100% |
| Any contact (phone / email / website) | ~62% |
| Phone · Email · Website | ~38% · ~37% · ~17% |
| Legal name (razón social) | ~42% |
Contact coverage rises with company size — for firms of 11+ employees, email reaches ~70–90% and website ~50–85%. Turn on Only businesses with contact info for lead-ready lists. Contact fields come only from what each business self-reported to INEGI — never fabricated; missing values are null.
Addresses are cleaned, not just copied. INEGI's API leaks a few source artefacts that we repair before shipping (measured on a live 1,000-record Mexico City pull):
| Source artefact | How often | What we ship |
|---|---|---|
Road type repeated inside the street name (AVENIDA + AVENIDA DEL IMÁN) | 2.6% | AVENIDA DEL IMÁN |
OTRO(ESPECIFIQUE) form placeholder used as the road type | 0.5% | dropped — street name only |
NINGUNO / 0 placeholders in street & house-number fields | 2.9% | null, not a fake value |
Postal code missing its leading zero (3810 for 03810) | 4.1% | zero-padded to a valid 5-digit CP |
Where the source itself packs two street names into one field (a real INEGI quirk on some market and corner addresses), we pass it through unchanged rather than guess at a split.
Pricing
Pay per result — you're billed per establishment returned. Only businesses with contact info narrows the set to lead-ready records so you don't pay for rows you can't act on. There's an Apify free tier to evaluate the full feature set before you scale. No proxies or third-party costs — INEGI's API is free.
FAQ
Can I use this data commercially / resell it? Yes — DENUE is published under INEGI's Términos de Libre Uso, which explicitly permit commercial reuse and redistribution with attribution. Every record carries the required Fuente: INEGI string.
Do I need an INEGI API key or account? No. A working token is built in, so the Actor runs out of the box. For heavy, sustained use you can paste your own free token — inegi.org.mx issues one instantly by email.
How fresh is the data? Each run reads live from INEGI's DENUE API, so you get the directory as INEGI currently publishes it. INEGI refreshes DENUE periodically.
What export formats are available? JSON, CSV, Excel, or via the Apify API and integrations.
Does it include company directors, financials or ownership? No. DENUE is a directory of business establishments (locations), not a corporate registry — it does not carry directors, financials or ownership. Those live in other registries.
Why don't all records have a phone or email? Contact is self-reported by each business; about ~62% reported at least one channel and the rest reported none. We normalise contacts and drop obviously-malformed values rather than ship junk — and never fabricate them.
Can I pull a whole industry at once? Yes — pick a 2-digit SCIAN sector code from the dropdown (e.g. 72 for accommodation & food services, 46 for retail trade), optionally scoped to states, to browse an entire sector.
Why is the location radius capped at 5 km? That's a hard limit of INEGI's radius endpoint. For city- or country-scale lists, use keyword or SCIAN search combined with states instead.
How many records can I get in one run? Up to 100,000 via maxResults. A single dense city block can already return thousands.
Is there a rate limit? No key or per-request limit on our side — throughput is bounded by INEGI's API and your Apify plan. Supply your own INEGI token for sustained heavy volume.
Troubleshooting
- 0 results → your keyword may be too specific or a state name misspelled. Use Spanish terms, broaden the keyword, drop
onlyWithContact, or switch to a SCIAN code to browse the whole sector. - Location search returns few rows → the radius is capped at 5 km. To cover a whole city, use keyword or SCIAN + state instead of a point radius.
- A business has no email or phone → about ~38% of establishments reported no contact at all; that's the source, not a miss (the value is
null, never fabricated). - A large pull is slow or stalls → keyword/SCIAN searches page in blocks of 1,000. Lower
maxResults, scope to fewer states, or paste your own free INEGI token to sustain higher volume.
Notes, limits & legal (honest)
- Establishments, not legal entities. DENUE is a directory of business locations; it does not include company directors, financials or ownership (those live in other registries).
legalName(razón social) is present for ~42% of records. - Contact is self-reported. ~62% of businesses list at least one contact method; the rest reported none. Phone/email/website are lightly normalised and obviously-malformed values are dropped rather than shipped — but occasional source typos exist. We never fabricate contact data.
- Radius search is capped at 5 km by the source API; use keyword-or-activity + state for country-scale lists.
sourceUrlis a browser link, not an API. It opens the establishment on INEGI's interactive DENUE map, which renders client-side — acurlof that URL returns the map application, not the record. For machine-readable provenance useidandclee, which are on every row.- Attribution required. Each record carries
Fuente: INEGI; keep the attribution when you redistribute (a condition of the open licence). - Personal data. Some contacts (e.g. sole-trader phone/email) are personal data — use them lawfully, for legitimate B2B, research and marketing in line with applicable law.
- Not affiliated with INEGI or the Mexican government; this Actor redistributes their public open data.
Support
Questions, a field you'd like added, or a custom build? Open the Issues tab on this Actor, or email info@foxlabs.com.tr. We reply fast.
If this Actor saves you time, a ⭐ review really helps.
Changelog
0.2.1 — 2026-07-28
- Fixed a dead
sourceUrl. Every row pointed atdenue/detalle.aspx?id=…, a page INEGI has retired — it redirected to their "Página no encontrada" error page.sourceUrlnow uses the interactive DENUE map's establishment deep link (denue/default.aspx?idee=<id>), verified against live INEGI data to open the exact record on the row. - Cleaner street addresses. Removed a duplicated road-type prefix (
AVENIDA AVENIDA DEL IMÁN→AVENIDA DEL IMÁN, 2.6% of rows), stopped shipping INEGI'sOTRO(ESPECIFIQUE)form placeholder as a road type (0.5%), and turnedNINGUNO/0placeholders in street and house-number fields intonullinstead of fake values (2.9%). - Valid postal codes. INEGI's API returns some CPs without their leading zero (
3810); these are now zero-padded to a valid 5-digit Mexican CP (4.1% of a Mexico City pull).fullAddresspicks up all of the above. - Docs: field table, "Addresses are cleaned" quality table, and a real (not illustrative) sample record.
0.2 — 2026-07-05
- Reworked docs: API quick-start, sample output, integrations, FAQ & troubleshooting.
0.1
- Initial release. Keyword+state, location-radius and SCIAN-activity search over DENUE's ~5M establishments; clean firmographics + address + geo + normalised contact;
onlyWithContactfilter; official INEGI REST API, built-in token.
Part of the foXLabs data platform — official public-data company, contact, ownership, jobs, charity, location & AI-search intelligence scrapers. Browse the full suite at data.foxlabs.com.tr.
