Instalação Arquitetura v1.0.0
REST · JSON JWT Bearer Rate Limiting

Referência completa da API

Todos os endpoints documentados com exemplos curl, parâmetros, payloads e respostas. Base URL: https://<host>

1Introdução

A API segue as convenções REST. Todas as respostas são em JSON (Content-Type: application/json). O versionamento fica no path: /api/v1/.

PropriedadeValor
Base URLhttps://<host>/api/v1
WebSocketwss://<host>/ws
FormatoJSON
AutenticaçãoBearer Token (JWT)
Docs interativoshttps://<host>/docs?token=<jwt>

2Autenticação

A API usa JWT Bearer. Faça login para obter o par access_token (30 min) e refresh_token (7 dias). Inclua o access_token no header de todas as requisições autenticadas:

http
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Quando o access_token expirar, use o endpoint POST /auth/refresh com o refresh_token para obter novos tokens sem re-login.

ℹ️ Roles disponíveis

readonlyoperatoradminsuperadmin. A role mínima de cada endpoint está indicada nos exemplos abaixo.

3Códigos de Resposta HTTP

CódigoSignificado
200Sucesso (leitura)
201Criado com sucesso
204Sem conteúdo (ex.: logout)
400Requisição inválida (validação Pydantic / parâmetro incorreto)
401Não autenticado (token ausente, expirado ou inválido)
403Acesso negado (role insuficiente ou usuário desabilitado)
404Recurso não encontrado
422Entidade não processável (schema Pydantic)
429Muitas requisições (rate limit)
500Erro interno do servidor
503Controlador UniFi indisponível / circuit breaker aberto

4Formato de Erros

json
{
  "detail": "Token expirado ou inválido",
  "status_code": 401,
  "request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

Para erros de validação (422), Pydantic retorna um array detail com os campos inválidos.

5Auth /api/v1/auth

POST /api/v1/auth/login
Público10 req/min por IP

Autentica um usuário e retorna o par de tokens JWT.

Request Body

json
{ "username": "admin", "password": "SenhaSegura123" }

Resposta 200

json
{
  "access_token":  "eyJ...",
  "refresh_token": "eyJ...",
  "token_type":    "bearer",
  "expires_in":    1800,
  "user": { "username": "admin", "role": "admin", "full_name": "Admin" }
}

Errors

401 — credenciais inválidas · 403 — usuário desabilitado · 429 — rate limit

Exemplo curl

bash
curl -s -X POST https://<host>/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"SenhaSegura123"}'
POST/api/v1/auth/refresh
Público

Renova o access_token usando o refresh_token. O refresh_token antigo é revogado e um novo é emitido (Token Rotation).

Request Body

json
{ "refresh_token": "eyJ..." }

Resposta 200

json
{ "access_token": "eyJ...", "refresh_token": "eyJ...", "token_type": "bearer", "expires_in": 1800 }

401 — token inválido ou expirado

POST/api/v1/auth/logout
JWT

Revoga o refresh_token informado, inserindo-o na blacklist.

Request Body

json
{ "refresh_token": "eyJ..." }

Resposta: 200 {"message": "Logout realizado com sucesso"}

GET/api/v1/auth/me
JWT

Retorna dados do usuário autenticado no token.

json
{ "id":1, "username":"admin", "role":"admin", "full_name":"Admin", "email":"admin@empresa.com", "last_login":"2025-03-01T10:00:00" }

6Usuários /api/v1/users

POST/api/v1/users/Criar usuário
admin

Cria um novo usuário. A role deve ser menor ou igual à role do criador.

json — request
{
  "username":  "joao.silva",     // 3–50 chars, regex [a-zA-Z0-9_\-.]+
  "password":  "Senha@2025",      // mínimo 8 caracteres
  "full_name": "João Silva",
  "email":     "joao@empresa.com",
  "role":      "operator"          // readonly | operator | admin | superadmin
}

Resposta: 201 com objeto do usuário criado (sem hashed_password).

GET/api/v1/users/Listar usuários
admin

Lista todos os usuários. Resposta: array de objetos User.

bash
curl -H "Authorization: Bearer $TOKEN" https://<host>/api/v1/users/
GET/api/v1/users/mePerfil próprio
JWT

Retorna perfil do usuário autenticado. Qualquer role pode acessar.

PUT/api/v1/users/meAtualizar perfil
JWT

Altera full_name e email do próprio usuário. Não pode alterar role.

json
{ "full_name": "João da Silva", "email": "novo@empresa.com" }
PUT/api/v1/users/me/passwordAlterar senha
JWT

Altera a própria senha. Exige confirmação da senha atual.

json
{ "current_password": "SenhaAtual123", "new_password": "NovaSenha456" }

400 se senha atual incorreta · 400 se senha nova < 8 chars

PUT/api/v1/users/{user_id}Atualizar usuário
admin

Atualiza full_name, email, role, disabled de qualquer usuário. Invalida o cache do usuário modificado.

json
{ "role": "readonly", "disabled": true }
DELETE/api/v1/users/{user_id}Desabilitar usuário
admin

Desabilita (soft delete) o usuário. Não é possível deletar o próprio usuário autenticado.

400 — tentativa de deletar a si mesmo

7Controladores — CRUD /api/v1/controllers

POST/api/v1/controllers/Criar controlador
admin

Cadastra um novo controlador UniFi. A senha é criptografada com Fernet AES-128 antes de ser armazenada.

json — request
{
  "name":       "Filial SP",
  "host":       "192.168.1.100",
  "port":       8443,
  "username":   "admin",
  "password":   "senhaUnifi",
  "site":       "default",
  "verify_ssl": false,
  "enabled":    true
}

Resposta: 201 com objeto do controlador (sem senha em texto claro).

Nota

Após criação, o ControllersManager é recarregado automaticamente e inicia sessão com o novo controlador.

GET/api/v1/controllers/Listar controladores
operator

Query Params

ParâmetroTipoPadrãoDescrição
enabled_onlybooltrueFiltrar apenas controladores habilitados
GET/api/v1/controllers/{controller_id}Detalhes
operator

Retorna detalhes de um controlador pelo ID. Senha nunca é retornada.

PUT/api/v1/controllers/{controller_id}Atualizar
admin

Atualiza os dados do controlador. Dispara reload do ControllersManager.

json
{ "name": "Filial SP — Atualizado", "enabled": false }
DELETE/api/v1/controllers/{controller_id}
admin

Remove o controlador do banco e do ControllersManager.

POST/api/v1/controllers/{controller_id}/reloadForçar reload
admin

Reinicia a sessão do controlador específico no ControllersManager, reabrindo a conexão aiohttp.

8Controladores — Dados /api/v1/controllers

GET/api/v1/controllers/statusStatus de todos
JWT

Retorna status de saúde em tempo real de todos os controladores cadastrados.

json — resposta
[{
  "id": 1, "name": "Filial SP", "host": "192.168.1.100",
  "online": true, "response_time_ms": 42,
  "circuit_breaker": "closed"
}]
GET/api/v1/controllers/summary/statisticsEstatísticas agregadas
JWT

Total de controladores, percentual online, tempo médio de resposta, totais de clientes e dispositivos.

GET/api/v1/controllers/all/devicesTodos dispositivos
JWT

Dispositivos de todos os controladores em uma única lista agregada.

GET/api/v1/controllers/all/clientsTodos clientes
JWT

Clientes (connectados) de todos os controladores agregados.

GET/api/v1/controllers/{controller_id}/devicesDispositivos de um controlador
JWT

Lista dispositivos de um controlador específico pelo ID.

GET/api/v1/controllers/{controller_id}/clientsClientes de um controlador
JWT

Clientes básicos de um controlador específico.

9Dispositivos /api/v1/device

GET/api/v1/device/{controller_id}Listar dispositivos
JWT

Query Params

ParâmetroTipoDescrição
device_typestringFiltrar por tipo: uap, usw, ugw
statestringFiltrar por estado: online, offline
pageintPágina (default: 1)
page_sizeintItens por página (default: 50, max: 200)
json — resposta
{
  "items": [{ "mac":"aa:bb:cc:dd:ee:ff", "name":"AP-Recepção", "type":"uap", "state":"online", "model":"U6-Lite" }],
  "total": 12, "page": 1, "page_size": 50,
  "summary": { "online": 10, "offline": 2 }
}
GET/api/v1/device/{controller_id}/{mac_address}Detalhes do dispositivo
JWT

Retorna detalhes completos de um dispositivo pelo MAC.

POST/api/v1/device/{controller_id}/{mac_address}/rebootReiniciar dispositivo
operator

Envia comando de reboot para o dispositivo via API UniFi (cmd/devmgr).

bash
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
  "https://<host>/api/v1/device/1/aa:bb:cc:dd:ee:ff/reboot"

10Clientes /api/v1/clients

GET/api/v1/clients/{controller_id}Listar clientes
JWT

Query Params

ParâmetroTipoDescrição
connection_typestringwireless ou wired
is_guestboolFiltrar apenas guests
page / page_sizeintPaginação

Retorna hostname, IP, MAC normalizado, SSID, banda, RSSI, signal% para wireless. Porta de switch para wired.

GET/api/v1/clients/{controller_id}/summaryResumo
JWT

Contagens: total, wireless, wired, guest, blocked.

GET/api/v1/clients/{controller_id}/{mac}Detalhes
JWT

Detalhes completos de um cliente pelo MAC.

POST/api/v1/clients/{controller_id}/{mac}/blockBloquear cliente
operator

Bloqueia o cliente no controlador UniFi via cmd/stamgr.

POST/api/v1/clients/{controller_id}/{mac}/unblockDesbloquear client
operator

Desbloqueia um cliente previamente bloqueado.

11Rede /api/v1/network

GET/api/v1/network/{controller_id}/wlansSSIDs
JWT

Lista SSIDs com contagem de clientes, VLAN herdada de networkconf. Suporta filtro enabled_only.

Consulta em paralelo: wlanconf + networkconf + sta.

GET/api/v1/network/{controller_id}/networksVLANs/redes
JWT

Redes configuradas: VLAN ID, subnet CIDR, DHCP habilitado, dot1x enabled.

GET/api/v1/network/{controller_id}/routingRoteamento
JWT

Tabela de rotas do controlador.

GET/api/v1/network/{controller_id}/statusStatus da rede
JWT

Resumo da rede: total de redes, VLANs, WLANs habilitadas.

12Segurança /api/v1/security

GET/api/v1/security/{controller_id}/alertsAlertas
JWT

Alertas de segurança enriquecidos com nome do AP (mac → name). Paginação via page / page_size.

POST/api/v1/security/{controller_id}/alerts/archive-allArquivar todos
operator

Arquiva todos os alertas ativos via cmd/evtmgr no controlador.

POST/api/v1/security/{controller_id}/alerts/archive-bulkArquivar lote
operator

Arquiva múltiplos alertas em paralelo (asyncio.gather).

json
{ "alert_ids": ["id1", "id2", "id3"] }
GET/api/v1/security/{controller_id}/alerts/{alert_id}Detalhe do alerta
JWT

Retorna detalhes de um alerta específico pelo ID.

GET/api/v1/security/{controller_id}/firmwareFirmware
JWT

Versão de firmware de todos os dispositivos. Flag upgradable: true caso haja atualização disponível.

GET/api/v1/security/{controller_id}/statusVisão geral de segurança
JWT

Resumo: total de alertas ativos, dispositivos com firmware desatualizado.

13Logs /api/v1/logs

GET/api/v1/logs/{controller_id}/recentEventos recentes
JWT

Query Params

ParâmetroTipoPadrãoDescrição
hoursint24Janela de tempo em horas (1–168)
categorystringwlan / admin / network / wan / vpn / ips / client / system
GET/api/v1/logs/{controller_id}/eventsTodos os eventos
JWT

Todos os eventos sem filtro de janela de tempo. Suporta paginação.

GET/api/v1/logs/{controller_id}/alertsAlertas ativos
JWT

Alertas ativos do log (não arquivados).

GET/api/v1/logs/{controller_id}/summaryResumo de eventos
JWT

Contagem de eventos por categoria e nível de severidade.

14Métricas /api/v1/metrics

GET/api/v1/metrics/throughput/{controller_id}Throughput TX/RX
JWT

Histórico de throughput em Mbps para o controlador. Use controller_id=0 para agregado de todos.

Query Params

ParâmetroValoresJanela
rangesÚltimos 3 min (pontos de 30s)
rangemÚltimos 30 min (pontos de 1min)
rangehÚltimas 2h (pontos de 5min)
json — resposta
{
  "controller_id": 1,
  "source": "influxdb",
  "data": [
    { "time": "2025-03-01T10:00:00Z", "tx_mbps": 45.2, "rx_mbps": 22.8 },
    { "time": "2025-03-01T10:00:30Z", "tx_mbps": 50.1, "rx_mbps": 25.3 }
  ]
}
Fallback

Se o InfluxDB estiver indisponível, o campo source será "buffer" e os dados virão do ring buffer em memória.

15Auditoria /api/v1/audit

GET/api/v1/audit/logsLogs de auditoria
superadmin

Query Params

ParâmetroTipoDescrição
usernamestringFiltrar por usuário
actionstringFiltrar por ação (ex.: login, user_create)
statusstringsuccess / failure
hoursintJanela de horas (1–8760, default 168)
page / page_sizeintPaginação
bash
curl -H "Authorization: Bearer $TOKEN" \
  "https://<host>/api/v1/audit/logs?action=login&status=failure&hours=24"
GET/api/v1/audit/statsEstatísticas de auditoria
superadmin

Resumo: total de eventos, eventos por ação, eventos por usuário, taxa de falhas.

16Telegram /api/v1/telegram

GET/api/v1/telegram/configObter config
superadmin

Retorna configuração do bot. O token é mascarado (tok6…n4).

PUT/api/v1/telegram/configSalvar config
superadmin
json
{
  "bot_token":              "123456:ABC-DEF...",
  "chat_id":               "-100123456789",
  "enabled":              true,
  "alert_offline":        true,
  "alert_high_latency":   true,
  "latency_threshold_ms": 500,
  "cooldown_minutes":     15
}
POST/api/v1/telegram/testEnviar mensagem de teste
superadmin

Envia uma mensagem de teste para o chat configurado. 400 se bot_token ou chat_id inválidos.

17Reset de Senha /api/v1/auth

POST/api/v1/auth/password-reset/requestSolicitar reset
Público5 req/min por IP

Solicita reset via e-mail. Sempre retorna 200 mesmo se o e-mail não existir (anti-enumeração).

json
{ "email": "usuario@empresa.com" }

Resposta: {"message": "Se o e-mail existir, você receberá as instruções."}

POST/api/v1/auth/password-reset/confirmConfirmar reset
Público

Confirma o reset com token recebido por e-mail e define nova senha.

json
{
  "token":        "abc123token",
  "new_password": "NovaSenha@2025"
}

Requisitos: ≥8 chars, ≥1 maiúscula, ≥1 minúscula, ≥1 dígito.

400 — token inválido/expirado ou senha fora dos requisitos.

18Configurações /api/v1/settings

GET/api/v1/settings/envLer .env
superadmin

Retorna pares chave-valor do arquivo .env. Campos sensíveis são mascarados com ••••.

PUT/api/v1/settings/envAtualizar .env
superadmin

Atualiza variáveis no .env preservando comentários e linhas em branco. Reinicia o serviço via systemctl restart unifi-api.

json
{ "SMTP_HOST": "smtp.empresa.com", "SMTP_PORT": "587" }
⚠️ Atenção

Este endpoint reinicia o serviço após a atualização. Use com cautela em produção.

POST/api/v1/settings/smtp/testTestar SMTP
superadmin

Envia e-mail de teste com as configurações SMTP atuais.

19WebSocket wss://<host>/ws

WS/ws/statusStatus de todos os controladores
JWT via 1ª msg

Stream de status de todos os controladores, atualizado a cada 10 segundos.

Protocolo de conexão

javascript
const ws = new WebSocket("wss://<host>/ws/status");
ws.onopen = () => {
  // 1. Autenticar enviando o token como 1ª mensagem
  ws.send(JSON.stringify({ token: "eyJ..." }));
};
ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log(data); // Array de status dos controladores
};
ℹ️ Limite de conexões

Máximo de 5 conexões simultâneas por endereço IP. Exceder retorna 4008 Too many connections.

Payload recebido (a cada 10s)

json
[{
  "id": 1, "name": "Filial SP", "online": true,
  "wlan_clients": 42, "wired_clients": 5,
  "alarms": 0, "response_time_ms": 38
}]
WS/ws/controller/{controller_id}Controlador específico
JWT via 1ª msg

Stream detalhado de um único controlador. Inclui contagens de dispositivos, clientes e alarmes.

20Health & Info

GET/healthHealth check
Público

Verifica a saúde da aplicação. Ideal para probe de liveness no systemd/Kubernetes.

json
{ "status": "healthy", "version": "1.0.0", "uptime_seconds": 3600 }
GET/infoInformações do sistema
Público

Versão da API, ambiente, total de controladores registrados.

GET/Root
Público

Mensagem de boas-vindas com links para /health e /docs.