Documentation Envol
Envoyez vos e-mails transactionnels par API (confirmation de commande, réinitialisation de mot de passe, code de connexion, facture…), écoutez les événements en temps réel via webhooks, et authentifiez votre domaine pour atterrir en boîte de réception. Tout ce dont vous avez besoin tient sur cette page.
URL de base
Toutes les requêtes se font en HTTPS sur :
https://envolmail.com/api/v1
Authentification
Chaque requête est authentifiée par une clé API passée dans l'en-tête Authorization, au format Bearer. Vos clés commencent par env_live_.
Authorization: Bearer env_live_VOTRE_CLE
Créer une clé
- Dans Envol, ouvrez Réglages → Clés API.
- Cliquez sur Nouvelle clé, donnez-lui un nom (ex. « Production »).
- Copiez la clé : elle n'est affichée qu'une seule fois. Stockez-la dans une variable d'environnement, jamais dans votre code source.
Envoyer un e-mail
Envoie un e-mail transactionnel. L'adresse from doit être un expéditeur vérifié de votre espace (voir Authentifier votre domaine).
Paramètres
| Champ | Type | Description | |
|---|---|---|---|
| from | string | requis | Expéditeur vérifié. Format email ou Nom <email>. |
| to | string | requis | Adresse du destinataire. |
| subject | string | requis | Objet de l'e-mail (1 à 200 caractères). |
| html | string | optionnel* | Corps HTML de l'e-mail. |
| text | string | optionnel | Version texte (recommandée pour la délivrabilité). |
| replyTo | string | optionnel | Adresse de réponse (Reply-To). |
| template | string | optionnel* | Nom ou ID d'un template enregistré. |
| data | object | optionnel | Variables injectées dans le template. |
* Vous devez fournir html ou template.
Exemple
curl -X POST https://envolmail.com/api/v1/emails \
-H "Authorization: Bearer env_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"from": "Studio Hirsch <contact@studio-hirsch.fr>",
"to": "client@example.com",
"subject": "Votre commande est en route",
"html": "<h1>Merci !</h1><p>Suivi : FR-90217</p>"
}'Templates & variables
Plutôt que d'envoyer du HTML à chaque requête, réutilisez un template enregistré dans Envol et passez seulement les variables. Référencez-le par son nom via template, et fournissez les valeurs dans data. Les variables s'écrivent {{maVariable}} dans le template et l'objet.
{
"from": "contact@studio-hirsch.fr",
"to": "client@example.com",
"subject": "Votre commande {{order}}",
"template": "order-shipped",
"data": {
"order": "FR-90217",
"tracking": "Colissimo 6A-1180-22"
}
}404 template_not_found.Réponses & erreurs
En cas de succès, l'API renvoie 202 Accepted : l'e-mail est accepté et mis en file d'envoi.
{
"id": "0113019ea5344f47-7c2b…",
"status": "accepted"
}Codes d'erreur
| Statut | Code | Cause |
|---|---|---|
| 400 | invalid_input | Champs manquants ou invalides (voir details). |
| 400 | no_html_or_template | Ni html ni template fourni. |
| 401 | missing_or_invalid_token | En-tête Authorization absent ou mal formé. |
| 401 | invalid_token | Clé révoquée ou inconnue. |
| 403 | sender_not_verified | L'adresse from n'est pas un expéditeur vérifié. |
| 404 | template_not_found | Le template référencé n'existe pas. |
Configurer un webhook
Envol envoie en temps réel les événements de vos envois (ouvertures, clics, rejets…) vers l'URL HTTPS de votre choix. Configurez-la dans Réglages → Webhooks, choisissez les événements à recevoir, et conservez le secret (whsec_…) généré pour vérifier les signatures.
Événements disponibles
| type | Déclenché quand… |
|---|---|
| DELIVERED | l'e-mail est remis au serveur du destinataire. |
| OPEN | une ouverture est détectée. |
| CLICK | un lien de l'e-mail est cliqué. |
| BOUNCE | rejet (adresse invalide, boîte pleine…). |
| COMPLAINT | le destinataire signale l'e-mail comme spam. |
| UNSUBSCRIBE | le destinataire se désinscrit. |
Format du payload
Chaque événement est envoyé en POST, corps JSON :
{
"type": "DELIVERED",
"messageId": "0113019ea5344f47-7c2b…",
"email": "client@example.com",
"meta": {},
"deliveredAt": "2026-06-08T10:12:30.000Z"
}Vérifier la signature
Chaque requête porte l'en-tête X-Envol-Signature : un HMAC-SHA256 (en hexadécimal) du corps brut, calculé avec le secret de votre webhook. Recalculez-le de votre côté et comparez, pour garantir que l'événement vient bien d'Envol.
import express from "express";
import crypto from "crypto";
const app = express();
app.post(
"/webhooks/envol",
express.raw({ type: "application/json" }), // garder le corps BRUT
(req, res) => {
const signature = req.header("X-Envol-Signature");
const expected = crypto
.createHmac("sha256", process.env.ENVOL_WEBHOOK_SECRET)
.update(req.body) // Buffer non parsé
.digest("hex");
if (signature !== expected) return res.status(401).end();
const event = JSON.parse(req.body.toString());
// event.type · event.messageId · event.email · event.deliveredAt
res.status(200).end();
},
);Authentifier votre domaine
Pour envoyer depuis votre propre domaine et atterrir en boîte de réception (et non en spam), authentifiez-le avec SPF et DKIM. L'envoi passe par Zoho ZeptoMail : la clé DKIM est générée dans la console ZeptoMail, par domaine.
Le parcours en 3 étapes
- Console ZeptoMail → Domains → ajoutez votre domaine. ZeptoMail affiche alors les 2 enregistrements exacts à publier : un TXT (DKIM) + un CNAME (retours).
- Publiez-les chez votre hébergeur DNS (voir les guides par hébergeur ci-dessous), puis revenez les valider dans ZeptoMail.
- Dans Envol, Réglages → Expéditeurs → ajoutez le même domaine → Vérifier. Envol contrôle que les enregistrements sont bien publiés.
Les enregistrements à publier
| Type | Hôte | Valeur |
|---|---|---|
| TXT (DKIM) | <sélecteur>._domainkey.votre-domaine.fr | clé k=rsa; p=… fournie par la console (sélecteur numérique unique) |
| CNAME (retours) | bounce-zem.votre-domaine.fr | clusterNN.zeptomail.com (valeur exacte dans la console) |
| TXT (DMARC, recommandé) | _dmarc.votre-domaine.fr | v=DMARC1; p=none; rua=mailto:dmarc@votre-domaine.fr |
k=rsa; p=…) + un CNAME de retours (bounce-zem). Pas de SPF à ajouter : DMARC passe via l'alignement DKIM. Copiez les valeurs exactes de votre console ZeptoMail (elles sont uniques par domaine). Propagation : 5 à 30 minutes.Guides par hébergeur
Les étapes exactes selon l'endroit où votre domaine est géré. Sélectionnez votre hébergeur :
13182548._domainkey ou bounce-zem), jamais le domaine complet.- Récupérez d'abord vos 2 enregistrements (TXT DKIM + CNAME de retours) dans la console ZeptoMail → Domains.
- Connectez-vous à hPanel → Domaines → votre domaine → DNS / Gérer les enregistrements.
- DKIM — Type
TXT, Nom = le sélecteur fourni (ex.13182548._domainkey), Valeur = la clék=rsa; p=…de la console. - Retours — Type
CNAME, Nombounce-zem, Cible =clusterNN.zeptomail.com(valeur de la console). - DMARC (recommandé) — Type
TXT, Nom_dmarc, Valeurv=DMARC1; p=none; rua=mailto:dmarc@votre-domaine.fr. - Enregistrez, patientez 5 à 30 min, validez dans ZeptoMail puis cliquez Vérifier dans Envol.
Domaines formulaires & landing pages
Servez vos formulaires (/f/…) et landing pages (/p/…) depuis votre propre sous-domaine (ex. forms.votre-domaine.fr) plutôt que le domaine Envol. Ajoutez le sous-domaine dans Réglages → Domaines, puis publiez un seul enregistrement CNAME.
| Type | Hôte | Valeur |
|---|---|---|
| CNAME | forms.votre-domaine.fr | cible affichée dans Réglages → Domaines |