Skip to main content

Visão Geral da API

Arquitetura​

A API do Cidadão.AI é construída em uma arquitetura orientada a microsserviços usando FastAPI, projetada para alta performance, escalabilidade e processamento de dados em tempo real. O sistema implementa um padrão de arquitetura em camadas com separação clara de responsabilidades.

Componentes Principais​

Especificações Técnicas​

Protocolo e Padrões​

  • Protocolo: HTTPS/2 com TLS 1.3
  • Estilo de API: RESTful com conformidade JSON:API
  • Versionamento: Baseado em URI (/api/v1/)
  • Autenticação: OAuth 2.0 + JWT (RFC 7519)
  • Documentação: Especificação OpenAPI 3.0

Características de Performance​

  • Tempo de Resposta: p95 < 100ms, p99 < 500ms
  • Throughput: 10.000+ requisições/segundo
  • Concorrência: Async/await com pool de conexões
  • Cache: Multi-camada (Redis + In-memory)

Ciclo de Vida da API​

Fluxo de Requisição​

Stack de Middleware​

  1. Middleware CORS: Compartilhamento de recursos entre origens
  2. Middleware de Segurança: Headers, proteção XSS
  3. Middleware de Autenticação: Validação JWT
  4. Middleware de Rate Limiting: Algoritmo token bucket
  5. Middleware de Logging: Logs estruturados JSON
  6. Middleware de Tratamento de Erros: Respostas de erro consistentes

Modelos de Dados​

Entidades Principais​

# Entidade Investigação
class Investigacao:
id: UUID
usuario_id: UUID
consulta: str
status: StatusInvestigacao
anomalias_encontradas: int
pontuacao_confianca: float
criado_em: datetime
concluido_em: Optional[datetime]

# Entidade Análise
class Analise:
id: UUID
tipo: TipoAnalise
fonte_dados: FonteDados
resultados: Dict[str, Any]
metadados: MetadadosAnalise

# Entidade Relatório
class Relatorio:
id: UUID
titulo: str
conteudo: str
formato: FormatoRelatorio
investigacoes: List[UUID]
gerado_em: datetime

Tratamento de Erros​

Formato de Resposta de Erro​

{
"erro": {
"codigo": "ERRO_VALIDACAO",
"mensagem": "Parâmetros de requisição inválidos",
"detalhes": {
"campo": "consulta",
"motivo": "Parâmetro consulta é obrigatório"
},
"id_requisicao": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2025-01-30T10:15:30Z"
}
}

Códigos de Status HTTP​

CódigoSignificadoUso
200OKGET, PUT bem-sucedidos
201CriadoPOST bem-sucedido
204Sem ConteúdoDELETE bem-sucedido
400Requisição InválidaParâmetros inválidos
401Não AutorizadoAutenticação ausente/inválida
403ProibidoPermissões insuficientes
404Não EncontradoRecurso não existe
429Muitas RequisiçõesLimite de taxa excedido
500Erro Interno do ServidorErro do lado do servidor

Limitação de Taxa​

Limites por Nível​

NívelRequisições/HoraRajadaConcorrente
Anônimo100102
Autenticado1.00010010
Premium10.0001.00050
AdminIlimitado--

Headers de Limite de Taxa​

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1640995200
X-RateLimit-Retry-After: 3600

Segurança​

Fluxo de Autenticação​

  1. Autenticação Inicial: POST /api/v1/auth/login
  2. Resposta de Token: Access token (15min) + Refresh token (7d)
  3. Autenticação de Requisição: Authorization: Bearer <access_token>
  4. Renovação de Token: POST /api/v1/auth/refresh

Headers de Segurança​

X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Strict-Transport-Security: max-age=31536000; includeSubDomains
Content-Security-Policy: default-src 'self'

Paginação​

Parâmetros de Requisição​

GET /api/v1/investigacoes?pagina=2&limite=20&ordenacao=-criado_em

Formato de Resposta​

{
"dados": [...],
"meta": {
"pagina": 2,
"limite": 20,
"total": 156,
"paginas": 8
},
"links": {
"primeira": "/api/v1/investigacoes?pagina=1&limite=20",
"anterior": "/api/v1/investigacoes?pagina=1&limite=20",
"proxima": "/api/v1/investigacoes?pagina=3&limite=20",
"ultima": "/api/v1/investigacoes?pagina=8&limite=20"
}
}

Filtragem e Ordenação​

Sintaxe de Filtro​

GET /api/v1/investigacoes?filtro[status]=concluida&filtro[anomalias_encontradas][gte]=5

Sintaxe de Ordenação​

GET /api/v1/investigacoes?ordenacao=-anomalias_encontradas,criado_em

Webhooks​

Eventos de Webhook​

  • investigacao.concluida
  • analise.finalizada
  • relatorio.gerado
  • anomalia.detectada

Payload do Webhook​

{
"evento": "investigacao.concluida",
"dados": {
"id_investigacao": "550e8400-e29b-41d4-a716-446655440000",
"anomalias_encontradas": 12,
"severidade": "alta"
},
"timestamp": "2025-01-30T10:15:30Z",
"assinatura": "sha256=..."
}

Versionamento da API​

Estratégia de Versão​

  • Versão Atual: v1
  • Aviso de Descontinuação: 6 meses
  • Fim da Vida: 12 meses
  • Header de Versão: X-API-Version: 1

Política de Mudanças Críticas​

  1. Anunciar nas notas de lançamento
  2. Adicionar avisos de descontinuação
  3. Manter compatibilidade regressiva
  4. Fornecer guia de migração

Otimização de Performance​

Estratégia de Cache​

  1. Cache do Navegador: Assets estáticos (1 ano)
  2. Cache CDN: Respostas da API (5 minutos)
  3. Cache Redis: Consultas de banco (1 hora)
  4. Cache da Aplicação: Resultados computados (15 minutos)

Otimização de Consulta​

  • Seleção de Campos: ?campos=id,titulo,status
  • Carregamento Eager: ?incluir=investigacoes,analises
  • Fieldsets Esparsos: Minimizar tamanho do payload
  • Compressão: gzip/brotli para respostas

Monitoramento e Observabilidade​

Métricas Expostas​

  • Taxa de requisições (req/s)
  • Tempo de resposta (p50, p95, p99)
  • Taxa de erro (4xx, 5xx)
  • Conexões ativas
  • Taxa de acerto do cache

Endpoints de Saúde​

  • /health - Verificação básica de saúde
  • /health/detailed - Status abrangente
  • /health/live - Liveness do Kubernetes
  • /health/ready - Readiness do Kubernetes

Suporte SDK​

SDKs Oficiais​

  • Python: pip install cidadao-ai-sdk
  • JavaScript/TypeScript: npm install @cidadao-ai/sdk
  • Go: go get github.com/cidadao-ai/go-sdk

Exemplo de Código​

from cidadao_ai import Cliente

cliente = Cliente(api_key="sua-api-key")

# Iniciar investigação
investigacao = cliente.investigacoes.criar(
consulta="Contratos suspeitos em 2024",
fonte_dados="portal_transparencia",
filtros={"ano": 2024, "valor_min": 1000000}
)

# Verificar status
status = cliente.investigacoes.obter_status(investigacao.id)

# Obter resultados
if status.concluida:
resultados = cliente.investigacoes.obter_resultados(investigacao.id)
print(f"Encontradas {resultados.anomalias_encontradas} anomalias")

Melhores Práticas​

Otimização de Requisições​

  1. Use seleção de campos para reduzir payload
  2. Implemente cache no lado do cliente
  3. Agrupe requisições quando possível
  4. Use webhooks para operações longas

Tratamento de Erros​

  1. Implemente backoff exponencial
  2. Trate limites de taxa graciosamente
  3. Registre erros com IDs de requisição
  4. Valide entradas no lado do cliente

Segurança​

  1. Nunca exponha chaves de API no código
  2. Use variáveis de ambiente
  3. Implemente assinatura de requisições
  4. Valide certificados SSL

Guia de Migração​

De v0 para v1​

  1. Atualize URL base para /api/v1/
  2. Migre de chaves de API para JWT
  3. Atualize tratamento de erros para novo formato
  4. Implemente paginação para endpoints de lista

Próximo: Autenticação →