Visão Geral da API
Guia completo sobre a estrutura, convenções e uso da API Sinapse
A API Sinapse segue os princípios REST e retorna respostas em formato JSON. Esta página fornece informações essenciais sobre como interagir com nossa API.
Base URLs
| Ambiente | URL Base | Descrição |
|---|---|---|
| Produção | https://api.sinapse.org.br/v1 | Ambiente principal |
| Staging | https://api-staging.sinapse.saude.gov.br/v1 | Testes de integração |
| Sandbox | https://api-sandbox.sinapse.saude.gov.br/v1 | Desenvolvimento |
Sempre use HTTPS. Requisições HTTP serão automaticamente rejeitadas por questões de segurança.
Convenções da API
Versionamento
A API usa versionamento na URL. A versão atual é v1:
https://api.sinapse.org.br/v1/recursoMudanças incompatíveis resultarão em nova versão (v2, v3, etc). Versões antigas serão mantidas por no mínimo 6 meses após o lançamento de uma nova versão.
Métodos HTTP
| Método | Descrição | Exemplo |
|---|---|---|
| GET | Recuperar recursos | GET /usuarios |
| POST | Criar novo recurso | POST /usuarios |
| PUT | Atualizar recurso completo | PUT /usuarios/123 |
| PATCH | Atualizar parcialmente | PATCH /usuarios/123 |
| DELETE | Remover recurso | DELETE /usuarios/123 |
Headers Padrão
Content-Type: application/json
Accept: application/json
Authorization: Bearer SEU_TOKEN_AQUI
X-Request-ID: uuid-unico-requisicaoFormato de Resposta
Resposta de Sucesso
{
"data": {
"id": 123,
"nome": "João Silva",
"email": "[email protected]"
},
"meta": {
"timestamp": "2025-07-29T10:30:00Z",
"version": "1.0.0"
}
}Resposta de Lista (Paginada)
{
"total": 150,
"page": 1,
"size": 50,
"pages": 3,
"items": [
{
"id": 1,
"nome": "Item 1"
},
{
"id": 2,
"nome": "Item 2"
}
],
"meta": {
"timestamp": "2025-07-29T10:30:00Z"
}
}Resposta de Erro
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Erro de validação nos dados enviados",
"details": [
{
"field": "email",
"message": "Email inválido",
"code": "INVALID_EMAIL"
}
],
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2025-07-29T10:30:00Z"
}
}Status Codes
| Código | Significado | Descrição |
|---|---|---|
| 200 | OK | Requisição bem-sucedida |
| 201 | Created | Recurso criado com sucesso |
| 204 | No Content | Sucesso sem conteúdo de resposta |
| 400 | Bad Request | Requisição mal formada |
| 401 | Unauthorized | Token ausente ou inválido |
| 403 | Forbidden | Sem permissão para o recurso |
| 404 | Not Found | Recurso não encontrado |
| 422 | Unprocessable Entity | Dados inválidos |
| 429 | Too Many Requests | Rate limit excedido |
| 500 | Internal Server Error | Erro no servidor |
| 503 | Service Unavailable | Serviço temporariamente indisponível |
Paginação
Todos os endpoints que retornam listas suportam paginação:
Parâmetros de Query
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
page | integer | 1 | Número da página (começa em 1) |
size | integer | 50 | Itens por página (máx: 100) |
sort | string | - | Campo para ordenação |
order | string | asc | Direção: asc ou desc |
Exemplo de Requisição
GET /api/v1/agravos/casos?page=2&size=25&sort=data_notificacao&order=descResposta com Metadados de Paginação
{
"total": 523,
"page": 2,
"size": 25,
"pages": 21,
"items": [...],
"links": {
"first": "/api/v1/agravos/casos?page=1&size=25",
"prev": "/api/v1/agravos/casos?page=1&size=25",
"next": "/api/v1/agravos/casos?page=3&size=25",
"last": "/api/v1/agravos/casos?page=21&size=25"
}
}Filtros e Busca
Filtros Simples
Use query parameters para filtrar resultados:
GET /api/v1/agravos/casos?tipo_agravo=dengue&estado=SP&municipio=São PauloOperadores de Comparação
| Operador | Descrição | Exemplo |
|---|---|---|
eq | Igual a | ?idade[eq]=25 |
ne | Diferente de | ?status[ne]=cancelado |
gt | Maior que | ?idade[gt]=18 |
gte | Maior ou igual | ?data[gte]=2025-01-01 |
lt | Menor que | ?idade[lt]=65 |
lte | Menor ou igual | ?data[lte]=2025-12-31 |
in | Está em | ?status[in]=ativo,pendente |
like | Contém | ?nome[like]=silva |
Busca Avançada
Para buscas complexas, use o parâmetro search com JSON codificado:
# Busca com múltiplas condições
GET /api/v1/agravos/casos?search={
"and": [
{"tipo_agravo": "dengue"},
{"estado": "SP"},
{"or": [
{"classificacao": "grave"},
{"idade": {"gt": 60}}
]}
]
}Rate Limiting
A API possui limites de taxa para garantir qualidade de serviço:
Limites por Tipo de Conta
| Tipo de Conta | Requisições/Hora | Burst |
|---|---|---|
| Básica | 1.000 | 50/min |
| Premium | 10.000 | 200/min |
| Enterprise | 50.000 | 1000/min |
Headers de Rate Limit
Cada resposta inclui headers informativos:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 834
X-RateLimit-Reset: 1627654800
X-RateLimit-Reset-After: 3600Tratando Rate Limit Excedido
async function requestWithRetry(url, options, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(url, options);
if (response.status !== 429) {
return response;
}
// Extrair tempo de espera do header
const retryAfter = response.headers.get('Retry-After') || 60;
console.log(`Rate limit atingido. Aguardando ${retryAfter}s...`);
// Esperar com backoff exponencial
await new Promise(resolve =>
setTimeout(resolve, (retryAfter * 1000) * Math.pow(2, i))
);
}
throw new Error('Rate limit excedido após múltiplas tentativas');
}Operações Assíncronas
Para operações demoradas, a API retorna status 202 com URL de acompanhamento:
Requisição Inicial
POST /api/v1/agravos/casos/bulk
Content-Type: application/json
{
"arquivo": "base64_encoded_file",
"formato": "csv"
}Resposta com Job ID
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"status_url": "/api/v1/jobs/550e8400-e29b-41d4-a716-446655440000",
"message": "Processamento iniciado"
}Verificar Status
GET /api/v1/jobs/550e8400-e29b-41d4-a716-446655440000{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"progress": 100,
"result": {
"total_processados": 1500,
"sucesso": 1485,
"erros": 15
},
"created_at": "2025-07-29T10:00:00Z",
"completed_at": "2025-07-29T10:05:32Z"
}Validação de Dados
Schemas de Validação
A API valida todos os dados de entrada. Erros de validação retornam status 422:
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Dados inválidos",
"details": [
{
"field": "data_nascimento",
"message": "Data deve estar no formato YYYY-MM-DD",
"code": "INVALID_FORMAT"
},
{
"field": "cpf",
"message": "CPF inválido",
"code": "INVALID_CPF"
}
]
}
}Tipos de Dados Aceitos
| Tipo | Formato | Exemplo |
|---|---|---|
| Data | ISO 8601 | 2025-07-29 |
| Data/Hora | ISO 8601 com timezone | 2025-07-29T10:30:00-03:00 |
| CPF | Com ou sem formatação | 123.456.789-00 ou 12345678900 |
| Telefone | Formato brasileiro | (11) 98765-4321 |
| CEP | Com ou sem hífen | 01310-100 ou 01310100 |
Internacionalização
A API suporta múltiplos idiomas através do header Accept-Language:
# Português (padrão)
Accept-Language: pt-BR
# Inglês
Accept-Language: en-US
# Espanhol
Accept-Language: es-ESMensagens de erro e descrições serão retornadas no idioma solicitado quando disponível.
CORS
A API suporta CORS para permitir requisições de navegadores:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400Para ambientes de produção, configure origens específicas:
// Configuração no cliente
const response = await fetch('https://api.sinapse.org.br/v1/recurso', {
method: 'GET',
headers: {
'Authorization': 'Bearer TOKEN',
'Content-Type': 'application/json'
},
mode: 'cors',
credentials: 'include'
});SDKs e Ferramentas
SDKs Oficiais
Python SDK
pip install sinapse-sdk
JavaScript SDK
npm install @sinapse/sdk
Java SDK
Maven: br.gov.saude.sinapse
Go SDK
go get github.com/sinapse/sdk-go
Ferramentas de Desenvolvimento
- Postman Collection - Coleção completa para testes
- OpenAPI Spec - Especificação OpenAPI 3.0
- GraphQL Playground - Interface GraphQL (beta)
Webhooks
Configure webhooks para receber notificações de eventos:
Configurar Webhook
POST /api/v1/webhooks
Content-Type: application/json
Authorization: Bearer TOKEN
{
"url": "https://seu-sistema.com/webhook",
"eventos": ["agravo.criado", "agravo.atualizado"],
"ativo": true,
"headers": {
"X-Custom-Header": "valor"
}
}Formato do Payload
{
"id": "evt_550e8400-e29b-41d4-a716-446655440000",
"tipo": "agravo.criado",
"timestamp": "2025-07-29T10:30:00Z",
"dados": {
"id": 123,
"tipo_agravo": "dengue",
"numero_notificacao": "2025-001234"
},
"webhook_id": "wh_123456"
}Verificar Assinatura
import hmac
import hashlib
def verificar_webhook(payload, signature, secret):
expected = hmac.new(
secret.encode(),
payload.encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)Próximos Passos
Explore a documentação específica de cada módulo:
Autenticação
Endpoints de login, logout e gestão de tokens
Usuários
Gestão de usuários e permissões
Agravos
Registro e análise de casos
Notícias
Sistema de notícias de saúde
Dica: Use nossa ferramenta interativa para testar os endpoints diretamente no navegador!