Histórico filtrado das mudanças que afetam API REST v1, SDK TypeScript, contrato OpenAPI, webhooks, rate limits e comportamento de endpoints públicos.
Última mudança relevante
v1.0.467
Bootstrap pg_cron sem edição manual da apikey
164 de 164 mudança(s) pública(s) de API.
v1.0.467
Infra
12 de jul. de 2026
Bootstrap pg_cron sem edição manual da apikey
api
Card `Bootstrap pg_cron` agora injeta automaticamente a chave pública do backend no header `apikey` quando ela está disponível no Diagnóstico.
Roteiro operacional passa a tratar o SQL da página de Diagnóstico como fonte preferencial e mantém placeholder genérico apenas para cópia manual.
v1.0.466
Correção
12 de jul. de 2026
CORS dos crons compatível com SDK
apiendpointendpointssdkrate limit
Preflight CORS dos endpoints `/api/public/cron/*` agora permite `X-DestrIA-Version`, usado pelo SDK público.
Headers permitidos foram padronizados para chamadas browser/server com `apikey`, mantendo JSON estrito e rate limit.
v1.0.465
Infra
12 de jul. de 2026
Crons alinhados ao padrão apikey do pg_cron
apisdk
`/api/public/cron/*` agora autentica pelo header `apikey` com a chave pública/anon do backend, compatível com `pg_net`.
Bootstrap pg_cron, Diagnóstico, Smoke e SDK deixam de depender de `CRON_SECRET`/`X-Destria-Cron-Secret`.
Roteiro operacional foi atualizado para remover o segredo customizado de cron e reduzir fricção de setup.
v1.0.463
Infra
12 de jul. de 2026
Operação E2E: workers SMTP/IMAP ligados aos crons públicos
apisdkbearer
Novas rotas `/api/public/cron/send-worker-smtp` e `/api/public/cron/imap-poll` delegam para os workers Deno do Lovable Cloud mantendo autenticação por `apikey`/Bearer e body limitado.
`campaigns-dispatch` agora tenta o worker SMTP quando Resend não está conectado; sem transporte real de campanhas, continua retornando `503 transport_not_configured` e preservando a fila em `queued`.
Envios reais passam por claim `queued → sending` antes do provedor para reduzir duplicidade em crons concorrentes, com migration aceitando `sending` e `dead_letter` em `campaign_sends.status`.
Cadastro de conta SMTP/IMAP com nova credencial chama `connection-test` real antes de persistir segredo, bloqueando credenciais inválidas com mensagem clara.
Roteiro operacional, SDK e smoke de diagnóstico foram depois alinhados ao padrão `apikey` do `pg_net` para reduzir fricção de setup.
v1.0.462
Infra
12 de jul. de 2026
SDK: constantes públicas de versão em runtime
apiopenapisdkpostmanv1
`/api/v1/sdk.ts` agora exporta `SDK_VERSION` e `OPENAPI_VERSION`, permitindo que workers e clientes validem a versão baixada sem depender apenas de headers HTTP.
`DestriaClient` ganhou a propriedade pública `readonly sdkVersion`, sincronizada com `X-DestrIA-SDK-Version`, para logs, health checks e guards de boot em integrações externas.
O gate `sdk:surface`, `contract-check` e health passam a validar as constantes runtime e a propriedade `client.sdkVersion`; OpenAPI/Postman acompanham o release público `1.0.462`.
v1.0.460
Infra
12 de jul. de 2026
CI: gate artifact:versions + assertions Newman para headers de versão
apiendpointendpointsopenapisdk
Novo gate `artifact:versions` em `scripts/ci/run-gates.mjs` executa `scripts/ci/artifact-versions-gate.mjs`, que valida `X-DestrIA-OpenAPI-Version`, `X-DestrIA-Postman-Version` e `X-DestrIA-SDK-Version` contra os endpoints públicos.
Postman collection tests passam a verificar os três headers de versão via `pm.response.headers.get(...)`, cobrindo pinning em CI local e Newman remoto.
`contract-check` endurece `postman-smoke-tests` exigindo as novas assertions; health lista `artifact-versions-ci-gate` e `postman-version-headers-assertions` para descoberta automática.
v1.0.459
Infra
12 de jul. de 2026
Artefatos públicos: headers de versão para OpenAPI e Postman
apiopenapisdkpostmandevelopers
`/api/v1/openapi.json` passa a responder com `X-DestrIA-OpenAPI-Version` (formato `info.version+release`, ex.: `2025-06-01+1.0.459`) e expõe o header via CORS para permitir pinning determinístico.
`/api/v1/postman.json` passa a responder com `X-DestrIA-Postman-Version` e expõe o header via CORS, permitindo que Newman/CI travem a coleção usada por release.
`contract-check` ganha três checks (`openapi-version-header`, `postman-version-header`, `api-reference-artifact-version-headers`) e a matriz em `/developers/api-reference` cita os novos headers ao lado de `X-DestrIA-SDK-Version`.
Health e contract-check bumpam para 1.0.459.
v1.0.458
Infra
12 de jul. de 2026
Developers: matriz de compatibilidade dos artefatos públicos
apiopenapisdkpostmandevelopers
`/developers/api-reference` ganhou uma matriz operacional conectando OpenAPI 3.1, Postman, SDK TypeScript, health e contract-check por fonte de versão, gate obrigatório e uso em produção.
A matriz orienta pinning de `X-DestrIA-SDK-Version`, `info.version` e `release` para CI, workers e automações externas sem depender de documentação dispersa.
Health e contract-check bumpam para 1.0.458 com o check `api-reference-compatibility-matrix`, garantindo que a documentação pública continue alinhada aos artefatos versionados.
v1.0.457
Infra
12 de jul. de 2026
SDK: versionamento público e contrato de compatibilidade
apisdkdevelopersv1
`/api/v1/sdk.ts` agora retorna o header `X-DestrIA-SDK-Version`, permitindo que consumidores façam pinning da versão baixada em CI, jobs e workers.
A documentação `/developers/sdk` ganhou a seção `Compatibilidade pública` com a superfície estável garantida, política SemVer operacional e referência ao gate `sdk:surface`.
`contract-check` e o E2E `sdk-surface` passam a validar o header de versão e a cobertura documental de compatibilidade, bloqueando regressões silenciosas no SDK oficial.
v1.0.456
Infra
12 de jul. de 2026
CI: gate E2E da superfície pública do SDK
apisdkidempotencyv1
Novo teste `tests/e2e/sdk-surface.spec.ts` faz GET em `/api/v1/sdk.ts` e valida presença de `RateLimitInfo`, `parseRateLimit`, `DestriaApiError.rateLimit`, `onRateLimit`, `lastRateLimit` e helpers cron (`cronCampaignsProcess`, `cronCampaignsDispatch`, `cronIdempotencyCleanup`).
`scripts/ci/run-gates.mjs` ganha o gate obrigatório `sdk:surface` entre os headers públicos e o Playwright visual — protege consumidores externos contra regressões silenciosas no SDK gerado.
Health bumpa para 1.0.456 com check `sdk-surface-e2e-gate`.
v1.0.455
Feature
12 de jul. de 2026
SDK: rate limit observável também nos helpers cron
restsdkrate limitidempotency
`cronRequest` agora usa `parseRateLimit(response)` e atualiza `client.lastRateLimit` em respostas dos helpers `cronCampaignsProcess`, `cronCampaignsDispatch` e `cronIdempotencyCleanup`.
`onRateLimit(info, ctx)` passa a ser chamado também nos crons, com contexto `{ path, method: 'POST', status, ok }`, mantendo observabilidade uniforme entre REST e scheduler.
Documentação do SDK ganhou exemplo operacional de backoff com `error.rateLimit`/`lastRateLimit`; `contract-check` adiciona `sdk-cron-ratelimit-hook` e health bumpa para 1.0.455.
v1.0.454
Feature
12 de jul. de 2026
SDK: hook onRateLimit e cache lastRateLimit no DestriaClient
sdk
Nova opção `onRateLimit(info, { path, method, status, ok })` em `DestriaClientOptions` é chamada em toda resposta que carrega headers `RateLimit-*`/`Retry-After` — tanto success quanto erro.
`client.lastRateLimit` guarda o último snapshot observado para dashboards e workers ajustarem concorrência sem interceptar cada chamada.
`contract-check` ganha `sdk-onratelimit-hook`; health bumpa para 1.0.454.
v1.0.453
Feature
12 de jul. de 2026
DestriaApiError expõe rateLimit para consumidores do SDK
apisdk
`DestriaApiError` ganha o campo `rateLimit: RateLimitInfo` populado via `parseRateLimit(response)` no construtor — `catch (e) { if (e.rateLimit.remaining === 0) ... }` funciona sem chamadas adicionais.
`contract-check` passa a exigir `rateLimit: RateLimitInfo` no shape de erro do SDK (`sdk-error-shape`), bloqueando regressão.
Health bumpa para 1.0.453 com o novo check `sdk-error-ratelimit-attached`.
v1.0.452
Infra
11 de jul. de 2026
Gate CI para headers de rate limit em endpoints públicos
apiendpointendpointspostmanrate limit
`scripts/ci/run-gates.mjs` ganha o gate `public:ratelimit-headers`, executando `tests/e2e/public-ratelimit-headers.spec.ts` como etapa obrigatória do pipeline, com short-circuit em caso de falha.
Smoke E2E valida a presença de `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset` e aliases `X-RateLimit-*` em `/api/public/unsubscribe`, `/api/public/track` e `/api/public/feedback`.
Postman collection agora exige testes de headers padronizados e `Retry-After` em respostas 429 (`contract-check` bloqueia regressão).
Health bumpa para 1.0.452 com check `public-ratelimit-headers-e2e-gate`.
v1.0.370
Feature
10 de jul. de 2026
Cooldown server-side para gatilhos comportamentais
rest
Nova tabela `behavioral_trigger_cooldowns` (workspace-scoped, RLS por membro, delete restrito a admin/owner) persiste o cooldown por (trigger, contato) fora do browser.
`enrollContactBehavioralFn` agora consulta o cooldown antes de matricular e faz upsert do próximo `expires_at` após sucesso — respostas ganham `cooldown_active` e `cooldown_expires_at`.
Store emite `cooldown_seconds` (derivado de `cooldown_hours`) no evento `destria:behavioral-enroll`; consumer encaminha ao servidor e registra audit log dedicado (`behavioral_enrollment.cooldown`).
Health/contract-check bumpam para 1.0.370 com check `behavioral-cooldowns-cloud`.
v1.0.369
Feature
09 de jul. de 2026
Consumer client-side de enrollment comportamental
idempotency
Nova server fn `enrollContactBehavioralFn` matricula contatos em campanhas (com upsert de contato, verificação de supressão sensível, deduplicação por contato e bump de métricas queued/planned_sends/total_recipients).
`useBehavioralEnrollmentConsumer` escuta `destria:behavioral-enroll` no app-shell, chama a server fn com Idempotency-Key estável (`behav:<trigger>:<campanha>:<email>:<ts>`), aplica retry exponencial e persiste as chaves processadas em localStorage para evitar reenvio entre reloads.
Toast + audit log (`behavioral_enrollment.created` / `.deduplicated` / `.failed`) tornam o disparo visível na timeline de auditoria e para o operador.
Health e contract-check bumpam para 1.0.369 com check dedicado `behavioral-enroll-consumer`.
v1.0.367
Infra
09 de jul. de 2026
Histórico Cloud para execuções de gatilhos comportamentais
idempotência
Nova tabela `public.behavioral_executions` persiste o log real de disparos por workspace com RLS, GRANTs explícitos e índices por data/gatilho.
Server functions `listBehavioralExecutionsFn` e `upsertBehavioralExecutionFn` registram execuções com idempotência por `workspace_id + local_id`.
`useCloudBehavioralTriggersSync` agora hidrata e sincroniza as últimas 500 execuções junto das regras, preservando auditoria entre sessões e dispositivos.
Health e contract-check bumpam para 1.0.367 com check dedicado `behavioral-executions-cloud-log`.
v1.0.358
Feature
09 de jul. de 2026
Dashboard global de entregabilidade
eventos
Nova rota `/deliverability` consolida score operacional, taxas de entrega/falha/abertura/clique, saúde SMTP, cobertura DNS e pressão de fila.
Server function `getDeliverabilityDashboardFn` agrega `campaign_sends`, eventos de engajamento, campanhas, contas SMTP e domínios com degradação segura quando storage operacional ainda não existe.
A UI inclui filtros por período/campanha, tendências diárias, ações prioritárias, tabelas de risco por campanha/conta/domínio e exportação CSV auditável.
Health e contract-check bumpam para 1.0.358.
v1.0.355
Infra
09 de jul. de 2026
Cron de limpeza de idempotency keys
apiidempotency
Novo `POST /api/public/cron/idempotency-cleanup` autenticado por anon key: apaga registros de `api_idempotency_keys` com `expires_at` < cutoff em lotes (`limit` até 10000), suporta `older_than` ISO e `dry_run`.
Degrada com `storage: unavailable` quando a tabela ainda não foi provisionada e devolve `expired_before_cleanup`/`deleted`/`remaining` para observabilidade do pg_cron.
Health/contract-check bumpam para 1.0.355.
v1.0.354
Infra
09 de jul. de 2026
Contrato público sincronizado com listagem de envios
apiopenapisdkpostmanv1
OpenAPI 3.1 documenta `GET /api/v1/campaigns/{id}/sends` com parâmetros (`limit`, `cursor`, `status`, `step_id`, `variant_id`, `email`, `since`, `until`) e schemas `CampaignSend` / `CampaignSendsResponse` (totais, tracking_token, tracked_open_url e agregados de engajamento por envio).
Postman ganhou a request `Listar envios da campanha` alinhada ao SDK `listCampaignSends`. Health/contract-check bumpam para 1.0.354.
v1.0.353
Feature
09 de jul. de 2026
Listagem operacional de envios por campanha
apisdkv1
Novo `GET /api/v1/campaigns/{id}/sends` paginado por cursor (`sent_at`) com filtros por `status`, `step_id`, `variant_id`, `email` e janela `since/until`, devolvendo totais por status e agregados de opens/clicks por envio via join com `campaign_engagement_events` pelo `send_id`.
Payload traz `tracking_token`, `tracked_open_url` (do metadata do dispatcher) e `transport`, habilitando dashboards operacionais e auditoria por envio.
SDK ganhou `listCampaignSends(campaignId, params)`. Health/contract-check bumpam para 1.0.353.
v1.0.352
Feature
09 de jul. de 2026
Dispatcher renderiza tracking por envio
apiv1
`POST /api/v1/dispatch` e o cron `campaigns-dispatch` agora buscam `tracking_token`, `step_id`, `variant_id/label` e `contact_id` de cada envio enfileirado e geram a URL de tracking (`sid` + `tk`) via `buildTrackingUrl`, gravando `metadata.tracked_open_url` e `metadata.tracking_token` para auditoria e reuso pelo transporte SMTP.
`rewriteTrackedLinks` aceita `sendId`/`trackingToken`, permitindo que cliques também sejam atribuídos ao envio exato quando o renderizador do e-mail rodar no worker SMTP.
Health/contract-check bumpam para 1.0.352.
v1.0.351
Feature
09 de jul. de 2026
Atribuição de engajamento por envio (send_id + tracking_token)
apiv1
Migration corrige `campaign_sends_status_check` para aceitar `queued` (bloqueava o processador em produção) e adiciona `tracking_token` único em `campaign_sends` + colunas `send_id` e `tracking_token` em `campaign_engagement_events`, com índices dedicados.
Processador (`POST /api/v1/campaigns/{id}/process` e cron `campaigns-process`) gera `tracking_token` UUID por envio enfileirado, permitindo casar aberturas/cliques com o envio exato (etapa + variante A/B).
`buildTrackingUrl` aceita `sendId`/`trackingToken` e propaga como `sid`/`tk` nos links; o buffer público de tracking já lê esses parâmetros e a persistência no cloud resolve `send_id` automaticamente por `tracking_token` quando o `sid` não vem no link.
Health e contract-check bumpam para 1.0.351.
v1.0.350
Infra
08 de jul. de 2026
Contrato público completo para /dispatch e smoke gate estendido
apiopenapisdkpostmanv1
OpenAPI 3.1 e Postman oficial agora documentam `POST /api/v1/dispatch` (limit, campaign_id, dry_run) com exemplos e schema padronizado, fechando paridade SDK ↔ contrato ↔ collection.
Smoke gate `scripts/ci/auth-e2e-gate.mjs` passou a chamar `processCampaign` seguido de `dispatchQueuedSends` após o pause/resume, validando payload de `processed`/`sent` no ciclo end-to-end autenticado.
Health e contract-check reportam release 1.0.350 para rastrear a etapa de fechamento do contrato de fila de envio.
v1.0.349
Infra
07 de jul. de 2026
Fila de envio: processador enfileira e dispatcher entrega
apisdkv1
`POST /api/v1/campaigns/{id}/process` e o cron `campaigns-process` agora gravam `campaign_sends.status='queued'` (não mais `sent` direto) e incrementam `metrics.queued_sends`, deixando explícito o intervalo entre agendamento e entrega real.
Novo `POST /api/v1/dispatch` autenticado por API key transita `campaign_sends` de `queued → sent` somente após aceite real do provedor, atualiza `metrics.sent/failed`, registra auditoria (`campaign.api_dispatched`) e devolve `next_batch_available` para paginação de fila.
Novo cron público `POST /api/public/cron/campaigns-dispatch` (anon key) processa a fila em todas as workspaces até 200 envios por batida — sem transporte real de campanhas configurado, retorna `503 transport_not_configured` e mantém a fila em `queued`.
SDK ganhou `dispatchQueuedSends({ limit, campaign_id, dry_run })`; health e contract-check bumpam para 1.0.349 com checks `dispatcher` e `cron-campaigns-dispatch`.
v1.0.348
Infra
06 de jul. de 2026
Motor de envio: cron público varre campanhas em execução
apiendpointopenapipostmanv1
Novo `POST /api/public/cron/campaigns-process` autenticado por anon key varre até 20 campanhas com status `running` e processa até 25 inscrições devidas por campanha em cada batida.
Reaproveita a mesma lógica de avanço/variante/agendamento do endpoint público v1: registra `campaign_sends` com `source: cron`, avança `current_step_index`, ajusta `metrics.sent`/`queued` e marca `completed` na etapa final.
Suporta `dry_run` e falha graciosamente quando o storage de inscrições ainda não está provisionado, retornando `skipped: storage_unavailable` por campanha.
OpenAPI e Postman ganharam `/campaigns/{id}/process`; health e contract-check bumpam para 1.0.348 com o check `cron-campaigns-process`.
v1.0.347
Feature
06 de jul. de 2026
Motor de envio: processador de inscrições por etapa/variante
apisdkv1
Novo `POST /api/v1/campaigns/{id}/process` avança inscrições ativas cuja `next_send_at` já venceu, avança `current_step_index`, escolhe variante ponderada por peso e agenda a próxima etapa.
Cada envio processado é persistido em `campaign_sends` com step, variante e origem, e ajusta `metrics.sent`/`metrics.queued` de forma atômica com auditoria de API key.
Inscrições concluídas mudam para `completed` com `completed_at`, encerrando o ciclo de cadência sem sobrescrever supressões ou paradas manuais.
SDK ganhou `processCampaign(campaignId, { limit, dry_run })`; health/contract-check expõem release 1.0.347 e o check `enrollment-processor`.
v1.0.346
Feature
05 de jul. de 2026
Developers: controle operacional de inscrições
apisdkpostmandevelopersv1
Novo `PATCH /api/v1/campaigns/{id}/enrollments/{enrollment_id}` permite pausar, retomar, parar ou suprimir inscrições persistidas com validação de transições terminais.
A operação ajusta `metrics.queued` quando uma inscrição entra ou sai do estado ativo, preservando `planned_sends` e `total_recipients`.
Supressão por API registra motivo manual, marca o contato como suprimido quando seguro e grava auditoria com actor de API key, IP, user-agent e metadata.
SDK oficial ganhou `updateCampaignEnrollment`, helpers `pause/resume/stop/suppressCampaignEnrollment`, e Postman/health/contract-check foram atualizados para release 1.0.346.
v1.0.345
Feature
05 de jul. de 2026
Developers: listagem paginada de inscrições da campanha
apiendpointopenapisdkpostman
Novo endpoint `GET /api/v1/campaigns/{id}/enrollments` retorna inscrições persistidas com filtros por status, e-mail e janela `enrolled_at`, cursor estável e totais agregados por status.
SDK oficial ganhou `listCampaignEnrollments(campaignId, params)` com tipagem completa de itens (`step_id`, `variant_id`, `variant_label`, `source`, `custom_fields`).
OpenAPI e Postman documentam o novo recurso; health/contract expõem release 1.0.345 e o check `enrollments-list` para pipelines de smoke.
Endpoint retorna `storage: "unavailable"` de forma resiliente quando `campaign_enrollments` ainda não foi provisionada no ambiente destino.
v1.0.344
Infra
04 de jul. de 2026
Developers: enrollment idempotente e métricas persistentes
apiopenapisdkdevelopersidempotency
`POST /api/v1/campaigns/{id}/enroll` agora valida `Idempotency-Key`, evita reprocessamento em retries e detecta conflito quando a mesma chave é reutilizada com outro payload.
Nova persistência `campaign_enrollments` registra inscrições por contato/campanha e impede dupla contagem; métricas `total_recipients`, `planned_sends` e `queued` são incrementadas apenas em novas inscrições.
SDK oficial, OpenAPI e smoke autenticado foram atualizados para cobrir resposta rica de enrollment, replay idempotente e estado de fila/métricas.
Nova migration adiciona `api_idempotency_keys`, `campaign_enrollments` e RPC `increment_campaign_enrollment_metrics` com escopo por workspace e service role.
v1.0.343
Infra
04 de jul. de 2026
Developers: campanha seed autossuficiente no E2E autenticado
apirestopenapisdkpostman
Novo `POST /api/v1/campaigns` cria ou atualiza campanhas por `local_id`, com validação Zod, escopo por workspace, status seguro e limites de tamanho para `sequence`, `schedule` e `metrics`.
O smoke `scripts/ci/auth-e2e-gate.mjs` agora cria/reutiliza automaticamente uma campanha seed quando o workspace não possui campanhas, eliminando skips e tornando o E2E autenticado autossuficiente.
OpenAPI, Postman, SDK oficial e contract-check foram atualizados para cobrir `createCampaign`, mantendo paridade dos artefatos públicos da REST v1.
Health e contract-check reportam release 1.0.343 para rastrear a etapa de hardening de campanhas em CI.
v1.0.342
Infra
04 de jul. de 2026
Developers: smoke E2E autenticado cobre campanhas
developerseventos
`scripts/ci/auth-e2e-gate.mjs` agora valida também o ciclo público de campanhas: listagem, seleção segura, métricas detalhadas, eventos filtrados e enrollment real do contato smoke.
O gate aceita `DESTRIA_E2E_CAMPAIGN_ID` para tornar a campanha obrigatória em CI; sem essa variável, detecta automaticamente uma campanha não arquivada e pula apenas quando o ambiente ainda não tem seed.
As validações conferem shape de `summary.metrics`, `summary.events`, `by_step`, `by_variant`, `top_links`, eventos paginados e resposta `status=enrolled`, mantendo cleanup seguro do contato ao final.
Health e contract-check reportam release 1.0.342 e o health expõe o check `campaign-e2e` como capacidade operacional do pipeline autenticado.
v1.0.341
Infra
04 de jul. de 2026
Developers: smoke E2E autenticado para REST v1
apirestdeveloperswebhookv1
Novo `scripts/ci/auth-e2e-gate.mjs` executa um fluxo real com API key: cria contato único, consulta/lista, cria webhook, consulta, rotaciona secret, lista e remove o webhook.
O smoke faz cleanup seguro via soft-delete do contato e remoção do webhook, usando dados `example.test` e IDs únicos por execução para evitar colisões com dados reais.
Novo script npm `auth:e2e` permite rodar `DESTRIA_API_KEY=... bun run auth:e2e -- https://seu-dominio` em CI quando houver credencial real configurada.
Health e contract-check reportam release 1.0.341 e o health expõe o check `authenticated-e2e` como capacidade operacional validável por pipeline.
v1.0.340
Infra
04 de jul. de 2026
Developers: Newman CI para collection Postman oficial
apiendpointendpointsopenapipostman
Novo `scripts/ci/postman-gate.sh` baixa `/api/v1/postman.json`, executa Newman e valida artefatos públicos, contrato e ausência de 5xx em toda a collection.
Novo script npm `postman:gate` permite rodar `bun run postman:gate -- https://seu-dominio` em pipelines; `DESTRIA_POSTMAN_STRICT=1` ativa exigência de auth real para endpoints protegidos.
Collection Postman agora inclui assertions de smoke/CI e variáveis default seguras para IDs, evitando rotas inválidas quando executada sem dados reais.
OpenAPI passou a documentar `/health` e `/contract-check`, mantendo paridade total com a collection e health reportando release 1.0.340.
v1.0.339
Correção
04 de jul. de 2026
Developers: paridade total OpenAPI/Postman/SDK
apiopenapisdkpostmandevelopers
Collection Postman agora cobre também `GET /webhooks/{id}` e `GET /postman.json`, removendo os últimos alertas de cobertura do contract-check.
SDK oficial ganhou o helper `rotateWebhookSecret`, mantendo compatibilidade com `updateWebhook({ rotate_secret: true })` e alinhando a documentação viva.
A página `/developers/contract-check` passou a normalizar parâmetros dinâmicos de OpenAPI e Postman pelo mesmo formato canônico, evitando falsos alertas em rotas com IDs.
Health e contract-check reportam release 1.0.339 para rastrear a etapa de paridade final do contrato público.
v1.0.338
Infra
04 de jul. de 2026
Developers: gate de contrato pronto para CI
apidevelopersv1
Novo `scripts/ci/contract-gate.sh` valida `/api/v1/health` e `/api/v1/contract-check` com curl + Node, sem dependência de jq.
O gate falha o job quando health não está operacional, quando o contrato retorna `status=fail` ou quando há checks bloqueantes, e preserva warnings como não bloqueantes com evidências no log.
Novo script npm `contract:gate` permite executar `bun run contract:gate -- https://seu-dominio` em GitHub Actions, GitLab CI ou pipelines equivalentes.
Health e contract-check agora reportam release 1.0.338 para rastrear a etapa de validação automatizada.
v1.0.337
Feature
04 de jul. de 2026
Developers: Endpoint /api/v1/contract-check para CI
apiendpointdevelopersv1
Novo `GET /api/v1/contract-check` executa a suíte de contrato no servidor e devolve JSON estável com `status` (pass/warn/fail), `summary` e evidências por check.
Retorna HTTP 503 quando qualquer check falha — ideal para gates de CI/CD via curl+jq sem depender do navegador.
Health snapshot passa a linkar o novo endpoint como check adicional e bumpa release para 1.0.337.
v1.0.336
Feature
04 de jul. de 2026
Developers: Uptime consolidado 1h/24h/7d no status page
developers
`/developers/status` agora persiste amostras de probes no navegador (localStorage) por até 7 dias com poda automática.
Cards agregados mostram uptime % e latência p95 nas janelas 1h/24h/7d, incluindo tons semânticos (ok/degraded/down) por SLA.
Cada probe exibe uptime 24h + p95 dedicado, histórico visual proporcional à latência e ação para limpar histórico local.
v1.0.335
Feature
04 de jul. de 2026
Developers: Status page e endpoint /api/v1/health
apiendpointopenapisdkpostman
Novo endpoint público `GET /api/v1/health` retorna JSON estável com `status`, `release`, `latency_ms` e checks do contrato para integrar com Statuspage/UptimeRobot/Better Stack.
Rota pública `/developers/status` executa probes a cada 30s contra Health, OpenAPI, SDK e Postman, com histórico visual das últimas 20 amostras por probe.
Classificação automática ok/degraded/down por HTTP status e latência, com latência média agregada e recheck manual.
v1.0.334
Feature
04 de jul. de 2026
Developers: Contract Check ao vivo do contrato REST v1
apirestopenapisdkpostman
Nova rota pública `/developers/contract-check` roda no navegador uma suíte de validação sobre OpenAPI 3.1, SDK TypeScript e collection Postman.
Cruza operações declaradas no OpenAPI com requests Postman, aponta métodos essenciais do `DestriaClient` e verifica `DestriaApiError` com `retryAfterSeconds`.
Resumo de passes/alertas/falhas com evidências detalhadas para incorporar em pipelines CI antes de publicar mudanças de contrato.
v1.0.333
Feature
03 de jul. de 2026
Developers: API Reference interativa com Try it out
apiendpointendpointsopenapisdk
Nova rota pública `/developers/api-reference` carrega `/api/v1/openapi.json`, lista endpoints por grupo e oferece busca, parâmetros editáveis, payload JSON gerado por schema e curl copiável.
Console Try it out executa chamadas reais no navegador com Bearer token mantido apenas em memória, valida JSON/path parameters e destaca headers operacionais como rate limit e Retry-After.
Portal `/developers` e documentação interna da API ganharam links diretos para a referência interativa, reduzindo fricção para validar integrações ponta a ponta.
Alias `enrollCampaign` do SDK agora processa múltiplos contatos quando usado no formato legado com array, mantendo compatibilidade com snippets antigos.
v1.0.332
Feature
03 de jul. de 2026
Developers: guia público completo do SDK TypeScript
apisdkpostmandeveloperswebhook
Nova rota pública `/developers/sdk` documenta instalação do SDK oficial em Node 18+, Bun, Deno/Supabase Edge e runtimes Edge com exemplos copiáveis.
Guia detalha métodos de `DestriaClient`, tratamento de `DestriaApiError`, retries para 429/5xx, idempotência, paginação e exportação CSV.
SDK oficial ganhou alias compatível `enrollCampaign` e `retryAfterSeconds` para alinhar exemplos antigos sem quebrar o método canônico `enrollContactInCampaign`.
Collection Postman foi corrigida para usar `email` no enrollment, `event_type` em eventos de campanha e nomes válidos de webhook (`reply.received`, `unsubscribe`).
v1.0.331
Feature
03 de jul. de 2026
Developers: receitas públicas de integração Zapier/Make
apirestendpointopenapipostman
Nova rota pública `/developers/integrations` entrega receitas completas para Zapier e Make com fluxo CRM → contato → campanha → BI.
Novo endpoint `GET /api/v1/integration-recipes.json` expõe o mesmo conteúdo em JSON para portais, CI e documentação externa.
Receitas incluem mapeamento de campos, payloads REST v1 copiáveis, checklists de validação ponta a ponta e tratamento de 400/401/409/429/5xx.
Portal `/developers`, documentação interna de `/api`, OpenAPI 3.1 e collection Postman foram atualizados com os novos links.
v1.0.330
Feature
03 de jul. de 2026
Developers: changelog público filtrado para API REST v1
apirestopenapisdkpostman
Nova rota pública `/developers/changelog` expõe um changelog read-only focado em REST API v1, SDK, OpenAPI, Postman, webhooks, CORS, HMAC e rate limits.
A página filtra automaticamente as entradas relevantes de `CHANGELOG`, preserva busca por URL (`q`/`tag`) e permite segmentar por Feature, Correção e Infra sem exigir login.
Portal `/developers` ganhou CTA e link de footer para o changelog, completando o trio público de adoção: quickstart, webhooks e histórico de mudanças.
v1.0.329
Feature
03 de jul. de 2026
Developers: documentação de webhooks e verificador HMAC online
developerswebhookwebhookshmacidempotency
Nova rota pública `/developers/webhooks` com catálogo de 8 tipos de eventos (delivered, opened, clicked, bounced, complained, unsubscribed, replied, campaign.completed) e payloads reais copiáveis.
Detalhamento de headers (`X-DestrIA-Signature`, `X-DestrIA-Timestamp`), Idempotency-Key, janela de clock skew, retry com backoff e grace de rotação de segredo.
Verificador HMAC-SHA256 in-browser via Web Crypto: calcula assinatura local e compara em tempo constante — nada trafega para o servidor.
Receiver de referência Node/Deno/Edge com timingSafeEqual, dedupe por evt_id e resposta 200 idempotente.
v1.0.328
Feature
03 de jul. de 2026
REST v1: collection Postman oficial
apirestendpointopenapipostman
Novo endpoint público `GET /api/v1/postman.json` gera collection Postman v2.1 com 17 requests cobrindo contatos, campanhas, eventos, webhooks e entregas.
Collection já traz Bearer auth via variável `api_key`, base URL do ambiente, headers padrão (Accept, X-DestrIA-Version) e Idempotency-Key gerada em POST /campaigns/{id}/enroll.
Página `/developers` e docs internos de `/api` agora oferecem botão dedicado para baixar a collection e usar em Postman/Insomnia sem escrever código.
OpenAPI 3.1 documenta a nova rota em `Developer Tools`.
v1.0.327
Feature
02 de jul. de 2026
Developers: documentação pública compartilhável da REST API
apirestendpointendpointsopenapi
Nova rota pública `/developers` apresenta API REST v1, SDK TypeScript, OpenAPI, quickstart, webhooks HMAC, rate limits e grupos de endpoints sem exigir login.
A home agora expõe links para Developers/Docs da API, facilitando adoção por integrações externas, Zapier/Make, CRMs e pipelines de BI.
v1.0.326
Feature
02 de jul. de 2026
REST v1: receitas de integração end-to-end na documentação
apirestsdkwebhookhmac
Nova seção `Integrações & exemplos` na aba de docs de `/api` com receitas prontas para Zapier/Make, SDK TypeScript, receiver de webhook com HMAC e sync de métricas para BI.
Snippets já vêm com base URL do ambiente e a primeira API key ativa injetada, prontos para copiar/colar.
v1.0.325
Infra
02 de jul. de 2026
REST v1: rate-limit durável e painel de uso da API
apirestendpointendpointsrate-limit
Rate-limit público passa a consumir buckets duráveis via RPC `consume_public_api_rate_limit`, com fallback local seguro enquanto a migração não estiver aplicada.
Nova migração cria `api_rate_limit_buckets` e `api_usage_events`, registra chamadas permitidas/bloqueadas com hash de IP e mantém isolamento por workspace via RLS.
A tela `/api` ganhou a aba `Uso & limites` com métricas por janela, endpoints mais usados, bloqueios, chaves por consumo e buckets ativos com progresso/reset.
v1.0.324
Feature
02 de jul. de 2026
REST v1: SDK TypeScript oficial gerado no ambiente
apirestendpointopenapisdk
Novo endpoint `GET /api/v1/sdk.ts` entrega um cliente TypeScript sem dependências para Node 18+, Bun, browsers e edge, com base URL do ambiente atual.
O SDK cobre contatos, campanhas, eventos/métricas, webhooks, entregas, retry manual e exportações CSV, com `DestriaApiError`, retry para 429/5xx e suporte a `X-DestrIA-Version`.
OpenAPI 3.1 e documentação viva em `/api` agora expõem o download do SDK, exemplo de uso e rate-limits por plano.
v1.0.323
Feature
02 de jul. de 2026
REST v1: rate-limit escalonado por plano com headers X-RateLimit-*
apirestrate-limitcorsv1
`enforceRateLimit` agora aplica buckets por plano (free 60, standard 120, pro 600, enterprise 3000 req/min) resolvidos a partir de `api_keys.plan` com fallback seguro quando a coluna não existe.
Respostas 429 incluem `Retry-After`, `X-RateLimit-Limit/Remaining/Reset/Plan` e body com `plan` e `retry_after`; CORS expõe estes headers via `Access-Control-Expose-Headers`.
Todas as rotas `/api/v1/*` propagam `auth.plan` para o limiter, preservando compatibilidade com chamadas existentes.
v1.0.322
Feature
02 de jul. de 2026
REST v1: listagem/CSV de entregas escopadas por webhook
apirestendpointendpointsopenapi
Novo `GET /api/v1/webhooks/{id}/deliveries` resolve o webhook por local_id ou UUID e devolve entregas escopadas com paginação por cursor.
Aceita os mesmos filtros de `/webhook-deliveries` (event, origin, ok, retryable, final_failure, status_code, since, until) e exportação `format=csv` com cabeçalhos `X-DestrIA-Next-Cursor`/`X-DestrIA-Has-More`.
OpenAPI 3.1, docs vivas em `/api` e tabela de endpoints atualizadas com snippet copiável e schema reutilizado `WebhookDeliveriesResponse`.
v1.0.321
Feature
02 de jul. de 2026
REST v1: retry manual de entregas de webhook
apirestwebhookrate limithmac
Novo `POST /api/v1/webhook-deliveries/{id}/retry` reenfileira uma entrega específica usando Bearer auth, CORS, rate limit e resolução por `local_id` ou UUID interno.
O retry respeita `retryable=false`, dead-letter, limite de 5 tentativas, webhook pausado e janela de backoff; quando ainda não venceu, retorna `next_retry_at` e `retry_after`.
A nova tentativa reutiliza a idempotency_key original, assina o payload com HMAC atual/anterior durante rotação, atualiza status do webhook e registra auditoria durável.
v1.0.320
Feature
02 de jul. de 2026
REST v1: OpenAPI 3.1 e docs UI cobrem GET/PATCH/DELETE de webhooks
apirestendpointendpointsopenapi
OpenAPI 3.1 recebe path `/webhooks/{id}` com operações getWebhook, updateWebhook e deleteWebhook, além de schemas WebhookPatchInput/WebhookPatchResponse e parâmetro reutilizável WebhookId.
CORS pública agora inclui PATCH em `Access-Control-Allow-Methods`, habilitando clientes browser a executar rotação/atualização de webhooks.
Documentação viva em `/api` ganha snippets copiáveis para atualizar webhook, rotacionar secret com janela de graça e remover rota, além de novas linhas na tabela de endpoints.
v1.0.319
Feature
02 de jul. de 2026
REST v1: gestão programática de webhooks (GET/PATCH/DELETE)
apirestwebhookwebhookseventos
Novo `GET /api/v1/webhooks/{id}` resolve por UUID ou `local_id` e retorna metadados de rotação de secret (previous_secret_active e expiração).
`PATCH /api/v1/webhooks/{id}` altera URL/descrição/eventos/ativo com validação HTTPS pública, detecção de conflito por URL e diff auditado em `audit_events`.
Rotação segura de secret via `rotate_secret: true` com `rotation_grace` (`none|15m|1h|24h|7d`); novo secret retornado apenas uma vez e antigo válido durante a janela.
`DELETE /api/v1/webhooks/{id}` cancela entregas pendentes/retrying antes de remover a rota e grava auditoria com metadados completos.
v1.0.318
Feature
02 de jul. de 2026
REST v1: criação programática de webhooks
apirestendpointopenapiwebhook
Novo endpoint `POST /api/v1/webhooks` cria webhooks via API key com autenticação Bearer, CORS, rate limit e resposta 201 contendo o secret HMAC apenas na criação.
A criação valida URL HTTPS pública, bloqueia localhost/redes privadas, deduplica eventos do catálogo oficial, detecta conflitos por `local_id` ou URL e registra auditoria durável.
OpenAPI 3.1 e documentação viva em `/api` foram atualizados com schema, tabela de endpoint e snippet copiável para provisionamento externo.
v1.0.317
Feature
02 de jul. de 2026
REST v1: métricas detalhadas de campanhas
apirestendpointopenapirate limit
Novo endpoint `GET /api/v1/campaigns/{id}/metrics` retorna métricas consolidadas da campanha com autenticação Bearer, CORS, rate limit e resolução por UUID ou `local_id`.
A resposta agrega aberturas/cliques por janela temporal, únicos amostrados, breakdown por etapa, variantes A/B com rates, vencedores promovidos e top links clicados.
OpenAPI 3.1 e documentação viva em `/api` foram atualizados com parâmetros `since`, `until` e `max_events`, incluindo indicação de amostra truncada para grandes volumes.
v1.0.316
Feature
02 de jul. de 2026
REST v1: listagem de campanhas com métricas
apirestendpointopenapirate limit
Novo endpoint `GET /api/v1/campaigns` lista campanhas do workspace com Bearer auth, CORS, rate limit e paginação por `created_at`.
Filtros por `status` repetível/CSV, busca textual (`q`), `list_id`, `account_id`, `since`, `until` e `include_sequence`; sequência detalhada é sanitizada sem anexos `data_url` nem corpo completo.
A resposta inclui métricas normalizadas, rates, resumo de sequência/A/B e agregados da página; OpenAPI 3.1 e documentação viva em `/api` foram atualizados.
v1.0.315
Feature
02 de jul. de 2026
REST v1: listagem pública de webhooks
apirestendpointendpointsopenapi
Novo endpoint `GET /api/v1/webhooks` retorna webhooks do workspace com autenticação Bearer, CORS, rate limit e paginação por `created_at`.
Filtros por `active`, `event` assinado, busca textual (`q`), janela de datas (`since`/`until`) e `include_secret_meta` para inspecionar o status da rotação sem expor o segredo.
OpenAPI 3.1, tabela de endpoints e snippet copiável em `/api` foram atualizados para integrações externas descobrirem e monitorarem os webhooks.
v1.0.314
Feature
02 de jul. de 2026
REST v1: filtro avançado de contatos por tags
apirestendpointopenapiv1
O endpoint `GET /api/v1/contacts` agora aceita filtros por tags via `tags=lead,trial` ou parâmetros repetidos `tag=lead&tag=trial`.
O parâmetro `tag_match` permite escolher entre correspondência `all` (contato precisa ter todas as tags) e `any` (pelo menos uma tag), mantendo normalização e limite de até 50 tags.
OpenAPI 3.1 e a documentação viva em `/api` foram atualizados com exemplos copiáveis para integrações externas segmentarem contatos por tags.
v1.0.313
Feature
02 de jul. de 2026
REST v1: exportação filtrada de entregas de webhook
apirestendpointopenapiwebhook
Novo endpoint `GET /api/v1/webhook-deliveries` lista logs de webhook com autenticação Bearer, CORS, rate limit, paginação por `delivered_at` e filtros por webhook, evento, origem, status HTTP, retry, dead-letter e janela de datas.
A mesma rota exporta CSV com `format=csv`, headers de paginação e `Content-Disposition`; payloads e headers ficam fora por padrão e podem ser incluídos sob demanda.
Headers sensíveis como assinaturas HMAC, Authorization, cookies e API keys são redigidos antes de retornar pela API pública; documentação viva e OpenAPI 3.1 foram atualizados.
v1.0.312
Feature
02 de jul. de 2026
REST v1: tags e metadados flexíveis no upsert de contatos
apirestendpointv1
O endpoint `POST /api/v1/contacts` agora aceita `local_id`, `add_tags`, `remove_tags`, `replace_tags`, `metadata`, `replace_metadata` e `replace_custom_fields` para integrações CRM/CDP mais completas.
Tags são normalizadas, deduplicadas e limitadas; `custom_fields`/`metadata` passam por validação JSON com limites de profundidade, tamanho, quantidade de chaves e proteção do prefixo interno `_destria_`.
O upsert preserva campos existentes quando omitidos, mantém statuses protegidos e respeita supressões ativas ao criar ou atualizar contatos via API pública.
v1.0.311
Feature
02 de jul. de 2026
Ping manual de webhooks com histórico durável
webhookwebhookshmacdeliverydeliveries
A aba Webhooks agora envia um evento `ping` manual assinado por HMAC para validar URL, headers e receiver sem depender de eventos reais da plataforma.
Em modo Lovable Cloud, o teste é executado server-side, grava a entrega em `webhook_deliveries`, atualiza o status do webhook e hidrata imediatamente o histórico da UI.
Falhas de teste exibem detalhes acionáveis, não entram em retry automático e registram auditoria com status HTTP, latência, evento e delivery_id.
v1.0.310
Feature
02 de jul. de 2026
Contrato OpenAPI 3.1 para REST v1
apirestendpointendpointsopenapi
Novo endpoint público `GET /api/v1/openapi.json` expõe o contrato OpenAPI 3.1 dos endpoints REST v1 já implementados, com schemas, parâmetros, respostas e autenticação Bearer.
A documentação de `/api` agora mostra a URL do schema e inclui snippet copiável para importar o contrato em Postman, Insomnia, geradores de SDK ou pipelines de validação.
O schema cobre contatos, soft-delete, inscrição em campanha e eventos de engajamento, mantendo CORS e cache curto para uso seguro por ferramentas externas.
v1.0.309
Feature
02 de jul. de 2026
Documentação REST v1 para eventos de campanha
apirestendpointendpointsbearer
A aba Documentação de `/api` agora inclui `GET /api/v1/campaigns/{id}/events` no catálogo oficial de endpoints REST v1.
Novo snippet copiável mostra autenticação Bearer, filtros por `event_type` e `since`, uso de UUID/local_id e o formato real da resposta com `totals` e `next_cursor`.
A documentação deixa explícitos os filtros aceitos (`open`/`click`, email, datas, cursor e limite) para uso em dashboards externos e integrações de BI.
v1.0.308
Feature
02 de jul. de 2026
API REST v1: eventos de engajamento por campanha
apirestendpointrate limitcors
Novo endpoint `GET /api/v1/campaigns/{id}/events` retorna aberturas e cliques da campanha com paginação por cursor (`occurred_at`), filtros por `event_type`, `email`, `since` e `until`, e aceita UUID ou `local_id` no path.
Resposta inclui agregados `totals.opens` e `totals.clicks` calculados diretamente no banco para permitir dashboards externos sem varrer a lista inteira.
Endpoint reutiliza `authenticatePublicApi`, rate limit de 120 req/min e cabeçalhos CORS/OPTIONS padronizados do restante da REST v1.
v1.0.307
Feature
02 de jul. de 2026
API REST v1: contato por ID e soft-delete auditável
apirestendpointendpointsrate limit
Novo endpoint `GET /api/v1/contacts/{id}` autenticado por API key retorna contato completo, supressões ativas e listas vinculadas, aceitando UUID, local_id ou email codificado.
Novo endpoint `DELETE /api/v1/contacts/{id}` executa soft-delete seguro: remove o contato das listas, adiciona supressão manual, marca `_destria_deleted` em `custom_fields` e preserva status protegidos como bounced/unsubscribed/complaint.
Endpoints REST v1 passaram a responder preflight `OPTIONS` e CORS em respostas de sucesso, erro e rate limit; documentação em `/api` inclui os novos fluxos e corrige o formato real da paginação.
v1.0.306
Feature
02 de jul. de 2026
Documentação viva dos endpoints REST v1 em /api
apirestendpointendpointsv1
Aba Documentação de `/api` agora usa a base URL real do ambiente (preview/produção) e injeta a primeira API Key ativa nos exemplos, permitindo copiar `curl` funcional sem edição manual.
Nova tabela de endpoints v1 (GET/POST `/contacts`, POST `/campaigns/{id}/enroll`) com descrição do comportamento de upsert idempotente, preservação de statuses protegidos e bloqueio por supressão sensível.
Adicionada referência de códigos de erro (400/401/403/404/409/429/5xx) e exemplos atualizados com paginação por cursor, merge de tags e `custom_fields`, e uso de `local_id` para inscrição em campanha.
v1.0.305
Feature
02 de jul. de 2026
API REST pública v1 (contatos + inscrição em campanha)
apirestendpointendpointsrate limit
Novos endpoints `GET/POST /api/v1/contacts` autenticados por Bearer token de API Key: listagem paginada por cursor, filtros por status e busca por email, e upsert idempotente que respeita statuses protegidos (bounced/unsubscribed/complaint).
Novo endpoint `POST /api/v1/campaigns/{id}/enroll` que resolve a campanha por ID/local_id do workspace, bloqueia inscrições de contatos suprimidos por bounce/complaint e vincula automaticamente à lista da campanha via `contact_list_members`.
Autenticação centralizada em `public-api-auth.server`: validação do token contra `api_keys`, atualização de `last_used_at` e rate limit por chave (120 req/min) com `Retry-After`.
v1.0.304
Feature
02 de jul. de 2026
Rotação HMAC de webhooks com janela controlada
apiwebhookwebhookshmac
A rotação de secret de webhook agora permite escolher janela de graça: sem janela, 6h, 24h ou 72h, com auditoria registrando a duração aplicada.
Secrets anteriores expirados são removidos automaticamente no cliente, normalizados ao hidratar do Cloud e ignorados pelo dispatcher server-side.
A tela de API mostra rotação ativa, permite revogar/limpar imediatamente e atualiza a documentação para receivers aceitarem `X-DestrIA-Signature-Previous` somente durante a janela configurada.
v1.0.302
Correção
02 de jul. de 2026
Centro público de preferências resiliente
rest
A central pública agora aguarda a confirmação do backend antes de confirmar descadastro, reclamação ou reativação, exibindo loading, bloqueio de duplo clique e erro acionável quando a persistência falha.
Reativação pública não remove nem mascara bloqueios mais fortes: bounce e complaint restantes mantêm o contato protegido e retornam estado bloqueado ao cliente.
Tokens de escopo unsubscribe só podem confirmar descadastro; reativação e reclamação exigem token de feedback assinado.
A página pública passa a carregar o status mínimo assinado diretamente do backend, evitando mostrar recebimento ativo quando o contato já está suprimido em produção.
v1.0.301
Correção
02 de jul. de 2026
Simulador reconhece upgrades de supressão
webhookwebhooks
O simulador de campanha agora contabiliza bounces e reclamações também quando a supressão existente é elevada (ex.: manual → bounce), mantendo métricas e webhooks fiéis ao efeito real no CRM.
v1.0.300
Infra
02 de jul. de 2026
Normalização canônica de supressões
endpointendpoints
Motivos de supressão agora usam o mesmo vocabulário em CRM local, Cloud e endpoints públicos: bounce, unsubscribe, complaint e manual.
A sincronização Cloud → local resolve múltiplas supressões pelo motivo mais protetivo e corrige status de contato sem reativar bounce/complaint indevidamente.
Foi adicionada migração para converter legados como hard_bounce, spam e complained e bloquear novos valores não canônicos no banco.
v1.0.299
Infra
02 de jul. de 2026
Endpoints públicos com autenticação e idempotência
apiendpointendpointsidempotência
Tracking público passou a exigir token assinado por contato/campanha/workspace antes de registrar métricas, mantendo pixel/redirect funcionais mesmo quando a gravação é recusada.
Feedback externo em `/api/public/feedback` agora exige API key válida para gravações com workspace, valida o payload antes de inserir no buffer local e usa IDs estáveis de provedor para reduzir duplicidade.
Descadastro público ganhou ID determinístico por contato/campanha/origem, e os endpoints de listagem local normalizam limites inválidos para evitar respostas vazias por parâmetros ruins.
v1.0.298
Infra
02 de jul. de 2026
Drenagem imediata dos eventos públicos locais
eventos
Tracking, unsubscribe e feedback agora expõem funções `flush...SyncNow` para processar imediatamente eventos públicos pendentes em modo local.
Os syncs deixam de depender apenas do intervalo de 12s e passam a reagir também ao retorno de foco da aba e ao evento online.
Eventos só são marcados como processados depois da aplicação local, reduzindo perda silenciosa em falhas transitórias.
v1.0.296
Feature
02 de jul. de 2026
Sincronização imediata de API keys e webhooks no Cloud
apiwebhookwebhooks
`flushApiKeysSyncNow` garante persistência imediata de chaves e webhooks após criar, rotacionar, revogar, remover, alternar e testar entregas.
Hidratação preserva mutações locais realizadas antes do primeiro fetch, evitando perda de definições recém-criadas.
Deduplicação de flush concorrente por promise em curso para múltiplas ações rápidas em sequência.
v1.0.294
Feature
02 de jul. de 2026
Persistência imediata para configurações e visualizações salvas
rest
`flushWorkspaceOpsSyncNow` agora preserva mutações feitas antes da hidratação inicial, evitando que saved views, exports ou configurações recém-alteradas sejam sobrescritos por uma hidratação tardia do Cloud.
Visualizações salvas no componente global e em `/relatorios` passaram a aguardar sincronização imediata ao salvar, importar e remover, com estados de loading e mensagens de fallback quando a nuvem não responde.
Configurações do workspace agora fazem flush imediato para o Lovable Cloud ao salvar/restaurar onboarding e registram auditoria com ator e metadados principais da alteração.
v1.0.291
Feature
02 de jul. de 2026
Auditoria imediata para operações críticas de contatos
eventos
Novo `flushAuditSyncNow()` força persistência imediata da trilha de auditoria no Lovable Cloud após ações críticas, sem aguardar o intervalo automático de sincronização.
Exclusão, supressão, reativação em massa e importação CSV de contatos agora registram auditoria local com contagens, ignorados, protegidos e falhas de Cloud, seguida de flush imediato.
Server functions de contatos também registram eventos duráveis em `audit_events` para bulk upsert, delete, suppress e reactivate, garantindo rastreabilidade mesmo se a aba fechar logo após a operação.
Corrigida a contagem de duplicados em `bulkSuppressFn` consultando supressões existentes antes do upsert, evitando métricas enganosas em operações reais.
v1.0.286
Correção
02 de jul. de 2026
Status: feedback técnico em retries e retestes
webhookwebhooks
Painel de incidentes agora mostra estado de execução ao reprocessar webhooks ou retestar SMTP, bloqueando ações concorrentes com mensagem clara.
Falhas de rede, permissão ou backend nos retries/retestes exibem detalhe técnico expansível e registram auditoria crítica para triagem posterior.
Resultados parciais de ações manuais mostram quantos itens recuperaram, quantos seguiram falhando e o payload técnico da tentativa.
v1.0.285
Feature
02 de jul. de 2026
Navegação: alerta ativo de incidentes críticos
webhookwebhooks
Sidebar agora exibe badge crítico em `Status do sistema` quando houver webhooks em dead-letter, contas SMTP em erro ou reclamações públicas nas últimas 24h.
O link do badge abre `/status?tab=incidents` e posiciona foco/scroll diretamente no painel operacional para reduzir tempo de triagem.
Filtro de incidentes em `/status` passa a sincronizar com a URL via `incident_type`, mantendo contexto em navegação, refresh e compartilhamento.
v1.0.284
Feature
02 de jul. de 2026
Status: incidentes de entrada (bounce/complaint/unsubscribe)
eventos
Painel operacional em /status agora consolida eventos públicos de entrada das últimas 24h — hard bounces, reclamações de spam e descadastros — como incidentes filtráveis.
Cada incidente de entrada abre a auditoria já filtrada por categoria `data` e janela 24h, ligando observabilidade a ação sem sair do healthcheck.
Novo cartão de contagem `Entrada` e filtro dedicado no seletor de tipos garantem visibilidade rápida de picos de deliverability.
v1.0.283
Infra
02 de jul. de 2026
Cloud: retry server-side de webhooks
webhookwebhookshmacidempotency
Adicionadas server functions para reprocessar entregas de webhook vencidas no Cloud sem depender do runner local bloqueado em modo Cloud.
Retry manual no histórico agora usa dispatcher server-side quando a workspace Cloud está ativa, preservando HMAC, idempotency key, rotação de secret e política de dead-letter.
O botão `Processar agora` reprocessa até 10 retries vencidos no backend, hidrata imediatamente o ledger local e mantém timeline/auditoria consistentes entre dispositivos.
v1.0.282
Infra
02 de jul. de 2026
Cloud: ledger persistente de entregas webhook
webhookwebhooksdeliveries
Criada persistência Cloud para `webhook_deliveries` com RLS, GRANTs explícitos, índices por webhook/data, fila de retry e dead-letter.
Novas server functions listam, salvam e excluem entregas de webhook com resolução segura por workspace e `local_id`.
Novo `useCloudWebhookDeliveriesSync` hidrata, faz backfill e sincroniza o histórico de entregas entre dispositivos, atualizando status dos webhooks no painel operacional.
v1.0.281
Infra
02 de jul. de 2026
Cloud: backfill contínuo de engajamento
endpointendpointseventos
`useCloudEngagementSync` agora executa backfill a cada 30s (e no `visibilitychange`) usando cursor `since` para trazer aberturas/cliques gerados pelos endpoints públicos em outros dispositivos.
Merge idempotente por `id` mantém o store limitado a 5000 eventos e preserva `uniqueKeys` para deduplicação de KPIs agregados.
v1.0.279
Infra
02 de jul. de 2026
Cloud: central pública de preferências persistida
apirestendpoint
Novo endpoint `/api/public/preference` valida token feedback assinado e aplica descadastro, reativação e reclamação diretamente no Supabase.
Página `/feedback/$slug` agora sincroniza ações públicas (unsubscribe, resubscribe, complaint) com o backend Cloud sem depender de polling.
Reativação pública remove supressões reversíveis, restaura status do contato quando não há bloqueio residual e registra auditoria dedicada.
v1.0.278
Infra
02 de jul. de 2026
Cloud: persistência server-side para eventos públicos
endpointendpointseventos
Endpoints públicos de tracking, descadastro e feedback agora persistem diretamente no Supabase quando o link contém `workspace_id`, sem depender de polling client-side em modo Cloud.
Eventos públicos gravam engajamento, supressões e auditoria com deduplicação por constraints do banco e resolução de campanhas por `local_id`.
Tokens públicos de descadastro passaram a validar também o workspace do link, reduzindo risco de uso cruzado entre tenants.
v1.0.277
Correção
02 de jul. de 2026
Cloud: runners locais bloqueados no modo Cloud
webhookeventos
`campaign-simulator`, `automation-runner` e `webhook-retry-runner` agora respeitam `isCloudEnabled()` e não executam processamento local quando a workspace Cloud já está ativa.
Syncs públicos de tracking, unsubscribe e feedback deixam de fazer polling client-side em modo Cloud, evitando duplicidade contra rotinas backend/server-side.
Reduz risco de envios simulados, automações, retries de webhook e eventos públicos serem aplicados duas vezes durante uso real com persistência Cloud.
v1.0.274
Infra
02 de jul. de 2026
Cloud: workspace unificado em API keys, automações e billing/suporte
apiwebhookwebhooks
`api-keys.functions.ts`, `automations.functions.ts` e `billing-support.functions.ts` agora resolvem workspace via `ensureWorkspaceId` centralizado.
Removidas duplicações locais de `slugify`/`ensureWorkspace` desses módulos, eliminando divergência de comportamento no primeiro login.
Sem mudança funcional: chaves de API, webhooks, automações, faturamento e chamados continuam usando as mesmas policies/RLS.
v1.0.273
Infra
02 de jul. de 2026
Cloud: workspace unificado em domínios, templates e engajamento
eventos
`domains.functions.ts`, `templates.functions.ts` e `engagement.functions.ts` passaram a resolver workspace via `ensureWorkspaceId` centralizado.
Removidas duplicações locais de slug/provisionamento desses fluxos para evitar divergência no primeiro login e em acessos multi-workspace.
Mantidas as validações existentes de DNS, templates e eventos; a mudança é focada em consistência de identidade e segurança Cloud.
v1.0.261
Infra
02 de jul. de 2026
Cloud: persistência de faturamento e suporte
api
Novas tabelas `billing_accounts`, `billing_invoices` e `support_tickets` com RLS por workspace e grants explícitos para o Data API.
Server functions `get/upsertBillingStateFn` e `list/upsert/deleteSupportTicketFn` sincronizam plano, ciclo, faturas e chamados com validação Zod.
`useCloudBillingSupportSync` no `AppShell` hidrata faturamento/suporte e faz flush diferencial periódico, preservando histórico local e estados de assinatura.
v1.0.260
Infra
02 de jul. de 2026
Cloud: persistência de API keys e webhooks
apiwebhookwebhookseventos
Novas tabelas `api_keys` e `webhooks` com RLS por workspace (owner/admin excluem; membros gerenciam) e trigger `updated_at`.
Server functions `list/upsert/deleteApiKeyFn` e `list/upsert/deleteWebhookFn` com upsert idempotente por `local_id`.
`useCloudApiKeysSync` no `AppShell` hidrata na entrada e faz flush diferencial (6s + beforeunload), preservando rotação de segredo, eventos e status de última entrega.
v1.0.259
Infra
02 de jul. de 2026
Cloud: persistência do log de auditoria
eventos
Nova tabela `audit_events` com RLS por workspace (membros veem/registram, owner/admin marca revisado ou remove) e índices por timestamp e categoria.
Server functions `listAuditEventsFn`, `insertAuditEventsFn` e `setAuditReviewedFn` cobrem hidratação inicial, upsert idempotente por `local_id` e sincronização do estado de revisão.
`useCloudAuditSync` roda no `AppShell` com flush diferencial a cada 7s e no `beforeunload`, mantendo eventos e marcações consistentes entre dispositivos.
v1.0.251
Infra
02 de jul. de 2026
Cloud: persistência de engajamento
eventos
Eventos de open/click passam a ser sincronizados com o Lovable Cloud em lote, com deduplicação por unique_key e resolução automática do UUID da campanha.
O AppShell hidrata o histórico de engajamento da nuvem ao entrar no app e faz flush periódico (a cada 4s e no beforeunload) do buffer local.
Novas server functions `recordEngagementEventsFn` e `listEngagementEventsFn` respeitam workspace do usuário via RLS.
v1.0.245
Feature
02 de jul. de 2026
Fila: orquestrador de envio com rotação e limites reais
rest
Novo orquestrador central calcula o próximo ciclo de envio por prioridade, janela, agendamento, cadência, throttle e capacidade diária restante.
A simulação operacional passou a usar alocação por conta com rotação por menor saturação, respeitando daily_limit, sent_today, warmup e contas pausadas por campanha.
A página Fila e o Dashboard agora expõem métricas do próximo ciclo e a distribuição prevista por conta, facilitando diagnóstico antes do disparo.
v1.0.243
Feature
02 de jul. de 2026
Campanhas: autopromoção estatística de testes A/B
webhook
Engine de campanhas agora atribui envios, aberturas, cliques, respostas e bounces por variante, mantendo métricas A/B persistidas por etapa.
Testes A/B podem promover automaticamente a variante vencedora para 100% do tráfego com critério configurável de métrica, amostra mínima, lift e confiança.
Promoções geram auditoria, webhook campaign.ab_winner_promoted, documentação pública e painel operacional no editor da sequência com status estatístico e resultado final.
v1.0.242
Feature
02 de jul. de 2026
Central pública de preferências: consistência com CRM e webhooks
webhookwebhooks
Reativação de recebimento na central pública agora emite o webhook resubscribe com motivo anterior e origem, mantendo integrações externas em sincronia.
Adicionada ação Reportar envio indevido para o contato registrar reclamação direto na central; gera supressão tipo complaint, auditoria e webhook complaint com flag wrong_recipient.
Novo evento de webhook resubscribe disponível para inscrição, com payload de exemplo e suporte completo em testes/entregas.
v1.0.241
Feature
02 de jul. de 2026
Master Inbox: IA explicável com revisão auditável
eventos
Classificação de intenção agora registra fonte, modelo, sinais detectados, explicação, horário da análise e flag de revisão quando a confiança é baixa ou ambígua.
Master Inbox ganhou filtro por revisão da IA, badges de pendência, painel de leitura da IA e ações para confirmar, reclassificar ou corrigir manualmente a intenção.
Confirmações, reclassificações e correções manuais passam a gerar eventos de auditoria na categoria Inbox, aparecendo também na timeline operacional.
v1.0.239
Feature
02 de jul. de 2026
Inbound: replay em lote com auditoria agregada
webhookwebhookseventos
A aba Inbound ganhou ação Aplicar pendentes para processar em lote os eventos ainda não aplicados no filtro atual.
O replay em lote confirma antes de executar, atualiza supressões/CRM, dispara webhooks quando aplicável e mantém os badges aplicado/pendente sincronizados.
Cada lote aplicado registra auditoria agregada com contagem por tipo, filtros ativos e IDs dos eventos para investigação posterior.
v1.0.238
Feature
02 de jul. de 2026
Inbound: replay manual com rastreabilidade completa
webhookeventos
Eventos inbound agora exibem badge aplicado/pendente baseado no cursor de processamento persistido.
Botão Aplicar/Reaplicar reexecuta supressão, auditoria e webhook (com flag replay) para incidentes que precisem de remediação manual.
applyFeedbackEvent e getProcessedFeedbackIds expostos a partir de public-feedback-sync para reuso em ferramentas operacionais.
v1.0.237
Correção
02 de jul. de 2026
Webhooks: investigação por delivery_id e filtros inbound resilientes
apiwebhookwebhooksdeliveryeventos
Eventos derivados de webhook agora carregam delivery_id estruturado em auditoria e timeline, permitindo rastrear uma entrega específica ponta a ponta.
/atividade e /auditoria passaram a aceitar filtro compartilhável por delivery, com badges removíveis, exportação preservando o escopo e links reversos para o histórico do webhook.
Os atalhos dentro do histórico de entregas agora abrem timeline/auditoria já filtradas por webhook_id e delivery_id, reduzindo ruído em incidentes de retry/dead-letter.
A aba Inbound em /api deixou de depender de window.location para estado inicial e sincroniza filtros/paginação via Route.useSearch, mantendo deep-links consistentes.
v1.0.236
Feature
02 de jul. de 2026
Webhooks: investigação profunda por entrega
apiendpointwebhookwebhooksdelivery
Deep-links para /api?tab=webhooks agora abrem automaticamente o histórico do endpoint e selecionam a entrega quando delivery_id está presente.
Timeline, notificações críticas e auditoria passaram a apontar para o webhook/entrega exatos, preservando webhook_id nos eventos derivados e exportações.
Badges de escopo em /atividade agora podem remover filtros individualmente, incluindo webhook, sem perder os demais recortes salvos ou compartilhados.
Política de retry foi alinhada à documentação pública (1m, 5m, 30m, 2h; 5 tentativas totais) e respostas 410 Gone pausam automaticamente o endpoint.
v1.0.235
Feature
02 de jul. de 2026
API & Webhooks: documentação versionada e catálogo público
apiwebhookwebhookseventos
Adicionado banner de versão da API (X-DestrIA-Version) com política de coexistência de 90 dias na documentação pública.
Catálogo completo dos eventos de webhook (email.*, contact.*, campaign.*) com descrição e contrato de headers.
Seção dedicada de Retry & Dead-letter explicando backoff (1m/5m/30m/2h), comportamento de 410 Gone e reentrega manual.
Documentado o fluxo de rotação de segredo com janela de 24h aceitando assinatura atual e anterior.
v1.0.234
Feature
02 de jul. de 2026
Webhooks: notificações críticas e dead-letter observável
apiwebhookwebhookseventos
Falhas definitivas de webhook e acúmulo de retries agora geram notificações in-app com severidade, evento afetado, HTTP status e link direto para /api?tab=webhooks.
A timeline operacional passou a incluir entregas de webhook com retry, recuperação e dead-letter, preservando o histórico de incidentes de integrações externas.
A auditoria derivada agora expõe eventos sistêmicos de webhook retry/dead-letter com webhook_id, tentativa, status_code e flags de retry/falha final.
Views salvas de /auditoria agora preservam filtros de member, invite, plan e integration, fechando a lacuna de compartilhamento dos escopos administrativos recentes.
v1.0.233
Feature
02 de jul. de 2026
Integrações: auditoria e investigação ponta a ponta
webhookwebhookseventos
Conectar, atualizar, pausar, reativar, sincronizar, desconectar e limpar logs de integrações agora registram eventos padronizados em auditoria com actor, target e integration_id.
/integracoes ganhou atalhos para timeline e auditoria, incluindo deep-links por integração em cada conector conectado.
/atividade e /auditoria agora aceitam filtro compartilhável por integração, com escopo estruturado para logs de sync, conexões e eventos auditados.
URLs de webhooks/conectores são validadas como HTTPS públicas, bloqueando localhost, IPs privados, credenciais embutidas e fragmentos inseguros.
v1.0.232
Feature
02 de jul. de 2026
API & Webhooks: trilha de auditoria completa
apiwebhookwebhookseventos
Criação, rotação, revogação e exclusão de API keys agora geram eventos de auditoria com prefixo da chave e severidade adequada.
Webhooks registram criação, ativação/pausa, rotação de secret (com grace de 24h), revogação do secret anterior e exclusão — todos com webhook_id e URL como target.
Eventos categorizados em `api` e `integrations` para alimentar filtros de /atividade e /auditoria sem ruído cruzado.
v1.0.231
Correção
01 de jul. de 2026
Administrativo: observabilidade de equipe e faturamento
eventos
Eventos de equipe e faturamento agora registram member_id, invite_id e plan_id em auditoria, permitindo investigação precisa por entidade administrativa.
/atividade e /auditoria passaram a aceitar filtros compartilháveis para membros, convites e planos, mantendo o contexto de gestão em deep-links e exportações.
Equipe e faturamento ganharam atalhos de investigação para timeline/auditoria, incluindo ações por membro e convites pendentes ou históricos.
v1.0.228
Correção
01 de jul. de 2026
Entidades: atalhos de investigação para auditoria e timeline
eventos
Detalhes de contato e conta SMTP ganharam atalhos diretos para /atividade com escopo da entidade, além dos links de auditoria existentes.
A timeline operacional agora aceita filtros compartilháveis por contato, conta, campanha, lista, template e domínio, preservando contexto em incidentes ponta a ponta.
Eventos da atividade passaram a carregar metadados de escopo para que deep-links vindos de entidades e auditoria retornem apenas o recorte afetado.
v1.0.226
Correção
01 de jul. de 2026
Atividade: timeline operacional compartilhável
eventos
/atividade agora valida e sincroniza período, categoria, ator e busca pela URL, mantendo filtros ao compartilhar links, voltar/avançar no navegador e exportar CSV.
Timeline passou a incluir eventos operacionais persistidos de auditoria, com origem por ator (operador, sistema, contato ou integração) para investigação ponta a ponta.
Dashboard e notificações ganharam deep-links para abrir a timeline já filtrada pelo incidente, reduzindo perda de contexto durante triagem operacional.
v1.0.224
Correção
01 de jul. de 2026
Campanhas: engajamento operacional por recorte
eventos
Detalhe de campanha agora sincroniza aba/filtros de engajamento pela URL, com segmentos de todos, cliques, alta intenção e baixa intenção mais busca por contato/empresa/status.
KPIs do detalhe passaram a mostrar contadores agregados junto de aberturas/cliques únicos vindos do engagement store, deixando clara a diferença entre métricas históricas e eventos por destinatário.
Geração de lista, follow-up e CSV de engajamento agora respeitam o recorte ativo, validam contas saudáveis e incluem metadados de segmento, origem e último evento para uso real pelo time comercial.
v1.0.220
Correção
01 de jul. de 2026
Relatórios: tracking real no simulador de campanha
webhookwebhookseventos
Simulador de envio agora persiste eventos de abertura/clique por contato durante cada tick, alimentando relatórios, detalhe de campanha, contatos, inbox e listas de engajados.
Eventos simulados não duplicam os contadores agregados da campanha nem reemitem webhooks, preservando métricas consistentes após lançamento e follow-up manual.
v1.0.219
Correção
01 de jul. de 2026
Configurações: restaurar padrão da janela de envio
rest
Adicionado botão 'Restaurar padrão' na seção de janela padrão de envio em /configuracoes para reverter dias, horários, limite diário e intervalo aos valores recomendados.
Cabeçalho da seção agora se adapta a viewports pequenos (358px) mantendo o título e a ação acessíveis sem overflow.
v1.0.213
Feature
01 de jul. de 2026
Sequência: disparo manual seguro de follow-up
rest
Detalhe da campanha ganhou ação 'Disparar follow-up agora' quando há next_step_at pendente em campanha running.
A ação é restrita a admin via permissão team.manage, bloqueada durante simulação de usuário e exige confirmação explícita.
Ao confirmar, a campanha limpa next_step_at preservando current_step_index e queued, liberando o próximo tick da fila imediatamente.
Auditoria registra campaign.followup_forced com ator, campanha, passo, volume em fila e horário originalmente agendado.
v1.0.207
Feature
01 de jul. de 2026
Equipe: user_roles canônico, auditoria e exportação
rest
Papéis de membros agora também persistem em `user_roles`, mantendo o membro denormalizado apenas para compatibilidade visual.
Aceite de convite, troca de papel, simulação de acesso, suspensão, remoção e exportação registram auditoria persistida.
A tela /equipe ganhou KPIs operacionais e export CSV da matriz de membros, papéis e convites para revisão de acesso.
Guardrails impedem alterar, suspender, remover ou simular usuários indevidamente quando o ator atual não é admin, está em simulação ou quando restaria zero admin ativo.
v1.0.205
Feature
01 de jul. de 2026
Feedback público: central assinada de preferências
webhook
Nova rota /feedback/$slug valida token assinado antes de expor histórico consolidado do contato.
A central lista preferências, supressões, respostas do inbox e campanhas relacionadas ao e-mail do contato.
Contatos podem confirmar descadastro ou reativar apenas supressões reversíveis, com auditoria e webhook de unsubscribe.
v1.0.204
Feature
01 de jul. de 2026
Webhooks: painel de entregas (sucesso, falhas, retries)
apiendpointwebhookwebhookseventos
Novo painel acima da lista de webhooks com KPIs de 24h e 7 dias: total de entregas, taxa de sucesso, retries pendentes e falhas.
Destaque de eventos com mais falhas em 7 dias para diagnosticar rapidamente o endpoint problemático.
Saúde individual por webhook (% sucesso · volume nos últimos 7 dias) com classificação por cor (success/warning/danger).
v1.0.199
Feature
01 de jul. de 2026
Inbox: rascunho de resposta persistente por thread
rest
Cada thread mantém o rascunho de resposta em localStorage, restaurado ao reabrir a conversa.
Indicador 'Rascunho salvo' e botão 'Descartar' próximos ao Sugerir com IA evitam perda de texto e dão controle explícito.
Rascunho é limpo automaticamente após envio bem-sucedido.
v1.0.196
Infra
01 de jul. de 2026
Endpoints públicos: rate limit unificado
apiendpointendpointsrate-limitrate limit
Novo módulo public-rate-limit centraliza sliding-window por IP para /api/public/*.
/api/public/unsubscribe agora limita 60 req/min/IP com 429 + Retry-After.
/api/public/track limita 600 req/min/IP retornando pixel vazio ou 302 sem registrar evento quando estourado, evitando amplificação de abuso.
/api/public/feedback migrado para o limiter compartilhado mantendo 240 req/min/IP.
v1.0.195
Infra
01 de jul. de 2026
Feedback público: rate limit e proteção de payload
apiendpointrate limit
Endpoint /api/public/feedback agora aplica rate limit por IP (240 req/min) com resposta 429 + Retry-After.
Payloads acima de 64KB são rejeitados com 413 antes do parse, evitando abuso e consumo desnecessário de CPU.
Dedup de 10 minutos por (email, tipo, campanha) mantido — entradas duplicadas retornam 202 sem reprocessar.
v1.0.194
Feature
01 de jul. de 2026
Inbound: filtros persistentes, paginação e export CSV
apieventos
A aba Inbound em /api agora persiste tipo, período, busca e página na URL, mantendo o contexto após navegação, refresh ou compartilhamento do link.
Eventos recebidos ganharam paginação acessível, contador de novos eventos em tempo real e filtro por período (24h, 7d, 30d).
A exportação CSV dos eventos inbound respeita os filtros ativos, registra o arquivo em /exports e grava auditoria com quantidade e contexto exportado.
v1.0.193
Feature
01 de jul. de 2026
API & Webhooks: histórico exportável e limpeza confirmada
apiwebhookwebhooksidempotency
Histórico de entregas de webhook ganhou exportação CSV (via downloadAndRecord, registrado em /exports e auditoria) com status, tentativa, latência, idempotency key e erro.
Ação 'Limpar histórico' agora exige confirmação destrutiva, registra evento de auditoria e avisa que entregas com retry agendado também serão removidas.
v1.0.185
Feature
01 de jul. de 2026
Webhooks: visibilidade de retries agendados
webhookwebhooks
Banner na aba Webhooks mostra quantas entregas têm retry agendado e o ETA do próximo, atualizando a cada segundo.
Botão 'Processar agora' força a execução imediata do runner de retries com feedback de loading e contagem de recuperados x pendentes.
Erros durante o processamento manual aparecem como toast acionável em vez de falharem em silêncio.
v1.0.184
Correção
01 de jul. de 2026
Auth guard: hidratação estável em rotas protegidas
rest
O guard das rotas internas deixou de redirecionar durante o beforeLoad inicial, evitando mismatch de hidratação quando uma URL protegida é aberta sem sessão demo.
A verificação de sessão agora aguarda a reidratação do store local persistido antes de decidir entre renderizar o app ou enviar para /auth.
Enquanto a sessão é restaurada ou o login é acionado, a rota mostra um estado de transição explícito em vez de conteúdo instável ou tela em branco.
v1.0.183
Correção
01 de jul. de 2026
Inbound: sincronização visível, retry e estado vazio operacional
apieventos
A aba Inbound em /api agora mostra status de sincronização, última atualização e loading inicial em skeletons, evitando tela aparentemente parada enquanto busca eventos.
Falhas ao carregar /api/public/feedback-events exibem mensagem acionável, botão 'Tentar agora' e retry automático com backoff exponencial até o limite de tentativas.
Estado vazio diferencia ausência real de eventos de filtro sem resultados e oferece CTA para sincronizar ou limpar filtros, mantendo o fluxo de feedback ponta a ponta mais claro.
v1.0.181
Correção
01 de jul. de 2026
Changelog: filtros persistentes e views salvas
rest
Busca e filtro por tag em /changelog agora persistem na URL, permitindo voltar, compartilhar e restaurar o contexto sem perder a seleção atual.
Tela ganhou Saved Views, contadores por tag e resumo de resultados com aria-live para paridade operacional com Auditoria e Exports.
Estado vazio diferencia histórico realmente vazio de busca sem resultados e oferece limpeza direta dos filtros ativos.
v1.0.179
Correção
01 de jul. de 2026
Auditoria: filtros persistentes e export rastreável
resteventos
Filtro 'Ocultar revisados' em /auditoria agora sincroniza com a URL e pode ser salvo/restaurado em views, mantendo contexto ao navegar ou compartilhar links.
Export CSV da auditoria passou a registrar todos os filtros aplicados no histórico de /exports e fica bloqueado quando não há eventos visíveis.
Limpeza de logs persistidos ganhou ação destrutiva semântica, contagem explícita de registros afetados e limpeza automática da seleção ativa.
v1.0.174
Correção
01 de jul. de 2026
Supressão: prévia ao vivo, layout mobile e tokens semânticos
rest
Diálogo 'Adicionar à supressão' mostra contagem em tempo real de e-mails novos, já listados, repetidos e inválidos enquanto o usuário digita; botão de envio só habilita quando há pelo menos um novo válido.
Lista de supressão ganhou layout em cards para viewports < sm, com checkbox global, e-mail quebrável, motivo e data legíveis em 358px.
AlertDialog de remoção em massa agora usa text-danger-foreground (em vez de text-white hardcoded), alinhando com o restante do app.
v1.0.169
Correção
01 de jul. de 2026
Health Check SMTP com diagnóstico acionável
api
Teste de conexão em /contas agora diferencia offline, configuração inválida, DNS, TCP, TLS, autenticação e timeout, exibindo correção sugerida em toast e no card da conta.
Store de contas persiste código, detalhe e recomendação do último Health Check para alimentar preflight, notificações e a tela /contas/:id sem perder compatibilidade com dados antigos.
Formulário de contas SMTP bloqueia duplicidade de e-mail, host local/privado, porta inválida, Reply-To incorreto, limites incoerentes e exige confirmação explícita ao sobrescrever senha/API key.
v1.0.166
Correção
01 de jul. de 2026
Fila de envios responsiva por conta SMTP
rest
Subtabela de contas SMTP em /fila ganha layout em cards para viewports < sm, com status, uso diário, saúde e restante sem scroll horizontal.
v1.0.158
Feature
01 de jul. de 2026
UI de Inbound em /api: endpoint, payloads e provedores
apiendpointwebhookeventos
Nova aba Inbound em /api com a URL pública /api/public/feedback, botão de copiar, tipos aceitos, aliases e limites operacionais (lote 100, dedupe 10 min).
Exemplos prontos para colar: payload genérico (lote), transform SendGrid Event Webhook e Postmark Bounce/SpamComplaint mapeando os eventos para hard_bounce/soft_bounce/complaint.
Comunica explicitamente o comportamento de supressão automática (hard_bounce/complaint) vs auditoria apenas (soft_bounce) para evitar configurações que destruam reputação.
v1.0.157
Feature
01 de jul. de 2026
Ingestão pública de bounces e reclamações (FBL)
apiendpointwebhookwebhookscors
Criado endpoint POST /api/public/feedback aceitando eventos hard_bounce, soft_bounce e complaint (lote até 100) com CORS aberto, no-store e noindex — alvo para webhooks de provedores SMTP (SendGrid/Postmark/Mailgun) e FBL.
Buffer em memória (src/lib/public-feedback-buffer.ts) com normalização de tipos (bounce/hard/soft/complaint/spam/fbl), validação de e-mail, captura de IP/UA e dedupe de 10 min por (email,type,campanha).
Endpoint privado GET /api/public/feedback-events protegido por sec-fetch-site + header X-DestrIA-Local-Sync para consumo apenas pelo app.
Hook usePublicFeedbackSync montado no AppShell aplica supressão real (bounce→bounce, complaint→complaint), registra auditoria (contact.bounced/complaint/soft_bounced) e emite webhooks de saída bounce/complaint com payload de provedor.
Soft bounces ficam apenas em auditoria (severity info) e não suprimem o contato nem emitem webhook — preserva reputação sem perder observabilidade.
v1.0.156
Feature
30 de jun. de 2026
One-Click Unsubscribe e envio de teste funcional
apiendpointwebhook
Implementado endpoint público /api/public/unsubscribe para List-Unsubscribe One-Click (RFC 8058) com token validado e resposta no-store/noindex.
Criado sync local de descadastros públicos para aplicar supressão real, registrar auditoria e emitir webhook unsubscribe sem depender do Lovable Cloud.
Envio de teste da campanha agora renderiza pelo mesmo pipeline do disparo real, mostra headers de deliverability e registra evento email.sent com payload e auditoria.
Previews de campanha exibem os headers List-Unsubscribe/List-Unsubscribe-Post para validação operacional antes do lançamento.
v1.0.145
Infra
30 de jun. de 2026
Auditoria E2E mobile (358px) com sessão demo
api
Auditoria de ponta-a-ponta via Playwright em 358×700 com sessão demo persistida: visitadas as 30 rotas principais (/dashboard, /boas-vindas, /tour, /contatos, /listas, /contas, /dominios, /templates, /campanhas, /inbox, /automacoes, /fila, /analytics, /atividade, /relatorios, /notificacoes, /api, /integracoes, /cloud, /equipe, /auditoria, /faturamento, /perfil, /ajuda, /configuracoes, /changelog, /exports, /supressao, /status, /publicar). Zero erros de console, zero pageerror, zero falhas de navegação e zero loops de getSnapshot / Maximum update depth. Fluxo principal validado para uso real.
v1.0.143
Correção
30 de jun. de 2026
Confirmações nativas substituídas por AlertDialog
api
Criado ConfirmDialogHost global (montado no AppShell) com API confirmAction({description, ...}) baseada em AlertDialog do shadcn. Os 12 window.confirm() do PreflightDialog (vincular lista/contas, retestar contas, aplicar autocorreções, remover supressões manuais etc.) agora usam o diálogo acessível com foco/aria nativos e fechamento via Esc, mantendo a UX consistente com o design system.
v1.0.141
Correção
30 de jun. de 2026
Tema: avisos usam tokens semânticos de warning
api
Substituídos usos ad-hoc de bg-amber-*/text-amber-*/border-amber-* por tokens semânticos (bg-warning/10, text-warning, border-warning/40) em boas-vindas, status, publicar, auditoria, API, banner de pausa automática, quota de storage, preview de campanha e detalhe de campanha. Garante contraste consistente em dark mode e alinhamento com o design system.
v1.0.127
Feature
30 de jun. de 2026
Dashboard: mini chart de Atividade de envio (14d)
eventos
Card Atividade de envio do dashboard substitui o placeholder por barras diárias dos últimos 14 dias agregando aberturas, cliques e eventos de campanha (criadas/lançadas), com tooltip por dia, total agregado e legenda. Mantém EmptyState quando não há eventos.
v1.0.121
Correção
30 de jun. de 2026
/auditoria: empty state com Limpar filtros
eventos
Quando há eventos mas nenhum corresponde aos filtros, o empty state agora oferece CTA Limpar filtros que reseta período, categoria, severidade e busca.
v1.0.108
Correção
30 de jun. de 2026
/relatorios: filtros, empty states e exports defensivos
rest
/relatorios: header agora exibe CTA 'Limpar filtros' quando período/campanha/status fogem do padrão, restaurando o recorte de 30 dias com um clique.
Empty state global divide dois casos: sem dados na conta (CTA 'Importar contatos') e recorte de filtros sem resultados (CTA 'Limpar filtros').
Botões de Resumo CSV/JSON e 'Lista de engajados' ficam desabilitados quando não há nenhum dado para exportar, evitando toasts redundantes.
v1.0.104
Correção
30 de jun. de 2026
Runner de automações respeita visibilidade da aba
webhook
useAutomationRunner agora pula ticks quando a aba está oculta e dispara um catch-up imediato ao retornar à aba, alinhando com tracking-sync e webhook-retry — menos trabalho ocioso em mobile e melhor responsividade ao voltar ao app.
v1.0.81
Feature
30 de jun. de 2026
/status enriquecido + exportar diagnóstico
webhookwebhooks
Adicionados checks de conexão (online/offline), Lovable Cloud (modo local/cloud), webhooks (pending/dead-letter) e automações ativas ao /status.
Botão 'Exportar diagnóstico' gera JSON com checks, ambiente e backup completo — pronto para anexar em chamados de suporte.
Resumo geral agora reflete falhas de rede e backlog de webhooks como erros bloqueantes.
Criado src/lib/cloud-bridge.ts com isCloudEnabled(), currentCloudMode(), cloudBridgeStatus() e helper selectDataSource para alternar entre local e Cloud sem refatoração.
/cloud mostra a fonte de dados atual (local vs cloud) com badge e razão, preparando a troca incremental dos stores.
Criado pacote SQL automations_cron com automations, automation_runs, webhook_endpoints, webhook_secrets, webhook_deliveries e cron_jobs.
Entregas de webhook idempotentes (unique endpoint_id + idempotency_key), com backoff exponencial via compute_webhook_backoff e dead_letter após max_attempts.
Seed de jobs pg_cron (dispatch, automations, retry de webhook, snapshot diário) e /cloud lista a Fase 5 com tabelas e funções.
v1.0.51
Feature
30 de jun. de 2026
Banner de cota esgotada no /faturamento com upgrade rápido
rest
/faturamento: novo banner que aparece quando a cota mensal de envios está esgotada (>=100%) ou baixa (<=10% restantes), com CTAs 'Ver planos' (scroll para a grade) e 'Upgrade para {próximo plano}'.
Seção de planos ganhou âncora #planos e scroll-mt para deep-link a partir de outros pontos do app.
v1.0.42
Feature
30 de jun. de 2026
Equilibrar pesos A/B direto do preflight
rest
PreflightDialog ganhou prop onNormalizeVariantWeights e CTA 'Equilibrar pesos A/B para 100%' quando há avisos variant-weight-*, com window.confirm antes de mutar.
/campanhas/:id implementa normalizeVariantWeights: redistribui uniformemente os pesos das variantes em cada etapa (base + resto nos primeiros índices) para somar exatamente 100, via updateCampaign, e re-executa runPreflight para limpar o aviso sem sair do modal.
v1.0.33
Feature
30 de jun. de 2026
Preflight valida frescor do health check SMTP
v1
runPreflight agora emite warnings 'accounts-untested' (conta nunca testada), 'accounts-stale-test' (>7 dias desde last_test_at) e 'accounts-last-error' (last_error preenchido sem status=error), com fix → /contas.
Permite que o operador rode useAccountsStore.testConnection antes de lançar uma campanha em vez de descobrir credencial expirada no meio do disparo — fecha o loop com a action consolidada em v1.0.32.
v1.0.31
Correção
30 de jun. de 2026
Gate de UI offline em ações de rede real
webhook
Botão 'Rodar Health Check' em /contas/:id e 'Verificar agora' em /dominios/:id consomem useNetworkStatus: ficam desabilitados com title='Indisponível offline' quando navigator.onLine === false.
Handlers runTest (SMTP) e onVerify (DNS) checam offline antes de qualquer side-effect e exibem toast explicativo em vez de simular sucesso falso, mantendo a auditoria e o estado da conta/domínio consistentes.
Complementa o gate já existente no dispatcher de webhook — agora os três pontos de rede real do app têm UX coerente quando o usuário perde conexão.
v1.0.30
Infra
30 de jun. de 2026
Status de rede como sinal global + gate no dispatcher
apiwebhook
Novo src/lib/network-status.ts expõe useNetworkStatus (useSyncExternalStore com snapshot estável SSR) e helpers isOnline/requireOnline/OfflineError reutilizáveis por qualquer ação que dependa de rede real.
OfflineBanner refatorado para consumir o sinal global em vez de manter useState local — sem listeners duplicados, sempre coerente entre componentes.
dispatchWebhook (src/stores/api-keys.store.ts) agora curto-circuita com erro 'offline' antes do fetch, evitando agendamento de retry/backoff por uma falha previsível e mantendo a auditoria correta.
v1.0.29
Feature
30 de jun. de 2026
Banner global de status offline
eventos
Novo OfflineBanner em src/components/layout/offline-banner.tsx monta logo abaixo do Header e escuta eventos window 'online'/'offline'.
Quando navigator.onLine === false, exibe aviso role=status / aria-live=polite explicando que as alterações ficam salvas localmente e sincronizam ao voltar — alinhado com a estratégia de persistência via localStorage.
Some automaticamente quando a conexão volta, sem reload e sem perda de estado.
v1.0.23
Correção
30 de jun. de 2026
Simulador respeita retorno tipado em bounce/complaint
webhookeventos
campaign-simulator agora só registra auditoria contact.bounced_suppressed / contact.complaint_suppressed e dispara webhook quando suppressEmail retorna status 'added'.
Evita duplicação de eventos quando um contato já estava suprimido por bounce/complaint anterior; payload do webhook reflete apenas os novos afetados.
v1.0.22
Correção
30 de jun. de 2026
Descadastro público diferencia novo vs. já listado
webhook
/descadastrar usa o retorno tipado de suppressEmail para distinguir 'novo descadastro' de 'já estava na supressão' e exibe mensagem honesta ao usuário.
Auditoria contact.unsubscribed e webhook unsubscribe só disparam em novos descadastros — antes podiam ser duplicados em recarga/reabertura do link.
v1.0.20
Correção
30 de jun. de 2026
Guard-rail de unsuppress no nível do store
api
unsuppressEmail no data.store agora exige opção { force: true } para remover entradas por bounce/complaint, retornando { ok, entry, reason } para o caller decidir.
Fonte única de verdade: qualquer chamada futura (API, automações, integrações) respeita a regra sem depender da UI.
Ação individual em /supressao exibe confirm() extra antes de forçar remoção sensível e audita com severity correta.
v1.0.16
Feature
30 de jun. de 2026
Reagendar campanha sem reabrir preflight
v1
Campanhas em status scheduled ganham botão Reagendar com diálogo datetime-local pré-preenchido com o horário atual.
Reagendamento valida horário futuro e mantém destinatários/envios planejados já calculados — não recomputa preflight.
Combinado com Cancelar agendamento e Iniciar agora (v1.0.15), o operador tem controle total sobre o ciclo de lançamento automático.
v1.0.14
Feature
30 de jun. de 2026
Agendamento de campanhas pelo preflight
v1
Diálogo de verificação ganha opção Agendar com seletor datetime-local, validação de data futura e mensagem explicando a janela.
Novo scheduleCampaign no store define scheduled_at, fila e total de destinatários sem disparar imediatamente.
Combinado com o auto-launch (v1.0.13), o operador pode preparar a campanha e deixá-la iniciar sozinha no horário escolhido.
v1.0.13
Feature
30 de jun. de 2026
Lançamento automático de campanhas agendadas
webhook
Campanhas em status scheduled passam a running automaticamente quando o scheduled_at chega e a janela de envio está aberta.
Novo evento de webhook campaign.started disparado no lançamento automático, com payload incluindo scheduled_at e nome da campanha.
Auditoria registra campaign.auto_launched com motivo scheduled_time_reached para rastrear lançamentos sem intervenção manual.
v1.0.11
Feature
30 de jun. de 2026
Reclamações de spam (FBL) com supressão automática
webhookeventos
Simulador emite eventos complaint com pequena fração do lote, marcando contatos como complaint na supressão global.
Novo evento de webhook complaint disponível para assinatura, com payload de feedback loop e contatos afetados.
Auditoria registra cada contato suprimido por reclamação de spam.
v1.0.10
Correção
30 de jun. de 2026
Bounces aplicam supressão automaticamente
webhook
Hard bounces simulados agora marcam contatos como bounced e entram na lista global de supressão com motivo Bounce.
Supressões por unsubscribe, complaint, bounce e manual passam a refletir o status correto do contato, evitando reativação indevida em campanhas futuras.
Auditoria registra contatos suprimidos por bounce e o payload do webhook inclui os contatos afetados no lote.
v1.0.9
Feature
30 de jun. de 2026
Webhooks — rotação de secret com grace period
webhookwebhookseventos
Botão Rotacionar gera novo secret e mantém o anterior válido por 24h.
Durante a janela, cada entrega inclui X-DestrIA-Signature-Previous, permitindo migrar o receiver sem perder eventos.
Ação Revogar agora encerra o grace imediatamente.
v1.0.8
Feature
30 de jun. de 2026
Webhooks com idempotência e anti-replay
webhookwebhookshmacidempotencyidempotência
Cada entrega gera um X-DestrIA-Idempotency-Key estável que persiste entre todas as tentativas do mesmo evento, permitindo deduplicação no destino.
Assinatura HMAC-SHA256 agora cobre `timestamp.body` e o header X-DestrIA-Timestamp acompanha cada requisição, habilitando rejeição de replays no consumidor.
Retries automáticos e manuais reutilizam a mesma chave de idempotência, garantindo que destinos compatíveis processem o evento apenas uma vez.
v1.0.7
Feature
30 de jun. de 2026
Retry automático de webhooks
endpointwebhookwebhooks
Falhas transitórias de webhook (timeout, 429 e 5xx) agora entram em retry automático com backoff até 5 tentativas.
O histórico marca origem da entrega, tentativa atual, próximo retry, falha final e mantém reenvio manual sem duplicar filas pendentes.
Um runner no app-shell processa retries vencidos em lote, respeita aba em background e atualiza o status do endpoint.
v1.0.6
Feature
30 de jun. de 2026
Entrega real de webhooks no modo local
endpointendpointswebhookwebhookshmac
Webhooks agora disparam POST real server-side para endpoints HTTPS públicos, em vez de sucesso aleatório simulado.
Cada entrega recebe headers X-DestrIA-Event, X-DestrIA-Delivery, X-DestrIA-Attempt e assinatura HMAC-SHA256 em X-DestrIA-Signature.
Histórico de entregas passa a registrar status HTTP real, latência, erro e prévia da resposta do endpoint.
v1.0.5
Correção
30 de jun. de 2026
Polling de tracking com cursor incremental
eventos
Sync de eventos públicos envia cursor `after` para receber apenas o delta novo, reduzindo banda e exposição de PII.
Polling pausa quando a aba está em background (`document.hidden`), economizando recursos.
Cursor persistido em localStorage permite retomar de onde parou após refresh sem reprocessar eventos antigos.
v1.0.4
Correção
30 de jun. de 2026
Anti-bot no pixel de tracking
apiendpoint
Aberturas disparadas por link-previewers e scanners de segurança (Mimecast, Proofpoint, Barracuda, Slackbot, etc.) são ignoradas para não inflar métricas.
Endpoint /api/public/track responde a HEAD sem registrar evento, evitando dupla contagem de scanners.
Cliques continuam sendo registrados independentemente do user-agent (sinal de intenção raro de falso positivo).
v1.0.2
Correção
30 de jun. de 2026
Endpoint público estável para tracking
apiendpointcors
URLs novas de pixel e clique agora usam /api/public/track, prefixo próprio para chamadas externas de clientes de e-mail.
A rota mantém GIF 1×1, redirect 302, no-store e CORS seguro para leitura por provedores sem depender da UI React.
A rota /track antiga continua compatível para links já gerados antes desta versão.
v1.0.1
Correção
30 de jun. de 2026
Hardening de tracking público
webhookwebhookseventos
A rota /track agora responde aberturas com GIF transparente 1×1 e headers no-store, adequado para clientes de e-mail.
Cliques rastreados agora fazem redirect HTTP 302 server-side para o destino original, sem depender de execução de React no navegador.
Eventos públicos de abertura/clique são bufferizados no servidor local e sincronizados para analytics, auditoria e webhooks enquanto o Cloud segue bloqueado.
v0.7.0
Infra
27 de jun. de 2026
Persistência local robusta
rest
safeLocalStorage com fallback de quota e toasts.
Compressão automática de imagens em anexos >1MB.
Painel de uso de armazenamento e limpeza de anexos.
Backup manual JSON e backup automático rotativo (24h).
Validação de integridade pós-restore com relatório por store.