📚 GUIA COMPLETO DE INTEGRAÇÃO - FRONTEND CIDADÃO.AI¶
🎯 Visão Geral¶
O Backend Cidadão.AI é uma API REST completa que fornece TODOS os dados e funcionalidades necessários para o frontend. O frontend NÃO precisa de banco de dados próprio - tudo vem desta API.
🔑 Informações Essenciais¶
// Configuração Base
const API_BASE_URL = 'https://cidadao-api-production.up.railway.app'
const API_VERSION = '/api/v1'
const FULL_API_URL = `${API_BASE_URL}${API_VERSION}`
// Headers Padrão
const headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
🌐 Endpoints Principais¶
1️⃣ Health Check & Status¶
// Verificar se API está online
GET /health/
Response:
{
"status": "ok",
"timestamp": "2025-11-21T17:50:00Z",
"version": "1.0.0",
"environment": "production"
}
2️⃣ Agentes de IA (16 Personagens Históricos)¶
Cada agente é um personagem histórico brasileiro com especialidade única:
// Listar todos os agentes disponíveis
GET /api/v1/agents/
Response:
{
"agents": [
{
"id": "zumbi",
"name": "Zumbi dos Palmares",
"specialty": "Detecção de anomalias",
"description": "Líder quilombola, detecta irregularidades"
},
{
"id": "anita",
"name": "Anita Garibaldi",
"specialty": "Análise de padrões",
"description": "Revolucionária, analisa tendências"
},
// ... mais 14 agentes
]
}
Invocar Agente Específico¶
// Exemplo: Analisar contratos com Zumbi
POST /api/v1/agents/zumbi
{
"query": "Analise contratos de saúde acima de 1 milhão",
"context": {
"year": 2024,
"state": "MG"
},
"options": {
"anomaly_types": ["price", "vendor", "temporal"],
"threshold": 0.8
}
}
Response:
{
"agent": "zumbi_dos_palmares",
"result": {
"anomalies": [
{
"contract_id": "CTR2024001",
"type": "price_anomaly",
"severity": "high",
"description": "Valor 300% acima da média",
"value": 5000000,
"average": 1200000
}
],
"summary": {
"total_analyzed": 150,
"anomalies_found": 12,
"total_suspicious_value": 45000000
}
},
"metadata": {
"processing_time": 250,
"confidence": 0.92
}
}
📋 Lista Completa dos 16 Agentes¶
| ID | Nome | Especialidade | Endpoint |
|---|---|---|---|
zumbi |
Zumbi dos Palmares | Detecção de anomalias | /api/v1/agents/zumbi |
anita |
Anita Garibaldi | Análise de padrões | /api/v1/agents/anita |
tiradentes |
Tiradentes | Geração de relatórios | /api/v1/agents/tiradentes |
bonifacio |
José Bonifácio | Análise legal | /api/v1/agents/bonifacio |
maria-quiteria |
Maria Quitéria | Segurança e auditoria | /api/v1/agents/maria-quiteria |
machado |
Machado de Assis | Análise textual | /api/v1/agents/machado |
dandara |
Dandara | Equidade social | /api/v1/agents/dandara |
lampiao |
Lampião | Análise regional | /api/v1/agents/lampiao |
oscar |
Oscar Niemeyer | Agregação de dados | /api/v1/agents/oscar |
drummond |
Carlos Drummond | Comunicação | /api/v1/agents/drummond |
obaluaie |
Obaluaiê | Detecção de corrupção | /api/v1/agents/obaluaie |
oxossi |
Oxóssi | Busca de dados | /api/v1/agents/oxossi |
ceuci |
Céuci | Análise preditiva | /api/v1/agents/ceuci |
abaporu |
Abaporu | Orquestração mestre | /api/v1/agents/abaporu |
ayrton-senna |
Ayrton Senna | Roteamento semântico | /api/v1/agents/ayrton-senna |
nana |
Nanã | Gerenciamento de memória | /api/v1/agents/nana |
3️⃣ Chat com Streaming (SSE)¶
Para conversas em tempo real com respostas progressivas:
// Iniciar conversa com streaming
const eventSource = new EventSource(`${API_BASE_URL}/api/v1/chat/stream`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'text/event-stream'
},
body: JSON.stringify({
message: "Encontre contratos suspeitos de obras",
session_id: "unique-session-id-123"
})
})
// Receber eventos em tempo real
eventSource.addEventListener('chunk', (event) => {
const data = JSON.parse(event.data)
console.log('Partial response:', data.content)
// Atualizar UI progressivamente
})
eventSource.addEventListener('complete', (event) => {
const finalResult = JSON.parse(event.data)
console.log('Investigation complete:', finalResult)
eventSource.close()
})
eventSource.addEventListener('error', (event) => {
console.error('Stream error:', event)
eventSource.close()
})
4️⃣ Portal da Transparência - Dados Governamentais¶
Contratos Públicos¶
GET /api/v1/transparency/contracts?year=2024&state=MG&limit=100
Response:
{
"contracts": [
{
"id": "CTR2024001",
"supplier": "Empresa XYZ Ltda",
"cnpj": "12.345.678/0001-00",
"object": "Fornecimento de medicamentos",
"value": 2500000.00,
"start_date": "2024-01-15",
"end_date": "2024-12-31",
"status": "active",
"organ": "Secretaria de Saúde",
"modality": "Pregão Eletrônico",
"suspicious_flags": ["price_above_average", "single_bidder"]
}
],
"metadata": {
"total_count": 1543,
"total_value": 450000000.00,
"page": 1,
"limit": 100
}
}
Servidores Públicos¶
GET /api/v1/transparency/servants?organ=saude&role=medico
Response:
{
"servants": [
{
"id": "SRV001",
"name": "João Silva",
"role": "Médico",
"organ": "Hospital Municipal",
"salary": 15000.00,
"benefits": 3000.00,
"total_income": 18000.00,
"admission_date": "2015-03-20",
"status": "active"
}
],
"statistics": {
"average_salary": 14500.00,
"total_servants": 234,
"total_cost_monthly": 3393000.00
}
}
Licitações¶
GET /api/v1/transparency/biddings?status=open&modality=pregao
Response:
{
"biddings": [
{
"id": "PE2024/001",
"object": "Aquisição de equipamentos hospitalares",
"estimated_value": 5000000.00,
"modality": "Pregão Eletrônico",
"status": "open",
"opening_date": "2024-12-01T10:00:00",
"proposals_count": 5,
"organ": "Secretaria de Saúde"
}
]
}
5️⃣ Investigações Automatizadas¶
Criar investigações completas que coordenam múltiplos agentes:
// Criar nova investigação
POST /api/v1/investigations/
{
"title": "Investigação de Contratos de TI 2024",
"description": "Análise completa de contratos de tecnologia",
"scope": {
"year": 2024,
"category": "technology",
"min_value": 100000
},
"agents": ["zumbi", "anita", "tiradentes", "obaluaie"]
}
Response:
{
"investigation_id": "INV2024-001",
"status": "processing",
"estimated_time": 45,
"created_at": "2024-11-21T18:00:00Z"
}
// Acompanhar progresso
GET /api/v1/investigations/INV2024-001
Response:
{
"investigation_id": "INV2024-001",
"status": "completed",
"progress": 100,
"findings": {
"anomalies": 23,
"patterns": 5,
"risk_level": "high",
"total_suspicious_value": 12000000.00
},
"agents_results": {
"zumbi": { /* resultados detalhados */ },
"anita": { /* resultados detalhados */ },
"tiradentes": { /* relatório completo */ },
"obaluaie": { /* indicadores de corrupção */ }
}
}
6️⃣ APIs Federais Integradas¶
IBGE - Dados Demográficos¶
GET /api/v1/federal/ibge/cities?state=MG
Response:
{
"cities": [
{
"code": "3106200",
"name": "Belo Horizonte",
"population": 2521564,
"area": 331.401,
"gdp": 95600000000,
"gdp_per_capita": 37915.23
}
]
}
DataSUS - Dados de Saúde¶
GET /api/v1/federal/datasus/establishments?city=3106200&type=hospital
Response:
{
"establishments": [
{
"cnes": "2001578",
"name": "Hospital das Clínicas UFMG",
"type": "Hospital Geral",
"beds": 450,
"sus_enabled": true,
"services": ["emergency", "icu", "surgery"]
}
]
}
INEP - Dados Educacionais¶
GET /api/v1/federal/inep/schools?city=3106200&type=public
Response:
{
"schools": [
{
"code": "31001234",
"name": "Escola Estadual Central",
"type": "public",
"students": 1200,
"teachers": 65,
"ideb_score": 6.5,
"infrastructure": {
"computer_lab": true,
"library": true,
"sports_court": true
}
}
]
}
🎨 Dashboard - Dados para Visualização¶
Métricas Gerais¶
GET /api/v1/dashboard/metrics
Response:
{
"overview": {
"total_contracts": 15432,
"total_value": 4500000000.00,
"suspicious_contracts": 423,
"suspicious_value": 125000000.00,
"investigations_completed": 89,
"anomalies_detected": 1234
},
"by_category": {
"health": {
"contracts": 3421,
"value": 1200000000.00,
"anomalies": 234
},
"education": {
"contracts": 2145,
"value": 800000000.00,
"anomalies": 123
},
"infrastructure": {
"contracts": 1876,
"value": 2000000000.00,
"anomalies": 345
}
},
"trends": {
"monthly": [
{"month": "2024-01", "value": 350000000, "anomalies": 23},
{"month": "2024-02", "value": 380000000, "anomalies": 34},
// ...
]
}
}
Top Fornecedores¶
GET /api/v1/dashboard/top-suppliers?limit=10
Response:
{
"suppliers": [
{
"cnpj": "12.345.678/0001-00",
"name": "Empresa Alpha Ltda",
"total_contracts": 45,
"total_value": 125000000.00,
"risk_score": 0.85,
"categories": ["health", "technology"],
"red_flags": ["concentration", "price_above_average"]
}
]
}
Mapa de Calor - Anomalias por Região¶
GET /api/v1/dashboard/heatmap?type=anomalies
Response:
{
"regions": [
{
"state": "MG",
"city": "Belo Horizonte",
"lat": -19.9167,
"lng": -43.9345,
"intensity": 0.75,
"anomaly_count": 234,
"total_value": 45000000
}
]
}
📊 Relatórios e Exportação¶
Gerar Relatório¶
POST /api/v1/reports/generate
{
"type": "investigation_summary",
"format": "pdf",
"investigation_id": "INV2024-001",
"include": ["charts", "tables", "recommendations"]
}
Response:
{
"report_id": "RPT2024-001",
"status": "processing",
"estimated_time": 30
}
// Download quando pronto
GET /api/v1/reports/RPT2024-001/download
// Returns: Binary PDF file
Exportar Dados¶
POST /api/v1/export/
{
"data_type": "contracts",
"format": "xlsx",
"filters": {
"year": 2024,
"min_value": 100000
}
}
Response:
{
"export_id": "EXP2024-001",
"download_url": "/api/v1/export/EXP2024-001/download"
}
🔐 Autenticação (Opcional)¶
Por enquanto o sistema está aberto para desenvolvimento. Para produção:
// Login
POST /api/v1/auth/login
{
"email": "user@example.com",
"password": "password"
}
Response:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"user": {
"id": "usr_001",
"email": "user@example.com",
"name": "João Silva",
"role": "analyst"
}
}
// Usar token nos headers
headers: {
'Authorization': `Bearer ${access_token}`
}
⚡ WebSocket (Tempo Real)¶
Para atualizações em tempo real:
const ws = new WebSocket('wss://cidadao-api-production.up.railway.app/ws')
ws.onopen = () => {
// Subscrever a eventos
ws.send(JSON.stringify({
type: 'subscribe',
channels: ['investigations', 'anomalies', 'alerts']
}))
}
ws.onmessage = (event) => {
const data = JSON.parse(event.data)
switch(data.type) {
case 'investigation_update':
// Atualizar progresso da investigação
updateInvestigationProgress(data.payload)
break
case 'anomaly_detected':
// Mostrar alerta de nova anomalia
showAnomalyAlert(data.payload)
break
case 'system_alert':
// Notificação do sistema
showSystemNotification(data.payload)
break
}
}
📈 Exemplos Práticos de Uso¶
Exemplo 1: Dashboard Inicial¶
async function loadDashboard() {
// 1. Carregar métricas gerais
const metrics = await fetch(`${API_URL}/dashboard/metrics`)
.then(r => r.json())
// 2. Carregar top fornecedores suspeitos
const suppliers = await fetch(`${API_URL}/dashboard/top-suppliers?limit=5`)
.then(r => r.json())
// 3. Carregar investigações recentes
const investigations = await fetch(`${API_URL}/investigations?limit=5&status=completed`)
.then(r => r.json())
// 4. Atualizar UI
updateMetricsCards(metrics.overview)
renderSuppliersList(suppliers.suppliers)
renderRecentInvestigations(investigations.items)
}
Exemplo 2: Investigação Completa¶
async function runInvestigation(query) {
// 1. Criar investigação
const investigation = await fetch(`${API_URL}/investigations/`, {
method: 'POST',
headers,
body: JSON.stringify({
title: query,
agents: ['zumbi', 'anita', 'tiradentes']
})
}).then(r => r.json())
// 2. Monitorar progresso via SSE
const eventSource = new EventSource(
`${API_URL}/investigations/${investigation.investigation_id}/stream`
)
eventSource.onmessage = (event) => {
const progress = JSON.parse(event.data)
updateProgressBar(progress.percentage)
if (progress.status === 'completed') {
displayResults(progress.findings)
eventSource.close()
}
}
}
Exemplo 3: Chat Interativo¶
class ChatInterface {
constructor() {
this.sessionId = generateUUID()
this.eventSource = null
}
async sendMessage(message) {
// Mostrar mensagem do usuário
this.addMessage('user', message)
// Iniciar streaming
this.eventSource = new EventSource(`${API_URL}/chat/stream`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'text/event-stream'
},
body: JSON.stringify({
message,
session_id: this.sessionId
})
})
let assistantMessage = ''
this.eventSource.addEventListener('chunk', (e) => {
const chunk = JSON.parse(e.data)
assistantMessage += chunk.content
this.updateAssistantMessage(assistantMessage)
})
this.eventSource.addEventListener('complete', (e) => {
const result = JSON.parse(e.data)
this.finalizeAssistantMessage(result)
this.eventSource.close()
})
}
}
🛠️ Tratamento de Erros¶
async function apiCall(url, options = {}) {
try {
const response = await fetch(url, {
...options,
headers: {
'Content-Type': 'application/json',
...options.headers
}
})
if (!response.ok) {
const error = await response.json()
switch(response.status) {
case 400:
throw new ValidationError(error.detail)
case 401:
throw new AuthenticationError('Login required')
case 403:
throw new AuthorizationError('Access denied')
case 404:
throw new NotFoundError(error.detail)
case 429:
throw new RateLimitError('Too many requests')
case 500:
throw new ServerError('Internal server error')
default:
throw new ApiError(error.detail || 'Unknown error')
}
}
return await response.json()
} catch (error) {
console.error('API Error:', error)
// Mostrar notificação ao usuário
showErrorNotification(error.message)
throw error
}
}
🎯 Melhores Práticas¶
1. Cache de Dados¶
class DataCache {
constructor(ttl = 5 * 60 * 1000) { // 5 minutos
this.cache = new Map()
this.ttl = ttl
}
async get(key, fetcher) {
const cached = this.cache.get(key)
if (cached && Date.now() - cached.timestamp < this.ttl) {
return cached.data
}
const data = await fetcher()
this.cache.set(key, { data, timestamp: Date.now() })
return data
}
}
const cache = new DataCache()
// Usar cache
const contracts = await cache.get(
'contracts_2024',
() => fetch(`${API_URL}/transparency/contracts?year=2024`).then(r => r.json())
)
2. Debounce para Pesquisas¶
function debounce(func, delay) {
let timeoutId
return function(...args) {
clearTimeout(timeoutId)
timeoutId = setTimeout(() => func.apply(this, args), delay)
}
}
const searchContracts = debounce(async (query) => {
const results = await fetch(`${API_URL}/search?q=${query}`).then(r => r.json())
displaySearchResults(results)
}, 300)
3. Loading States¶
class ApiLoader {
async loadWithState(loader, callback) {
this.setLoading(true)
this.clearError()
try {
const data = await loader()
callback(data)
} catch (error) {
this.setError(error.message)
} finally {
this.setLoading(false)
}
}
}
📱 Responsividade¶
O backend retorna dados otimizados para mobile quando detectado:
// Headers para mobile
headers: {
'X-Client-Type': 'mobile',
'X-Screen-Size': 'small'
}
// Response será otimizada (menos dados, paginação menor)
🔄 Atualizações e Versionamento¶
// Verificar versão da API
GET /api/version
Response:
{
"version": "1.0.0",
"minimum_client_version": "1.0.0",
"features": {
"streaming": true,
"websocket": true,
"export": true
}
}
📞 Suporte e Limites¶
Rate Limiting¶
- 60 requisições por minuto (geral)
- 10 requisições por minuto (investigações)
- 100 requisições por minuto (leitura)
Headers de resposta:
Limites de Dados¶
- Máximo 1000 itens por página
- Máximo 10MB por requisição
- Timeout: 30 segundos (geral), 5 minutos (investigações)
🚀 Quick Start - Código Inicial¶
<!DOCTYPE html>
<html>
<head>
<title>Cidadão.AI</title>
</head>
<body>
<div id="app"></div>
<script>
// Configuração
const API = {
BASE_URL: 'https://cidadao-api-production.up.railway.app',
VERSION: '/api/v1'
}
// Classe principal
class CidadaoAI {
constructor() {
this.apiUrl = `${API.BASE_URL}${API.VERSION}`
}
async getAgents() {
const response = await fetch(`${this.apiUrl}/agents/`)
return response.json()
}
async analyzeWithAgent(agentId, query) {
const response = await fetch(`${this.apiUrl}/agents/${agentId}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ query, context: {} })
})
return response.json()
}
async getContracts(filters = {}) {
const params = new URLSearchParams(filters)
const response = await fetch(`${this.apiUrl}/transparency/contracts?${params}`)
return response.json()
}
}
// Inicializar
const cidadao = new CidadaoAI()
// Exemplo de uso
async function init() {
// 1. Listar agentes
const agents = await cidadao.getAgents()
console.log('Agentes disponíveis:', agents)
// 2. Analisar com Zumbi
const analysis = await cidadao.analyzeWithAgent('zumbi', 'Encontre anomalias em contratos')
console.log('Análise:', analysis)
// 3. Buscar contratos
const contracts = await cidadao.getContracts({ year: 2024, limit: 10 })
console.log('Contratos:', contracts)
}
init()
</script>
</body>
</html>
📊 Resumo dos Recursos¶
O que o Frontend receberá desta API:¶
✅ 16 Agentes de IA com personalidades históricas brasileiras ✅ Dados completos do Portal da Transparência (contratos, licitações, servidores) ✅ APIs Federais integradas (IBGE, DataSUS, INEP, PNCP) ✅ Investigações automatizadas com múltiplos agentes ✅ Chat com streaming (SSE) para respostas em tempo real ✅ Dashboard com métricas, gráficos e mapas de calor ✅ Relatórios em PDF/Excel com gráficos e análises ✅ WebSocket para notificações em tempo real ✅ Sistema de busca com filtros avançados ✅ Exportação de dados em múltiplos formatos
O Frontend NÃO precisa:¶
❌ Banco de dados próprio ❌ Processamento de dados complexos ❌ Integração direta com APIs governamentais ❌ Lógica de IA ou análise ❌ Geração de relatórios
🎯 IMPORTANTE: Este backend é a ÚNICA fonte de dados para o frontend. Todos os dados mostrados na interface virão exclusivamente desta API.
📧 Contato para dúvidas: documentação completa em /docs
Última atualização: 21/11/2025 - Sistema 100% operacional com 16 agentes funcionais