API di inboxsink

Caselle usa e getta pilotabili da codice, per testare le iscrizioni senza dipendere da una casella vera. Cinque rotte, una base su https://inboxsink.com, JSON.

La rotta che cambia qualcosa è wait: si blocca finché il messaggio non arriva. Senza di essa un test end-to-end tira a indovinare con sleep e diventa instabile appena la coda di invio rallenta.

Chiave API gratuita

Mille chiamate al mese, senza carta. Quanto basta per collegarla alla tua suite di test e vedere se regge.

Poi, quando i tuoi test inizieranno a essere rifiutati: un dominio tuo non è pubblicato da nessuna parte, quindi non finisce in nessuna lista nera — 29 € al mese.

Client JavaScript

Un pacchetto senza alcuna dipendenza, per Node 18 e successivi. Il codice è su 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 solleva un errore invece di restituire null quando non arriva nessun codice: un test deve fallire in modo rumoroso, non compilare in silenzio un campo vuoto.

Autenticazione

Un'intestazione Authorization a ogni chiamata. Le chiavi si creano dal pannello e iniziano con ibsk_.

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

La chiave in chiaro viene mostrata solo alla creazione. Dopo resta visibile soltanto il prefisso: di essa conserviamo unicamente l'impronta.

Creare una casella

POST /v1/inboxes

Tutti i parametri sono facoltativi: domain (per impostazione predefinita un dominio del pool a caso), prefix (casuale per impostazione predefinita), ttl_seconds (da 60 secondi a 30 giorni).

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 casella creata dall'API è privata: solo la chiave che l'ha creata può leggerla.

Attendere un messaggio

GET /v1/inboxes/:id/wait

Si blocca finché non arriva un messaggio, poi risponde subito. timeout in millisecondi (30 000 predefinito, 120 000 massimo), since per ricevere solo i messaggi successivi a un identificatore.

Risponde 204 senza corpo se il tempo scade senza messaggi: non è un errore, è la risposta normale a «non è arrivato niente».

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 e link sono estratti per te. Un codice viene segnalato solo se il messaggio lo annuncia davvero («codice», «verifica», «accesso»…) — un importo di fattura o un anno non vengono mai scambiati per un codice.

Elencare i messaggi

GET /v1/inboxes/:id/messages

Accetta since e limit (50 predefinito, 200 massimo). Restituisce riepiloghi, senza il corpo dei messaggi.

Leggere un messaggio

GET /v1/messages/:id

Il messaggio completo: text, html, headers e l'elenco degli allegati.

Eliminare una casella

DELETE /v1/inboxes/:id

Cancella la casella e i suoi messaggi immediatamente. Risponde 204.

Errori

204Nessun contenuto — per wait, il tempo è scaduto senza messaggi
400Parametro non valido
401Chiave assente, sconosciuta o revocata
403Quella casella appartiene a un'altra chiave
404Casella o messaggio inesistente, o già scaduto
429Troppe chiamate

Limiti e durata

Le caselle del pool pubblico vivono un'ora; quelle create dall'API seguono il loro ttl_seconds, fino a trenta giorni. Trascorso il termine, la casella e i suoi messaggi vengono eliminati: non resta alcun archivio da recuperare.

I messaggi oltre dieci megabyte vengono rifiutati alla ricezione. Gli indirizzi di un dominio sconosciuto vengono rifiutati durante la sessione SMTP, senza generare un rimbalzo.

Queste caselle non possono inviare posta, ed è voluto: un messaggio inviato da un dominio usa e getta non arriverebbe da nessuna parte.