Skip to content

Enviar e-mail

POST /v1/send

Envia um e-mail transacional ou de marketing. Requer API Key com scope email:send.

Headers

HeaderObrigatórioDescrição
AuthorizationSimBearer <api_key>
Idempotency-KeyNãoEvita reenvio duplicado — veja Paginação e rate limiting

Corpo da requisição

json
{
  "from": "noreply@meudominio.com",
  "from_name": "Minha Loja",
  "reply_to": "suporte@meudominio.com",
  "to": ["cliente@exemplo.com"],
  "subject": "Confirmação de pedido",
  "html": "<p>Olá! Seu pedido foi confirmado.</p>",
  "text": "Olá! Seu pedido foi confirmado.",
  "stream": "transactional",
  "tags": ["order-confirmation"],
  "metadata": { "order_id": "12345" }
}
CampoTipoObrigatórioDescrição
fromstringSimEndereço remetente. O domínio precisa pertencer ao tenant e estar verificado
from_namestringNãoNome de exibição do remetente
reply_tostringNãoEndereço para respostas
tostring[]Sim1 a 50 destinatários
subjectstringSimAssunto
htmlstringNãoCorpo HTML
textstringNãoCorpo em texto puro
streamstringNãotransactional (default) ou marketing — marketing adiciona cabeçalhos de descadastro automaticamente
tagsstring[]NãoMarcações livres para segmentar métricas
metadataobjetoNãoPares chave/valor livres, devolvidos nos eventos

Campos fora deste schema no JSON causam erro 400.

Resposta de sucesso — 202 Accepted

json
{
  "accepted": [
    { "message_id": "0190f7a2-...", "to": "cliente@exemplo.com" }
  ],
  "rejected": [
    { "to": "outro@invalido", "reason": "invalid_address" }
  ]
}

Cada destinatário de to é resolvido individualmente: um endereço inválido ou em supressão (bounce/complaint/unsubscribe anterior) é listado em rejected com o motivo — isso não faz a requisição inteira falhar.

Motivos possíveis em rejected[].reason: invalid_address, suppressed.

Erros

StatusQuando
400Corpo inválido, domínio remetente não verificado, stream inválido
401API Key ausente ou inválida
403Chave sem o scope email:send, ou tenant inativo
409Idempotency-Key repetida com corpo diferente
429Rate limit excedido