Modèles
Créez des versions de modèle, publiez-en une par alias et utilisez-les lors de l’envoi.
Créer un modèle
Crée une version de modèle. Les versions qui partagent un alias appartiennent au même modèle, et une seule version par alias est publiée à la fois. Lorsque vous envoyez un e-mail avec template défini sur un alias, Emailit utilise la version publiée. Nécessite une clé API de portée full.
/templatesCorps de la requête
namestringObligatoireNom du modèle affiché dans le tableau de bord. 191 caractères au maximum.
aliasstringObligatoireIdentifiant qui regroupe les versions d’un modèle. 191 caractères au maximum ; lettres minuscules, chiffres, traits de soulignement et traits d’union uniquement (^[a-z0-9_-]+$).
Si aucun modèle n’utilise encore cet alias, la nouvelle version est publiée immédiatement. Si l’alias existe déjà, la nouvelle version est créée non publiée (published_at vaut null) et vous la publiez avec Publier un modèle.
fromstringExpéditeur par défaut, par exemple Acme <hello@acme.com>. 191 caractères au maximum.
subjectstringLigne d’objet par défaut. 191 caractères au maximum. Peut contenir des variables Temple comme {{ first_name }}.
reply_tostring | string[]Adresse de réponse, ou tableau d’adresses. Chaque valeur doit être une adresse e-mail valide.
htmlstringCorps HTML.
textstringCorps en texte brut.
sourcestringDocument source de l’éditeur, par exemple le JSON Dragit d’un modèle créé dans l’éditeur glisser-déposer. Enregistré tel quel. Pour editor: "mjml", le MJML : Emailit le valide, l’enregistre sous forme de document MJML et en compile html.
editorstringÉditeur auquel appartient le modèle : html (par défaut), text, dragit ou tiptap. mjml est en alpha et réservé à l’équipe Emailit ; les autres requêtes reçoivent 403 avec error: "mjml_alpha". Consultez Éditeurs et API MJML.
Réponse
Renvoie 201 Created avec le modèle dans data et un message de confirmation. Le modèle inclut html, text et source. Emailit envoie aussi l’événement webhook template.created.
Les modèles MJML renvoient aussi un objet mjml avec les versions du document. Un MJML invalide renvoie 422 avec errors.source et diagnostics ; consultez Validation.
Si un champ ne passe pas la validation, la réponse est 400 avec message: "Validation failed" et un objet errors indexé par champ, par exemple pour un alias contenant des majuscules ou une adresse reply_to non valide. Un name ou un alias manquant, ou une valeur editor non autorisée, renvoie à la place l’erreur de validation 400 standard avec un tableau details. Consultez Erreurs.
{
"data": {
"id": "tem_2xKx7M2c9wQe3kHhJ8sVtY1pZ0a",
"name": "Welcome email",
"alias": "welcome-email",
"from": null,
"subject": "Welcome to Acme, {{ first_name }}",
"reply_to": null,
"html": "<h1>Welcome, {{ first_name }}</h1>",
"text": null,
"source": null,
"editor": "html",
"published_at": "2026-09-30T10:30:00.482119Z",
"preview_url": null,
"created_at": "2026-09-30T10:30:00.482119Z",
"updated_at": "2026-09-30T10:30:00.482119Z"
},
"message": "Template was successfully created."
}{
"message": "Validation failed",
"errors": {
"alias": ["Alias must contain only lowercase letters (a-z), numbers (0-9), underscores (_), and hyphens (-)"]
}
}Récupérer un modèle
Renvoie une version de modèle, avec son contenu, et liste les autres versions du même alias dans versions. Les modèles se recherchent uniquement par ID, pas par alias. Nécessite une clé API de portée full.
/templates/:idParamètres de chemin
idstringObligatoireID du modèle, par exemple tem_2xKx7M2c9wQe3kHhJ8sVtY1pZ0a.
Réponse
Renvoie 200 OK avec le modèle dans data. En plus des champs du modèle, la réponse contient un tableau versions avec l’id, le name, le published_at, le created_at et l’updated_at de chacune des autres versions qui partagent l’alias, de la plus récente à la plus ancienne. La version publiée est celle dont published_at n’est pas nul.
Renvoie 404 avec message: "Template not found" si l’ID n’existe pas dans votre espace de travail.
{
"data": {
"id": "tem_2xKx7M2c9wQe3kHhJ8sVtY1pZ0a",
"name": "Welcome email",
"alias": "welcome-email",
"from": "Acme <hello@acme.com>",
"subject": "Welcome to Acme, {{ first_name }}",
"reply_to": ["support@acme.com"],
"html": "<h1>Welcome, {{ first_name }}</h1>",
"text": "Welcome, {{ first_name }}",
"source": null,
"editor": "html",
"published_at": "2026-09-30T10:30:00.482119Z",
"preview_url": null,
"created_at": "2026-09-28T08:12:45.103882Z",
"updated_at": "2026-09-30T10:30:00.482119Z",
"versions": [
{
"id": "tem_2xKyB4qLm7RtV9sNd3HwEa6uC1f",
"name": "Welcome email (October)",
"published_at": null,
"created_at": "2026-09-30T14:02:11.550731Z",
"updated_at": "2026-09-30T14:02:11.550731Z"
}
]
}
}{
"message": "Template not found"
}Mettre à jour un modèle
Met à jour une version de modèle. N’envoyez que les champs à modifier. La version conserve son état de publication : une version publiée reste publiée et un brouillon reste un brouillon. Nécessite une clé API de portée full.
/templates/:idParamètres de chemin
idstringObligatoireID du modèle, par exemple tem_2xKx7M2c9wQe3kHhJ8sVtY1pZ0a.
Corps de la requête
namestringNom du modèle. 191 caractères au maximum.
aliasstringNouvel alias. 191 caractères au maximum ; lettres minuscules, chiffres, traits de soulignement et traits d’union uniquement. Il ne peut pas s’agir d’un alias déjà utilisé par un autre modèle.
fromstringExpéditeur par défaut, par exemple Acme <hello@acme.com>. 191 caractères au maximum. Envoyez une chaîne vide pour l’effacer.
subjectstringLigne d’objet par défaut. 191 caractères au maximum. Envoyez une chaîne vide pour l’effacer.
reply_tostring | string[]Adresse de réponse ou tableau d’adresses. Envoyez une chaîne vide pour l’effacer.
htmlstringCorps HTML.
textstringCorps en texte brut.
sourcestringDocument source de l’éditeur, par exemple du JSON Dragit. Pour un modèle MJML, le MJML complet : Emailit le valide et recompile html, et tout html que vous envoyez est ignoré.
editorstringhtml, text, dragit ou tiptap. mjml est en alpha et réservé à l’équipe Emailit ; modifier le contenu d’un modèle MJML sans accès à MJML renvoie 403 avec error: "mjml_alpha". Le renommer ou le publier fonctionne pour tout le monde. Consultez Éditeurs et API MJML.
Réponse
Renvoie 200 OK avec le modèle mis à jour dans data et un message de confirmation. Emailit envoie aussi l’événement webhook template.updated.
Renvoie 400 avec message: "Validation failed" et un objet errors lorsqu’une valeur n’est pas valide, par exemple "Alias already exists". Les valeurs de plus de 191 caractères ou un editor inconnu renvoient l’erreur de validation 400 standard. Renvoie 404 si le modèle n’existe pas.
Pour que cette version soit celle utilisée pour les envois, appelez Publier un modèle.
{
"data": {
"id": "tem_2xKx7M2c9wQe3kHhJ8sVtY1pZ0a",
"name": "Welcome email",
"alias": "welcome-email",
"from": "Acme <hello@acme.com>",
"subject": "Welcome aboard, {{ first_name }}",
"reply_to": ["support@acme.com"],
"html": "<h1>Welcome, {{ first_name }}</h1>",
"text": "Welcome, {{ first_name }}",
"source": null,
"editor": "html",
"published_at": "2026-09-30T10:30:00.482119Z",
"preview_url": null,
"created_at": "2026-09-28T08:12:45.103882Z",
"updated_at": "2026-10-01T09:15:27.640000Z"
},
"message": "Template was successfully updated."
}{
"message": "Validation failed",
"errors": {
"alias": ["Alias already exists"]
}
}{
"message": "Template not found"
}Lister les modèles
Renvoie la version publiée de chaque modèle, du plus récent au plus ancien. Les versions non publiées ne sont pas listées ; récupérez un modèle pour voir toutes les versions de son alias. Nécessite une clé API de portée full.
/templatesParamètres de requête
pageintegerNuméro de page, à partir de 1. Par défaut : 1.
per_pageintegerNombre de modèles par page, de 1 à 100. Par défaut : 25.
include_contentbooleanDéfinissez-le sur true pour inclure html, text et source dans chaque modèle. Omis par défaut pour alléger les réponses.
filter[name]stringCorrespondance partielle, insensible à la casse, sur le nom ou l’alias du modèle.
filter[alias]stringAlias exact.
filter[editor]stringÉditeur : html, text, dragit, tiptap ou mjml (alpha).
matchstringall (par défaut) exige que tous les filtres key.condition correspondent. or accepte n’importe lequel d’entre eux. Consultez Filtrage et tri.
sortstringClé de tri : name, alias, created_at (par défaut), updated_at ou published_at.
orderstringSens du tri : asc ou desc (par défaut).
Filtres
Les filtres de liste sont des paramètres de requête key.condition=value sur un seul niveau. Consultez Filtrage et tri pour match, order, direction et la liste des conditions par type.
Clés de filtre
| Clé | Type | Conditions | Remarques |
|---|---|---|---|
name | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
alias | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
editor | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
subject | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
created_at | date | exact, before, after, empty, not_empty |
Clés de tri
Cet endpoint trie avec sort défini sur l’une de ces clés et order sur asc ou desc (order=<key> renvoie 400 ici) : name, alias, editor, subject, created_at
Sur cet endpoint, order n’accepte que asc ou desc. Transmettez la clé de tri dans sort, par exemple sort=name&order=asc.
Réponse
Renvoie 200 OK avec les modèles dans data et les champs de pagination total_records, per_page, current_page et total_pages. Chaque modèle inclut total_versions, le nombre de versions qui partagent son alias.
{
"data": [
{
"id": "tem_2xKx7M2c9wQe3kHhJ8sVtY1pZ0a",
"name": "Welcome email",
"alias": "welcome-email",
"from": "Acme <hello@acme.com>",
"subject": "Welcome to Acme, {{ first_name }}",
"reply_to": ["support@acme.com"],
"editor": "html",
"published_at": "2026-09-30T10:30:00.482119Z",
"preview_url": null,
"total_versions": 3,
"created_at": "2026-09-28T08:12:45.103882Z",
"updated_at": "2026-09-30T10:30:00.482119Z"
}
],
"total_records": 1,
"per_page": 25,
"current_page": 1,
"total_pages": 1
}{
"statusCode": 401,
"error": "Unauthorized",
"message": "Invalid API key"
}Publier un modèle
Publie une version de modèle et dépublie toutes les autres versions du même alias, en une seule transaction. Utilisez-le pour déployer un nouveau brouillon ou pour revenir à une version antérieure. Nécessite une clé API de portée full.
/templates/:id/publishParamètres de chemin
idstringObligatoireID de la version à publier, par exemple tem_2xKyB4qLm7RtV9sNd3HwEa6uC1f.
Corps de la requête
Aucun corps. Publier une version déjà publiée définit un nouveau published_at.
Réponse
Renvoie 200 OK avec le modèle publié dans data et un message de confirmation. Renvoie 404 si le modèle n’existe pas.
Emailit envoie un événement webhook template.updated pour la version publiée, et un autre pour chaque version dépubliée.
{
"data": {
"id": "tem_2xKyB4qLm7RtV9sNd3HwEa6uC1f",
"name": "Welcome email (October)",
"alias": "welcome-email",
"from": "Acme <hello@acme.com>",
"subject": "Welcome to Acme, {{ first_name }}",
"reply_to": ["support@acme.com"],
"html": "<h1>Welcome, {{ first_name }}</h1><p>Here is your October guide.</p>",
"text": "Welcome, {{ first_name }}. Here is your October guide.",
"source": null,
"editor": "html",
"published_at": "2026-10-01T09:20:04.118502Z",
"preview_url": null,
"created_at": "2026-09-30T14:02:11.550731Z",
"updated_at": "2026-10-01T09:20:04.118000Z"
},
"message": "Template was successfully published."
}{
"message": "Template not found"
}Supprimer un modèle
Supprime définitivement une version de modèle. Les autres versions du même alias sont conservées. Nécessite une clé API de portée full.
/templates/:idParamètres de chemin
idstringObligatoireID du modèle, par exemple tem_2xKx7M2c9wQe3kHhJ8sVtY1pZ0a.
Réponse
Renvoie 200 OK avec data: null et un message de confirmation. Emailit envoie l’événement webhook template.deleted avec la version supprimée. Renvoie 404 si le modèle n’existe pas.
Si vous supprimez la version publiée, aucune version de cet alias n’est publiée tant que vous n’en publiez pas une autre, et les envois avec cet alias échouent. Supprimer un brouillon n’affecte pas la version publiée. La suppression est irréversible.
{
"data": null,
"message": "Template was successfully deleted."
}{
"message": "Template not found"
}