API inboxsink

Управляемые кодом одноразовые ящики, чтобы тестировать регистрации без зависимости от настоящей почты. Пять маршрутов, база https://inboxsink.com, JSON.

Маршрут, который меняет дело, — wait: он блокирует до прихода письма. Без него сквозной тест гадает через sleep и становится нестабильным, как только очередь отправки задерживается.

Бесплатный ключ API

Тысяча вызовов в месяц, без карты. Достаточно, чтобы встроить его в свои тесты и посмотреть, держится ли.

Потом, когда ваши тесты начнут отклонять: собственный домен нигде не публикуется, а значит не попадает ни в один чёрный список — 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

Ключ в открытом виде показывается только при создании. Дальше остаётся виден лишь его префикс — мы храним только отпечаток.

Создать ящик

POST /v1/inboxes

Все параметры необязательны: 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, приватен: прочитать его может только создавший его ключ.

Ждать письмо

GET /v1/inboxes/:id/wait

Блокирует до прихода письма, затем отвечает мгновенно. 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 извлекаются за вас. Код сообщается, только если письмо действительно его объявляет («код», «подтверждение», «вход»…) — сумма счёта или год никогда не будут приняты за код.

Список писем

GET /v1/inboxes/:id/messages

Принимает since и limit (по умолчанию 50, максимум 200). Возвращает сводки, без тела писем.

Прочитать письмо

GET /v1/messages/:id

Письмо целиком: text, html, headers и список вложений.

Удалить ящик

DELETE /v1/inboxes/:id

Немедленно стирает ящик и его письма. Отвечает 204.

Ошибки

204Нет содержимого — для wait срок истёк без письма
400Неверный параметр
401Ключ отсутствует, неизвестен или отозван
403Этот ящик принадлежит другому ключу
404Ящик или письмо не существует либо истёк
429Слишком много вызовов

Ограничения и срок жизни

Ящики из общего пула живут час; созданные через API следуют своему ttl_seconds, до тридцати дней. По истечении ящик и письма удаляются — архива, из которого можно что-то достать, не существует.

Письма больше десяти мегабайт отклоняются при приёме. Адреса неизвестного домена отклоняются прямо в SMTP-сессии, без создания отбойника.

Эти ящики не могут отправлять почту, и это сделано намеренно: письмо с одноразового домена никуда бы не дошло.