📡 Lana Chat — API
Documentação dos endpoints. público = sem auth · install token = via /api/config-token/{token} · admin = header
x-admin-token🌐 Públicos
GET
/api/healthpúblicoStatus DB/Claude/Resend/MP + métricas 24h. 200 ok / 503 problema.
GET
/statuspúblicoHTML status page com auto-refresh 30s.
GET
/api/chat/{slug}/messagepúblicoCosmetic config do widget (cor, posição). Usado pelo widget.js.
POST
/api/chat/{slug}/messagepúblicoMensagem do widget. Body:
{message, sessionId, visitorId, history, page, referrer}. Rate-limited (default 20/min, override em config). Retorna {reply, hotLead, _blocked}. Headers de resposta: X-Request-Id (prefix lr_ — distributed tracing), X-RateLimit-Limit/Remaining/Reset (RFC draft), Retry-After em 429 (RFC 6585). CORS preflight cacheado 1h (Access-Control-Max-Age: 3600).GET
/r/{codigo}públicoRedirect tracking pra campanhas/QR codes. Codigo whitelist
[a-zA-Z0-9_-]{1,64}. Resposta: 302 → https://wa.me/<numero>?text=Codigo: <codigo>. Tracking best-effort no VPS upstream com X-Request-Id propagado.GET
/api/case-studiespúblicoLista de cases que index.html exibe. CDN cache 5min com SWR 10min. Fallback gracioso se VPS offline (cases vazios + 502).
GET
/api/vagas-disponiveispúblicoContagem de vagas restantes pra founding members (badge na home). CDN cache 60s + SWR 120s.
💳 Billing (Mercado Pago)
POST
/api/billing/mp-webhookpúblicoReceive webhook MP. Idempotente via webhook_processed.
POST
/api/billing/checkout/{token}install tokenCria checkout MP. Body:
{plano: 'pro'|'enterprise'}.POST
/api/billing/portal/{token}install tokenAbre portal MP de gestão da subscription.
👤 Tenant — install token
GET
/api/config-token/{token}tokenConfig completa do tenant.
GET
/api/config-token/{token}?op=dashboardtokenMétricas + agentInsights enriquecidos.
GET
/api/config-token/{token}?op=insightstokenConsolidado de insights gerados pelos agentes.
GET
/api/config-token/{token}?op=changelog&days=14tokenTimeline de decisões dos agentes.
GET
/api/config-token/{token}?op=faqstokenFAQs gerados + content_ideias + overrides.
GET
/api/config-token/{token}?op=hotleadstokenHot leads recentes.
GET
/api/config-token/{token}?op=export-csv&dias=30tokenExport CSV das conversations.
POST
/api/config-token/{token}?op=traintokenAdiciona conhecimento custom. Body:
{conteudo}.POST
/api/config-token/{token}?op=faq-addtokenAdiciona FAQ manual. Body:
{pergunta, resposta}.POST
/api/config-token/{token}?op=faq-removetokenRemove FAQ por índice.
POST
/api/config-token/{token}?op=faqs-importtokenBulk import. Body:
{faqs:[{pergunta,resposta_canonica}]}.POST
/api/config-token/{token}?op=webhook-configtokenConfigura webhookUrl + secret. Auto-detecta Slack/Discord.
POST
/api/config-token/{token}?op=widget-configtokenCor + posição do widget.
POST
/api/config-token/{token}?op=signaltokenRecebe sinal externo. Verifica HMAC se signalSecret configurado.
POST
/api/config-token/{token}?op=signal-secrettokenConfigura HMAC secret pra validar signals.
🛠️ Admin — agentes
GET
/api/cron/agents-tick?agent=XadminRoda agente X pra todos tenants.
GET
/api/cron/agents-tick?pipeline=daily|daily-fast|daily-claude|weeklyadminRoda pipeline.
GET
/api/admin/rerun-agent?slug=X&agent=YadminRoda agente Y só pra tenant X.
GET
/api/admin/run-pipeline-tenant?slug=X&pipeline=YadminRoda pipeline inteira pra tenant X.
GET
/api/admin/agent-list-tenant?slug=XadminLista agentes + status pause/active.
POST
/api/admin/agent-pause?slug=X&agent=Y&action=pause|resumeadminPausa/ativa agente por tenant.
POST
/api/admin/bulk-pause-global?agent=X&action=pause|resumeadminPausa/ativa agente globalmente.
GET
/api/admin/agent-state?slug=X[&agent=Y]adminState agentes do tenant.
GET
/api/admin/agent-error-rate?days=7adminTaxa de erro por agente.
GET
/api/admin/agent-suggestionsadminCross-tenant: todos proposed_overrides + proposed_faqs.
GET
/api/admin/agent-stats?days=7&slug=XadminReports + tokens IN/OUT por agente.
📋 Admin — tarefas
GET
/api/admin/tasks?status=open&slug=&limit=100adminLista agent_tasks.
POST
/api/admin/task-update?id=N&action=close|cancel|reopen|priorityadminAtualiza status/prioridade.
POST
/api/admin/tasks-bulk?action=close|canceladminBulk actions com filtros (slug, agent, older_than_days).
🔍 Admin — observability
GET
/api/admin/system-overviewadminStats globais.
GET
/api/admin/changelog?slug=&days=30adminTimeline cross-tenant.
GET
/api/admin/metricsadminFormato OpenMetrics (Prometheus).
GET
/api/admin/heatmap?slug=X&days=14adminGrid hora × dia da semana.
GET
/api/admin/latency-stats?slug=&days=7adminp50/p95/p99 da latência Claude.
GET
/api/admin/conversion-by-page?slug=X&days=14adminTaxa de hot lead por landing page.
GET
/api/admin/quick-stats?slug=Xadmin1-query agregado (lightweight).
GET
/api/admin/usage-by-tenantadminConsumo do mês vs limite.
GET
/api/admin/recent-sessions?slug=X&limit=30adminÚltimas sessões 7d.
GET
/api/admin/session-replay?slug=X&session_id=YadminReconstrói transcript completo.
GET
/api/admin/replay-suggest?slug=X&session_id=YadminClaude analisa e sugere respostas melhores.
GET
/api/admin/search-conversations?slug=X&q=textoadminFull-text search.
GET
/api/admin/top-questions?slug=X&days=14adminPerguntas mais frequentes.
GET
/api/admin/events-stream?slug=&type=&limit=100adminLatest events filtered.
GET
/api/admin/onboarding-checklist?slug=Xadmin10 checks de implantação.
🛡️ Admin — segurança/abuse
GET
/api/admin/abuse-list?slug=&blocked=1adminLista abuse_signals.
POST
/api/admin/abuse-toggle?slug=X&visitor_id=Y&blocked=trueadminBloqueia/desbloqueia visitor.
GET
/api/admin/unblock-abuse?slug=X&visitor_id=YadminAtalho pra desbloquear.
⚙️ Admin — config / overrides
POST
/api/admin/override-decide?slug=X&key=tone&decision=approve|rejectadminAprova/rejeita proposed_override do healer.
GET
/api/admin/overrides-pendingadminLista global de propostas pendentes.
GET
/api/admin/snapshots-list?slug=XadminSnapshots disponíveis pro tenant.
GET
/api/admin/snapshot-config?slug=XadminCria snapshot agora.
POST
/api/admin/restore-config?slug=XadminRestaura config. Body:
{config}.GET
/api/admin/diff-config?slug=X&a=DATE&b=currentadminDiff entre snapshots.
👥 Admin — tenant
POST
/api/admin/tenant-createadminCria tenant. Body:
{slug, nome_empresa, email_owner, url_site, trial_dias}. trial_dias = dias de cortesia até trial_ends_at (legado nome; modelo atual é garantia 7d money-back). Retorna installToken + snippet.GET
/api/admin/extend-grace?slug=X&dias=NadminEstende cortesia (trial_ends_at) em N dias (1-90). Alias
extend-trial mantido pra compat.GET
/api/admin/tenant-search?q=textoadminBusca por slug/nome/email.
GET
/api/admin/tenant-dashboard?slug=XadminDashboard agregado.
POST
/api/admin/cleanup-tenant?slug=X&confirm=yes-i-am-sureadminLGPD right-to-erasure. Cascade delete + snapshot final.
GET
/api/admin/bulk-export-configsadminBackup off-site de tenants + configs.
GET
/api/admin/export-csv?slug=X&type=conversations|tasks|hot-leadsadminCSV download.
GET
/api/admin/lana-self-test?slug=XadminTesta Claude com pergunta padrão.
GET
/api/admin/webhook-test?slug=XadminEnvia payload sample no webhookUrl.
GET
/api/admin/test-email?to=email@x.comadminValida Resend.
GET
/api/admin/admin-digest?email=&dry_run=1adminTop 3 problemas semanais (e-mail).
GET
/api/admin/healer-batchadminForça healer pra todos tenants.
GET
/api/admin/magic-link?slug=X&ttl_h=24adminURL signed pro owner ver dashboard.
⚙️ Crons (Vercel)
GET
/api/cron/cold-huntercron05:00 UTC — hunt + enrich prospects.
GET
/api/cron/outreach-tickcron13:00 UTC — outreach steps.
GET
/api/cron/trial-watchcron14:00 UTC — cortesia expiring (verifica trial_ends_at < +3d/1d, avisa owner).
GET
/api/cron/healercron06:00 UTC — healer global.
GET
/api/cron/daily-digestcron11:00 UTC — owner digests.
GET
/api/cron/agents-tick?pipeline=dailycron11:30 UTC — pipeline diária 26 agentes.
GET
/api/cron/agents-tick?pipeline=daily-claudecron12:00 UTC — pipeline Claude-heavy.
GET
/api/cron/agents-tick?pipeline=weeklycron22:00 UTC domingo — 19 agentes weekly.
GET
/api/cron/compresscron04:00 dia 1 — compacta events >90d.
GET
/api/cron/abuse-cleanupcron05:00 segunda — limpa abuse_signals antigos.
📞 Voz (Twilio) — Em breve · não disponível em produção
POST
/api/voice/incomingpúblico (Twilio)🔮 Em breve. Twilio webhook pra ligação inbound. Retorna TwiML que conecta áudio bidirecional ao WS no VPS (voice.lanachat.com.br). X-Twilio-Signature validado se TWILIO_AUTH_TOKEN configurado.
POST
/api/voice/statuspúblico (Twilio)🔮 Em breve. Status callbacks do Twilio (ligação iniciada/finalizada). Logs estruturados pra observability.
🔄 Misc
POST
/api/demo/messagepúblicoDemo chat público (lanachat-demo). Sem persistência. Rate-limited por IP.
ANY
/api/proxy?p=<path>adminProxy reverso pra VPS. Path whitelist
[a-zA-Z0-9_/-]{1,200}, body cap 1MB, timeout 20s. Propaga security headers + X-RateLimit do upstream.