Guia de integraçãoprimeiro e-mail em < 2 min

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é ele
01

Verifique seu domínio

POR QUÊ

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.

TipoNomeValor
CNAMEdex1._domainkeydex1.dkim.dexmail.com.br
TXT@v=spf1 include:dexmail.com.br ~all
TXT_dmarcv=DMARC1; p=none; rua=mailto:dmarc@seudominio.com

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.

02

Gere uma API key

POR QUÊ

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:

.env — no seu appenv
# 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"
EscopoPode
FULLEnviar, ler status e gerenciar webhooks
SEND_ONLYSomente enviar e-mails
READ_ONLYSomente ler status e listar
03

Envie o primeiro e-mail

POR QUÊ

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/node

TypeScript nativo, zero dependências, retry automático em 429/5xx.

terminalbash
npm i @dexmail/node
import { 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).

ResendDEXMail
resend.emails.send()dexmail.emails.send()
RESEND_API_KEYDEXMAIL_API_KEY
api.resend.comapi.dexmail.com.br
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>",
});
POR QUÊ

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.

04

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.

queuedsentdeliveredbouncedcomplainedfailed
status.shbash
curl "$DEXMAIL_API_URL/emails/em_18a2c" \
  -H "Authorization: Bearer $DEXMAIL_API_KEY"

# → { "id": "em_18a2c", "status": "delivered", "to": "cliente@exemplo.com" }
POR QUÊ

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.

05

Webhooks & eventos

POR QUÊ

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.

email.sentaceito pelo destino
email.deliveredentregue na caixa
email.openedaberto
email.clickedlink clicado
email.bounceddevolvido
email.complainedmarcado como spam
payload.jsonjson
// 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ê:

webhook-handler.tsts
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;
    }
  },
);
06

Relay SMTP

POR QUÊ

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.

HOST
smtp.dexmail.com.br
PORTA
587 · 465
USUÁRIO
dexmail
SENHA
sua API key dx_…

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).

smtp.ts — Nodemailerts
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>",
});
07

Referência da API

Endpoints, esquemas e exemplos completos — teste direto no navegador.

POST/api/v1/emailsFULL · SEND_ONLY
GET/api/v1/emailsFULL · READ_ONLY
GET/api/v1/emails/:idFULL · READ_ONLY
POST/api/v1/webhooksFULL
GET/api/v1/webhooksFULL
DELETE/api/v1/webhooks/:idFULL
POR QUÊ

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.

Criar conta