# MJML (alpha) API

> Validez du MJML, effectuez-en le rendu et consultez la référence MJML. En alpha, réservé à l’équipe Emailit.

URL de base : `https://api.emailit.com/v2`. Authentifiez-vous avec `Authorization: Bearer <API key>`.

## Valider du MJML — POST /mjml/validate

> Vérifiez du MJML comme le fait l’enregistrement d’un modèle, sans l’enregistrer. Renvoie chaque diagnostic avec sa ligne. Alpha : réservé à l’équipe Emailit.

# Valider du MJML

Vérifie du MJML comme le fait l’enregistrement d’un modèle (syntaxe XML, structure MJML, types d’attribut et syntaxe Temple) et le compile avec MJML 5.4.1. Rien n’est enregistré. Un MJML invalide renvoie quand même `200`, avec `valid: false` et les diagnostics. Nécessite la portée `full`.

Pour le détail de chaque contrôle, consultez [Validation](/fr/docs/templates/mjml/#validation).

> **MJML est en alpha:** MJML est réservé à l’équipe Emailit pendant que nous le testons. Les autres requêtes, y compris toutes celles effectuées avec une clé API, renvoient `403` avec `error: "mjml_alpha"`. Consultez [Qui peut utiliser MJML](/fr/docs/templates/mjml/#who-can-use-mjml).

`POST /mjml/validate`

## Paramètres du corps

- `source` (string | object, obligatoire): Le MJML à vérifier : du balisage MJML (`<mjml>…</mjml>`), du MJML JSON ou un document MJML Emailit, comme le `source` enregistré d’un modèle. Consultez [Formats de source](/fr/docs/templates/mjml/#source-formats). 2 Mo au maximum.

**Requête** `POST /mjml/validate`

**Node.js**

```javascript
const source = `<mjml>
  <mj-body>
    <mj-column>
      <mj-text colour="#333333">Hi {{first_name}}</mj-text>
    </mj-column>
  </mj-body>
</mjml>`;

const response = await fetch('https://api.emailit.com/v2/mjml/validate', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer your_api_key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ source })
});

const { valid, diagnostics } = await response.json();
```

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/mjml/validate \
  -H "Authorization: Bearer your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "<mjml>\n  <mj-body>\n    <mj-column>\n      <mj-text colour=\"#333333\">Hi {{first_name}}</mj-text>\n    </mj-column>\n  </mj-body>\n</mjml>"
  }'
```

**200 Invalide**

```json
{
  "valid": false,
  "mjml_version": "5.4.1",
  "format": "markup",
  "diagnostics": [
    {
      "severity": "error",
      "code": "mjml.invalid-child",
      "message": "<mj-column> cannot be placed inside <mj-body>. Allowed parents: <mj-group>, <mj-section>.",
      "line": 3,
      "column": 6,
      "tag": "mj-column",
      "path": [0, 0]
    },
    {
      "severity": "error",
      "code": "mjml.unknown-attribute",
      "message": "<mj-text> has no attribute colour. Did you mean color?",
      "line": 4,
      "column": 16,
      "tag": "mj-text",
      "attribute": "colour",
      "path": [0, 0, 0]
    },
    {
      "severity": "warning",
      "code": "mjml.missing-title",
      "message": "Add an <mj-title> to <mj-head>; clients and screen readers use it.",
      "line": 1,
      "column": 2,
      "tag": "mjml",
      "path": []
    },
    {
      "severity": "info",
      "code": "mjml.missing-preview",
      "message": "Add an <mj-preview> to control the inbox preview text.",
      "line": 1,
      "column": 2,
      "tag": "mjml",
      "path": []
    }
  ]
}
```

**200 Valide**

```json
{
  "valid": true,
  "mjml_version": "5.4.1",
  "format": "markup",
  "diagnostics": []
}
```

**200 Non reconnu**

```json
{
  "valid": false,
  "mjml_version": "5.4.1",
  "format": null,
  "diagnostics": [
    {
      "severity": "error",
      "code": "document.unrecognized",
      "message": "Expected MJML markup (<mjml>…), MJML JSON or an Emailit MJML document."
    }
  ]
}
```

**422**

```json
{
  "message": "Validation failed",
  "errors": {
    "source": ["The source field is required."]
  }
}
```

**403**

```json
{
  "error": "mjml_alpha",
  "message": "MJML is in alpha and available only to Emailit platform admins."
}
```

## Réponse

Renvoie `200 OK` avec le résultat, même quand le MJML est invalide :

| Champ | Type | Description |
| --- | --- | --- |
| `valid` | boolean | `true` quand il n’y a aucun diagnostic d’erreur : un modèle avec cette source peut donc être enregistré. |
| `mjml_version` | string | La version de MJML avec laquelle Emailit compile. |
| `format` | string ou null | La façon dont la source a été lue : `markup` ou `json`. `null` quand elle n’a pas pu être lue. |
| `diagnostics` | array | Tous les diagnostics d’erreur, d’avertissement et d’information. |

`valid: true` signifie qu’un modèle avec cette source serait accepté. Corrigez aussi les avertissements : ils signalent généralement de vrais problèmes, comme une balise `<mj-title>` manquante. Pour obtenir le HTML, utilisez [Effectuer le rendu de MJML](/fr/docs/api-reference/mjml/render/).

Renvoie `422` avec `message: "Validation failed"` quand `source` est absent ou vide, et `403` avec `error: "mjml_alpha"` sans accès à MJML.

### Objet diagnostic

Les champs qui ne s’appliquent pas sont omis.

| Champ | Type | Description |
| --- | --- | --- |
| `severity` | string | `error`, `warning` ou `info`. Seules les erreurs rendent `valid` faux. |
| `code` | string | Un code stable, par exemple `mjml.invalid-child`, `xml.unclosed-tag` ou `temple.unclosed-if`. Voir [Codes de diagnostic](/fr/docs/templates/mjml/#diagnostic-codes). |
| `message` | string | Une explication lisible. |
| `line` | integer | Ligne dans le balisage, à partir de 1. Sources en balisage uniquement. |
| `column` | integer | Colonne dans le balisage, à partir de 1. Sources en balisage uniquement. |
| `tag` | string | L’élément concerné par le diagnostic. |
| `attribute` | string | L’attribut concerné par le diagnostic. |
| `path` | integer[] | Chemin d’indices d’enfants depuis la racine `<mjml>`. |

---
Source: https://emailit.com/fr/docs/api-reference/mjml/validate/

## Effectuer le rendu de MJML — POST /mjml/render

> Compilez du MJML en HTML tel qu’Emailit l’envoie et prévisualisez-le avec des variables Temple. Alpha : réservé à l’équipe Emailit.

# Effectuer le rendu de MJML

Compile du MJML en HTML tel qu’Emailit l’envoie, avec MJML 5.4.1. Avec `variables`, la réponse inclut aussi `rendered_html` : le HTML après application de Temple, tel qu’un destinataire le recevrait. Rien n’est enregistré ni envoyé. Nécessite la portée `full`.

Cet endpoint est limité à 120 requêtes par minute.

> **MJML est en alpha:** MJML est réservé à l’équipe Emailit pendant que nous le testons. Les autres requêtes, y compris toutes celles effectuées avec une clé API, renvoient `403` avec `error: "mjml_alpha"`. Consultez [Qui peut utiliser MJML](/fr/docs/templates/mjml/#who-can-use-mjml).

`POST /mjml/render`

## Paramètres du corps

- `source` (string | object, obligatoire): Le MJML à compiler : du balisage MJML (`<mjml>…</mjml>`), du MJML JSON ou un document MJML Emailit, comme le `source` enregistré d’un modèle. Consultez [Formats de source](/fr/docs/templates/mjml/#source-formats). 2 Mo au maximum.

- `variables` (object): Variables Temple pour `rendered_html`, comme `first_name`, ou un objet `cf` avec les champs personnalisés de campagne. Rien n’est rempli automatiquement : transmettez les variables que le canal d’envoi fournirait. Consultez [Variables par canal](/fr/docs/templates/mjml/#variables-by-channel). Doit être un objet ; toute autre valeur renvoie `400`.

**Requête** `POST /mjml/render`

**Node.js**

```javascript
const source = `<mjml>
  <mj-head>
    <mj-title>Welcome</mj-title>
    <mj-preview>Your account is ready</mj-preview>
  </mj-head>
  <mj-body>
    <mj-section>
      <mj-column>
        <mj-text>Hi {{first_name|"there"}}, welcome aboard.</mj-text>
        <mj-button href="{{activation_url}}">Activate account</mj-button>
      </mj-column>
    </mj-section>
  </mj-body>
</mjml>`;

const response = await fetch('https://api.emailit.com/v2/mjml/render', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer your_api_key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    source,
    variables: {
      first_name: 'Ada',
      activation_url: 'https://example.com/activate?token=abc123'
    }
  })
});

const { html, rendered_html } = await response.json();
```

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/mjml/render \
  -H "Authorization: Bearer your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "<mjml><mj-head><mj-title>Welcome</mj-title><mj-preview>Your account is ready</mj-preview></mj-head><mj-body><mj-section><mj-column><mj-text>Hi {{first_name|\"there\"}}, welcome aboard.</mj-text><mj-button href=\"{{activation_url}}\">Activate account</mj-button></mj-column></mj-section></mj-body></mjml>",
    "variables": {
      "first_name": "Ada",
      "activation_url": "https://example.com/activate?token=abc123"
    }
  }'
```

**200**

```json
{
  "valid": true,
  "mjml_version": "5.4.1",
  "html": "<!doctype html>\n<html lang=\"und\" dir=\"auto\" …>…Hi {{first_name|\"there\"}}, welcome aboard.…<a href=\"{{activation_url}}\" …>…</html>\n",
  "html_bytes": 5267,
  "diagnostics": [],
  "rendered_html": "<!doctype html>\n<html lang=\"und\" dir=\"auto\" …>…Hi Ada, welcome aboard.…<a href=\"https://example.com/activate?token=abc123\" …>…</html>\n"
}
```

**200 Invalide**

```json
{
  "valid": false,
  "mjml_version": "5.4.1",
  "html": null,
  "html_bytes": 0,
  "diagnostics": [
    {
      "severity": "error",
      "code": "mjml.invalid-child",
      "message": "<mj-column> cannot be placed inside <mj-body>. Allowed parents: <mj-group>, <mj-section>.",
      "line": 3,
      "column": 6,
      "tag": "mj-column",
      "path": [0, 0]
    },
    {
      "severity": "error",
      "code": "mjml.unknown-attribute",
      "message": "<mj-text> has no attribute colour. Did you mean color?",
      "line": 4,
      "column": 16,
      "tag": "mj-text",
      "attribute": "colour",
      "path": [0, 0, 0]
    },
    {
      "severity": "warning",
      "code": "mjml.missing-title",
      "message": "Add an <mj-title> to <mj-head>; clients and screen readers use it.",
      "line": 1,
      "column": 2,
      "tag": "mjml",
      "path": []
    },
    {
      "severity": "info",
      "code": "mjml.missing-preview",
      "message": "Add an <mj-preview> to control the inbox preview text.",
      "line": 1,
      "column": 2,
      "tag": "mjml",
      "path": []
    }
  ],
  "rendered_html": null
}
```

**422**

```json
{
  "message": "Validation failed",
  "errors": {
    "source": ["The source field is required."]
  }
}
```

**403**

```json
{
  "error": "mjml_alpha",
  "message": "MJML is in alpha and available only to Emailit platform admins."
}
```

## Réponse

Renvoie `200 OK` avec le résultat, même quand le MJML est invalide :

| Champ | Type | Description |
| --- | --- | --- |
| `valid` | boolean | `true` quand il n’y a aucun diagnostic d’erreur. |
| `mjml_version` | string | La version de MJML avec laquelle Emailit compile. |
| `html` | string ou null | Le HTML compilé, avec les balises Temple laissées en place, tel qu’Emailit l’enregistre pour un modèle. `null` quand le MJML contient des erreurs. |
| `html_bytes` | integer | Taille de `html` en UTF-8. Gmail tronque les messages de plus de 102 Ko environ. `0` quand `html` vaut `null`. |
| `diagnostics` | array | Tous les diagnostics d’erreur, d’avertissement et d’information. Voir [Valider du MJML](/fr/docs/api-reference/mjml/validate/). |
| `rendered_html` | string ou null | `html` avec les `variables` appliquées par Temple. Présent uniquement si vous envoyez `variables`, et `null` quand le MJML contient des erreurs. |

Un MJML invalide renvoie `200` avec `valid: false`, `html: null` et les diagnostics. `rendered_html` utilise exactement les `variables` que vous envoyez : les variables manquantes donnent une chaîne vide ou leur valeur par défaut, si bien que `{{first_name|"there"}}` donne `there`. Le texte brut n’est pas généré à partir du MJML.

Renvoie `422` avec `message: "Validation failed"` quand `source` est absent ou vide, `400` quand `variables` n’est pas un objet, et `403` avec `error: "mjml_alpha"` sans accès à MJML.

---
Source: https://emailit.com/fr/docs/api-reference/mjml/render/

## Récupérer la référence MJML — GET /mjml/reference

> Chaque composant et chaque attribut MJML pris en charge par Emailit, les versions des éditeurs, le guide Temple et les règles d’écriture. Alpha : réservé à l’équipe Emailit.

# Récupérer la référence MJML

Récupère chaque composant et chaque attribut de la version de MJML avec laquelle Emailit compile, les versions actuelles des éditeurs, le guide Temple et les règles d’écriture. Utilisez-la pour créer des outils ou pour fournir à un modèle d’IA ce dont il a besoin pour écrire des modèles MJML valides. Nécessite la portée `full`.

La même référence est disponible pour les agents IA sous la forme de l’outil MCP `get-mjml-reference`. Consultez [MJML pour les agents IA](/fr/docs/templates/mjml/#mjml-for-ai-agents).

> **MJML est en alpha:** MJML est réservé à l’équipe Emailit pendant que nous le testons. Les autres requêtes, y compris toutes celles effectuées avec une clé API, renvoient `403` avec `error: "mjml_alpha"`. Consultez [Qui peut utiliser MJML](/fr/docs/templates/mjml/#who-can-use-mjml).

`GET /mjml/reference`

**Requête** `GET /mjml/reference`

**Node.js**

```javascript
const response = await fetch('https://api.emailit.com/v2/mjml/reference', {
  headers: {
    'Authorization': 'Bearer your_api_key'
  }
});

const reference = await response.json();
```

**cURL**

```bash
curl https://api.emailit.com/v2/mjml/reference \
  -H "Authorization: Bearer your_api_key"
```

**200**

```json
{
  "mjml_version": "5.4.1",
  "document_schema_version": 1,
  "editors": {
    "mjml-code": { "version": "0.2.0", "stage": "alpha" },
    "mjml-visual": { "version": "0.2.0", "stage": "alpha" }
  },
  "components": [
    {
      "tag": "mj-body",
      "label": "Body",
      "description": "The visible email. Holds sections, wrappers and heroes.",
      "category": "root",
      "ending_tag": false,
      "parents": ["mjml"],
      "children": ["mj-raw", "mj-section", "mj-wrapper", "mj-hero"],
      "attributes": [
        { "name": "width", "type": "unit(px)", "default": "600px" },
        { "name": "background-color", "type": "color", "default": null },
        { "name": "id", "type": "string", "default": null },
        { "name": "mj-class", "type": "string", "default": null },
        { "name": "css-class", "type": "string", "default": null }
      ]
    },
    {
      "tag": "mj-button",
      "label": "Button",
      "description": "A bulletproof call-to-action button. Content is the label.",
      "category": "content",
      "ending_tag": true,
      "parents": ["mj-column", "mj-hero"],
      "children": [],
      "attributes": [
        { "name": "align", "type": "enum(left,center,right)", "default": "center" },
        { "name": "background-color", "type": "color", "default": "#414141" },
        { "name": "href", "type": "string", "default": null },
        { "name": "inner-padding", "type": "unit(px,%){1,4}", "default": "10px 25px" }
      ]
    }
  ],
  "temple_guide": "Temple is Emailit's templating language, evaluated per recipient at send time on the final HTML:\n- {{first_name}} inserts a variable; …",
  "rules": "MJML rules:\n- Structure: <mjml> > <mj-head> (optional) + <mj-body>. …",
  "reference_text": "MJML 5.4.1 component reference. Format: name=type[default]. …"
}
```

**403**

```json
{
  "error": "mjml_alpha",
  "message": "MJML is in alpha and available only to Emailit platform admins."
}
```

## Réponse

Renvoie `200 OK` avec la référence. L’exemple ci-dessus est abrégé : `components` liste les 36 composants avec tous leurs attributs.

| Champ | Type | Description |
| --- | --- | --- |
| `mjml_version` | string | La version de MJML avec laquelle Emailit compile. |
| `document_schema_version` | integer | Le `schema_version` actuel du document MJML enregistré. |
| `editors` | object | La version actuelle et le stade (`alpha`, `beta` ou `stable`) de `mjml-code` et de `mjml-visual`. |
| `components` | array | Tous les composants MJML. Voir ci-dessous. |
| `temple_guide` | string | Le fonctionnement de Temple dans MJML : variables, valeurs par défaut, conditions et variables de campagne. |
| `rules` | string | Les règles d’écriture du MJML : structure, attributs autorisés et accessibilité. |
| `reference_text` | string | Toute la référence des composants sous forme de texte brut compact, pour les prompts. |

Renvoie `403` avec `error: "mjml_alpha"` sans accès à MJML.

### Objet composant

| Champ | Type | Description |
| --- | --- | --- |
| `tag` | string | Nom de la balise, par exemple `mj-button`. |
| `label` | string | Nom affiché. |
| `description` | string | Ce que fait le composant. |
| `category` | string | `root`, `head`, `layout`, `content`, `interactive`, `child` ou `advanced`. |
| `ending_tag` | boolean | `true` quand le contenu est du HTML brut ou du texte (`mj-text`, `mj-button`, `mj-raw`, …). |
| `parents` | string[] | Les éléments dans lesquels ce composant peut être placé. |
| `children` | string[] | Les éléments que ce composant peut contenir. `["*"]` signifie n’importe quel composant (`mj-attributes`). |
| `attributes` | array | Les attributs, chacun avec `name`, `type` (un type MJML comme `color`, `unit(px,%){1,4}` ou `enum(left,center,right)`) et `default` (`null` s’il n’y en a pas). |

---
Source: https://emailit.com/fr/docs/api-reference/mjml/reference/
