Voz Seu Lobato API

Contrato OpenAPI: /openapi.json. As APIs usam JSON e datas UTC. Rotas de integração usam Authorization: Bearer <API_KEY>; páginas e gestão de conta/tenant usam cookie de sessão, com CSRF nas escritas.

Contas de pessoas usam entrada web em /login/; o console global em /admin/ exige papel de administrador. A chave de API continua exclusiva do discador legado e de integrações server-to-server; ela não cria uma conta de pessoa.

Widget React: autorize origens com PUT /api/v1/dialer/origins, gere grants de 90 segundos no backend com POST /api/v1/dialer/sessions e use o pacote @seulobato/voice-dialer descrito em sdk/react/README.md. O SDK de integração TypeScript está em sdk/typescript/README.md (@seulobato/voice-sdk). Os dois pacotes têm configuração local de build/empacotamento, mas ainda não foram publicados no npm nem validados com um CRM real. Os grants são de uso único e limitados ao tenant, à origem HTTPS autorizada e a uma sessão conectada; nunca envie uma API key ao browser.

Operações disponíveis

Estado de produção: release SaaS implantado em 2026-10-21. O serviço está ativo, as migrations 0001–0020 foram aplicadas, /healthz responde publicamente e /readyz exige bearer operacional (sem credencial retorna 404). As rotas públicas são servidas. O smoke visual público passou em desktop e celular; isso não comprova login administrativo autenticado, MFA, onboarding por e-mail, cobrança, CRM ou chamada VoIP após o release. SMTP, Mercado Pago e planos comerciais não estão configurados. Consulte ACCEPTANCE-REPORT.md.

Site e consoles SaaS

Recuperação de conta e e-mail

/login/ oferece recuperação e confirmação de e-mail. Tokens são de uso único e o banco guarda somente hashes: 30 minutos para redefinição de senha e 24 horas para confirmação de endereço. A página remove #reset_token=… ou #verify_token=… do endereço antes de enviar o token no corpo JSON. As rotas POST /auth/email/verify/request e POST /auth/email/verify usam resposta neutra, rate limit e proteção de origem; a confirmação revoga sessões existentes para exigir novo login. O login não cria sessão para conta com endereço não confirmado. A migration preserva timestamps/sessões legadas; convite manual não confirma e-mail. O bootstrap único cmd/admin-bootstrap marca como verificado o administrador inicial provisionado pelo operador e exige troca da senha inicial; contas comuns continuam exigindo confirmação por e-mail.

O sender SMTP é opcional e vendor-neutral. Configure VOICE_SMTP_HOST, VOICE_SMTP_FROM e, se necessário, VOICE_SMTP_PORT, VOICE_SMTP_TLS_MODE=starttls|implicit, VOICE_SMTP_USERNAME, VOICE_SMTP_PASSWORD, VOICE_SMTP_FROM_NAME e VOICE_SMTP_TIMEOUT. Para recuperação e confirmação, configure também VOICE_EMAIL_ENCRYPTION_KEY com base64 de 32 bytes aleatórios; a chave estável cifra destinatário e URL nas outboxes. O worker aplica até cinco tentativas e limpa o payload quando a mensagem é enviada, termina em falha ou expira. STARTTLS ou TLS implícito com validação de certificado é obrigatório. Sem SMTP, os endpoints de entrega respondem indisponível e não emitem token. Credenciais e chaves não devem ser registradas em logs nem versionadas.

Sessões e organizações da conta

Estas rotas usam a sessão web da própria pessoa. Escritas exigem origem permitida e proteção CSRF. As organizações exibidas vêm das memberships ativas e de tenants em estado active ou trialing; o servidor revalida a membership e o tenant a cada requisição.

Membros e convites

As rotas abaixo exigem cookie de conta com papel tenant_owner ou tenant_admin. O tenant é obtido da sessão autenticada; informar outro tenant_id não muda a autoridade. Escritas exigem CSRF. O último proprietário ativo não pode ser rebaixado nem desativado.

Auditoria do tenant

GET /api/v1/tenant/audit exige sessão web ativa de tenant_owner ou tenant_admin. O backend deriva o tenant do principal autenticado; não há parâmetro para escolher organização. A resposta lista eventos recentes das origens tenant, billing e account, sem metadata_json. O parâmetro opcional limit aceita de 1 a 200 e usa 50 por padrão. A resposta tem o formato {data:[{id,source,created_at,actor_id,action,resource_type,resource_id?,request_id?}],limit}; papel sem permissão responde 403 e falha de leitura responde 503.

A página /app/#audit oferece a visão Auditoria com estados de carregamento, lista vazia e erro/retentativa. Ela mostra data, origem, ator, ação, recurso e request ID. A leitura só retorna eventos da organização atual e o painel não apresenta metadados internos.

Central de notificações

GET /api/v1/tenant/notifications lista notificações do usuário autenticado na organização selecionada e inclui unread_count; GET /api/v1/tenant/notifications/unread-count retorna somente a contagem; POST /api/v1/tenant/notifications/{id}/read marca como lida e é idempotente. Todas exigem sessão de pessoa, membership ativa e tenant ativo ou em avaliação. A escrita também exige CSRF. A central em /app/#notifications atende todos os papéis ativos e mantém cada leitura por usuário.

A migration 0022 cria produtores idempotentes para chamadas encerradas/falhas, gravações prontas, transições reais do WhatsApp para desconectado e convites aceitos. Títulos e textos são constantes genéricas; não incluem número, segredo, token, payload, URL de mídia ou erro externo. Ainda não há produtor in-app para pagamento/fatura, falha de webhook, limite de uso, convite apenas enviado/recebido, verificação de e-mail, MFA/segurança ou WhatsApp conectado. Esses eventos precisam de contratos e origens persistidas antes de serem exibidos.

Exportação assíncrona de dados

POST /api/v1/tenant/data-exports requer sessão web de tenant_owner ou tenant_admin e o cabeçalho Idempotency-Key (8–128 caracteres). O tenant vem da sessão; o hash da chave é usado para devolver o mesmo job em reenvios. Há no máximo uma exportação em andamento por tenant. Consulte GET /api/v1/tenant/data-exports/{id} até o estado ready e baixe em GET /api/v1/tenant/data-exports/{id}/download. Cada etapa revalida o papel e o tenant. O pacote ZIP contém export.json e, se o diretório local estiver disponível, gravações WAV ready/partial que passem validação de caminho, tamanho, hash e formato. Se um arquivo local esperado estiver ausente ou inválido, o job falha; quando o root inteiro não está disponível, o JSON explica que o áudio foi omitido. Não exporta senhas, hashes de credenciais, tokens, URLs/segredos de webhook, payloads, caminhos locais ou metadata detalhada de auditoria.

O arquivo é gravado em diretório privado local, servido diretamente apenas pela rota autenticada, sem link público/assinado, e removido após 24 horas. O worker remove arquivos expirados e órfãos e mantém os registros expirados/falhos por até 90 dias. O limite padrão é 2 GiB de conteúdo descompactado e pode ser ajustado com VOICE_TENANT_EXPORT_MAX_BYTES entre 20 MiB e 10 GiB. VOICE_TENANT_EXPORT_DIR deve estar fora do armazenamento de sessões e gravações; o padrão é /var/lib/voz-seulobato/exports. MariaDB é lido em uma transação e os WAVs são copiados durante o job; banco e gravações não formam um snapshot atômico.

API keys do tenant

Gerenciamento requer sessão web de proprietário ou administrador do tenant e proteção CSRF. O segredo nunca aparece na listagem e é mostrado uma única vez na criação/rotação; salve-o ao recebê-lo.

Planos, entitlements e faturamento

Ciclo de vida administrativo

As rotas de ciclo de vida estão implantadas na produção para platform_admin, com cookie de conta e CSRF. A implementação registra alterações e transições rejeitadas em auditoria append-only. As migrations correspondentes foram aplicadas; o aceite do fluxo administrativo autenticado e da ativação MFA ainda está pendente.

Autenticação em dois fatores

No checkout local, MFA é opcional para todos os papéis. Quando ativado, cada login exige TOTP ou código de recuperação; o usuário pode desativar MFA confirmando a senha e um código válido. Sem fator ativo, login usa e-mail e senha. O release de produção 92daf32 ainda exigia MFA para platform_admin; a mudança só terá efeito no domínio depois de uma publicação validada.

Auditoria da plataforma

GET /api/v1/platform/audit é exclusiva de platform_admin e agrega eventos das origens platform, billing, tenant e account, do mais recente para o mais antigo. Parâmetros opcionais: limit (padrão 50, entre 1 e 200) e tenant_id (até 64 caracteres). A resposta contém {data:[{id,source,created_at,actor_id,tenant_id?,action,resource_type,resource_id?,request_id?,metadata_json}],limit}; filtros inválidos respondem 400 e falha de leitura responde 503.

O painel e a rota de auditoria estão implantados em /admin/, com estados de carregamento, vazio e erro, além de filtros por organização/limite. Mostra data, origem, ator, organização, ação, recurso e request ID; omite metadata_json. A tela pública foi revisada sem autenticação; a listagem administrativa e a auditoria exigem sessão e ainda aguardam aceite browser autenticado.

Exemplo

curl -H 'Authorization: Bearer SUA_API_KEY' https://voz.seulobato.com/api/v1/sessions