Développeurs
La boîte mail se moque de
qui est aux commandes.
Tout ce que fait l’application, votre code le fait : 104 opérations documentées sur 68 chemins, derrière un document OpenAPI 3.1 lisible sans clé. Le client TypeScript est tenu à ce document à chaque build.
MCP n’a aucune clé à coller. Le client découvre le serveur d’autorisation depuis le point de terminaison, s’enregistre lui-même et vous renvoie ici pour vous connecter.
104
opérations documentées
68
chemins sous un seul hôte
116
méthodes SDK, qui les couvrent toutes
20
événements webhook, en trois familles
Le document OpenAPI 3.1 est sur GET /openapi.json, et le lire ne demande aucune clé.
Surfaces
Trois portes,
une seule boîte mail.
Une clé d’espace de travail décide de ce qu’un appel peut faire et des adresses au nom desquelles il peut envoyer. Révoquer est une mise à jour plutôt qu’une suppression : un appel ultérieur s’entend donc dire que la clé a été révoquée.
Une clé envoie au nom de 25 domaines entiers et 50 adresses uniques au maximum. GET /ping renvoie les portées qu’elle détient et celles que son rôle lui a laissées.
Pointez un client vers le point de terminaison et connectez-vous. Aucune clé à coller, car le client s’enregistre lui-même et vous renvoie ici.
Les outils sont construits à partir de ce que l’appelant peut faire : un client limité à la lecture n’a donc aucun outil d’envoi. Un jeton atteint malgré tout toute la boîte mail.
Déclarez un point de terminaison https et la boîte mail y poste. Les remises sont levées par la boîte mail elle-même plutôt que par un appel d’API : écrire dans l’application et poster vers l’API déclenchent donc la même.
20 événements en trois familles, et dix points de terminaison par boîte mail.
Parité
Le client ne peut pas être en retard sur
l’API.
Un contrôle de parité lit le document OpenAPI à chaque build et échoue au moindre écart : une méthode pointant vers une opération absente de la spec, une opération documentée sans méthode, ou une liste de portées en désaccord avec ce que l’opération exige. Il imprime ce qu’il a prouvé, et cela donne aujourd’hui 116 méthodes SDK couvrant les 104 opérations documentées.
La configuration, la requête et l’appel sont la même opération, écrite de trois façons.
Agents, API et MCP
OpenEmail est fait pour être piloté par des logiciels autant que par des personnes. La boîte mail est la même dans les deux cas.
Serveur MCP
Pointez Claude, ou n’importe quel client MCP, vers votre boîte mail.
OAuth pour les clients tiers
BientôtEnregistrement de client en libre-service avec PKCE, pour qu'une application demande l'accès correctement.
Le consentement et la révocation sont là ; la portée, non : un jeton atteint donc toute votre boîte, et pas seulement la partie demandée par l'application.
API REST
Une API HTTP documentée, avec des clés à émettre, restreindre et révoquer.
Démarrage rapide
De rien à un message envoyé.
Trois étapes.
- 1
Générez une clé
Paramètres, Clés API, sur une boîte mail qui vous appartient. Choisissez ses portées, et restreignez les adresses d’envoi à des domaines entiers ou à des adresses uniques. Le secret n’est montré qu’une fois et ce qui est stocké est un hachage à sens unique.
GET /ping répond avec les portées de la clé et celles que son rôle lui a laissées. export OPENEMAIL_API_KEY=oe_live_9f2c1a4b7e05d3862c1f0a44_kX7… curl https://api.openemail.uk/ping \ -H "Authorization: Bearer $OPENEMAIL_API_KEY" - 2
Installez le client
Un client TypeScript sans dépendances, publié en ESM et CommonJS, qui lit la clé dans OPENEMAIL_API_KEY. Passez-le si vous préférez poster le JSON vous-même, car chaque point de terminaison est du simple HTTP.
Node 18 et plus, Workers, Deno, Bun et le navigateur. bun add @openemail/sdk - 3
Envoyez
La réponse porte l’id. GET /emails/{id} le résout, /events contient la trace par destinataire, et /tracking les ouvertures et les clics.
Une nouvelle tentative portant la même Idempotency-Key renvoie le premier résultat avec Idempotency-Replayed: true. import { init, openemail } from '@openemail/sdk' init({ apiKey: process.env.OPENEMAIL_API_KEY }) const email = await openemail.emails.send({ from: 'Acme Billing <[email protected]>', to: '[email protected]', subject: 'Your September invoice', html: '<p>Invoice attached.</p>',}) console.log(email.id, email.status)
Absent
Ce qu’il ne fera pas
encore pour vous.
Cinq choses à savoir avant de développer là-dessus, plutôt qu’après.
- Aucun point de terminaison d’envoi de fichiers
- Les pièces jointes en ligne partent en base64, sous un plafond total de 5 Mo. Un fichier plus lourd s’envoie en désignant par son id un fichier déjà présent dans l’espace de travail, qui voyage comme lien de téléchargement.
- Les rejets s’arrêtent à la boîte mail
- Un rapport de remise est analysé, rapproché par Message-ID, signalé sur la conversation et poussé comme webhook email.bounced. Rien n’est réécrit dans la ligne d’envoi : via GET /emails, un message rejeté se lit donc toujours comme envoyé.
- Le courrier de l’éditeur n’est pas dans GET /emails
- Le courrier envoyé depuis l’éditeur de l’application n’apparaît pas dans cette liste, car l’éditeur n’écrit pas par le même chemin d’envoi.
- OAuth a le consentement, pas la portée
- Une demande est montrée avant d’être accordée et Applications connectées la reprend, mais un jeton atteint toute votre boîte mail plutôt que la partie demandée par l’application.
- Aucun workflow de publication
- Publier le client, c’est lancer à la main le préflight, le build et bun publish : une version arrive donc sur npm quand quelqu’un l’exécute, pas quand le changement est intégré.
Vérifier une remise
Chaque remise est signée,
et chaque nouvelle tentative porte son id.
La signature est un HMAC-SHA-256 sur l’horodatage, un point, puis le corps brut. Vérifiez sur les octets tels qu’ils sont arrivés, car analyser puis re-sérialiser réordonne les clés et casse tout.
X-OpenEmail-Signature: t=1758240000,v1=9f0c4b2e7d1a86c3X-OpenEmail-Event: email.deliveredX-OpenEmail-Delivery: evt_4b7e05d3862c1f0a- Fenêtre de rejeu
- 300 secondes, et c’est au récepteur de les faire respecter. Le vérificateur du SDK s’y tient par défaut.
- Idempotency-Key
- Réservée par un index unique portant à la fois sur la clé et sur votre clé API : une nouvelle tentative après un délai dépassé renvoie donc le premier résultat avec Idempotency-Replayed: true plutôt que d’envoyer deux fois.
- Nouvelles tentatives
- Cinq tentatives : au moment de l’événement, puis après 1 minute, 5, 25 et 2 heures. Seuls un délai dépassé, une connexion refusée, 408, 425, 429 ou un 5xx sont répétés.
- X-OpenEmail-Delivery
- L’id de l’événement est frappé une fois et chaque tentative le porte : un récepteur qui voit deux fois le même id peut donc jeter le second plutôt que d’agir à nouveau.
Pour qui c’est
Une seule boîte mail.
Trois portes d’entrée.
Une adresse gratuite sur openemail.uk, avec le client derrière.
La même boîte mail via une API, un SDK et MCP.
Générez une clé.
Envoyez quelque chose.
Full API, MCP and SDK access sur toutes les formules. Free emporte 50 AI actions a day avec elle.