API Template Email
L’API Template Email consente agli amministratori di personalizzare le email transazionali inviate da Auris. Ognuno dei tredici tipi di template corrisponde a un evento specifico (verifica, reset password, magic link, avvisi di sicurezza, …) e può essere personalizzato con HTML e variabili dinamiche, in modo indipendente per ogni lingua.
Auris include template predefiniti per tutti i tipi in cinque lingue (en, it, fr, de, es). Quando esiste un template personalizzato per un tipo e una lingua, viene usato per tutte le email future di quel tipo; altrimenti viene usato il default con il branding del tenant. Ordine di risoluzione all’invio: personalizzato (lingua richiesta) -> personalizzato (en) -> default (lingua richiesta) -> default (en).
Tutti gli endpoint richiedono un token Bearer con il permesso manage:security e selezionano il tenant tramite l’header x-tenant (l’identificatore del realm del tenant).
Questi endpoint restituiscono oggetti JSON semplici — non usano l’involucro { ok, data } presente
in altre parti dell’API Auris.
Elenca i Template
/api/email-templatesRequires: manage:securityElenca tutti i tredici tipi di template con lo stato di personalizzazione per il tenant. I corpi HTML completi non sono inclusi — usa la lettura del singolo template.
Risposta di successo (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", "it"]
}
],
"availableLocales": ["en", "it", "fr", "de", "es"],
"wellKnownLocales": { "en": "English", "it": "Italiano", "pt-BR": "Português (Brasil)" }
}| Campo | Tipo | Descrizione |
|---|---|---|
type | string | Identificatore del tipo di template (vedi Tipi di Template più sotto) |
label | string | Nome leggibile del template |
description | string | Quando viene inviata l’email |
variables | string[] | Variabili disponibili per questo tipo, incluse le variabili di data globali auto-iniettate (year, month, day, date) |
hasCustomTemplate | boolean | true se esiste almeno una versione personalizzata (in qualsiasi lingua) |
active | boolean | Se una versione personalizzata è attiva (true quando non esiste alcun template personalizzato — il default è sempre attivo) |
updatedAt | string | null | Timestamp ISO 8601 dell’ultima personalizzazione, oppure null |
customLocales | string[] | Lingue per cui esiste una versione personalizzata |
availableLocales | string[] | Lingue con template predefiniti integrati |
wellKnownLocales | object | Mappa codice lingua -> etichetta usata dalla Console |
Ottieni un Template
/api/email-templates/{type}?locale={locale}Requires: manage:securityOttiene un template per una lingua: il contenuto personalizzato (se esiste) più la baseline predefinita con il branding del tenant. Il parametro locale ha default en.
Risposta di successo (200)
{
"type": "verification",
"locale": "it",
"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": "Verifica il tuo indirizzo email",
"defaultHtmlBody": "<!DOCTYPE html>...",
"availableLocales": ["en", "it", "fr", "de", "es"],
"customLocales": ["en"],
"hasDefaultTemplate": true,
"wellKnownLocales": { "en": "English", "it": "Italiano" }
}subject, htmlBody e metadata sono null quando non esiste un template personalizzato per la lingua richiesta. defaultSubject e defaultHtmlBody contengono sempre il template integrato, renderizzato con il branding del tenant (logo, colore, footer white-label) esattamente come per un invio reale. hasDefaultTemplate indica se la lingua richiesta ha un default integrato (en, it, fr, de, es); le altre lingue ricadono sull’inglese.
Risposte di errore
| HTTP | Descrizione |
|---|---|
400 | Tipo di template o codice lingua non valido |
401 / 403 | Autenticazione mancante o permessi insufficienti |
404 | Tenant non trovato |
Aggiorna un Template
/api/email-templates/{type}Requires: manage:securityCrea o aggiorna il template personalizzato per una lingua. La lingua può essere passata nel body o come parametro query; default en. Il template salvato è attivo immediatamente.
Body della richiesta
{
"subject": "Verifica la tua email — {{email}}",
"htmlBody": "<!DOCTYPE html><html><body><h1>Verifica la tua email</h1><p>Ciao {{email}},</p><p><a href=\"{{link}}\">Conferma il tuo indirizzo</a></p><p>Il link scade tra {{expiresIn}}.</p></body></html>",
"locale": "it",
"metadata": { "source": "code" }
}| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
subject | string | Sì | Oggetto dell’email. Può includere placeholder {{variabile}} |
htmlBody | string | Sì | Corpo HTML completo. Dimensione massima 500 KB |
locale | string | No | Codice lingua (stile BCP-47, es. en, pt-BR). Default en |
metadata | object | No | Stato dell’editor usato dalla Console (tema, layout builder, modalità). Validato contro uno schema chiuso — i campi non riconosciuti vengono rifiutati, non scartati in silenzio. Dimensione massima 256.000 caratteri |
Il corpo HTML viene sanificato lato server prima del salvataggio: tag <script>, attributi di gestione eventi (onclick, …), URI javascript:/data:, tag <iframe>/<embed>/<object>/<form>/<base> e costrutti CSS pericolosi vengono rimossi.
Risposta di successo (200) — il record del template salvato:
{
"id": "cltpl123",
"tenantId": "tnt_ScUtrVKUKGxtu7WY",
"type": "verification",
"locale": "it",
"subject": "Verifica la tua email — {{email}}",
"htmlBody": "<!DOCTYPE html>...",
"metadata": { "source": "code" },
"active": true,
"createdAt": "2026-07-23T09:00:00.000Z",
"updatedAt": "2026-07-23T09:00:00.000Z"
}Risposte di errore
| HTTP | Descrizione |
|---|---|
400 | Tipo non valido, lingua non valida, oppure subject/htmlBody mancanti |
413 | htmlBody supera il limite di 500 KB, oppure metadata supera i 256.000 caratteri |
422 | metadata non rispetta lo schema previsto (forma o campo non riconosciuti) |
Le modifiche hanno effetto immediato per tutte le email future di quel tipo e di quella lingua. Non esiste un meccanismo di bozze — visualizza l’anteprima e testa il template prima di salvare.
Elimina un Template
/api/email-templates/{type}?locale={locale}Requires: manage:securityElimina il template personalizzato e ripristina il default integrato. Con il parametro locale viene eliminata solo quella lingua; senza, vengono eliminate TUTTE le lingue del tipo.
Risposta di successo (200)
{ "success": true }Anteprima di un Template
/api/email-templates/{type}/previewRequires: manage:securityRenderizza oggetto e corpo HTML con variabili di esempio realistiche per il tipo di template. Non viene inviato né salvato nulla.
Body della richiesta
{
"subject": "Verifica la tua email — {{email}}",
"htmlBody": "<!DOCTYPE html>..."
}Risposta di successo (200)
{
"subject": "Verifica la tua email — [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"
}
}Il campo variables riporta i valori di esempio sostituiti. Il corpo HTML viene sanificato prima del render; l’oggetto viene renderizzato come testo semplice (senza escape HTML dei valori).
Email di Test
/api/email-templates/{type}/testRequires: manage:securityRenderizza oggetto e corpo HTML con dati di esempio e li invia come email reale. Di default l’email va all’indirizzo dell’amministratore autenticato.
Body della richiesta
{
"subject": "Verifica la tua email — {{email}}",
"htmlBody": "<!DOCTYPE html>...",
"recipientEmail": "[email protected]"
}| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
subject | string | Sì | Oggetto (con placeholder) |
htmlBody | string | Sì | Corpo HTML (con placeholder) |
recipientEmail | string | No | Destinatario alternativo opzionale. Se omesso (o vuoto), il test viene inviato alla casella dell’amministratore autenticato. Deve essere un indirizzo email valido |
Risposta di successo (200)
{ "success": true, "sentTo": "[email protected]" }Risposte di errore
| HTTP | Descrizione |
|---|---|
400 | Tipo non valido, subject/htmlBody mancanti, recipientEmail non valido, oppure impossibile determinare l’email del chiamante |
500 | Invio dell’email fallito |
L’oggetto renderizzato viene prefissato con [TEST] così le email di test sono facili da distinguere
dalle email transazionali reali. La consegna usa la configurazione SMTP del tenant quando presente e
attiva, altrimenti il mittente predefinito della piattaforma.
Tipi di Template
Auris supporta tredici tipi di template email transazionali:
| Tipo | Quando viene inviata | Variabili |
|---|---|---|
verification | Un nuovo utente si registra e deve verificare l’email | email, link, expiresIn |
password_reset | Un utente richiede il reset della password | email, link, expiresIn |
invitation | Un utente viene invitato in un tenant | email, orgName, role, inviterEmail, link, expiresIn |
mfa_code | Autenticazione a due fattori via email | email, code, expiresIn |
magic_link | Login senza password via magic link | email, link, approveLink, expiresIn, tenantName |
login_alert | Nuovo accesso rilevato sull’account | email, device, ipAddress, location, time |
welcome | L’utente verifica con successo la propria email | email, name, orgName, dashboardLink |
password_changed | Conferma del cambio password | email, name, time, ipAddress |
account_locked | Account bloccato dopo tentativi falliti | email, name, lockDuration, attempts, ipAddress, time |
suspicious_login | Accesso inusuale rilevato | email, name, device, ipAddress, location, time, reason |
email_changed | Cambio dell’email principale (inviata al vecchio indirizzo) | email, name, newEmail, time |
license_issued | Emissione di una chiave di licenza | key, jwtToken, product, expiresAt, features |
ciba | Approvazione dell’accesso richiesta via flusso CIBA | email, appName, bindingMessage, approveUrl, denyUrl |
Le variabili di data globali year, month, day e date (formato YYYY-MM-DD) vengono iniettate automaticamente in ogni render, in aggiunta alle variabili per tipo elencate sopra.
Sintassi dei Template
{{variabile}}— sostituita con il valore. Nel corpo HTML i valori subiscono escape HTML automatico per prevenire injection; nell’oggetto vengono inseriti come testo semplice.{{{variabile}}}— interpolazione raw senza escape. Solo per frammenti HTML fidati costruiti lato server.{{#if variabile}}...{{/if}}— il blocco viene mantenuto solo quando la variabile ha un valore non vuoto; altrimenti viene rimosso interamente (markup incluso). Esempio: il template predefinito dimagic_linkmostra il pulsante di approvazione secondario solo quandoapproveLinkè valorizzato.
I placeholder sconosciuti restano invariati nell’output. Dot notation e cicli non sono supportati.
<h1>Accedi a {{tenantName}}</h1>
<p><a href="{{link}}">Accedi su questo dispositivo</a></p>
{{#if approveLink}}
<p><a href="{{approveLink}}">Approva sul dispositivo di origine</a></p>
{{/if}}
<p>Il link scade tra {{expiresIn}}.</p>Riferimento Permessi
| Permesso | Descrizione |
|---|---|
manage:security | Elencare, vedere, aggiornare, eliminare, visualizzare in anteprima e testare tutti i template email del tenant |
Correlati
- Personalizzare i Template Email — Guida passo passo alla personalizzazione
- Template Email — Modifica i template visivamente dalla Console