Templates auflisten
Jedes Template der Connection, neueste zuerst, per Keyset paginiert.
Führt den echten Aufruf gegen Ihren Workspace aus, mit Ihrem eigenen Schlüssel.
GET /templates
Jedes Template der Connection, neueste zuerst, per Keyset paginiert.
Zwei Engines
export OE=https://api.openemail.ukexport AUTH="Authorization: Bearer $OPENEMAIL_API_KEY"Ein Template ist ein einmal gespeicherter und vielfach versendeter Body, und es gehört der CONNECTION und nicht demjenigen, der es geschrieben hat. Ein Workspace-Schlüssel sieht dieselben Templates wie eine Kollegin, und das Löschen des Autorenkontos nimmt sie nicht mit.
engine: "blocks" speichert einen Baum, dessen Knotenarten die Exporte von @react-email/components sind (Section, Row, Column, Container, Text, Heading, Button, Link, Img, Hr, Markdown, CodeBlock und CodeInline) und dessen Props die dieser Komponenten sind. Er wird beim Hineinschreiben validiert, ein fehlerhafter Knoten ist also ein 422 auf dem schreibenden Aufruf statt einer kaputten E-Mail später.
engine: "html" speichert Markup, das Sie bereits haben, einmalig bereinigt beim Veröffentlichen der Version. Das ist die Wahl, wenn Ihre Templates react-email-Komponenten in Ihrem eigenen Repository sind: Rendern Sie die Komponente in Ihrem eigenen Build mit @react-email/render und posten Sie das Ergebnis. Es gibt keinen JSX-Endpunkt und wird keinen geben. Die API nimmt HTML, weil HTML das ist, was ein Mailclient liest, und das Ausführen einer fremden Komponente würde eine Sandbox erkaufen, die niemand braucht.
| Deklariert als | Befüllt von | Fehlt beim Versand |
|---|---|---|
| `slots` | wer das Template bearbeitet | der default des Slots wird gerendert |
| `props` | wer versendet | missing_template_prop, ein 422, und es geht keine Post hinaus |
Beide werden im Body und im Betreff als {{key}} geschrieben, und beide tragen ein kind (text, url oder image), das entscheidet, wie der Wert beim Einsetzen escapt wird. Ein Schlüssel, den nichts deklariert, scheitert beim Veröffentlichen; ein url-Wert, dessen Schema nicht http, https oder mailto ist, wird abgelehnt statt gerendert.
Eine veröffentlichte Version ist eingefroren. Das Bearbeiten des Bodys eines veröffentlichten Templates erzeugt einen neuen Entwurf, statt zu ändern, was laufende Sendungen auflösen; eine Kollegin, die den Text umschreibt, kann also nicht ändern, was Ihr Code bereits versendet, und wenn Sie version festschreiben, kann sie es auch beim Veröffentlichen nicht.
Beispiel
Benötigt templates:read. limit geht bis 100, status schränkt auf draft, active oder archived ein, und cursor ist opak; geben Sie also den nextCursor zurück, den Sie erhalten haben, statt einen zu bauen.
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 ist das, was ein Versand ohne version auflöst, und latestVersion ist der Entwurf, der darauf sitzt. Unterscheiden sich die beiden, hat jemand bearbeitet und nicht veröffentlicht. Das ist kein Fehler, und es lohnt sich, das in einem Deploy-Log sichtbar zu machen.
Eine Zeile sind Metadaten. Die deklarierten slots und props kommen von einem Abruf zurück, und das ist der Aufruf, den Sie machen, wenn Sie wissen müssen, was Sie übergeben müssen.