Documentation
API Mailera
Gérez vos boîtes aux lettres Microsoft (Outlook, Hotmail, Microsoft 365) de bout en bout via REST: ajoutez des boîtes aux lettres, vérifiez leur fonctionnement, lisez et envoyez des messages, récupérez des codes OTP, sortez les messages du Courrier indésirable et recevez des webhooks.
Introduction
Tous les points de terminaison partagent une URL de base et acceptent et renvoient du JSON.
- 1Créez un compte et votre propre espace de travail (gratuit).
- 2Ouvrez Paramètres → API keys, créez une clé et choisissez ses autorisations.
- 3Transmettez la clé dans l’en-tête X-API-Key à chaque requête.
Les réponses réussies contiennent un champ data; les erreurs contiennent un champ error avec code et message.
Créez un espace de travail gratuithttps://mailera.app/api/public/v1# 200{ "data": [ ... ], "next_cursor": "..." }# 4xx / 5xx{ "error": { "code": "not_found", "message": "..." } }Authentification
Transmettez votre API key dans l’en-tête X-API-Key. Les clés commencent par mh_live_ et ne sont affichées qu’une fois, à leur création; si vous en perdez une, créez-en une nouvelle et révoquez l’ancienne.
Un en-tête Authorization avec un token Bearer contenant la même clé est également accepté.
Les clés peuvent être limitées à une liste d’IP autorisées; les appels provenant d’autres IP reçoivent une erreur 403.
curl https://mailera.app/api/public/v1/mailboxes \ -H "X-API-Key: mh_live_..."Autorisations des clés
Chaque clé possède une ou plusieurs autorisations. L’appel d’un point de terminaison sans l’autorisation requise renvoie 403 forbidden.
| Autorisation | Permet de |
|---|---|
read | Lire les boîtes aux lettres, les messages, les codes OTP et leur emplacement (Boîte de réception/Courrier indésirable) |
move | Sortir les messages du Courrier indésirable et les déplacer entre dossiers |
import | Ajouter des boîtes aux lettres |
sync | Demander une synchronisation immédiate |
send | Envoyer des messages, y répondre et les transférer |
manage | Suspendre, réactiver et supprimer des boîtes aux lettres |
webhooks | Gérer les webhooks |
Erreurs
Les erreurs contiennent toujours un code stable et un message en anglais. Traitez-les selon le champ code, jamais selon le texte du champ message.
| HTTP | Code | Signification |
|---|---|---|
| 401 | unauthorized | API key manquante, invalide, expirée ou révoquée |
| 403 | forbidden | La clé n’a pas l’autorisation requise ou l’IP ne figure pas dans sa liste d’IP autorisées |
| 404 | not_found | La boîte aux lettres ou le message n’existe pas ou n’appartient pas à l’espace de travail de la clé |
| 409 | mailbox_unavailable | La boîte aux lettres doit être reconnectée, est suspendue ou utilise uniquement IMAP (pas encore pris en charge) |
| 422 | validation_error | Les données de la requête sont mal formatées |
| 429 | rate_limited | Plus de 300 requêtes par minute pour cette clé — respectez le délai indiqué dans l’en-tête Retry-After |
| 503 | upstream_error | Microsoft rencontre une erreur ou limite le débit — réessayez plus tard |
| 500 | internal_error | Erreur système |
Limites et pagination
Chaque clé autorise 300 requêtes par minute. Tout dépassement renvoie 429 avec un en-tête Retry-After.
Les listes renvoient next_cursor; transmettez cette valeur dans le paramètre cursor pour obtenir la page suivante. S’il n’y a plus de données, next_cursor vaut null.
Le paramètre limit définit la taille des pages.
curl "https://mailera.app/api/public/v1/mailboxes?limit=50&cursor=NEXT_CURSOR" \ -H "X-API-Key: mh_live_..."Boîtes aux lettres
Ajoutez, vérifiez, synchronisez, suspendez et supprimez des boîtes aux lettres.
- GET
/mailboxesLister les boîtes aux lettres
- Autorisation:
read- Paramètres de requête:
- status, q, cursor, limit
- POST
/mailboxes/importImporter des boîtes aux lettres en masse (email:password:refresh_token:client_id, ou séparées par |)
- Autorisation:
import- Corps:
- lines, text, group_id, duplicate_mode
- GET
/mailboxes/importProgression de l’import et résultats par ligne
- Autorisation:
import- Paramètres de requête:
- job_id
- GET
/mailboxes/{id}Détails de la boîte aux lettres et compteurs des dossiers
- Autorisation:
read
- PATCH
/mailboxes/{id}Suspendre ou réactiver une boîte aux lettres
- Autorisation:
manage- Corps:
- action (obligatoire)
- DELETE
/mailboxes/{id}Supprimer une boîte aux lettres
- Autorisation:
manage
- GET
/mailboxes/{id}/statusVérifier en direct auprès de Microsoft si la boîte aux lettres fonctionne toujours
- Autorisation:
read
- POST
/mailboxes/{id}/syncSynchronisez maintenant
- Autorisation:
sync- Corps:
- wait
curl -X POST https://mailera.app/api/public/v1/mailboxes/import \ -H "X-API-Key: mh_live_xxx" -H "content-type: application/json" \ -d '{"lines":["user@hotmail.com:pass:M.C5_refresh...:9e5f94bc-..."]}'# → { "data": { "job_id": "..." } }curl "https://mailera.app/api/public/v1/mailboxes/import?job_id=JOB_ID" -H "X-API-Key: mh_live_xxx"Messages
Lisez, recherchez et envoyez des messages, et récupérez des codes OTP.
- GET
/mailboxes/{id}/messagesLister les messages d’un dossier
- Autorisation:
read- Paramètres de requête:
- folder, unread, cursor, limit
- GET
/mailboxes/{id}/messages/{msgId}Récupérer un message avec son contenu
- Autorisation:
read
- GET
/mailboxes/{id}/otpRécupérer le dernier code OTP
- Autorisation:
read- Paramètres de requête:
- from, subject, since_minutes
- POST
/mailboxes/{id}/sendEnvoyer, répondre ou transférer
- Autorisation:
send- Corps:
- to, cc, bcc, subject, html, text, importance, reply_to_message_id, mode, attachments
- GET
/messages/searchRechercher des messages dans toutes les boîtes aux lettres
- Autorisation:
read- Paramètres de requête:
- q, folder, limit
curl -X POST https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/send \ -H "X-API-Key: mh_live_xxx" -H "content-type: application/json" \ -d '{"to":["customer@example.com"],"subject":"Hello","text":"Message body"}'Courrier indésirable
Vérifiez l’emplacement des messages (Boîte de réception/Courrier indésirable) et sortez-les du Courrier indésirable.
- POST
/mailboxes/{id}/messages/{msgId}/moveDéplacer un message (par exemple du Courrier indésirable vers la Boîte de réception)
- Autorisation:
move- Corps:
- destination (obligatoire)
- POST
/mailboxes/{id}/unspamSortir tous les messages, ou ceux d’un expéditeur, du Courrier indésirable
- Autorisation:
move- Corps:
- filter
- GET
/mailboxes/{id}/placementSavoir si le message est arrivé dans la Boîte de réception ou le Courrier indésirable
- Autorisation:
read- Paramètres de requête:
- from, subject, since_minutes
curl "https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/placement?from=me@example.com" -H "X-API-Key: mh_live_xxx"curl -X POST https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/unspam -H "X-API-Key: mh_live_xxx" \ -H "content-type: application/json" -d '{"filter":{"type":"sender","value":"me@example.com"}}'Webhooks
Enregistrez des URL pour recevoir des événements.
Pour chaque événement, Mailera envoie une requête POST en JSON à votre URL. Si votre point de terminaison renvoie une erreur ou ne répond pas, Mailera réessaie avec des délais croissants.
| Événement | Quand |
|---|---|
message.received | Un nouveau message est arrivé dans la Boîte de réception |
message.junk | Un nouveau message est arrivé dans le Courrier indésirable |
mailbox.disconnected | La boîte aux lettres a perdu sa connexion (token révoqué, mot de passe modifié…) |
Pour vérifier la signature, calculez le HMAC-SHA256 de l’horodatage suivi d’un point et du corps avec le secret du webhook, puis comparez-le à l’en-tête de signature.
En-têtes envoyés: X-MailHub-Event X-MailHub-Delivery X-MailHub-Timestamp X-MailHub-Signature
- GET
/webhooksLister les webhooks
- Autorisation:
webhooks
- POST
/webhooksCréer un webhook (le secret de signature n’est renvoyé qu’une fois)
- Autorisation:
webhooks- Corps:
- url (obligatoire), events, group_id
- PATCH
/webhooks/{id}Activer/désactiver un webhook ou modifier ses événements ou son URL
- Autorisation:
webhooks
- DELETE
/webhooks/{id}Supprimer un webhook
- Autorisation:
webhooks
import crypto from "node:crypto";// X-MailHub-Signature: sha256=<hex> X-MailHub-Timestamp: <unix seconds>const expected = "sha256=" + crypto.createHmac("sha256", SECRET) .update(timestamp + "." + rawBody).digest("hex");const ok = expected.length === signature.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));Exemples
Remplacez MAILBOX_ID et la clé par vos propres valeurs.
curl -X POST https://mailera.app/api/public/v1/mailboxes/import \ -H "X-API-Key: mh_live_xxx" -H "content-type: application/json" \ -d '{"lines":["user@hotmail.com:pass:M.C5_refresh...:9e5f94bc-..."]}'# → { "data": { "job_id": "..." } }curl "https://mailera.app/api/public/v1/mailboxes/import?job_id=JOB_ID" -H "X-API-Key: mh_live_xxx"curl https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/status -H "X-API-Key: mh_live_xxx"curl "https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/otp?from=noreply@service.com&since_minutes=15" \ -H "X-API-Key: mh_live_xxx"# → { "data": { "code": "482913", "folder": "inbox", ... } } or { "data": { "code": null } }curl -X POST https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/send \ -H "X-API-Key: mh_live_xxx" -H "content-type: application/json" \ -d '{"to":["customer@example.com"],"subject":"Hello","text":"Message body"}'curl "https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/placement?from=me@example.com" -H "X-API-Key: mh_live_xxx"curl -X POST https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/unspam -H "X-API-Key: mh_live_xxx" \ -H "content-type: application/json" -d '{"filter":{"type":"sender","value":"me@example.com"}}'const res = await fetch("https://mailera.app/api/public/v1/mailboxes?limit=50", { headers: { "X-API-Key": process.env.MAILERA_API_KEY },});const { data, next_cursor } = await res.json();import os, requestsr = requests.get( "https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/messages", params={"folder": "inbox", "limit": 20}, headers={"X-API-Key": os.environ["MAILERA_API_KEY"]},)print(r.json()["data"])import crypto from "node:crypto";// X-MailHub-Signature: sha256=<hex> X-MailHub-Timestamp: <unix seconds>const expected = "sha256=" + crypto.createHmac("sha256", SECRET) .update(timestamp + "." + rawBody).digest("hex");const ok = expected.length === signature.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
