Developers
API Changelog
OpenAPI
REST v1 pública

Changelog público para integrações em produção.

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.
v1.0.80
Infra
30 de jun. de 2026

Cloud bridge + tipos compartilhados

webhookwebhooks
  • Adicionado src/integrations/cloud/types.ts espelhando workspaces, contatos, supressão, campanhas, inbox, automações e webhooks.
  • 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.
v1.0.79
Infra
30 de jun. de 2026

Migração Cloud Automations + Webhooks + Cron preparada

endpointendpointswebhookwebhooksidempotency
  • 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.
  • RPCs SECURITY DEFINER: enqueue_webhook_delivery, record_webhook_attempt, pick_due_automations, start_automation_run, finish_automation_run.
  • 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.