Skip to content

Referência da API

A especificação viva é gerada pelo huma e fica disponível na própria aplicação:

  • /docs — documentação interativa (Scalar)
  • /openapi.json — OpenAPI 3.1

Esta seção documenta o que o OpenAPI não expressa: o comportamento por trás de cada rota.

Todas as rotas

MétodoPathOperationIDTagVisível no OpenAPI
GET/pingpingHealth
GET/mfamfa-page
GET/mfa/batchmfa-batch-page
POST/mfa/send-tokenmfa-send-token
POST/smiles/loginsmiles-loginSmiles
POST/smiles/exists-sessionsmiles-exists-sessionSmiles
POST/smiles/deletesmiles-deleteSmiles
POST/smiles/account-infosmiles-account-infoSmiles
POST/smiles/account-statementsmiles-account-statementSmiles
POST/smiles/account-exp-pointssmiles-account-expiring-pointsSmiles
GET/smiles/dashboardsmiles-dashboardSmiles
POST/latam/loginlatam-loginLatam
POST/latam/exists-sessionlatam-exists-sessionLatam
POST/latam/deletelatam-deleteLatam
POST/azul/loginazul-loginAzul
POST/azul/exists-sessionazul-exists-sessionAzul
POST/azul/deleteazul-deleteAzul
GET/metrics❌ (registrado direto no chi)

Tudo é POST

Inclusive exists-session e delete, porque o CPF vai no corpo da requisição — nunca na URL. Isso evita CPF em log de acesso, em histórico de proxy e em URL de referrer.

Sem autenticação

O Khronos não tem autenticação nem autorização. Ele é um serviço interno, acessível apenas pela rede do cluster. Qualquer exposição externa precisaria de uma camada de auth na frente.

Comportamento comum

/{cia}/exists-session

json
{ "username": "12345678900" }

Resposta — sempre 200:

json
{ "message": "session found" }

Valores possíveis de message:

messageSignificado
session foundExiste valor na chave
session not foundChave vazia ou inexistente
an error occurred retrieving the sessionFalha ao consultar o Redis

"Existe" não é "vale"

A rota só verifica se há algo na chave. Ela não valida o JSON, não checa IsValid() e não checa expiração. Uma sessão expirada continua respondendo session found.

/{cia}/delete

json
{ "username": "12345678900" }

Resposta — sempre 200:

json
{ "success": true, "message": "success" }

Em falha do Redis, success: false e message com o erro. O status HTTP continua 200; verifique success.

DEL de chave inexistente é sucesso

O Redis não erra ao apagar algo que não existe, então success: true não garante que havia sessão.

/{cia}/login

Corpo comum a todas as companhias (variações em cada página específica):

json
{
  "username": "12345678900",
  "password": "senha",
  "keyType": "E",
  "keyToken": "usuario@exemplo.com",
  "proxyUrl": "http://user:pass@proxy:8080",
  "force": false,
  "session": false
}

Códigos de resposta possíveis:

StatusQuando
200Login concluído
401Refresh token inválido
403Bloqueio de antibot detectado
404Credencial inválida, código MFA incorreto ou token não encontrado no Pigeon
412Conta bloqueada por segurança
422Requisição inválida para a companhia, ou autenticador MFA não encontrado
428MFA necessário — reenvie com keyType e keyToken
500Antibot na Azul, erro indefinido de OAuth ou falha interna
502A companhia respondeu algo que não sabemos interpretar

O corpo de erro segue o formato RFC 7807 do huma:

json
{
  "$schema": "http://localhost:3000/schemas/ErrorModel.json",
  "title": "Precondition Required",
  "status": 428,
  "detail": "Solicitado codigo de verificacao"
}

Header X-Trace-ID

Toda resposta de rota registrada no huma traz X-Trace-ID. Use esse valor para achar o login inteiro no Graylog:

trace_id:"<valor do header>"

Ver Observabilidade.

/ping

bash
curl http://localhost:3000/ping
json
{ "message": "pong" }

É o health check configurado no Helm (HEALTHCHECK: /ping). Não verifica Redis nem dependências — responde pong enquanto o processo HTTP estiver de pé.

Documentação interna — 123milhas