{"openapi":"3.0.3","info":{"title":"ApiSwt","version":"0.1.0","description":"Selecione uma rota e use Try it out para testar. Rotas protegidas exigem um token de integração e permissão para a transportadora informada. O contrato LEVER está pendente de homologação."},"servers":[{"url":"/","description":"Servidor desta documentação"}],"tags":[{"name":"Saúde","description":"Verifique o processo e a conexão com o banco da ApiSwt."},{"name":"Acessos","description":"Consulte os acessos concedidos à integração. A leitura de credencial exige auditoria."},{"name":"Webhooks","description":"Receba eventos de rastreamento da LEVER. Contrato proposto; ainda sem envio de push."},{"name":"Eventos","description":"Consulte os eventos recebidos de uma transportadora autorizada."}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Informe apenas o token swt_…; o prefixo Bearer é adicionado automaticamente. Use um token criado para esta integração."}},"schemas":{"LeverEvent":{"type":"object","additionalProperties":false,"required":["eventId","type","tenantId","trackingId","status","occurredAt"],"properties":{"eventId":{"type":"string","minLength":1,"maxLength":160,"example":"teste-swagger-001"},"type":{"type":"string","enum":["tracking.status_changed"]},"tenantId":{"type":"string","format":"uuid","example":"11111111-1111-4111-8111-111111111111"},"trackingId":{"type":"string","minLength":1,"maxLength":160,"example":"encomenda-teste-123"},"status":{"type":"string","minLength":1,"maxLength":80,"example":"EM_ROTA"},"occurredAt":{"type":"string","format":"date-time","example":"2026-10-21T12:00:00-03:00"}}}}},"paths":{"/health":{"get":{"tags":["Saúde"],"summary":"Verificar se a API está em execução","responses":{"200":{"description":"Processo ativo; não verifica dependências"}}}},"/ready":{"get":{"tags":["Saúde"],"summary":"Verificar a conexão com o banco da ApiSwt","responses":{"200":{"description":"Banco ApiSwt pronto"},"503":{"description":"Banco indisponível ou migrations pendentes"}}}},"/api/v1/robot/acessos":{"get":{"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Objeto data com acessos e finalidade"},"400":{"description":"Parâmetros inválidos"},"401":{"description":"Token ausente, inválido, expirado ou revogado"},"403":{"description":"Escopo ou tenant não autorizado"},"429":{"description":"Limite por minuto excedido"},"503":{"description":"Dependência indisponível"}},"tags":["Acessos"],"summary":"Listar acessos ativos autorizados, sem CPF ou senha","description":"Requer o escopo acessos:read. tenantId é o UUID autorizado no token, não o domínio SSW.","parameters":[{"name":"tenantId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"sistema","in":"query","schema":{"type":"string","maxLength":80}}]}},"/api/v1/robot/acessos/{id}/credencial":{"post":{"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Objeto data com id, dominio, sistema, usuario, cpf e senha"},"400":{"description":"Parâmetros inválidos"},"401":{"description":"Token ausente, inválido, expirado ou revogado"},"403":{"description":"Escopo ou tenant não autorizado"},"404":{"description":"Acesso indisponível ou não concedido"},"429":{"description":"Limite por minuto excedido"},"503":{"description":"Dependência indisponível"}},"tags":["Acessos"],"summary":"Consultar uma credencial autorizada","description":"Requer credenciais:read e permissão para o ID informado. A resposta contém a senha; a consulta é auditada. Não requer corpo.","parameters":[{"name":"tenantId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/api/v1/webhooks/lever/rastreamento":{"post":{"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Evento repetido, sem nova gravação"},"202":{"description":"Persistido; NÃO significa push enviado"},"400":{"description":"Evento inválido"},"401":{"description":"Token ausente, inválido, expirado ou revogado"},"403":{"description":"Escopo ou tenant não autorizado"},"409":{"description":"Mesmo eventId com conteúdo diferente"},"413":{"description":"Corpo acima de 32 KiB"},"415":{"description":"Content-Type inválido"},"429":{"description":"Limite por minuto excedido"},"503":{"description":"Dependência indisponível"}},"tags":["Webhooks"],"summary":"Receber uma mudança no rastreamento","description":"Requer webhooks:write. Use o mesmo eventId nos reenvios: um evento equivalente retorna duplicate: true. Os UUIDs dos exemplos são fictícios.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeverEvent"}}}}}},"/api/v1/eventos":{"get":{"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Objeto data com eventos do tenant autorizado"},"400":{"description":"Parâmetros inválidos"},"401":{"description":"Token ausente, inválido, expirado ou revogado"},"403":{"description":"Escopo ou tenant não autorizado"},"429":{"description":"Limite por minuto excedido"},"503":{"description":"Dependência indisponível"}},"tags":["Eventos"],"summary":"Consultar eventos recebidos","description":"Requer eventos:read e permissão para a transportadora.","parameters":[{"name":"tenantId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"minimum":1,"maximum":100}},{"name":"offset","in":"query","schema":{"type":"integer","default":0,"minimum":0,"maximum":100000}}]}}}}