API inboxsink

Des boîtes mail jetables pilotables, pour tester des tunnels d'inscription sans dépendre d'une vraie messagerie. Cinq routes, une base https://inboxsink.com, du JSON.

La route qui change quelque chose est wait : elle bloque jusqu'à l'arrivée du message. Sans elle, un test de bout en bout attend au jugé avec des sleep, et devient instable dès que la file d'envoi prend du retard.

Clé d'API gratuite

Mille appels par mois, sans carte. De quoi la brancher dans votre suite de tests et voir si ça tient.

Ensuite, quand vos tests commenceront à être refusés : un domaine à vous n'est publié nulle part, donc il n'atterrit sur aucune liste noire — 29 € par mois.

Client JavaScript

Un paquet sans aucune dépendance, pour Node 18 et plus. Le code est sur 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 lève une erreur plutôt que de rendre null quand aucun code n'arrive : un test doit échouer bruyamment, pas remplir un champ vide en silence.

Authentification

Un en-tête Authorization sur chaque appel. Les clés se créent depuis le tableau de bord et commencent par ibsk_.

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

La clé en clair n'est affichée qu'à sa création. Ensuite, seul son préfixe reste visible — nous n'en stockons que l'empreinte.

Créer une boîte

POST /v1/inboxes

Tous les paramètres sont facultatifs : domain (par défaut un domaine du pool au hasard), prefix (par défaut aléatoire), ttl_seconds (de 60 secondes à 30 jours).

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

Une boîte créée par l'API est privée : seule la clé qui l'a créée peut la lire.

Attendre un message

GET /v1/inboxes/:id/wait

Bloque jusqu'à l'arrivée d'un message, puis répond immédiatement. timeout en millisecondes (30 000 par défaut, 120 000 au maximum), since pour ne recevoir que les messages postérieurs à un identifiant.

Répond 204 sans corps si le délai expire sans message — ce n'est pas une erreur, c'est la réponse normale à « rien n'est arrivé ».

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 et link sont extraits pour vous. Le code n'est retenu que s'il est annoncé par un mot-clé (« code », « vérification », « connexion »…) — un montant ou une année ne sera pas confondu avec un code.

Lister les messages

GET /v1/inboxes/:id/messages

Paramètres since et limit (50 par défaut, 200 au maximum). Retourne des résumés, sans le corps des messages.

Lire un message

GET /v1/messages/:id

Le message complet : text, html, headers et la liste des pièces jointes.

Supprimer une boîte

DELETE /v1/inboxes/:id

Efface la boîte et ses messages sur-le-champ. Répond 204.

Erreurs

204Pas de contenu — pour wait, le délai a expiré sans message
400Paramètre invalide
401Clé absente, inconnue ou révoquée
403Cette boîte appartient à une autre clé
404Boîte ou message inexistant, ou déjà expiré
429Trop d'appels

Limites et durée de vie

Les boîtes du pool public vivent une heure, celles créées par l'API suivent leur ttl_seconds, jusqu'à trente jours. Passé ce délai, la boîte et ses messages sont supprimés — il n'y a pas d'archive à récupérer ensuite.

Les messages de plus de dix mégaoctets sont refusés à la réception. Les adresses d'un domaine inconnu sont rejetées pendant la session SMTP, sans générer de rebond.

Ces boîtes ne peuvent pas envoyer de courrier, et c'est délibéré : un message émis depuis un domaine jetable n'arriverait nulle part.