Proyectos / ContrataData
FastAPINext.js 14ETL PipelinePostgreSQL GovTech / Data

ContrataData

Resultado: Miles de contratos públicos consolidados y visualizables en tiempo real
Ver en GitHub
Imagen del proyecto ContrataData

ContrataData es una plataforma GovTech que consolida y visualiza contratos del sector público colombiano extraídos de SECOP y datos.gov.co. Implementa un pipeline ETL incremental que procesa solo registros nuevos o modificados, exponiendo los datos normalizados mediante una API REST y un dashboard React con visualizaciones analíticas.

El Problema

Contratos públicos colombianos dispersos en SECOP y datos.gov.co sin forma de consolidarlos, normalizarlos ni visualizarlos de manera unificada y analizable.

La Solución

Pipeline ETL incremental en Python con Socrata API, normalización en PostgreSQL/Neon, REST API con FastAPI y dashboard analítico en Next.js con filtros en tiempo real.

El Resultado

Miles de contratos públicos consolidados y visualizables en tiempo real

Stack Tecnológico

Python 3.12 + SQLAlchemy 2.0
Pipeline ETL
Socrata API (SODA)
Extracción de datos gubernamentales
PostgreSQL / Neon
Base de datos normalizada
FastAPI + Pydantic v2
REST API con validación estricta de tipos
Next.js 14 + TypeScript
Frontend / App Router
TanStack Query v5
Caché reactivo y fetching en cliente
shadcn/ui + Tremor
UI components y charts analíticos

Pipeline de Datos

  1. 1

    El extractor consulta SECOP/datos.gov.co vía Socrata API usando el protocolo SODA estándar de datos abiertos

  2. 2

    Modo incremental: la tabla pipeline_meta persiste el último timestamp de ejecución y filtra con $where=:updated_at >= '<last_run>' reduciendo consumo de cuota API

  3. 3

    Detección automática full/delta: primera ejecución hace carga completa; subsiguientes solo extraen lo nuevo o modificado

  4. 4

    Etapa de normalización mapea los datos crudos a 5 modelos SQLAlchemy: Entity, Supplier, Contract, RejectedRecord, PipelineMeta

  5. 5

    Validación estricta con Pydantic v2: registros inválidos se almacenan en RejectedRecord con payload raw y metadata de error para auditoría

  6. 6

    Carga idempotente via ON CONFLICT DO NOTHING, segura para re-ejecuciones sin duplicados

  7. 7

    Backfill manual disponible via variable de entorno DATE_FROM para re-procesar rangos históricos específicos

Características Técnicas

Pipeline ETL incremental: solo procesa contratos nuevos o modificados desde la última ejecución
Detección automática de modo full/delta basada en timestamps persistidos en BD
Carga idempotente (ON CONFLICT DO NOTHING) segura para re-ejecuciones y recuperación de fallos
API REST paginada con filtros combinables por fecha, entidad pública, proveedor y estado de contrato
KPIs de entidades públicas, perfiles de proveedores y análisis de tendencias temporales
Dashboard con tema oscuro/claro implementado sin librerías externas de theming
Documentación interactiva Swagger auto-generada disponible en /api/docs

¿Quieres resultados similares?

Cuéntame sobre tu proyecto y diseñamos juntos la estrategia.