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.
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
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
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
Aceita since e limit (50 por padrão, 200 no máximo). Devolve resumos, sem o corpo das mensagens.
Ler uma mensagem
A mensagem inteira: text, html, headers e a lista de anexos.
Apagar uma caixa
Apaga a caixa e as mensagens na hora. Responde 204.
Erros
| 204 | Sem conteúdo — no wait, o prazo acabou sem mensagem |
| 400 | Parâmetro inválido |
| 401 | Chave ausente, desconhecida ou revogada |
| 403 | Essa caixa pertence a outra chave |
| 404 | Caixa ou mensagem inexistente, ou já expirada |
| 429 | Chamadas 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.