API comunitaria para consultar el Registro Nacional de Contribuyentes (RNC) de la DGII (República Dominicana).
Desarrollado por Boyer Marketing.
Estado: Activo · Versión: 1.0.0 · Licencia: MIT
Esta aplicación ofrece:
-
Un servidor REST en Node.js (Express) para consultar contribuyentes por RNC, nombre o búsqueda avanzada.
-
Una biblioteca que descarga, descomprime y procesa el dataset oficial diariamente desde la DGII, leyendo el TXT interno codificado en Latin-1.
-
Un frontend web (HTML/CSS/JS) con documentación, ejemplos y un demo interactivo.
El proyecto es 100% JavaScript, sin dependencias de Python, e implementa la lógica de descarga/extracción/parseo y búsqueda local sobre ~735 000 registros.
-
API REST completa:
/api/health,/api/dataset,/api/rnc/:id,/api/nombre/:nombre,/api/search -
Descarga y actualización automática del dataset (verifica fecha del archivo y vuelve a descargar si cambió)
-
Extracción de
TMP/DGII_RNC.TXTdesde el ZIP oficial con adm-zip y codificación Latin-1 -
Frontend responsive con navegación lateral, secciones de referencia y demo
-
CORS habilitado, validaciones y manejo centralizado de errores
flowchart LR
A[Cliente Frontend] <--> B[Express API]
B -->|usa| C[Lib RNC]
C -->|descarga| D[(ZIP DGII)]
C -->|extrae TXT| E[(data/DGII_RNC.TXT)]
C -->|parsea| F[(Memoria)]
dgii-rnc-api/
├─ server.js # Servidor Express (+ rutas, CORS, logs, errores)
├─ lib/
│ └─ dgii-rnc.js # Lógica: descarga, extracción TXT, carga y búsqueda
├─ public/
│ └─ index.html # Documentación visual + demo interactivo
├─ data/
│ └─ DGII_RNC.TXT # Generado automáticamente (Latin-1, '|' delimitado)
├─ package.json # Dependencias y scripts (start/dev)
├─ package-lock.json # Versionado exacto de dependencias
├─ README.md # Docs (parciales) existentes
└─ README-API.md # Docs adicionales de API
Requisitos: Node.js 14+, npm o yarn, conexión a Internet para la primera descarga de datos.
# 1) Instala dependencias
npm install
# 2) Desarrollo (con nodemon)
npm run dev # nodemon server.js
# 3) Producción
npm start # node server.js
Acceso rápido:
-
Frontend: http://localhost:3000
-
Health: http://localhost:3000/api/health
PORT=3000
NODE_ENV=development # o production
Por defecto, el servidor usa
PORTo 3000. El modo afecta mensajes de error detallados.
-
start:node server.js -
dev:nodemon server.js
| Paquete | Uso |
| ------------- | ---------------------------- |
| express | Servidor HTTP/REST |
| cors | CORS middleware |
| body-parser | Parseo JSON/URL-encoded |
| adm-zip | Lectura ZIP + extracción TXT |
| nodemon (dev) | Recarga en desarrollo |
-
URL fuente (en la librería):
https://dgii.gov.do/app/WebApps/Consultas/RNC/DGII_RNC.zip -
Ruta interna extraída:
TMP/DGII_RNC.TXT(dentro del ZIP) -
Codificación:
latin1 -
Delimitador:
|(pipe) -
Ubicación local:
data/DGII_RNC.TXT
Flujo:
-
Si
data/DGII_RNC.TXTno existe → descarga el ZIP, extrae el TXT y guarda. -
Si existe, compara la fecha del archivo con la fecha actual (día) → si no coincide, re-descarga.
-
Tras asegurar el TXT, carga a memoria (
this.df) mapeando columnas.
El dataset reporta ~735 000+ registros, de acuerdo con la documentación del proyecto y la UI.
Todas las rutas devuelven JSON y registran peticiones con timestamp. Errores centralizados con códigos HTTP adecuados.
GET /api/health
Respuesta 200:
{
"status":"OK",
"message":"API DGII RNC funcionando correctamente",
"timestamp":"2025-10-30T00:00:00.000Z",
"version":"1.0.0"
}
GET /api/dataset
Respuesta 200:
{
"success": true,
"data": [ /* array de registros */ ],
"count": 735000,
"timestamp": "2025-10-30T00:00:00.000Z"
}
Errores: 500 en caso de fallo de lectura/descarga.
GET /api/rnc/:id
-
Búsqueda exacta por
ID(string, 9–11 dígitos). -
200 si encuentra, 404 si no hay coincidencias.
Respuesta 200:
{
"success": true,
"data": {
"ID":"401007551",
"NOMBRE":"BANCO CENTRAL DE LA REPUBLICA DOMINICANA",
"NOMBRE_COMERCIAL":"BANCO CENTRAL",
"CATEGORIA":"SERVICIOS FINANCIEROS",
"FECHA":"YYYY-MM-DD",
"REGIMEN_PAGO":"X",
"ESTADO":"ACTIVO"
},
"timestamp":"2025-10-30T00:00:00.000Z"
}
Respuesta 404:
{ "success": false, "error": "RNC no encontrado" }
GET /api/nombre/:nombre
-
Filtra por
NOMBREconteniendo el valor suministrado (normalizado a mayúsculas). -
200 con arreglo de coincidencias (puede ser vacío).
Respuesta 200:
{
"success": true,
"data": [ /* coincidencias */ ],
"count": 12,
"timestamp":"2025-10-30T00:00:00.000Z"
}
POST /api/search
Content-Type: application/json
{
"criteria": {
"ID": "401007551",
"NOMBRE": "BANCO CENTRAL",
"NOMBRE_COMERCIAL": "COMERCIAL",
"CATEGORIA": "COMERCIO"
}
}
-
criteriadebe ser un objeto; de lo contrario → 400 con mensaje explicativo. -
Combina filtros:
IDexacto, los demás por contiene (case-insensitive). -
200 con coincidencias. Errores 500 si falla la operación.
Respuesta 400:
{ "success": false, "error": "Se requiere un objeto \"criteria\" con los criterios de búsqueda" }
Los registros mapeados desde el TXT son objetos con campos:
| Campo | Fuente TXT | Descripción |
| ------------------ | ---------- | --------------------------------------- |
| ID | col 0 | Número de RNC |
| NOMBRE | col 1 | Razón social / nombre del contribuyente |
| NOMBRE_COMERCIAL | col 2 | Nombre comercial |
| CATEGORIA | col 3 | Actividad económica |
| FECHA | col 8 | Fecha de registro |
| REGIMEN_PAGO | col 9 | Régimen de pago |
| ESTADO | col 10 | Estado del contribuyente |
El parseo separa por
|y aplicatrim()a cada campo. Codificación de lectura: Latin-1.
El archivo public/index.html provee:
-
Navegación lateral con secciones Inicio, Inicio Rápido, Características, Endpoints, Ejemplos, Demo, Estructura de Datos, Errores, Instalación, Aviso Legal.
-
Bloques de código etiquetados, tablas, alertas de estado, y una demo interactiva.
-
Schema.org (
WebAPI) embebido y diseño con la estética de Boyer Marketing.
-
Primera carga (descarga + parseo): ~30 s (estimado)
-
Búsqueda local: ~<1 s (en memoria, filtros en JS)
-
Tamaño: ~150 MB (TXT descomprimido)
-
RAM: 512 MB mínimo (1 GB recomendado)
El rendimiento depende del hardware y del tamaño real del dataset del día.
-
CORS habilitado (dominios abiertos por defecto)
-
Validación de inputs para endpoints con
criteriay rutas paramétricas -
Manejo consistente de errores y ocultación de mensajes internos en
production
Nota: Esta API es comunitaria y no implementa autenticación por defecto. Si se expone públicamente, agregue API keys, rate limiting y WAF/Reverse Proxy según su contexto.
-
Logging básico: middleware que imprime
timestamp,métodoyruta. -
404 genérico para cualquier ruta inexistente.
-
Error handler global: responde
500con mensaje genérico (o detallado en desarrollo).
Opción A – PM2 (recomendada en VPS/Linux)
npm ci
npm run build # (si aplica en el futuro)
pm2 start server.js --name dgii-rnc-api
pm2 save
pm2 startup
Opción B – Docker (ejemplo de Dockerfile mínimo)
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
ENV NODE_ENV=production
ENV PORT=3000
EXPOSE 3000
CMD ["node", "server.js"]
docker build -t dgii-rnc-api .
docker run --name dgii-rnc -p 3000:3000 dgii-rnc-api
Opción C – Servicio systemd (Linux)
[Unit]
Description=DGII RNC API
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/dgii-rnc-api
ExecStart=/usr/bin/node server.js
Restart=always
Environment=NODE_ENV=production
Environment=PORT=3000
[Install]
WantedBy=multi-user.target
cURL
# Health
curl http://localhost:3000/api/health
# Por RNC
curl http://localhost:3000/api/rnc/401007551
# Por nombre
curl "http://localhost:3000/api/nombre/BANCO%20CENTRAL"
# Búsqueda avanzada
curl -X POST http://localhost:3000/api/search \
-H "Content-Type: application/json" \
-d '{"criteria":{"NOMBRE":"SUPERMERCADOS","CATEGORIA":"COMERCIO"}}'
-
No encuentra el archivo TXT / 500 al buscar
-
Verifique conexión a Internet para la primera descarga.
-
Revise permisos del directorio
data/. -
Chequee logs de servidor para códigos HTTP de la descarga.
-
Resultados vacíos al buscar por nombre
-
Recuerde que el filtro es por contiene (case-insensitive), pero depende del texto exacto en DGII. Pruebe términos más cortos.
-
Memoria alta
-
El dataset se carga en memoria para acelerar búsquedas. Considere aumentar RAM o paginar respuestas a futuro.
-
Autenticación opcional por API Key / Token
-
Rate limiting y caching
-
Paginación en
/api/datasety/api/nombre -
Filtros adicionales (provincia, estado, fechas)
-
CLI de administración y cron interno de actualización
-
Licencia: MIT (ver archivo de licencia del proyecto)
-
Créditos base: Inspirado en el proyecto Python
lcgarc1a/dgii_rnc.
-
package.json / dependencias y scripts
-
package-lock.json / versiones exactas
-
README.md (doc. general existente)
-
README-API.md (doc. de API existente)
-
server.js (rutas, CORS, logs, errores)
-
public/index.html (frontend/documentación/demo)
-
lib/dgii-rnc.js (descarga, extracción, parseo, búsqueda)
📍 Punta Cana, República Dominicana
🌐 www.marketingboyer.com
📞 +1 (829) 250-2341