API Modèles d’E-mail
L’API Modèles d’E-mail permet aux administrateurs de personnaliser les e-mails transactionnels envoyés par Auris. Chacun des treize types de modèles correspond à un événement précis (vérification, réinitialisation de mot de passe, magic link, alertes de sécurité, …) et peut être personnalisé avec du HTML et des variables dynamiques, indépendamment pour chaque langue.
Auris fournit des modèles par défaut pour tous les types dans cinq langues (en, it, fr, de, es). Quand un modèle personnalisé existe pour un type et une langue, il est utilisé pour tous les futurs e-mails de ce type ; sinon c’est le défaut avec le branding du tenant qui est utilisé. Ordre de résolution à l’envoi : personnalisé (langue demandée) -> personnalisé (en) -> défaut (langue demandée) -> défaut (en).
Tous les endpoints exigent un jeton Bearer avec la permission manage:security et sélectionnent le tenant via l’en-tête x-tenant (l’identifiant de realm du tenant).
Ces endpoints renvoient des objets JSON simples — ils n’utilisent pas l’enveloppe { ok, data }
présente ailleurs dans l’API Auris.
Lister les Modèles
/api/email-templatesRequires: manage:securityListe les treize types de modèles avec leur statut de personnalisation pour le tenant. Les corps HTML complets ne sont pas inclus — utilise la lecture d’un modèle unique.
Réponse de succès (200)
{
"templates": [
{
"type": "verification",
"label": "Email Verification",
"description": "Sent when a new user registers to verify their email address.",
"variables": ["email", "link", "expiresIn", "year", "month", "day", "date"],
"hasCustomTemplate": true,
"active": true,
"updatedAt": "2026-07-20T10:00:00.000Z",
"customLocales": ["en", "fr"]
}
],
"availableLocales": ["en", "it", "fr", "de", "es"],
"wellKnownLocales": { "en": "English", "fr": "Français", "pt-BR": "Português (Brasil)" }
}| Champ | Type | Description |
|---|---|---|
type | string | Identifiant du type de modèle (voir Types de Modèles plus bas) |
label | string | Nom lisible du modèle |
description | string | Quand l’e-mail est envoyé |
variables | string[] | Variables disponibles pour ce type, y compris les variables de date globales auto-injectées (year, month, day, date) |
hasCustomTemplate | boolean | true si au moins une version personnalisée existe (toute langue) |
active | boolean | Si une version personnalisée est active (true quand aucun modèle personnalisé n’existe — le défaut est toujours actif) |
updatedAt | string | null | Horodatage ISO 8601 de la dernière personnalisation, ou null |
customLocales | string[] | Langues pour lesquelles une version personnalisée existe |
availableLocales | string[] | Langues avec modèles par défaut intégrés |
wellKnownLocales | object | Carte code de langue -> libellé utilisée par la Console |
Récupérer un Modèle
/api/email-templates/{type}?locale={locale}Requires: manage:securityRécupère un modèle pour une langue : le contenu personnalisé (le cas échéant) plus la base par défaut avec le branding du tenant. Le paramètre locale vaut en par défaut.
Réponse de succès (200)
{
"type": "verification",
"locale": "fr",
"label": "Email Verification",
"description": "Sent when a new user registers to verify their email address.",
"variables": ["email", "link", "expiresIn", "year", "month", "day", "date"],
"hasCustomTemplate": false,
"subject": null,
"htmlBody": null,
"metadata": null,
"active": true,
"updatedAt": null,
"defaultSubject": "Vérifie ton adresse e-mail",
"defaultHtmlBody": "<!DOCTYPE html>...",
"availableLocales": ["en", "it", "fr", "de", "es"],
"customLocales": ["en"],
"hasDefaultTemplate": true,
"wellKnownLocales": { "en": "English", "fr": "Français" }
}subject, htmlBody et metadata sont null quand aucun modèle personnalisé n’existe pour la langue demandée. defaultSubject et defaultHtmlBody contiennent toujours le modèle intégré, rendu avec le branding du tenant (logo, couleur, footer white-label) exactement comme pour un envoi réel. hasDefaultTemplate indique si la langue demandée a un défaut intégré (en, it, fr, de, es) ; les autres langues retombent sur l’anglais.
Réponses d’erreur
| HTTP | Description |
|---|---|
400 | Type de modèle ou code de langue invalide |
401 / 403 | Authentification manquante ou permissions insuffisantes |
404 | Tenant introuvable |
Mettre à Jour un Modèle
/api/email-templates/{type}Requires: manage:securityCrée ou met à jour le modèle personnalisé pour une langue. La langue peut être passée dans le corps ou en paramètre query ; défaut en. Le modèle enregistré est actif immédiatement.
Corps de la requête
{
"subject": "Vérifie ton e-mail — {{email}}",
"htmlBody": "<!DOCTYPE html><html><body><h1>Vérifie ton e-mail</h1><p>Bonjour {{email}},</p><p><a href=\"{{link}}\">Confirme ton adresse</a></p><p>Le lien expire dans {{expiresIn}}.</p></body></html>",
"locale": "fr",
"metadata": { "source": "code" }
}| Champ | Type | Requis | Description |
|---|---|---|---|
subject | string | Oui | Objet de l’e-mail. Peut inclure des placeholders {{variable}} |
htmlBody | string | Oui | Corps HTML complet. Taille maximale 500 Ko |
locale | string | Non | Code de langue (style BCP-47, ex. en, pt-BR). Défaut en |
metadata | object | Non | État de l’éditeur utilisé par la Console (thème, layout du builder, mode). Validé contre un schéma fermé — les champs non reconnus sont rejetés, pas supprimés silencieusement. Taille maximale 256 000 caractères |
Le corps HTML est assaini côté serveur avant l’enregistrement : balises <script>, attributs de gestion d’événements (onclick, …), URI javascript:/data:, balises <iframe>/<embed>/<object>/<form>/<base> et constructions CSS dangereuses sont supprimés.
Réponse de succès (200) — l’enregistrement du modèle sauvegardé :
{
"id": "cltpl123",
"tenantId": "tnt_ScUtrVKUKGxtu7WY",
"type": "verification",
"locale": "fr",
"subject": "Vérifie ton e-mail — {{email}}",
"htmlBody": "<!DOCTYPE html>...",
"metadata": { "source": "code" },
"active": true,
"createdAt": "2026-07-23T09:00:00.000Z",
"updatedAt": "2026-07-23T09:00:00.000Z"
}Réponses d’erreur
| HTTP | Description |
|---|---|
400 | Type invalide, langue invalide, ou subject/htmlBody manquants |
413 | htmlBody dépasse la limite de 500 Ko, ou metadata dépasse 256 000 caractères |
422 | metadata ne correspond pas au schéma attendu (forme ou champ non reconnu) |
Les modifications prennent effet immédiatement pour tous les futurs e-mails de ce type et de cette langue. Il n’y a pas de mécanisme de brouillon — prévisualise et teste le modèle avant d’enregistrer.
Supprimer un Modèle
/api/email-templates/{type}?locale={locale}Requires: manage:securitySupprime le modèle personnalisé et revient au défaut intégré. Avec le paramètre locale, seule cette langue est supprimée ; sans, TOUTES les langues du type sont supprimées.
Réponse de succès (200)
{ "success": true }Prévisualiser un Modèle
/api/email-templates/{type}/previewRequires: manage:securityRend un objet et un corps HTML avec des variables d’exemple réalistes pour le type de modèle. Rien n’est envoyé ni enregistré.
Corps de la requête
{
"subject": "Vérifie ton e-mail — {{email}}",
"htmlBody": "<!DOCTYPE html>..."
}Réponse de succès (200)
{
"subject": "Vérifie ton e-mail — [email protected]",
"html": "<!DOCTYPE html>...",
"variables": {
"email": "[email protected]",
"link": "https://console.auris.dev/verify-email?token=abc123",
"expiresIn": "24 hours",
"year": "2026",
"month": "07",
"day": "23",
"date": "2026-07-23"
}
}Le champ variables renvoie les valeurs d’exemple substituées. Le corps HTML est assaini avant le rendu ; l’objet est rendu comme texte brut (sans échappement HTML des valeurs).
E-mail de Test
/api/email-templates/{type}/testRequires: manage:securityRend l’objet et le corps HTML avec des données d’exemple et les envoie comme un vrai e-mail. Par défaut l’e-mail va à l’adresse de l’administrateur authentifié.
Corps de la requête
{
"subject": "Vérifie ton e-mail — {{email}}",
"htmlBody": "<!DOCTYPE html>...",
"recipientEmail": "[email protected]"
}| Champ | Type | Requis | Description |
|---|---|---|---|
subject | string | Oui | Objet (avec placeholders) |
htmlBody | string | Oui | Corps HTML (avec placeholders) |
recipientEmail | string | Non | Destinataire alternatif optionnel. S’il est omis (ou vide), le test est envoyé à la boîte de l’administrateur authentifié. Doit être une adresse e-mail valide |
Réponse de succès (200)
{ "success": true, "sentTo": "[email protected]" }Réponses d’erreur
| HTTP | Description |
|---|---|
400 | Type invalide, subject/htmlBody manquants, recipientEmail invalide, ou l’adresse e-mail de l’appelant n’a pas pu être déterminée |
500 | Échec de l’envoi de l’e-mail |
L’objet rendu est préfixé par [TEST] afin que les e-mails de test soient faciles à distinguer des
e-mails transactionnels réels. L’envoi utilise la configuration SMTP du tenant si elle est présente et
active, sinon l’expéditeur par défaut de la plateforme.
Types de Modèles
Auris supporte treize types de modèles d’e-mail transactionnels :
| Type | Quand il est envoyé | Variables |
|---|---|---|
verification | Un nouvel utilisateur s’inscrit et doit vérifier son e-mail | email, link, expiresIn |
password_reset | Un utilisateur demande une réinitialisation de mot de passe | email, link, expiresIn |
invitation | Un utilisateur est invité dans un tenant | email, orgName, role, inviterEmail, link, expiresIn |
mfa_code | Authentification à deux facteurs par e-mail | email, code, expiresIn |
magic_link | Connexion sans mot de passe via magic link | email, link, approveLink, expiresIn, tenantName |
login_alert | Nouvelle connexion détectée sur le compte | email, device, ipAddress, location, time |
welcome | L’utilisateur vérifie avec succès son e-mail | email, name, orgName, dashboardLink |
password_changed | Confirmation d’un changement de mot de passe | email, name, time, ipAddress |
account_locked | Compte verrouillé après des tentatives échouées | email, name, lockDuration, attempts, ipAddress, time |
suspicious_login | Connexion inhabituelle détectée | email, name, device, ipAddress, location, time, reason |
email_changed | Changement de l’e-mail principal (envoyé à l’ancienne adresse) | email, name, newEmail, time |
license_issued | Émission d’une clé de licence | key, jwtToken, product, expiresAt, features |
ciba | Approbation de connexion demandée via le flux CIBA | email, appName, bindingMessage, approveUrl, denyUrl |
Les variables de date globales year, month, day et date (format YYYY-MM-DD) sont injectées automatiquement dans chaque rendu, en plus des variables par type listées ci-dessus.
Syntaxe des Modèles
{{variable}}— remplacée par la valeur. Dans le corps HTML, les valeurs sont échappées automatiquement pour prévenir l’injection ; dans l’objet elles sont insérées comme texte brut.{{{variable}}}— interpolation brute sans échappement. Uniquement pour des fragments HTML de confiance construits côté serveur.{{#if variable}}...{{/if}}— le bloc est conservé seulement quand la variable a une valeur non vide ; sinon il est supprimé entièrement (markup inclus). Exemple : le modèle par défaut demagic_linkn’affiche le bouton d’approbation secondaire que lorsqueapproveLinkest renseigné.
Les placeholders inconnus restent tels quels dans le rendu. La notation pointée et les boucles ne sont pas supportées.
<h1>Connecte-toi à {{tenantName}}</h1>
<p><a href="{{link}}">Se connecter sur cet appareil</a></p>
{{#if approveLink}}
<p><a href="{{approveLink}}">Approuver sur l'appareil d'origine</a></p>
{{/if}}
<p>Le lien expire dans {{expiresIn}}.</p>Référence des Permissions
| Permission | Description |
|---|---|
manage:security | Lister, voir, mettre à jour, supprimer, prévisualiser et tester tous les modèles d’e-mail du tenant |
Associés
- Personnaliser les Modèles d’E-mail — Guide pas à pas de personnalisation
- Modèles d’E-mail — Modifier les modèles visuellement depuis la Console