E-Mail-Vorlagen-API
Mit der E-Mail-Vorlagen-API können Administratoren die von Auris gesendeten Transaktions-E-Mails anpassen. Jeder der dreizehn Vorlagentypen entspricht einem bestimmten Ereignis (Verifizierung, Passwort-Reset, Magic Link, Sicherheitswarnungen, …) und kann mit HTML und dynamischen Variablen angepasst werden, unabhängig pro Sprache.
Auris liefert Standardvorlagen für alle Typen in fünf Sprachen (en, it, fr, de, es). Existiert eine eigene Vorlage für einen Typ und eine Sprache, wird sie für alle zukünftigen E-Mails dieses Typs verwendet; andernfalls der Standard mit dem Tenant-Branding. Auflösungsreihenfolge beim Versand: eigene Vorlage (angeforderte Sprache) -> eigene Vorlage (en) -> Standard (angeforderte Sprache) -> Standard (en).
Alle Endpunkte erfordern ein Bearer-Token mit der Berechtigung manage:security und wählen den Tenant über den Header x-tenant (die Realm-Kennung des Tenants).
Diese Endpunkte liefern einfache JSON-Objekte — sie verwenden nicht die { ok, data }-Hülle, die in
anderen Teilen der Auris-API üblich ist.
Vorlagen auflisten
/api/email-templatesRequires: manage:securityListet alle dreizehn Vorlagentypen mit ihrem Anpassungsstatus für den Tenant. Vollständige HTML-Inhalte sind nicht enthalten — dafür einzelne Vorlagen abrufen.
Erfolgsantwort (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", "de"]
}
],
"availableLocales": ["en", "it", "fr", "de", "es"],
"wellKnownLocales": { "en": "English", "de": "Deutsch", "pt-BR": "Português (Brasil)" }
}| Feld | Typ | Beschreibung |
|---|---|---|
type | string | Kennung des Vorlagentyps (siehe Vorlagentypen unten) |
label | string | Lesbarer Name der Vorlage |
description | string | Wann die E-Mail gesendet wird |
variables | string[] | Verfügbare Variablen für diesen Typ, inklusive der automatisch injizierten globalen Datumsvariablen (year, month, day, date) |
hasCustomTemplate | boolean | true, wenn mindestens eine eigene Version existiert (beliebige Sprache) |
active | boolean | Ob eine eigene Version aktiv ist (true, wenn keine eigene Vorlage existiert — der Standard ist immer aktiv) |
updatedAt | string | null | ISO-8601-Zeitstempel der letzten Anpassung, oder null |
customLocales | string[] | Sprachen, für die eine eigene Version existiert |
availableLocales | string[] | Sprachen mit integrierten Standardvorlagen |
wellKnownLocales | object | Zuordnung Sprachcode -> Anzeigename, von der Konsole verwendet |
Vorlage abrufen
/api/email-templates/{type}?locale={locale}Requires: manage:securityRuft eine Vorlage für eine Sprache ab: den eigenen Inhalt (falls vorhanden) plus die Standard-Baseline mit dem Tenant-Branding. Der locale-Parameter ist standardmäßig en.
Erfolgsantwort (200)
{
"type": "verification",
"locale": "de",
"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": "Bestätige deine E-Mail-Adresse",
"defaultHtmlBody": "<!DOCTYPE html>...",
"availableLocales": ["en", "it", "fr", "de", "es"],
"customLocales": ["en"],
"hasDefaultTemplate": true,
"wellKnownLocales": { "en": "English", "de": "Deutsch" }
}subject, htmlBody und metadata sind null, wenn für die angeforderte Sprache keine eigene Vorlage existiert. defaultSubject und defaultHtmlBody enthalten immer die integrierte Vorlage, gerendert mit dem Branding des Tenants (Logo, Farbe, White-Label-Footer) — genau wie bei einem echten Versand. hasDefaultTemplate gibt an, ob die angeforderte Sprache einen integrierten Standard hat (en, it, fr, de, es); andere Sprachen fallen auf Englisch zurück.
Fehlerantworten
| HTTP | Beschreibung |
|---|---|
400 | Ungültiger Vorlagentyp oder ungültiger Sprachcode |
401 / 403 | Fehlende Authentifizierung oder unzureichende Berechtigungen |
404 | Tenant nicht gefunden |
Vorlage aktualisieren
/api/email-templates/{type}Requires: manage:securityErstellt oder aktualisiert die eigene Vorlage für eine Sprache. Die Sprache kann im Body oder als Query-Parameter übergeben werden; Standard en. Die gespeicherte Vorlage ist sofort aktiv.
Request-Body
{
"subject": "Bestätige deine E-Mail — {{email}}",
"htmlBody": "<!DOCTYPE html><html><body><h1>Bestätige deine E-Mail</h1><p>Hallo {{email}},</p><p><a href=\"{{link}}\">Adresse bestätigen</a></p><p>Der Link läuft in {{expiresIn}} ab.</p></body></html>",
"locale": "de",
"metadata": { "source": "code" }
}| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
subject | string | Ja | Betreffzeile. Kann {{variable}}-Platzhalter enthalten |
htmlBody | string | Ja | Vollständiger HTML-Inhalt. Maximale Größe 500 KB |
locale | string | Nein | Sprachcode (BCP-47-artig, z. B. en, pt-BR). Standard en |
metadata | object | Nein | Editor-Zustand der Konsole (Theme, Builder-Layout, Modus). Wird gegen ein festes Schema validiert — unbekannte Felder werden abgelehnt, nicht stillschweigend verworfen. Maximale Größe 256.000 Zeichen |
Der HTML-Inhalt wird vor dem Speichern serverseitig bereinigt: <script>-Tags, Event-Handler-Attribute (onclick, …), javascript:/data:-URIs, <iframe>/<embed>/<object>/<form>/<base>-Tags und gefährliche CSS-Konstrukte werden entfernt.
Erfolgsantwort (200) — der gespeicherte Vorlagendatensatz:
{
"id": "cltpl123",
"tenantId": "tnt_ScUtrVKUKGxtu7WY",
"type": "verification",
"locale": "de",
"subject": "Bestätige deine 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"
}Fehlerantworten
| HTTP | Beschreibung |
|---|---|
400 | Ungültiger Typ, ungültige Sprache, oder subject/htmlBody fehlen |
413 | htmlBody überschreitet das 500-KB-Limit, oder metadata überschreitet 256.000 Zeichen |
422 | metadata entspricht nicht dem erwarteten Schema (unbekannte Form oder unbekanntes Feld) |
Änderungen gelten sofort für alle zukünftigen E-Mails dieses Typs und dieser Sprache. Es gibt keinen Entwurfsmechanismus — Vorschau ansehen und testen, bevor du speicherst.
Vorlage löschen
/api/email-templates/{type}?locale={locale}Requires: manage:securityLöscht die eigene Vorlage und kehrt zum integrierten Standard zurück. Mit dem locale-Parameter wird nur diese Sprache gelöscht; ohne werden ALLE Sprachen des Typs gelöscht.
Erfolgsantwort (200)
{ "success": true }Vorlagenvorschau
/api/email-templates/{type}/previewRequires: manage:securityRendert Betreff und HTML-Inhalt mit realistischen Beispielvariablen für den Vorlagentyp. Es wird nichts gesendet und nichts gespeichert.
Request-Body
{
"subject": "Bestätige deine E-Mail — {{email}}",
"htmlBody": "<!DOCTYPE html>..."
}Erfolgsantwort (200)
{
"subject": "Bestätige deine 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"
}
}Das Feld variables gibt die eingesetzten Beispielwerte zurück. Der HTML-Inhalt wird vor dem Rendern bereinigt; der Betreff wird als reiner Text gerendert (kein HTML-Escaping der Werte).
Test-E-Mail
/api/email-templates/{type}/testRequires: manage:securityRendert Betreff und HTML-Inhalt mit Beispieldaten und sendet sie als echte E-Mail. Standardmäßig geht die E-Mail an die Adresse des authentifizierten Administrators.
Request-Body
{
"subject": "Bestätige deine E-Mail — {{email}}",
"htmlBody": "<!DOCTYPE html>...",
"recipientEmail": "[email protected]"
}| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
subject | string | Ja | Betreff (mit Platzhaltern) |
htmlBody | string | Ja | HTML-Inhalt (mit Platzhaltern) |
recipientEmail | string | Nein | Optionaler alternativer Empfänger. Fehlt er (oder ist leer), geht der Test an das Postfach des authentifizierten Administrators. Muss eine gültige E-Mail-Adresse sein |
Erfolgsantwort (200)
{ "success": true, "sentTo": "[email protected]" }Fehlerantworten
| HTTP | Beschreibung |
|---|---|
400 | Ungültiger Typ, subject/htmlBody fehlen, recipientEmail ungültig, oder die E-Mail-Adresse des Aufrufers konnte nicht ermittelt werden |
500 | E-Mail-Versand fehlgeschlagen |
Der gerenderte Betreff erhält das Präfix [TEST], damit Test-E-Mails leicht von echten
Transaktions-E-Mails zu unterscheiden sind. Der Versand nutzt die SMTP-Konfiguration des Tenants,
wenn vorhanden und aktiv, andernfalls den Standardabsender der Plattform.
Vorlagentypen
Auris unterstützt dreizehn transaktionale E-Mail-Vorlagentypen:
| Typ | Wann gesendet | Variablen |
|---|---|---|
verification | Ein neuer Benutzer registriert sich und muss seine E-Mail verifizieren | email, link, expiresIn |
password_reset | Ein Benutzer fordert einen Passwort-Reset an | email, link, expiresIn |
invitation | Ein Benutzer wird in einen Tenant eingeladen | email, orgName, role, inviterEmail, link, expiresIn |
mfa_code | E-Mail-basierte Zwei-Faktor-Authentifizierung | email, code, expiresIn |
magic_link | Passwortloser Login per Magic Link | email, link, approveLink, expiresIn, tenantName |
login_alert | Neue Anmeldung auf dem Konto erkannt | email, device, ipAddress, location, time |
welcome | Der Benutzer verifiziert erfolgreich seine E-Mail | email, name, orgName, dashboardLink |
password_changed | Bestätigung einer Passwortänderung | email, name, time, ipAddress |
account_locked | Konto nach fehlgeschlagenen Versuchen gesperrt | email, name, lockDuration, attempts, ipAddress, time |
suspicious_login | Ungewöhnliche Anmeldung erkannt | email, name, device, ipAddress, location, time, reason |
email_changed | Änderung der primären E-Mail (an die alte Adresse gesendet) | email, name, newEmail, time |
license_issued | Ausstellung eines Lizenzschlüssels | key, jwtToken, product, expiresAt, features |
ciba | Anmeldebestätigung über den CIBA-Flow angefordert | email, appName, bindingMessage, approveUrl, denyUrl |
Die globalen Datumsvariablen year, month, day und date (Format YYYY-MM-DD) werden zusätzlich zu den oben aufgeführten typspezifischen Variablen automatisch in jedes Rendering injiziert.
Vorlagensyntax
{{variable}}— wird durch den Wert ersetzt. Im HTML-Inhalt werden Werte automatisch HTML-escaped, um Injection zu verhindern; im Betreff werden sie als reiner Text eingefügt.{{{variable}}}— Raw-Interpolation ohne Escaping. Nur für vertrauenswürdige, serverseitig erzeugte HTML-Fragmente.{{#if variable}}...{{/if}}— der Block bleibt nur erhalten, wenn die Variable einen nicht-leeren Wert hat; andernfalls wird er vollständig entfernt (samt Markup). Beispiel: die Standardvorlage vonmagic_linkzeigt den sekundären Bestätigungs-Button nur, wennapproveLinkgesetzt ist.
Unbekannte Platzhalter bleiben unverändert in der Ausgabe. Punktnotation und Schleifen werden nicht unterstützt.
<h1>Anmelden bei {{tenantName}}</h1>
<p><a href="{{link}}">Auf diesem Gerät anmelden</a></p>
{{#if approveLink}}
<p><a href="{{approveLink}}">Auf dem Ursprungsgerät bestätigen</a></p>
{{/if}}
<p>Der Link läuft in {{expiresIn}} ab.</p>Berechtigungsreferenz
| Berechtigung | Beschreibung |
|---|---|
manage:security | Alle E-Mail-Vorlagen des Tenants auflisten, ansehen, aktualisieren, löschen, vorschauen und testen |
Verwandt
- E-Mail-Vorlagen anpassen — Schritt-für-Schritt-Anleitung zur Anpassung
- E-Mail-Vorlagen — Vorlagen visuell in der Konsole bearbeiten