Listar plantillas
Todas las plantillas de la conexión, las más nuevas primero, paginadas por keyset.
Ejecuta la llamada real contra tu espacio de trabajo, con tu propia clave.
GET /templates
Todas las plantillas de la conexión, las más nuevas primero, paginadas por keyset.
Dos motores
export OE=https://api.openemail.ukexport AUTH="Authorization: Bearer $OPENEMAIL_API_KEY"Una plantilla es un cuerpo guardado una vez y enviado muchas, y pertenece a la CONEXIÓN y no a quien la escribió. Una key de espacio de trabajo ve las mismas plantillas que un colega, y borrar la cuenta del autor no se las lleva consigo.
engine: "blocks" guarda un árbol cuyos tipos de nodo son los exports de @react-email/components (Section, Row, Column, Container, Text, Heading, Button, Link, Img, Hr, Markdown, CodeBlock y CodeInline) y cuyas props son las de esos componentes. Se valida a la entrada, así que un nodo incorrecto es un 422 en la llamada que lo escribió y no un email roto más tarde.
engine: "html" guarda el marcado que ya tienes, saneado una vez cuando se publica la versión. Este es el que hay que usar cuando tus plantillas son componentes react-email que viven en tu propio repositorio: renderiza el componente con @react-email/render en tu propio build y publica el resultado. No hay un endpoint de JSX y no lo va a haber. La API acepta HTML porque HTML es lo que lee un cliente de correo, y ejecutar el componente de quien llama compraría un sandbox que nadie necesita.
| Declarado como | Lo rellena | Si falta al enviar |
|---|---|---|
| `slots` | quien edita la plantilla | se renderiza el default del propio slot |
| `props` | quien envía | missing_template_prop, un 422, y no sale ningún correo |
Ambos se escriben como {{key}} en el cuerpo y en el asunto, y ambos llevan un kind (text, url o image) que decide cómo se escapa el valor al sustituirlo. Una clave que nadie declara falla al publicar; un valor url cuyo esquema no sea http, https o mailto se rechaza en lugar de renderizarse.
Una versión publicada está congelada. Editar el cuerpo de una plantilla publicada acuña un borrador nuevo en lugar de cambiar lo que resuelven los envíos en vivo, así que un colega que reescriba el texto no puede cambiar lo que tu código ya envía, y fijar version significa que tampoco podrá cambiarlo cuando publique.
Ejemplo
Necesita templates:read. limit llega a 100, status acota a draft, active o archived, y cursor es opaco, así que devuelve el nextCursor que te dieron en lugar de construir uno.
curl "$OE/templates?limit=25&status=active" -H "$AUTH"{ "object": "list", "data": [ { "object": "template", "id": "tpl_9c1f0a4b7e05d3862c1f0a44", "name": "Order shipped", "slug": "order-shipped", "description": null, "status": "active", "publishedVersion": 3, "latestVersion": 4, "createdAt": "2026-08-01T09:12:44.000Z", "updatedAt": "2026-08-28T16:03:10.000Z" } ], "hasMore": false, "nextCursor": null}publishedVersion es lo que resuelve un envío sin version y latestVersion es el borrador que está encima. Que los dos difieran significa que alguien ha editado y no ha publicado. No es un error, y vale la pena mostrarlo en un log de despliegue.
Una fila son metadatos. Los slots y props declarados vuelven en una recuperación, que es la llamada que hay que hacer cuando necesitas saber qué pasarle a una.