inboxsink API

Skriptbare Wegwerf-Postfächer, um Anmeldestrecken zu testen, ohne von einem echten Postfach abzuhängen. Fünf Routen, eine Basis unter https://inboxsink.com, JSON.

Die Route, die etwas ändert, ist wait: Sie blockiert, bis die Nachricht eintrifft. Ohne sie rät ein End-to-End-Test mit sleep und wird instabil, sobald die Versandwarteschlange stockt.

Kostenloser API-Schlüssel

Tausend Aufrufe im Monat, ohne Karte. Genug, um ihn in Ihre Testsuite einzubauen und zu sehen, ob es trägt.

Später, wenn Ihre Tests abgewiesen werden: eine eigene Domain wird nirgends veröffentlicht und landet daher auf keiner Sperrliste — 29 € im Monat.

JavaScript-Client

Ein Paket ohne Abhängigkeiten, für Node 18 und neuer. Quellcode auf 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 wirft einen Fehler, statt null zurückzugeben, wenn kein Code eintrifft: ein Test soll laut scheitern, nicht stillschweigend ein leeres Feld absenden.

Authentifizierung

Ein Authorization-Header pro Aufruf. Schlüssel werden im Dashboard erstellt und beginnen mit ibsk_.

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

Der Schlüssel im Klartext wird nur bei der Erstellung angezeigt. Danach bleibt nur sein Präfix sichtbar — wir speichern lediglich seinen Hash.

Postfach anlegen

POST /v1/inboxes

Alle Parameter sind optional: domain (standardmäßig eine zufällige Pool-Domain), prefix (standardmäßig zufällig), ttl_seconds (60 Sekunden bis 30 Tage).

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

Ein über die API angelegtes Postfach ist privat: nur der Schlüssel, der es erstellt hat, kann es lesen.

Auf eine Nachricht warten

GET /v1/inboxes/:id/wait

Blockiert bis zum Eintreffen einer Nachricht und antwortet dann sofort. timeout in Millisekunden (30 000 Standard, 120 000 Maximum), since, um nur Nachrichten nach einer Kennung zu erhalten.

Antwortet mit 204 ohne Inhalt, wenn die Frist ohne Nachricht abläuft — das ist kein Fehler, sondern die normale Antwort auf «nichts eingetroffen».

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 und link werden für Sie ausgelesen. Ein Code wird nur gemeldet, wenn die Nachricht ihn tatsächlich ankündigt («Code», «Bestätigung», «Anmeldung»…) — ein Rechnungsbetrag oder eine Jahreszahl wird nie damit verwechselt.

Nachrichten auflisten

GET /v1/inboxes/:id/messages

Nimmt since und limit (50 Standard, 200 Maximum). Liefert Zusammenfassungen, ohne Nachrichtentext.

Eine Nachricht lesen

GET /v1/messages/:id

Die vollständige Nachricht: text, html, headers und die Liste der Anhänge.

Postfach löschen

DELETE /v1/inboxes/:id

Löscht das Postfach und seine Nachrichten sofort. Antwortet mit 204.

Fehler

204Kein Inhalt — bei wait lief die Frist ohne Nachricht ab
400Ungültiger Parameter
401Schlüssel fehlt, unbekannt oder widerrufen
403Dieses Postfach gehört einem anderen Schlüssel
404Postfach oder Nachricht nicht vorhanden oder abgelaufen
429Zu viele Aufrufe

Grenzen und Lebensdauer

Postfächer aus dem öffentlichen Pool leben eine Stunde; über die API angelegte folgen ihrem ttl_seconds, bis zu dreißig Tage. Danach werden Postfach und Nachrichten gelöscht — es gibt kein Archiv, das man später holen könnte.

Nachrichten über zehn Megabyte werden beim Empfang abgewiesen. Adressen einer unbekannten Domain werden während der SMTP-Sitzung abgelehnt, ohne einen Bounce zu erzeugen.

Diese Postfächer können keine Mail versenden, und das ist Absicht: eine aus einer Wegwerfdomain gesendete Nachricht käme nirgends an.