MJML (alfa)
Valida y renderiza MJML y consulta la referencia de MJML. En alfa, solo para el equipo de Emailit.
Validar MJML
Comprueba un MJML igual que al guardar una plantilla (sintaxis XML, estructura de MJML, tipos de los atributos y sintaxis de Temple) y lo compila con MJML 5.4.1. No se guarda nada. Un MJML no válido también devuelve 200, con valid: false y los diagnósticos. Requiere el permiso full.
Consulta Validación para saber qué cubre cada comprobación.
/mjml/validateParámetros del cuerpo
sourcestring | objectObligatorioEl MJML que se comprueba: marcado MJML (<mjml>…</mjml>), MJML JSON o un documento MJML de Emailit, como el source guardado de una plantilla. Consulta Formatos de origen. Como máximo, 2 MB.
Devuelve
Devuelve 200 OK con el resultado, aunque el MJML no sea válido:
| Campo | Tipo | Descripción |
|---|---|---|
valid |
booleano | true si no hay diagnósticos de error, es decir, si se puede guardar una plantilla con este origen. |
mjml_version |
cadena | La versión de MJML con la que compila Emailit. |
format |
cadena o null | Cómo se leyó el origen: markup o json. null si no se pudo leer. |
diagnostics |
array | Todos los diagnósticos de error, de advertencia e informativos. |
valid: true significa que una plantilla con este origen se aceptaría. Corrige también las advertencias: suelen señalar problemas reales, como que falte un <mj-title>. Para obtener el HTML, usa Renderizar MJML.
Devuelve 422 con message: "Validation failed" si falta source o está en blanco, y 403 con error: "mjml_alpha" sin acceso a MJML.
Objeto de diagnóstico
Los campos que no aplican se omiten.
| Campo | Tipo | Descripción |
|---|---|---|
severity |
cadena | error, warning o info. Solo los errores hacen que valid sea false. |
code |
cadena | Un código estable, por ejemplo mjml.invalid-child, xml.unclosed-tag o temple.unclosed-if. Consulta Códigos de diagnóstico. |
message |
cadena | Una explicación legible. |
line |
entero | La línea en el marcado, empezando por 1. Solo en orígenes de marcado. |
column |
entero | La columna en el marcado, empezando por 1. Solo en orígenes de marcado. |
tag |
cadena | El elemento al que se refiere el diagnóstico. |
attribute |
cadena | El atributo al que se refiere el diagnóstico. |
path |
integer[] | La ruta de índices de hijos desde la raíz <mjml>. |
{
"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": []
}
]
}{
"valid": true,
"mjml_version": "5.4.1",
"format": "markup",
"diagnostics": []
}{
"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."
}
]
}{
"message": "Validation failed",
"errors": {
"source": ["The source field is required."]
}
}{
"error": "mjml_alpha",
"message": "MJML is in alpha and available only to Emailit platform admins."
}Renderizar MJML
Compila un MJML en el HTML que envía Emailit, con MJML 5.4.1. Con variables, la respuesta también incluye rendered_html: el HTML después de aplicar Temple, tal como lo recibiría un destinatario. No se guarda ni se envía nada. Requiere el permiso full.
Este endpoint está limitado a 120 peticiones por minuto.
/mjml/renderParámetros del cuerpo
sourcestring | objectObligatorioEl MJML que se compila: marcado MJML (<mjml>…</mjml>), MJML JSON o un documento MJML de Emailit, como el source guardado de una plantilla. Consulta Formatos de origen. Como máximo, 2 MB.
variablesobjectLas variables de Temple para rendered_html, como first_name, o un objeto cf con los campos personalizados de la campaña. No se rellena nada automáticamente: pasa las variables que aportaría el canal de envío. Consulta Variables por canal. Debe ser un objeto; cualquier otra cosa devuelve 400.
Devuelve
Devuelve 200 OK con el resultado, aunque el MJML no sea válido:
| Campo | Tipo | Descripción |
|---|---|---|
valid |
booleano | true si no hay diagnósticos de error. |
mjml_version |
cadena | La versión de MJML con la que compila Emailit. |
html |
cadena o null | El HTML compilado, con las etiquetas de Temple sin sustituir, tal como Emailit lo guarda para una plantilla. null si el MJML tiene errores. |
html_bytes |
entero | El tamaño en UTF-8 de html. Gmail recorta los mensajes de más de unos 102 KB. 0 si html es null. |
diagnostics |
array | Todos los diagnósticos de error, de advertencia e informativos. Consulta Validar MJML. |
rendered_html |
cadena o null | html con las variables aplicadas por Temple. Solo aparece si envías variables, y es null si el MJML tiene errores. |
Un MJML no válido devuelve 200 con valid: false, html: null y los diagnósticos. rendered_html usa exactamente las variables que envías: las variables que faltan se renderizan como cadenas vacías o como su valor por defecto, así que {{first_name|"there"}} se renderiza como there. El texto plano no se genera a partir del MJML.
Devuelve 422 con message: "Validation failed" si falta source o está en blanco, 400 si variables no es un objeto, y 403 con error: "mjml_alpha" sin acceso a MJML.
{
"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"
}{
"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
}{
"message": "Validation failed",
"errors": {
"source": ["The source field is required."]
}
}{
"error": "mjml_alpha",
"message": "MJML is in alpha and available only to Emailit platform admins."
}Obtener la referencia de MJML
Obtiene todos los componentes y atributos de la versión de MJML con la que compila Emailit, las versiones actuales de los editores, la guía de Temple y las reglas de escritura. Usa esta referencia para crear herramientas de desarrollo o para dar a un modelo de IA lo que necesita para escribir plantillas MJML válidas. Requiere el permiso full.
La misma referencia está disponible para los agentes de IA como la herramienta MCP get-mjml-reference. Consulta MJML para agentes de IA.
/mjml/referenceDevuelve
Devuelve 200 OK con la referencia. El ejemplo de arriba está abreviado: components incluye los 36 componentes con todos sus atributos.
| Campo | Tipo | Descripción |
|---|---|---|
mjml_version |
cadena | La versión de MJML con la que compila Emailit. |
document_schema_version |
entero | El schema_version actual del documento MJML guardado. |
editors |
objeto | La versión y la fase actuales (alpha, beta o stable) de mjml-code y mjml-visual. |
components |
array | Todos los componentes de MJML. Consulta más abajo. |
temple_guide |
cadena | Cómo funciona Temple dentro de MJML: variables, valores por defecto, condicionales y variables de campaña. |
rules |
cadena | Las reglas de escritura de MJML: estructura, atributos permitidos y accesibilidad. |
reference_text |
cadena | Toda la referencia de componentes en texto plano compacto, para los prompts. |
Devuelve 403 con error: "mjml_alpha" sin acceso a MJML.
Objeto de componente
| Campo | Tipo | Descripción |
|---|---|---|
tag |
cadena | El nombre de la etiqueta, por ejemplo mj-button. |
label |
cadena | El nombre visible. |
description |
cadena | Lo que hace el componente. |
category |
cadena | root, head, layout, content, interactive, child o advanced. |
ending_tag |
booleano | true si el contenido es HTML o texto sin procesar (mj-text, mj-button, mj-raw, …). |
parents |
string[] | Los elementos en los que se puede colocar este componente. |
children |
string[] | Los elementos que puede contener este componente. ["*"] significa cualquier componente (mj-attributes). |
attributes |
array | Los atributos, cada uno con name, type (un tipo de MJML como color, unit(px,%){1,4} o enum(left,center,right)) y default (null si no hay ninguno). |
{
"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]. …"
}{
"error": "mjml_alpha",
"message": "MJML is in alpha and available only to Emailit platform admins."
}