inboxsink API

Scriptbare wegwerppostvakken, om aanmeldstromen te testen zonder van een echte mailbox af te hangen. Vijf routes, één basis op https://inboxsink.com, JSON.

De route die iets verandert is wait: die blokkeert tot het bericht aankomt. Zonder haar gokt een end-to-end-test met sleep en wordt instabiel zodra de verzendwachtrij achterloopt.

Gratis API-sleutel

Duizend aanroepen per maand, zonder kaart. Genoeg om hem in je testsuite te hangen en te zien of het houdt.

Later, wanneer je tests geweigerd worden: een eigen domein wordt nergens gepubliceerd en belandt dus op geen enkele blokkeerlijst — 29 € per maand.

JavaScript-client

Een pakket zonder afhankelijkheden, voor Node 18 en hoger. Broncode op 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 gooit een fout in plaats van null terug te geven als er geen code komt: een test moet luid falen, niet stilletjes een leeg veld invullen.

Authenticatie

Eén Authorization-header per aanroep. Sleutels maak je aan in het dashboard; ze beginnen met ibsk_.

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

De sleutel in leesbare vorm wordt alleen bij het aanmaken getoond. Daarna blijft enkel het voorvoegsel zichtbaar — wij bewaren alleen de hash.

Een postvak aanmaken

POST /v1/inboxes

Alle parameters zijn optioneel: domain (standaard een willekeurig pooldomein), prefix (standaard willekeurig), ttl_seconds (60 seconden tot 30 dagen).

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

Een via de API aangemaakt postvak is privé: alleen de sleutel die het aanmaakte kan het lezen.

Op een bericht wachten

GET /v1/inboxes/:id/wait

Blokkeert tot er een bericht aankomt en antwoordt dan meteen. timeout in milliseconden (standaard 30 000, maximaal 120 000), since om alleen berichten na een identifier te krijgen.

Antwoordt 204 zonder inhoud als de termijn verstrijkt zonder bericht — dat is geen fout, dat is het normale antwoord op «er is niets aangekomen».

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 en link worden voor je uitgelezen. Een code wordt alleen gemeld als het bericht er daadwerkelijk een aankondigt («code», «verificatie», «inloggen»…) — een factuurbedrag of een jaartal wordt er nooit mee verward.

Berichten opsommen

GET /v1/inboxes/:id/messages

Neemt since en limit (standaard 50, maximaal 200). Geeft samenvattingen terug, zonder berichttekst.

Een bericht lezen

GET /v1/messages/:id

Het volledige bericht: text, html, headers en de lijst met bijlagen.

Een postvak verwijderen

DELETE /v1/inboxes/:id

Wist het postvak en zijn berichten meteen. Antwoordt 204.

Fouten

204Geen inhoud — bij wait verstreek de termijn zonder bericht
400Ongeldige parameter
401Sleutel ontbreekt, onbekend of ingetrokken
403Dat postvak hoort bij een andere sleutel
404Postvak of bericht bestaat niet, of is verlopen
429Te veel aanroepen

Limieten en levensduur

Postvakken uit de publieke pool leven één uur; via de API aangemaakte volgen hun ttl_seconds, tot dertig dagen. Daarna worden postvak en berichten gewist — er is geen archief om later op te halen.

Berichten boven tien megabyte worden bij ontvangst geweigerd. Adressen op een onbekend domein worden tijdens de SMTP-sessie geweigerd, zonder een bounce te maken.

Deze postvakken kunnen geen post versturen, en dat is bewust: een bericht vanaf een wegwerpdomein zou nergens aankomen.