Do domínio ao primeiro envio, sem atrito.
Verifique um domínio, gere uma API key e dispare seu e-mail. Use o SDK oficial, cURL ou SMTP — o que encaixar no seu stack. Entregabilidade (SPF/DKIM/DMARC), fila e retries ficam por nossa conta.
O caminho, em quatro passos
clique num passo para pular até eleVerifique seu domínio
Você só envia a partir de um domínio que provou ser seu. É o que garante entregabilidade — provedores confiam em quem assina os e-mails corretamente com SPF, DKIM e DMARC.
No painel, em Domínios → Adicionar domínio, geramos os registros DNS do seu domínio (3 CNAMEs de DKIM, 1 TXT de SPF e 1 TXT de DMARC). Publique-os no seu provedor de DNS, volte à tela e clique em Verificar — costuma propagar em minutos.
Valores ilustrativos. A tela do domínio mostra os registros exatos, com botão de copiar — e, se você usa Cloudflare, publica todos de uma vez com um token Zone.DNS · Edit. Enquanto o domínio não estiver VERIFIED, envios com esse from retornam 403 permission_error.
Gere uma API key
A key autentica cada requisição. Mantenha-a no servidor — nunca exponha em código de cliente ou no repositório. Guardamos apenas um hash, então você revoga e gera novas quando quiser, sem downtime.
No painel, em Settings → API Keys, escolha o escopo e crie a key. Ela (dx_…) aparece uma única vez — copie na hora e guarde como variável de ambiente:
# Chave gerada no painel — aparece uma única vez
DEXMAIL_API_KEY="dx_sua_chave_aqui" # nunca no cliente
# Opcional: os SDKs oficiais já usam https://api.dexmail.com.br/api/v1.
# Só precisa definir para apontar a outro ambiente (dev/staging).
# DEXMAIL_API_URL="https://api.dexmail.com.br/api/v1"| Escopo | Pode |
|---|---|
FULL | Enviar, ler status e gerenciar webhooks |
SEND_ONLY | Somente enviar e-mails |
READ_ONLY | Somente ler status e listar |
Envie o primeiro e-mail
Uma única chamada dispara o e-mail. Escolha a interface que já existe no seu stack — a API, o payload e a entregabilidade são idênticos nos três caminhos.
SDK oficial
@dexmail/nodeTypeScript nativo, zero dependências, retry automático em 429/5xx.
npm i @dexmail/nodeimport { DexMail } from "@dexmail/node";
// Lê DEXMAIL_API_KEY e DEXMAIL_API_URL do ambiente
const dexmail = new DexMail();
const { id, status } = await dexmail.emails.send({
from: "Equipe <noreply@mail.suaempresa.com.br>",
to: "cliente@exemplo.com", // ou ["a@x.com", "b@x.com"] (até 50)
subject: "Bem-vindo a bordo",
html: "<h1>Olá 👋</h1><p>Seu primeiro e-mail transacional.</p>",
// opcionais: text, reply_to, cc, bcc, headers,
// tags: [{ name: "fluxo", value: "onboarding" }],
// attachments: [{ filename: "guia.pdf", content: "<base64>" }],
});
// Envio reentrante (evita duplicar em retry): 2º arg com idempotencyKey
// await dexmail.emails.send({ ... }, { idempotencyKey: "pedido-123" });
console.log(id, status); // "ckq…" "queued"O from precisa ser do seu domínio verificado. Informe pelo menos um de html ou text. A resposta é 202 na hora com { "id": "…", "status": "queued" } — o envio é assíncrono. Guarde o id para consultar o status ou correlacionar com webhooks.
Vindo do Resend?
A API é compatível na forma. Na maioria dos casos, troque o import e a key — o payload continua igual. O from é uma variável do seu app (como o EMAIL_FROM no Resend); o DEXMail só precisa da DEXMAIL_API_KEY (a URL base já aponta para api.dexmail.com.br por padrão).
import { Resend } from "resend";
const resend = new Resend(process.env.RESEND_API_KEY);
await resend.emails.send({
from: process.env.EMAIL_FROM,
to: "cliente@exemplo.com",
subject: "Bem-vindo!",
html: "<p>Sua conta foi criada.</p>",
});O domínio do from precisa estar verificado na conta DEXMail — mesmo requisito do Resend. Sem isso, o envio retorna 403 permission_error. É o passo 01 acima.
Acompanhe o status
Cada envio retorna um id. Consulte o ciclo de vida por ele — GET /emails/:id devolve o status e a timeline; GET /emails lista com status, limit e cursor — ou receba tudo em tempo real por webhooks.
curl "$DEXMAIL_API_URL/emails/em_18a2c" \
-H "Authorization: Bearer $DEXMAIL_API_KEY"
# → { "id": "em_18a2c", "status": "delivered", "to": "cliente@exemplo.com" }As atualizações de status chegam de forma at-least-once e fora de ordem. Aplicamos um ranking só-pra-frente: um delivered nunca é sobrescrito por um sent atrasado.
Webhooks & eventos
Em vez de ficar consultando o status, aponte uma URL no painel e receba um POST assinado a cada evento. Ideal para atualizar seu banco sem polling.
// POST assinado para a sua URL (header DEXMail-Signature)
{
"type": "email.delivered",
"email_id": "em_18a2c",
"created_at": "2026-07-08T13:40:11Z"
}Cada entrega vem assinada no header DEXMail-Signature: t=…,v1=… — um HMAC-SHA256 de <t>.<corpo-cru> com o seu whsec_. Verifique sobre o corpo cru (não o JSON reserializado); o SDK faz isso e a janela de ±5 min por você:
import express from "express";
import { verifyWebhookSignature, WebhookVerificationError } from "@dexmail/node";
app.post(
"/webhooks/dexmail",
express.raw({ type: "application/json" }), // precisa do corpo CRU
(req, res) => {
try {
const event = verifyWebhookSignature(
req.body, // Buffer cru — não reserialize o JSON
req.header("DEXMail-Signature"),
process.env.DEXMAIL_WEBHOOK_SECRET!,
);
// trate de forma idempotente pelo event.id (entrega é at-least-once)
console.log(event.type, event.data.email_id);
res.status(200).end(); // responda 2xx rápido
} catch (err) {
if (err instanceof WebhookVerificationError) return res.status(400).end();
throw err;
}
},
);Relay SMTP
Já tem um sistema que fala SMTP (WordPress, Rails, uma ferramenta legada)? Aponte para o nosso relay e ganhe a mesma entregabilidade, fila e retries — sem trocar de biblioteca. A mensagem cai na mesma fila do envio pela API.
A senha SMTP é a própria API key dx_… (mesma autenticação da API REST). Use o usuário dexmail e prefira a porta 465 (TLS implícito) ou 587 (STARTTLS).
import nodemailer from "nodemailer";
const transport = nodemailer.createTransport({
host: "smtp.dexmail.com.br",
port: 465,
secure: true,
auth: { user: "dexmail", pass: process.env.DEXMAIL_API_KEY }, // a senha É a API key
});
await transport.sendMail({
from: "Equipe <noreply@mail.suaempresa.com.br>",
to: "cliente@exemplo.com",
subject: "Bem-vindo a bordo",
html: "<p>Sua conta foi criada.</p>",
});Referência da API
Endpoints, esquemas e exemplos completos — teste direto no navegador.
| POST | /api/v1/emails | FULL · SEND_ONLY |
| GET | /api/v1/emails | FULL · READ_ONLY |
| GET | /api/v1/emails/:id | FULL · READ_ONLY |
| POST | /api/v1/webhooks | FULL |
| GET | /api/v1/webhooks | FULL |
| DELETE | /api/v1/webhooks/:id | FULL |
100 requisições/minuto, por API key e por IP. Toda resposta traz X-RateLimit-Remaining; ao estourar, 429 com Retry-After. O SDK já reenvia em 429/5xx respeitando esse header.
Pronto para o primeiro envio?
Crie sua conta, verifique um domínio e comece a enviar em minutos.