Do cadastro ao primeiro envio
Guia completo: crie sua conta, configure um serviço, gere uma API Key, monte seus templates e dispare seus primeiros e-mails transacionais.
Crie sua conta
Acesse /auth/sign-up e crie sua conta com e-mail e senha, ou entre direto com Google ou GitHub. Essa conta é para você (ou seu time) acessar o painel do Hermes — não tem relação com os usuários da sua aplicação.
Crie um serviço
Um serviço é um namespace isolado: cada aplicação/produto seu deve ter o seu próprio, com credenciais, templates e configurações separadas. Em Serviços → Novo Serviço, dê um nome (ex: "App Principal", "Landing de Marketing") e confirme.
Cadastre uma conexão e gere sua API Key
Dentro do serviço, vá em Credenciais de Disparo → Nova Conexão e escolha como o Hermes vai enviar os e-mails de fato:
- SMTP Padrão — host, porta e SSL/TLS de qualquer provedor (Gmail, SES, SendGrid, seu próprio servidor de e-mail, etc).
- Google OAuth2 — autorização segura via conta Google, sem expor senha/app password.
Ao salvar, a API Key (formato hm_...) aparece uma única vez. Copie e guarde agora — o Hermes armazena só o hash dela e não consegue mostrá-la de novo (só rotacionar e gerar uma nova).
Instale o SDK (opcional, mas recomendado)
O SDK cuida de retry, streaming de status e rotação automática de chave pra você. Se preferir não adicionar a dependência, dá pra chamar a API REST direto.
npm install @ruanlopes1350/hermes-clientSem o SDK, o mesmo envio fica assim:
// Alternativa sem o SDK: chamando a API REST diretamente
await fetch(`${process.env.HERMES_API_URL}/api/emails`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': process.env.HERMES_API_KEY!,
},
body: JSON.stringify({
to: 'cliente@empresa.com',
subject: 'Bem-vindo!',
template_id: 'uuid-do-template',
variables: { nome: 'João da Silva' },
}),
});Configure as variáveis de ambiente
Guarde a URL da sua instância do Hermes e a API Key gerada no passo 3 como variáveis de ambiente — nunca direto no código:
HERMES_API_URL=https://sua-instancia-hermes.com
HERMES_API_KEY=hm_sua_chave_gerada_no_passo_3Crie o client na sua aplicação
Instancie o HermesClient uma única vez e reexporte. Em produção (VPS/servidor com processo persistente), use o EnvAdapter: se a chave rotacionar via webhook (passo 8), ele atualiza o .env sozinho.
import { HermesClient } from '@ruanlopes1350/hermes-client';
import { EnvAdapter } from '@ruanlopes1350/hermes-client/node';
export const hermes = new HermesClient({
baseUrl: process.env.HERMES_API_URL!,
// Lê e mantém HERMES_API_KEY sincronizada no .env quando a rotação acontecer
storageAdapter: new EnvAdapter('.env', 'HERMES_API_KEY'),
});Decida onde disparar os e-mails
Chame hermes.email() nos pontos de negócio da sua aplicação onde um e-mail deve sair — cadastro de usuário, recuperação de senha, confirmação de pedido, alertas, etc:
// src/routes/auth/signup.ts
import { hermes } from '../lib/hermes';
export async function onUserSignUp(user: { name: string; email: string }) {
await hermes.email()
.to(user.email)
.subject('Bem-vindo!')
.useTemplate('boas-vindas-tpl', { nome: user.name })
.send();
}// src/routes/auth/forgot-password.ts
await hermes.email()
.to(user.email)
.subject('Redefinição de senha')
.useTemplate('recuperacao-senha-tpl', { resetLink })
.priority('high')
.send();(Opcional) Ative a rotação automática de chaves
Se você configurou Intervalo de Validade da Chave, a API Key expira e precisa ser trocada periodicamente. Pra sua aplicação não quebrar quando isso acontecer, receba o aviso via webhook:
a) Crie a rota que recebe o aviso
// src/routes/webhook-hermes.ts (Express)
import express from 'express';
import { expressWebhookHandler } from '@ruanlopes1350/hermes-client/express';
import { hermes } from '../lib/hermes';
app.post(
'/webhook/hermes',
express.raw({ type: 'application/json' }),
expressWebhookHandler(hermes, process.env.HERMES_WEBHOOK_SECRET!),
);b) Cadastre o endpoint no Hermes
Em Serviço → Configurações → Rotação de Chaves e Webhooks, preencha:
- URL do Webhook — a rota pública que você acabou de criar.
- Segredo do Webhook — usado pra assinar o header
X-Hermes-Signature(mesmo valor deHERMES_WEBHOOK_SECRETacima). - Ativar Rotação Automática de API Keys — liga o processo.
- Dias de antecedência para rotacionar (Threshold) — quantos dias antes do vencimento a nova chave é gerada e o webhook disparado.
Crie seus templates MJML
Em Templates → Novo Template, escolha um Escopo de Uso: 🌍 Global (disponível pra todos os serviços) ou vinculado a um serviço específico. No editor, escreva o layout em MJML — toda variável no formato {{assim}} é detectada automaticamente e listada em Variáveis Detectadas, sem precisar declarar nada à parte. O preview ao vivo mostra o resultado enquanto você edita.
Use os templates na sua aplicação
Passe o id do template e um objeto com os valores de cada variável detectada. O SDK também traz helpers prontos pra formatação comum (saudação, data, moeda):
import { templateHelpers } from '@ruanlopes1350/hermes-client';
await hermes.email()
.to('cliente@empresa.com')
.subject('Pedido confirmado')
.useTemplate('order-confirmation', {
greeting: templateHelpers.greeting('João'),
orderDate: templateHelpers.formatDate(new Date()),
total: templateHelpers.formatCurrency(149.90),
})
.send();Realize os envios
Com tudo configurado, os três padrões de envio do dia a dia:
// Envio simples
await hermes.email().to('a@b.com').subject('Oi').body('<p>Olá!</p>').send();
// Agendado
await hermes.email()
.to('a@b.com').subject('Lembrete')
.useTemplate('lembrete-tpl')
.schedule(new Date('2026-09-01T09:00:00Z'))
.send();
// Em massa (até 100 por chamada)
await hermes.bulk()
.email().to('a@b.com').subject('Oi').useTemplate('tpl', { nome: 'A' }).done()
.email().to('c@d.com').subject('Oi').useTemplate('tpl', { nome: 'C' }).done()
.send();Atenção aos limites de envio dos provedores
O Hermes não contorna os limites de envio do provedor por trás da sua conexão (passo 3) — ele só repassa a requisição. Os tetos são impostos pelo próprio Gmail/Google Workspace/SMTP e valem por conta ou domínio remetente, não por aplicação:
- Conta Gmail pessoal (SMTP ou OAuth2): ~500 e-mails/dia e ~100 destinatários por mensagem.
- Google Workspace: ~2.000 e-mails/dia por usuário (varia conforme o plano contratado).
- Ultrapassar o limite costuma resultar em bloqueio temporário de envio ou marcação como spam pelo provedor — não é um erro do Hermes.
- Para volumes maiores ou transacionais críticos, prefira um provedor SMTP dedicado (Amazon SES, SendGrid, Mailgun, Postmark, etc.) em vez de uma conta Gmail pessoal como conexão.
Esses números são os publicados pelo Google e podem mudar — confirme sempre na documentação oficial do provedor escolhido antes de dimensionar volume.