Logo

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

AmbienteURL BaseDescrição
Produçãohttps://api.sinapse.org.br/v1Ambiente principal
Staginghttps://api-staging.sinapse.saude.gov.br/v1Testes de integração
Sandboxhttps://api-sandbox.sinapse.saude.gov.br/v1Desenvolvimento

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/recurso

Mudanç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étodoDescriçãoExemplo
GETRecuperar recursosGET /usuarios
POSTCriar novo recursoPOST /usuarios
PUTAtualizar recurso completoPUT /usuarios/123
PATCHAtualizar parcialmentePATCH /usuarios/123
DELETERemover recursoDELETE /usuarios/123

Headers Padrão

Content-Type: application/json
Accept: application/json
Authorization: Bearer SEU_TOKEN_AQUI
X-Request-ID: uuid-unico-requisicao

Formato 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ódigoSignificadoDescrição
200OKRequisição bem-sucedida
201CreatedRecurso criado com sucesso
204No ContentSucesso sem conteúdo de resposta
400Bad RequestRequisição mal formada
401UnauthorizedToken ausente ou inválido
403ForbiddenSem permissão para o recurso
404Not FoundRecurso não encontrado
422Unprocessable EntityDados inválidos
429Too Many RequestsRate limit excedido
500Internal Server ErrorErro no servidor
503Service UnavailableServiço temporariamente indisponível

Paginação

Todos os endpoints que retornam listas suportam paginação:

Parâmetros de Query

ParâmetroTipoPadrãoDescrição
pageinteger1Número da página (começa em 1)
sizeinteger50Itens por página (máx: 100)
sortstring-Campo para ordenação
orderstringascDireção: asc ou desc

Exemplo de Requisição

GET /api/v1/agravos/casos?page=2&size=25&sort=data_notificacao&order=desc

Resposta 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 Paulo

Operadores de Comparação

OperadorDescriçãoExemplo
eqIgual a?idade[eq]=25
neDiferente de?status[ne]=cancelado
gtMaior que?idade[gt]=18
gteMaior ou igual?data[gte]=2025-01-01
ltMenor que?idade[lt]=65
lteMenor ou igual?data[lte]=2025-12-31
inEstá em?status[in]=ativo,pendente
likeConté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 ContaRequisições/HoraBurst
Básica1.00050/min
Premium10.000200/min
Enterprise50.0001000/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: 3600

Tratando 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

TipoFormatoExemplo
DataISO 86012025-07-29
Data/HoraISO 8601 com timezone2025-07-29T10:30:00-03:00
CPFCom ou sem formatação123.456.789-00 ou 12345678900
TelefoneFormato brasileiro(11) 98765-4321
CEPCom ou sem hífen01310-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-ES

Mensagens 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: 86400

Para 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

Ferramentas de Desenvolvimento

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:


Dica: Use nossa ferramenta interativa para testar os endpoints diretamente no navegador!

On this page