API de inboxsink

Bandejas desechables controlables por código, para probar registros sin depender de un buzón real. Cinco rutas, una base en https://inboxsink.com, JSON.

La ruta que cambia algo es wait: se bloquea hasta que llega el mensaje. Sin ella, una prueba de extremo a extremo adivina con sleep y se vuelve inestable en cuanto la cola de envío se retrasa.

Clave de API gratuita

Mil llamadas al mes, sin tarjeta. Lo justo para conectarla a tu suite de pruebas y ver si aguanta.

Después, cuando tus pruebas empiecen a ser rechazadas: un dominio propio no se publica en ninguna parte, así que no cae en ninguna lista negra — 29 € al mes.

Cliente JavaScript

Un paquete sin dependencias, para Node 18 en adelante. El código está en 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 lanza un error en lugar de devolver null cuando no llega ningún código: una prueba debe fallar ruidosamente, no rellenar un campo vacío en silencio.

Autenticación

Una cabecera Authorization en cada llamada. Las claves se crean desde el panel y empiezan por ibsk_.

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

La clave en claro solo se muestra al crearla. Después únicamente queda visible su prefijo: no guardamos más que su huella.

Crear una bandeja

POST /v1/inboxes

Todos los parámetros son opcionales: domain (por defecto un dominio del grupo al azar), prefix (aleatorio por defecto), ttl_seconds (de 60 segundos a 30 días).

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" }

Una bandeja creada por la API es privada: solo la clave que la creó puede leerla.

Esperar un mensaje

GET /v1/inboxes/:id/wait

Se bloquea hasta que llega un mensaje y responde de inmediato. timeout en milisegundos (30 000 por defecto, 120 000 como máximo), since para recibir solo los mensajes posteriores a un identificador.

Responde 204 sin cuerpo si el plazo expira sin mensaje: no es un error, es la respuesta normal a «no ha llegado 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 y link se extraen por ti. El código solo se reporta cuando el mensaje realmente lo anuncia («código», «verificación», «iniciar sesión»…): un importe de factura o un año nunca se confunden con un código.

Listar los mensajes

GET /v1/inboxes/:id/messages

Acepta since y limit (50 por defecto, 200 como máximo). Devuelve resúmenes, sin el cuerpo de los mensajes.

Leer un mensaje

GET /v1/messages/:id

El mensaje completo: text, html, headers y la lista de adjuntos.

Eliminar una bandeja

DELETE /v1/inboxes/:id

Borra la bandeja y sus mensajes de inmediato. Responde 204.

Errores

204Sin contenido — para wait, el plazo expiró sin mensaje
400Parámetro inválido
401Clave ausente, desconocida o revocada
403Esa bandeja pertenece a otra clave
404Bandeja o mensaje inexistente, o ya expirado
429Demasiadas llamadas

Límites y duración

Las bandejas del grupo público viven una hora; las creadas por la API siguen su ttl_seconds, hasta treinta días. Pasado ese plazo, la bandeja y sus mensajes se eliminan: no queda archivo que recuperar.

Los mensajes de más de diez megabytes se rechazan al llegar. Las direcciones de un dominio desconocido se rechazan durante la sesión SMTP, sin generar rebote.

Estas bandejas no pueden enviar correo, y es deliberado: un mensaje enviado desde un dominio desechable no llegaría a ninguna parte.