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.
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
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
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
Acepta since y limit (50 por defecto, 200 como máximo). Devuelve resúmenes, sin el cuerpo de los mensajes.
Leer un mensaje
El mensaje completo: text, html, headers y la lista de adjuntos.
Eliminar una bandeja
Borra la bandeja y sus mensajes de inmediato. Responde 204.
Errores
| 204 | Sin contenido — para wait, el plazo expiró sin mensaje |
| 400 | Parámetro inválido |
| 401 | Clave ausente, desconocida o revocada |
| 403 | Esa bandeja pertenece a otra clave |
| 404 | Bandeja o mensaje inexistente, o ya expirado |
| 429 | Demasiadas 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.