Voltar ao inícioDocs

Documentação

Tudo que você precisa para receber um email como uma requisição HTTP assinada.

Seu endereço

Toda conta recebe um endereço permanente no formato inbox_ab12cd34ef@tempy.uk. Ele não pode ser alterado e é o único endereço que chega ao seu webhook. Encaminhe email para ele de qualquer provedor, ou informe o endereço direto.

inbox_7wgaav5mdb@tempy.uk

O payload

Um POST HTTPS por email, enviado como application/json. O corpo traz o id do email, from, to, subject, os corpos texto e HTML, todos os cabeçalhos originais e um array de anexos. Um cabeçalho que aparece uma vez é uma string; um cabeçalho repetido é um array de strings, na ordem em que vieram na mensagem.

Payload
{
  "id": "em_wnrppxfrp5p9wvv1",
  "from": "you@gmail.com",
  "to": "inbox_7wgaav5mdb@tempy.uk",
  "subject": "Your verification code",
  "text": "Your code is 482913",
  "html": "<p>Your code is <b>482913</b></p>",
  "headers": {
    "message-id": "<…@mail.gmail.com>"
  },
  "attachments": [],
  "received_at": "2026-09-03T10:42:11Z"
}

Verificando a assinatura

Toda requisição traz um cabeçalho X-Mailhook-Signature: sha256= seguido do HMAC-SHA256 do corpo bruto, com o seu segredo de assinatura como chave. Calcule sobre os bytes recebidos, antes de qualquer parse de JSON, e compare em tempo constante. Rejeite tudo que não bater.

X-Mailhook-Signature: sha256=8f1c4e9a…

Verificar a assinaturaNode.jsPython

Trocando o segredo

Durante uma troca, a assinatura principal continua sendo calculada com o segredo atual e o novo chega em X-Mailhook-Signature-Next. O X-Mailhook-Secret-Version informa a versão por trás do cabeçalho principal. Publique o segredo novo e depois ative — no meio do caminho nada quebra.

X-Mailhook-SignatureX-Mailhook-Signature-NextX-Mailhook-Secret-Version

Novas tentativas e timeouts

Qualquer 2xx conta como entregue. Um 5xx, um 429 ou uma falha de rede é repetido até cinco vezes, com cerca de 30 segundos, 1 minuto, 2 minutos e 4 minutos de intervalo, mais jitter. Um 4xx que não seja 429 é permanente e nunca é repetido. Seu endpoint tem 30 segundos para responder.

5×+30s+1m+2m+4m30s

Anexos

Os arquivos não vão embutidos no JSON. Cada anexo traz nome, tipo de conteúdo, tamanho e uma URL assinada válida por 24 horas a partir da chegada do email. Baixe o que precisar dentro dessa janela — depois o arquivo some junto com o resto do conteúdo.

filename · content_type · size · url · expires_at

Limites

Uma mensagem pode ter até 20 MB com anexos; acima disso ela é recusada na porta, para que o remetente receba um retorno em que possa agir. Requisições de teste e tentativas manuais têm limite por conta, e a requisição de teste traz X-Mailhook-Test: true para você diferenciar.

20 MB · X-Mailhook-Test: true

Idempotência

Uma nova tentativa reenvia o mesmo corpo com o mesmo id de email, então use esse id como chave de deduplicação. Dois POSTs com um mesmo id são o mesmo email, não dois.

X-Mailhook-Id: em_wnrppxfrp5p9wvv1