Activar datos reales
RUNT y SIMIT no tienen API pública — sus portales tienen reCAPTCHA. Para tener datos reales tienes tres caminos posibles. Aquí están con sus tradeoffs reales.
Estado actual de las fuentes
- Pico y placaReal
Reglas vigentes 2026 hardcodeadas para 6 ciudades. No requiere API.
- RUNT (vehículo · SOAT · RTM · antecedentes)Demo
Requiere API comercial (ver abajo) o scraper + anti-captcha.
- SIMIT (multas)Demo
Mismo problema: reCAPTCHA en fcm.org.co/simit.
- FASECOLDADemo
Web pública sin captcha — se puede scrapear, pero requiere marca+línea+año (que vendría del RUNT).
- Impuesto vehicular departamentalDemo
Portales sin captcha (Bogotá, Antioquia). Scrapeables con Playwright.
APIs comerciales
Recomendado · 10 minutos para activar
Verifik
RecomendadoPlanes mensuales (consultar)
El más completo. API REST clara, documentación en inglés y español.
Apitude
Pay-per-call
Buena alternativa. Endpoints REST simples.
PlacaAPI
~74 COP/consulta · 10 gratis al registrarte
SOAP/ASMX. Más barato pero solo RUNT.
Pasos: Regístrate en un proveedor → obtén tu API key → edítala en .env → pon DATA_MODE=live → reinicia el dev server. Los adapters en lib/sources/runt.ts y lib/sources/simit.ts ya tienen el shape esperado.
Scraper propio con anti-captcha
Más barato a la larga · más frágil
Montar Playwright headless que navegue runt.gov.co + fcm.org.co/simit y resuelva el reCAPTCHA con un servicio como 2Captcha o AntiCaptcha (~$0.003 USD por resolución).
Tradeoff: cuando los portales cambien su HTML rompe todo — mantenimiento constante. Posiblemente viola los ToS del RUNT/FCM.
Híbrido: solo fuentes sin captcha
Sin pagar nada · cobertura parcial
Pico y placa (ya está real)
Scraper FASECOLDA por web (sin captcha, requiere marca+línea+año desde otra fuente)
Scraper Impuesto Bogotá / Antioquia con Playwright (sin captcha, solo navegación)
Sigues sin datos del RUNT ni SIMIT
¿Cómo cablear un adapter real?
Cada fuente vive en lib/sources/*.ts. Por ejemplo en runt.ts reemplaza el cuerpo de fetchVerifik:
async function fetchVerifik(input) {
const key = process.env.VERIFIK_API_KEY;
if (!key) return null;
const res = await fetch("https://api.verifik.co/v2/cf/runt-vehicle", {
method: "POST",
headers: { Authorization: `Bearer ${key}`, "Content-Type": "application/json" },
body: JSON.stringify({ documentNumber: input.docNumber, plate: input.placa }),
});
if (!res.ok) return null;
const json = await res.json();
return mapVerifikToProviderResponse(json);
}