Una API gratuita para consultar el registLa API estará disponible en http://localhost:3000
Esta API puede desplegarse fácilmente en Vercel para uso en producción:
# 1. Conecta tu repositorio con Vercel
# 2. Vercel detectará automáticamente la configuración
# 3. Despliega con un clicVer VERCEL_DEPLOYMENT.md para instrucciones detalladas.
📋 Uso de la API"No Llame" de Uruguay, desarrollada como alternativa libre a nollame.uy.
Esta API permite verificar si un número telefónico uruguayo está registrado en el sistema "No Llame" de URSEC (Unidad Reguladora de Servicios de Comunicaciones). El sistema automatiza el proceso de consulta que normalmente se realiza manualmente a través del portal oficial de trámites de URSEC.
- ✅ Validación automática de números telefónicos uruguayos
- 🤖 Resolución automática de CAPTCHAs usando OCR (Tesseract.js)
- 🔄 Sistema de reintentos inteligente para mayor confiabilidad
- 📱 Normalización automática de formatos de teléfono
- 🆓 Completamente gratuito y de código abierto
- Node.js (versión 18 o superior)
- npm o yarn
git clone <url-del-repositorio>
cd no-llamar-apinpm installCrear un archivo .env en la raíz del proyecto:
NODE_ENV=development
PORT=3000
# Configuración de caché (opcional - ver CACHE_CONFIGURATION.md para detalles)
# MySQL (prioritario)
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=your_password
MYSQL_DATABASE=no_llamar_cache
# MongoDB (alternativo)
MONGODB_URL=mongodb://localhost:27017/no-llamar-cache
# Vercel Blob (fallback)
BLOB_READ_WRITE_TOKEN=your_vercel_blob_token📖 Para configuración detallada del sistema de caché, consulta CACHE_CONFIGURATION.md
npm run build# Modo desarrollo
npm run dev
# Modo producción
npm startLa API estará disponible en http://localhost:3000
GET /api/check/:phoneNumber[?ignoreCache=true]
phoneNumber: Número telefónico uruguayo (puede incluir código de país +598 o no)
ignoreCache: (opcional) Si se establece entrueo1, omite la caché y realiza una consulta nueva al sistema URSEC
curl https://no-llamar-uy.vercel.app/api/check/95614500curl https://no-llamar-uy.vercel.app/api/check/59895614500curl https://no-llamar-uy.vercel.app/api/check/+59895614500curl "https://no-llamar-uy.vercel.app/api/check/95614500?ignoreCache=true"{
"success": true,
"phoneNumber": "95614500",
"validation": {
"isValid": true,
"formatted": "+598 95 614 500",
"type": "Mobile"
},
"normalizedNumber": "95614500",
"portalResponse": {
"captchaSolveAttempts": 1,
"response": "No se encontró el número ingresado en el Registro No llame",
"isInRecord": false
},
"timestamp": "2025-07-22T00:17:18.073Z"
}{
"success": true,
"phoneNumber": "99123456",
"validation": {
"isValid": true,
"formatted": "+598 99 123 456",
"type": "Mobile"
},
"normalizedNumber": "99123456",
"portalResponse": {
"captchaSolveAttempts": 2,
"response": "El número ingresado se encuentra en el Registro No llame",
"isInRecord": true
},
"timestamp": "2025-07-22T00:17:25.451Z"
}{
"success": false,
"error": "Invalid phone number format for Uruguay",
"phoneNumber": "123456789",
"timestamp": "2025-07-22T00:17:30.123Z"
}| Campo | Descripción |
|---|---|
success |
Indica si la consulta fue exitosa |
phoneNumber |
Número consultado (normalizado) |
validation.isValid |
Si el número tiene formato válido |
validation.formatted |
Número en formato internacional |
validation.type |
Tipo de línea (Mobile, Fixed Line, etc.) |
normalizedNumber |
Número en formato URSEC (8 dígitos) |
portalResponse.response |
Respuesta textual del portal URSEC |
portalResponse.isInRecord |
true si está en el registro No Llame |
portalResponse.captchaSolveAttempts |
Intentos de resolución del CAPTCHA |
timestamp |
Marca de tiempo de la consulta |
cached |
(opcional) true si la respuesta viene de caché |
cacheTimestamp |
(opcional) Fecha de cuando se guardó en caché |
La API implementa un sistema de caché inteligente multi-proveedor para mejorar el rendimiento:
La API detecta automáticamente la configuración disponible y usa el mejor proveedor en este orden de prioridad:
- MySQL (prioritario)
- MongoDB
- Vercel Blob (fallback)
Para usar MySQL como sistema de caché, configura estas variables de entorno:
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=your_password
MYSQL_DATABASE=no_llamar_cache
MYSQL_SSL=falseLa API creará automáticamente la base de datos y las tablas necesarias. También incluye un script SQL de configuración manual en mysql-setup.sql.
Para usar MongoDB como sistema de caché:
MONGODB_URL=mongodb://localhost:27017/no-llamar-cache
# o
MONGO_URL=mongodb://localhost:27017/no-llamar-cachePara usar Vercel Blob (recomendado para despliegues en Vercel):
BLOB_READ_WRITE_TOKEN=your_vercel_blob_token- Duración: 24 horas por defecto (configurable)
- Alcance: Por número de teléfono normalizado
- Invalidación: Automática por tiempo o manual con
ignoreCache=true - Interfaz unificada: Todos los proveedores implementan la misma interfaz
- Auto-detección: Selección automática del mejor proveedor disponible
- Las consultas exitosas se almacenan automáticamente en caché
- Las respuestas con errores no se cachean
- El parámetro
ignoreCache=trueomite completamente la caché - Las respuestas cacheadas incluyen los campos
cached: trueycacheTimestamp - Limpieza automática de entradas expiradas (MySQL y MongoDB)
- ⚡ Respuesta rápida: Respuestas instantáneas para números ya consultados
- 💰 Menor costo: Reduce llamadas al sistema URSEC
- 🔄 Menor carga: Evita resolver CAPTCHAs innecesariamente
- 🎯 Mejor UX: Experiencia más fluida para el usuario
- 🔧 Flexibilidad: Múltiples opciones de almacenamiento según el entorno
La API funciona siguiendo estos pasos:
- Validación: Verifica y normaliza el número telefónico
- Sesión: Establece una sesión con el portal de URSEC
- Navegación: Extrae URLs de iframes y navega por el formulario
- Submission: Envía el número al sistema de validación
- CAPTCHA: Resuelve automáticamente el CAPTCHA usando OCR
- Resultado: Extrae y procesa la respuesta final
- Node.js + TypeScript: Backend principal
- Express: Framework web
- Axios: Cliente HTTP para requests
- Cheerio: Parsing de HTML/XML
- Tesseract.js: OCR para resolución de CAPTCHAs
- google-libphonenumber: Validación de números telefónicos
- MySQL2: Driver para MySQL (cache prioritario)
- MongoDB: Driver oficial para MongoDB (cache alternativo)
- @vercel/blob: Cliente para Vercel Blob Storage (cache fallback)
# Desarrollo y construcción
npm run dev # Ejecutar en modo desarrollo
npm run build # Compilar TypeScript
npm start # Ejecutar en producción
# Testing y validación
npm run test:cache # Probar todos los proveedores de caché
npm run test # Ejecutar tests comprehensivos
npm run test:phone # Probar PhoneChecker específicamente
npm run test:api # Probar la API completa
# OCR API (opcional)
npm run start:ocr # Ejecutar API de OCR por separado
npm run dev:ocr # Ejecutar OCR API en modo desarrollo
# PM2 (gestión de procesos)
npm run pm2:start # Iniciar con PM2
npm run pm2:stop # Detener procesos PM2
npm run pm2:logs # Ver logs de PM2Para verificar que los proveedores de caché están funcionando correctamente:
# Probar todos los proveedores configurados
npm run test:cache
# O probar manualmente cada uno:
ts-node test-cache-providers.tsEste script probará automáticamente todos los proveedores de caché disponibles según tu configuración de variables de entorno.
- Rate Limiting: Se recomienda implementar límites de velocidad para evitar sobrecarga del portal URSEC
- Timeouts: Las consultas pueden tomar 10-30 segundos debido al procesamiento de CAPTCHAs
- Disponibilidad: Depende de la disponibilidad del portal oficial de URSEC
- Uso Responsable: Esta herramienta debe usarse de manera responsable y ética
- Solo funciona con números telefónicos uruguayos
- Requiere conexión a internet para acceder al portal URSEC
- La precisión del OCR puede variar según la complejidad del CAPTCHA
- Puede fallar si URSEC cambia la estructura de su portal
Las contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -am 'Agregar nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
Eduardo Airaudo
Este proyecto fue desarrollado con el objetivo de proporcionar una solución alternativa y gratuita al servicio oficial de nollame.uy, democratizando el acceso a la información del registro "No Llame" y permitiendo su integración en aplicaciones y sistemas de terceros.
Si este proyecto te ayudó, considera darle una estrella ⭐ en GitHub y compartirlo con otros desarrolladores.
Nota: Esta herramienta es independiente y no está afiliada oficialmente con URSEC. Su uso es bajo la responsabilidad del usuario final.