Cómo estructuro integraciones de APIs con Python, SQL y GitHub Actions
Un patrón conciso para integraciones de APIs: frontera de credenciales, ingesta bruta, identificadores idempotentes, jobs programados, modelado SQL y reportes operativos.
Un patrón conciso para integraciones de APIs: frontera de credenciales, ingesta bruta, identificadores idempotentes, jobs programados, modelado SQL y reportes operativos.
Una integración debe tener un lugar claro para credenciales, uno para llamadas al proveedor y otro para modelado downstream. Mezclar responsabilidades complica retries y auditoría.
La capa raw guarda respuestas del proveedor antes de que reglas de negocio las transformen. Views SQL y tablas modeladas pueden evolucionar sin perder la forma original de la API.
Las ventanas repetidas de recopilación son normales. IDs externos, upserts y logs controlados permiten replay sin duplicar registros ni ocultar fallas parciales.
Para ingesta ligera y programada, GitHub Actions ofrece historial, ejecución manual, secrets y previsibilidad sin mantener un worker permanente.
Incluso APIs bien documentadas cambian en detalles pequeños: campos opcionales desaparecen, límites de tasa se mueven, la paginación se comporta distinto y los tokens vencen en malos momentos. Una buena integración espera ese desvío. El código debe aislar clientes del proveedor, normalizar errores, registrar metadatos de respuesta y dejar claro qué parte del pipeline falló. Esa es la diferencia entre un script que funciona hoy y una integración mantenible el mes siguiente.
Un job programado necesita más que una expresión cron. Debe recordar qué ventana recopiló, qué registros insertó, cuáles omitió y si un reintento es seguro. GitHub Actions ayuda con historial de ejecución y disparo manual, pero el pipeline todavía necesita logs y almacenamiento idempotente. Sin eso, un retry puede crear duplicados u ocultar la razón de un reporte incompleto.
Cuando la respuesta bruta de la API se guarda primero, las reglas de negocio pueden pasar a modelos SQL, donde son más fáciles de inspeccionar. Joins, filtros, ventanas de fecha y definiciones de estado quedan explícitos en vez de enterrados en transformaciones Python. Eso también facilita cambios de criterio. Si la definición de un reporte cambia, la integración no necesita recopilar todos los payloads otra vez; la capa modelada evoluciona desde la misma fuente auditable.