API do inboxsink

Caixas descartáveis controláveis por código, para testar cadastros sem depender de uma caixa de verdade. Cinco rotas, uma base em https://inboxsink.com, JSON.

A rota que muda alguma coisa é wait: ela bloqueia até a mensagem chegar. Sem ela, um teste de ponta a ponta chuta com sleep e fica instável assim que a fila de envio atrasa.

Chave de API grátis

Mil chamadas por mês, sem cartão. O suficiente para plugar na sua suíte de testes e ver se aguenta.

Depois, quando seus testes começarem a ser recusados: um domínio seu não é publicado em lugar nenhum, então não cai em lista negra — 29 € por mês.

Cliente JavaScript

Um pacote sem dependência nenhuma, para Node 18 ou mais novo. O código está no GitHub.

npm i inboxsink
import { InboxSink } from 'inboxsink';
const sink = new InboxSink(process.env.INBOXSINK_API_KEY);

const inbox = await sink.createInbox();
const code = await sink.waitForOtp(inbox.id);   // '204815'

waitForOtp lança um erro em vez de devolver null quando nenhum código chega: um teste tem que falhar alto, não preencher um campo vazio em silêncio.

Autenticação

Um cabeçalho Authorization em cada chamada. As chaves são criadas no painel e começam com ibsk_.

curl -H "Authorization: Bearer ibsk_…" \
  https://inboxsink.com/v1/domains

A chave em texto claro só aparece na criação. Depois disso, apenas o prefixo continua visível — guardamos somente o hash.

Criar uma caixa

POST /v1/inboxes

Todos os parâmetros são opcionais: domain (por padrão um domínio do pool ao acaso), prefix (aleatório por padrão), ttl_seconds (de 60 segundos a 30 dias).

curl -X POST https://inboxsink.com/v1/inboxes \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"ttl_seconds": 900}'

→ 201
{ "id": "42", "address": "9f2c1a@mailhusk.com", "expires_at": "2026-09-01T15:12:00Z" }

Uma caixa criada pela API é privada: só a chave que a criou consegue lê-la.

Esperar uma mensagem

GET /v1/inboxes/:id/wait

Bloqueia até uma mensagem chegar e responde na hora. timeout em milissegundos (30 000 por padrão, 120 000 no máximo), since para receber só as mensagens posteriores a um identificador.

Responde 204 sem corpo se o prazo terminar sem mensagem — não é erro, é a resposta normal para «não chegou nada».

curl -H "Authorization: Bearer $KEY" \
  "https://inboxsink.com/v1/inboxes/42/wait?timeout=45000"

→ 200
{ "message": { "id": "913", "from": "no-reply@acme.com", "subject": "…",
               "otp": "204815", "link": "https://acme.com/confirm/9f3a" } }

otp e link já vêm extraídos. O código só é reportado quando a mensagem realmente anuncia um («código», «verificação», «entrar»…) — um valor de fatura ou um ano nunca é confundido com um código.

Listar as mensagens

GET /v1/inboxes/:id/messages

Aceita since e limit (50 por padrão, 200 no máximo). Devolve resumos, sem o corpo das mensagens.

Ler uma mensagem

GET /v1/messages/:id

A mensagem inteira: text, html, headers e a lista de anexos.

Apagar uma caixa

DELETE /v1/inboxes/:id

Apaga a caixa e as mensagens na hora. Responde 204.

Erros

204Sem conteúdo — no wait, o prazo acabou sem mensagem
400Parâmetro inválido
401Chave ausente, desconhecida ou revogada
403Essa caixa pertence a outra chave
404Caixa ou mensagem inexistente, ou já expirada
429Chamadas demais

Limites e duração

As caixas do pool público duram uma hora; as criadas pela API seguem o ttl_seconds delas, até trinta dias. Passado o prazo, a caixa e as mensagens são apagadas — não existe arquivo para recuperar depois.

Mensagens acima de dez megabytes são recusadas na chegada. Endereços de um domínio desconhecido são recusados durante a sessão SMTP, sem gerar retorno.

Estas caixas não conseguem enviar e-mail, e isso é proposital: uma mensagem enviada de um domínio descartável não chegaria a lugar nenhum.