Email Transacional

Notificações, recibos e password reset
com timeline ao vivo de cada envio

API REST simples ou SMTP Relay com o token como senha. Cada mensagem deixa rastro completo: sent → delivered → opened → clicked → bounced. Webhooks HMAC com retry. Sandbox pra rodar CI/CD sem queimar crédito.

1k
Por batch
30 MB
Anexos
HMAC
SHA-256/512
SMTP
Relay nativo
app.ravimail.com.br/developers/messages

Activity Feed

Todos os emails enviados pela API com timeline de eventos

Mostrando 5 de mensagens próximos →
O problema

Email transacional não pode falhar

Quando o cliente compra, esquece a senha ou recebe uma notificação crítica, o email precisa chegar em segundos. Não é hora de descobrir que o provedor caiu, que o IP foi blacklistado ou que o webhook não disparou.

Cliente esperando

Password reset que demora 5 minutos vira ticket no suporte. Recibo que não chega vira chargeback.

Debugging cego

"O email foi enviado?" sem timeline real, sem webhook de delivered/bounced, vira chute.

Testes que cobram

CI rodando 200x por dia, cada teste subindo um envio real no contador. No fim do mês, surpresa na fatura.

Primeira request

4 linhas pra enviar.
5 segundos pro delivered chegar.

POST JSON ou SMTP autenticado, você escolhe. O mesmo token Bearer funciona nos dois canais. Idempotency-Key opcional pra retry seguro: se sua rede caiu no meio, o segundo POST retorna o mesmo message_id sem reenviar.

  • 1 a 1 ou batch: até 1000 mensagens distintas por chamada, retorno 207 Multi-Status
  • Anexos via /v1/files: suba uma vez, referencie por file_id em N envios
  • Tags livres: object key-value pra agrupar nos relatórios
  • Templates compartilhados: render server-side com variáveis no formato {{nome}}
# Password reset, 1 request
curl -X POST https://api.ravimail.com.br/v1/transactional/send \
  -H "Authorization: Bearer rvm_live_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pwd-reset-9382" \
  -d '{
    "to": "joao@empresa.com.br",
    "from": "noreply@seudominio.com.br",
    "subject": "Redefina sua senha",
    "html": "<a href=\"https://app.io/reset/abc\">Resetar</a>",
    "tags": {"category": "password_reset", "user_id": "9382"}
  }'

# Resposta síncrona
{ "data": { "message_id": "msg_8aJ9w2x", "status": "sent" } }
// composer require ravisystems/ravimail-php
use Ravimail\Client;

$rm = new Client('rvm_live_...');

$rm->transactional->send([
    'to'      => 'joao@empresa.com.br',
    'from'    => 'noreply@seudominio.com.br',
    'subject' => 'Recibo do pedido #4729',
    'html'    => $html,
    'tags'    => ['order_id' => '4729'],
    'attachments' => [
        ['file_id' => 'file_abc123'],
    ],
], idempotencyKey: 'order-4729-receipt');
// fetch nativo, sem SDK
await fetch('https://api.ravimail.com.br/v1/transactional/batch', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer rvm_live_...',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    messages: [
      { to: 'ana@a.com',   subject: 'Recibo', html: '...' },
      { to: 'bruno@b.com', subject: 'Recibo', html: '...' }
      // até 1000 mensagens, retorno 207 Multi-Status
    ]
  })
});
# Não quer mexer no código? Use SMTP Relay direto.
# Mesmo token, autenticação SASL PLAIN.

Host:     smtp.ravimail.com.br
Porta:    587 (STARTTLS)
Username: api
Password: rvm_live_... # token completo no campo senha

# Pronto. Funciona em qualquer cliente: Laravel,
# WordPress, n8n, Zapier, Postfix, Sendmail, etc.
# Limite por mensagem: 30 MB.
Detalhe de cada mensagem

Toda mensagem tem timeline. Toda timeline é auditável.

Clique em qualquer linha do Activity Feed e veja exatamente o que aconteceu, em que ordem, e quais webhooks foram disparados.

app.ravimail.com.br/developers/messages/msg_8aJ9w2x

Redefina sua senha

msg_8aJ9w2x
opened

Timeline do envio passe o mouse pra ver detalhes técnicos

  1. Aceita na fila
    POST /v1/transactional/send · 87ms · Idempotency-Key: pwd-reset-9382
  2. Despachada pelo nó RJ-01
    IP 200.221.x.12 · pool gmail-friendly · SMTP handshake em 103ms
  3. Aceita pelo Gmail (250 OK)
    250 2.0.0 OK · gsmtp · message-id externo recebido
  4. Pixel disparado de São Paulo
    IP 191.x.x.x · Chrome 124 macOS · São Paulo, BR

Webhooks disparados (2) clique pra ver payload

Destinatário
joao@empresa.com.br
Remetente
noreply@seudominio.com.br
Roteamento
Nó: RJ-01
IP: 200.221.x.12
Domínio: seudominio.com.br
Tags
category: password_reset
user_id: 9382
Custo
0,001200

Tudo o que aparece nesse painel também volta na resposta da API e nos webhooks. Mesma fonte de dados, três canais de leitura.

9 capacidades

Tudo que o transacional moderno exige

Recursos reais do RaviMail, validados em produção.

API REST + SMTP Relay

POST JSON ou SMTP autenticado. O mesmo token vale pros dois. Você escolhe sem retrabalho.

POST /v1/transactional/send · smtp.ravimail.com.br:587

Batch até 1000 por chamada

Envie até mil mensagens em um único request. Retorno 207 Multi-Status com sucesso e erro por linha.

POST /v1/transactional/batch

Idempotency-Key

Header opcional. Retry seguro: chamadas duplicadas retornam o mesmo message_id sem reenvio.

Header: Idempotency-Key

Anexos até 30 MB

Suba arquivos via /v1/files e referencie pelo file_id. Suporta PDF, imagens, ZIP, CSV.

attachments: [{file_id}]

Tracking de abertura e click

Pixel de open e rewrite de links automático. Subdomínio per-user isola sua reputação dos outros.

i{userId}.ravimail.com.br/track/*

Webhooks HMAC

Assinatura SHA-256 ou SHA-512. 12 retries com backoff exponencial (1s até 24h). Log completo.

X-Ravimail-Signature: t=...,v2=...

Event stream SSE

Quer ver os eventos chegando ao vivo? GET /v1/events/stream entrega via Server-Sent Events.

GET /v1/events/stream

40+ scopes granulares

Token só com transactional:send? Pode. Token só com webhooks:read? Pode. IP whitelist por token em CIDR.

transactional:send · suppression:write

Roteamento forçado

Força um domínio, IP ou nó específico via campo route. Útil pra A/B de infraestrutura.

route: { domain_id, ip_id, node_id }

Exclusivo do RaviMail

Mailbox Simulator +
Sandbox per-token

Rodar CI/CD em provedor de email cobrava por cada teste, ou pior: nem reproduzia bounce. No RaviMail, endereços pré-definidos do simulator retornam eventos determinísticos. Todo token rvm_test_* roda em sandbox isolado: não cobra crédito, não envia, mas registra tudo (e dispara webhooks reais).

  • 7 endereços simulator pré-definidos retornam delivered, bounced, complained, suppressed, opened, clicked, soft bounce
  • Sandbox per-token ativa só pelo prefixo do token: zero config, zero ambiente paralelo, zero risco de subir teste em produção
  • Trigger manual de eventos via POST /v1/sandbox/trigger-event pra reproduzir cenários sob demanda
  • Webhooks reais disparados em sandbox: você testa todo o fluxo de assinatura, retry, replay sem queimar crédito
Pegar token sandbox grátis
▸ Mailbox Simulator
# Endereços determinísticos pra CI/CD
success@simulator.ravimail.com.br      # delivered
bounce@simulator.ravimail.com.br       # hard bounce
soft-bounce@simulator.ravimail.com.br  # soft bounce + retry
complaint@simulator.ravimail.com.br    # marca como spam
suppress@simulator.ravimail.com.br     # vai pra supressão
opened@simulator.ravimail.com.br       # delivered + open
clicked@simulator.ravimail.com.br      # delivered + open + click

# Trigger manual via API (sandbox token)
curl -X POST https://api.ravimail.com.br/v1/sandbox/trigger-event \
  -H "Authorization: Bearer rvm_test_..." \
  -d '{"message_id":"msg_sb_xy","event":"bounced"}'

# Webhook chega assinado mesmo em sandbox
POST /seu-webhook
X-Ravimail-Signature: t=1700000000,v2=...
{
  "event": "transactional.bounced",
  "message_id": "msg_sb_xy",
  "reason": "mailbox_full",
  "_sandbox": true
}
Saúde dos webhooks

Webhook não chegou? Você vê na hora.

Dashboard por endpoint com success rate de 7 dias, latência média, sparkline visual e log de cada delivery individual com replay.

app.ravimail.com.br/developers/webhooks/wh_prod_main

Webhook principal de produção

https://app.io/webhooks/ravimail
saudável
Entregas 7d
Success rate 7d
99,3%
Latência média
128ms
Saúde 7d
:

passe o mouse na linha amarela pra ver a cadeia de retry

Status Event Try HTTP Lat Quando
A linha amarela falhou com 503 na 1ª tentativa. O sistema reenviou automaticamente (try #3) e entregou. Você não precisou fazer nada.
Eventos assinados
transactional.sent transactional.delivered transactional.opened transactional.clicked transactional.bounced transactional.complained
Falhas consecutivas
0
Total lifetime
142.018
Último sucesso
há 12 segundos
Última falha
há 4 horas (recuperada)
Signing secret

Rotacionar emite novo segredo. O anterior continua válido por 24h pra atualizar o handler sem downtime (header extra X-Ravimail-Signature-Prev).

SMTP Relay nativo

Já usa Laravel, WordPress ou n8n?
Plugue direto no SMTP.

Não precisa trocar nada no seu código existente. O SMTP Relay do RaviMail aceita o mesmo token Bearer como senha SASL PLAIN. Tracking, webhooks, suppression list, tudo continua funcionando: a infraestrutura é a mesma da API REST.

  • Configure uma vez, esqueça: host, porta 587 STARTTLS, user "api", senha = token.
  • Auditoria completa: GET /v1/smtp/log lista todos os envios via SMTP com timestamp e destino.
  • Mesmo scope, mesmas regras: token precisa do scope smtp:relay. IP whitelist e expiração valem normalmente.
  • Webhook continua funcionando: emails do SMTP recebem mesmo tracking e mesmos eventos delivered/bounced/opened.
▸ Laravel .env
# config/mail.php usa essas variáveis
MAIL_MAILER=smtp
MAIL_HOST=smtp.ravimail.com.br
MAIL_PORT=587
MAIL_USERNAME=api
MAIL_PASSWORD=rvm_live_xxxxxxxxxxxxxx
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@seudominio.com.br"
MAIL_FROM_NAME="Meu App"

# Pronto. Mail::send() funciona normal.

Perguntas frequentes

Dúvidas técnicas comuns antes de migrar pro RaviMail.

A resposta da API fica entre 80 e 250 ms (síncrona): a chamada retorna assim que o envio entra na fila do nó. O delivered confirmado via webhook vem em 0,5 a 3 segundos pros provedores grandes (Gmail/Outlook/Hotmail). Em horário comercial brasileiro, vista a fila no /v1/events/stream pra ter feedback real-time.
Header opcional. Se você manda dois POST com o mesmo Idempotency-Key dentro de 24h, o segundo retorna o message_id do primeiro sem reenviar. Útil pra retry de pedido perdido na rede sem duplicar email do cliente.
Sim. Crie em POST /v1/templates, depois renderize com POST /v1/templates/{id}/render passando as variáveis no formato {{nome}}. O retorno é o HTML pronto pra mandar via /v1/transactional/send.
Ambos. Webhooks HMAC pra integrações serverless ou que rodam atrás de NAT (eventos em push, retry automático com backoff). SSE pra dashboards reativos (GET /v1/events/stream entrega em conexão persistente). Mesma fonte de dados, dois canais.
Cada mensagem aceita em /v1/transactional/send ou /batch consome 1 crédito. Tokens com prefixo rvm_test_ rodam em sandbox e não consomem nada. Bounces/rejeições do provedor não devolvem crédito porque a tentativa de envio já foi feita.
Sim, configurável por token no painel (rate_limit_per_second). Headers X-RateLimit-Limit e X-RateLimit-Remaining retornam em toda resposta. 429 traz Retry-After em segundos.
Sim, via campo route no payload: {"route": {"domain_id": 5, "ip_id": 12, "node_id": 2}}. Útil pra rodar A/B de infraestrutura ou isolar tráfego de um cliente seu (em conta agência com subaccounts).
POST /v1/suppression pra adicionar (com reason: unsubscribed, bounced, invalid), DELETE /v1/suppression/{email} pra remover, GET /v1/suppression pra listar. Pré-bloqueio acontece no momento do envio: se o destinatário está na lista, retorna erro sem queimar crédito.

Pronto pra fazer seu primeiro envio?

Cadastro em 30 segundos. Token sandbox liberado na hora. Sem cartão de crédito pra começar.