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.
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
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
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
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
Le message complet : text, html, headers et la liste des pièces jointes.
Supprimer une boîte
Efface la boîte et ses messages sur-le-champ. Répond 204.
Erreurs
| 204 | Pas de contenu — pour wait, le délai a expiré sans message |
| 400 | Paramètre invalide |
| 401 | Clé absente, inconnue ou révoquée |
| 403 | Cette boîte appartient à une autre clé |
| 404 | Boîte ou message inexistant, ou déjà expiré |
| 429 | Trop 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.