Como estruturo integrações de APIs com Python, SQL e GitHub Actions
Um padrão conciso para integrações de APIs: fronteira de credenciais, ingestão bruta, identificadores idempotentes, jobs agendados, modelagem SQL e relatórios operacionais.
Um padrão conciso para integrações de APIs: fronteira de credenciais, ingestão bruta, identificadores idempotentes, jobs agendados, modelagem SQL e relatórios operacionais.
Uma integração deve ter um lugar claro para credenciais, um para chamadas ao provedor e outro para modelagem downstream. Misturar essas responsabilidades dificulta retries e auditoria.
A camada raw guarda respostas do provedor antes que regras de negócio as transformem. Views SQL e tabelas modeladas podem evoluir sem perder o formato original da API.
Janelas repetidas de coleta são normais. IDs externos, upserts e logs controlados permitem replay sem duplicar registros ou esconder falhas parciais.
Para ingestão leve e agendada, GitHub Actions oferece histórico, execução manual, secrets e previsibilidade sem manter um worker permanente.
Mesmo APIs bem documentadas mudam comportamento em detalhes pequenos: campos opcionais desaparecem, limites de taxa mudam, paginação se comporta de outro jeito e tokens expiram em horários ruins. Uma boa integração espera esse desvio. O código deve isolar clients do provedor, normalizar erros, registrar metadados de resposta e deixar claro qual parte do pipeline falhou. Essa é a diferença entre um script que funciona hoje e uma integração que pode ser mantida no mês seguinte.
Um job agendado precisa de mais do que uma expressão cron. Ele precisa lembrar qual janela coletou, quais registros inseriu, quais ignorou e se uma nova tentativa é segura. GitHub Actions ajuda com histórico de execução e disparo manual, mas o pipeline ainda precisa de logs e armazenamento idempotente. Sem isso, um retry pode criar duplicidade ou esconder o motivo de um relatório incompleto.
Quando a resposta bruta da API é salva primeiro, as regras de negócio podem ir para modelos SQL, onde ficam mais fáceis de inspecionar. Joins, filtros, janelas de data e definições de status ficam explícitos em vez de enterrados em transformações Python. Isso também facilita mudanças de regra. Se a definição de um relatório muda, a integração não precisa coletar todos os payloads de novo; a camada modelada evolui a partir da mesma fonte auditável.