API inboxsink
Управляемые кодом одноразовые ящики, чтобы тестировать регистрации без зависимости от настоящей почты. Пять маршрутов, база https://inboxsink.com, JSON.
Маршрут, который меняет дело, — wait: он блокирует до прихода письма. Без него сквозной тест гадает через sleep и становится нестабильным, как только очередь отправки задерживается.
Тысяча вызовов в месяц, без карты. Достаточно, чтобы встроить его в свои тесты и посмотреть, держится ли.
Потом, когда ваши тесты начнут отклонять: собственный домен нигде не публикуется, а значит не попадает ни в один чёрный список — 29 € в месяц.
Клиент на JavaScript
Пакет без единой зависимости, для Node 18 и новее. Код на 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 бросает ошибку, а не возвращает null, когда код не приходит: тест должен падать громко, а не молча заполнять пустое поле.
Аутентификация
Заголовок Authorization при каждом вызове. Ключи создаются в панели и начинаются с ibsk_.
curl -H "Authorization: Bearer ibsk_…" \
https://inboxsink.com/v1/domains
Ключ в открытом виде показывается только при создании. Дальше остаётся виден лишь его префикс — мы храним только отпечаток.
Создать ящик
Все параметры необязательны: domain (по умолчанию случайный домен из пула), prefix (по умолчанию случайный), ttl_seconds (от 60 секунд до 30 дней).
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" }
Ящик, созданный через API, приватен: прочитать его может только создавший его ключ.
Ждать письмо
Блокирует до прихода письма, затем отвечает мгновенно. timeout в миллисекундах (по умолчанию 30 000, максимум 120 000), since чтобы получать только письма после указанного идентификатора.
Отвечает 204 без тела, если срок истёк без письма — это не ошибка, а обычный ответ на «ничего не пришло».
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 и link извлекаются за вас. Код сообщается, только если письмо действительно его объявляет («код», «подтверждение», «вход»…) — сумма счёта или год никогда не будут приняты за код.
Список писем
Принимает since и limit (по умолчанию 50, максимум 200). Возвращает сводки, без тела писем.
Прочитать письмо
Письмо целиком: text, html, headers и список вложений.
Удалить ящик
Немедленно стирает ящик и его письма. Отвечает 204.
Ошибки
| 204 | Нет содержимого — для wait срок истёк без письма |
| 400 | Неверный параметр |
| 401 | Ключ отсутствует, неизвестен или отозван |
| 403 | Этот ящик принадлежит другому ключу |
| 404 | Ящик или письмо не существует либо истёк |
| 429 | Слишком много вызовов |
Ограничения и срок жизни
Ящики из общего пула живут час; созданные через API следуют своему ttl_seconds, до тридцати дней. По истечении ящик и письма удаляются — архива, из которого можно что-то достать, не существует.
Письма больше десяти мегабайт отклоняются при приёме. Адреса неизвестного домена отклоняются прямо в SMTP-сессии, без создания отбойника.
Эти ящики не могут отправлять почту, и это сделано намеренно: письмо с одноразового домена никуда бы не дошло.