CRM e contatos
Upsert idempotente por e-mail ou local_id, tags avançadas, metadata validada e proteção contra sobrescrever supressões críticas.
SDK TypeScript oficial, contrato OpenAPI 3.1, webhooks assinados e endpoints REST para CRM, campanhas, métricas e automações no-code.
Upsert idempotente por e-mail ou local_id, tags avançadas, metadata validada e proteção contra sobrescrever supressões críticas.
Crie seeds por local_id, liste campanhas, inscreva leads com segurança e consulte eventos de abertura, clique, resposta, bounce e unsubscribe por cursor.
Provisionamento por API, rotação de secret, histórico filtrável, retry manual e HMAC-SHA256 sobre timestamp.body.
Rate limits por plano com headers X-RateLimit-*, Retry-After e painel autenticado de consumo por chave, endpoint e janela.
Os exemplos abaixo usam a URL do ambiente atual e mantêm os padrões de produção: API key em variável de ambiente, retry para 429/5xx e assinatura HMAC para eventos recebidos.
curl -L https://seu-projeto.lovable.app/api/v1/sdk.ts -o destria-mailer-sdk.ts
import { createDestriaClient } from "./destria-mailer-sdk";
const destria = createDestriaClient({
apiKey: process.env.DESTRIA_API_KEY!,
baseUrl: "https://seu-projeto.lovable.app/api/v1",
});
const { data: contact } = await destria.upsertContact({
email: "[email protected]",
local_id: "crm_1842",
first_name: "Ana",
company: "Empresa",
add_tags: ["crm-sync", "lead-quente"],
});
await destria.enrollCampaign("cmp_outbound_q3", {
contacts: [{ email: contact.email }],
start_at: "immediate",
});import { createHmac, timingSafeEqual } from "node:crypto";
export async function POST(req: Request) {
const timestamp = req.headers.get("x-destria-timestamp") ?? "";
const signature = req.headers.get("x-destria-signature") ?? "";
const body = await req.text();
const expected = createHmac("sha256", process.env.DESTRIA_WEBHOOK_SECRET!)
.update(timestamp + "." + body)
.digest("hex");
const got = Buffer.from(signature);
const want = Buffer.from(expected);
if (got.length !== want.length || !timingSafeEqual(got, want)) {
return new Response("invalid signature", { status: 401 });
}
const event = JSON.parse(body);
return Response.json({ ok: true, type: event.type });
}Rotas autenticadas por Bearer token, CORS habilitado, respostas JSON padronizadas e rate-limit durável por plano.
GET /contactsPOST /contactsGET /contacts/{id}DELETE /contacts/{id}GET /campaignsPOST /campaignsPOST /campaigns/{id}/enrollGET /campaigns/{id}/metricsGET /webhooksPOST /webhooksPATCH /webhooks/{id}POST /webhook-deliveries/{id}/retry