Zum Hauptinhalt springen

Vorlagen-API

Die meisten Teams verwalten Vorlagen im Editor oder mit der CLI. Beide verwenden die Vorlagen-Endpunkte, und diese stehen auch Ihnen zur Verfügung: um Vorlagen aus Ihrem eigenen System zu erzeugen, um aus einer Pipeline zu veröffentlichen oder um die Felder einer Vorlage in Ihrer Oberfläche anzuzeigen.

Lesen braucht den Scope template:read (einer der Standard-Scopes eines neuen Schlüssels), Schreiben template:write, den Sie beim Anlegen des Schlüssels auswählen (Scopes). POST /templates/{id}/validate liest nur und braucht template:read. Vorlagen gehören zu einem Workspace: Ein Schlüssel sieht nur die Vorlagen seines eigenen Workspaces.

Eine Vorlage benennen. Überall, wo ein Pfad oder ein Rendering eine Vorlage erwartet, übergeben Sie ihren Slug (delivery-note), ihre ID (tpl_ gefolgt von 32 Hex-Ziffern, wie die API sie liefert) oder die reine UUID. Eine unbekannte oder archivierte Vorlage ergibt 404 template_not_found.

Vorlagen auflisten und lesen​

curl "https://api-eu.formfeed.dev/v1/templates?kind=pdf&tag=billing&limit=50" \
-H "Authorization: Bearer $FORMFEED_API_KEY"

curl https://api-eu.formfeed.dev/v1/templates/delivery-note \
-H "Authorization: Bearer $FORMFEED_API_KEY"
{
"id": "tpl_3e8b0c1a5d2f4e6a9b7c8d0e1f2a3b4c",
"slug": "delivery-note",
"name": "Delivery note",
"description": null,
"kind": "pdf",
"engine": "liquid",
"tags": ["billing"],
"published_version": 3,
"latest_version": 4,
"created_at": "2026-09-12T10:00:00Z",
"updated_at": "2026-09-14T08:30:00Z"
}

published_version ist die Nummer der Version, die Renderings standardmäßig verwenden (null, solange nichts veröffentlicht ist), latest_version die neueste Version, veröffentlicht oder nicht (0 vor der ersten). GET /templates antwortet mit { "data": [ … ], "next_cursor": … }, die zuletzt geänderten zuerst, ohne archivierte Vorlagen:

Query-ParameterBedeutung
kindpdf, image, docx oder pptx.
enginejinja2, liquid oder handlebars.
tagVorlagen mit genau diesem Tag. Der Vergleich ist exakt und unterscheidet Groß- und Kleinschreibung: ?tag=billing findet Billing nicht.
qEin Teil des Namens oder des Slugs, ohne Rücksicht auf Groß- und Kleinschreibung.
limitSeitengröße, 1 bis 200, Standard 50.
cursorDer next_cursor der vorherigen Seite; auf der letzten Seite null.

Vorlage anlegen​

curl https://api-eu.formfeed.dev/v1/templates \
-H "Authorization: Bearer $FORMFEED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Delivery note",
"slug": "delivery-note",
"kind": "pdf",
"engine": "liquid",
"html": "<h1>Delivery note {{ number }}</h1>",
"css": "h1 { font-family: sans-serif; }",
"settings": { "paper": { "format": "A4" } },
"sample_data": { "number": "DN-1001" },
"publish": true
}'

Das legt die Vorlage und ihre erste Version an und antwortet mit 201 und der Vorlage. Mit "publish": true wird die Version sofort veröffentlicht und kann direkt gerendert werden; andernfalls bleibt sie ein Entwurf.

FeldTypBedeutung
nameString, 1 bis 200 Zeichen, PflichtWird in der App angezeigt.
slugString, PflichtDer Name, den Renderings und URLs verwenden: 1 bis 64 Kleinbuchstaben, Ziffern und Bindestriche, beginnend und endend mit einem Buchstaben oder einer Ziffer. Eindeutig im Workspace, archivierte Vorlagen eingeschlossen; ein vergebener Slug ergibt 409 conflict.
kindpdf, image, docx oder pptx, PflichtWas die Vorlage erzeugt. docx und pptx sind Word- und PowerPoint-Vorlagen, die aus einer Datei entstehen.
enginejinja2, liquid oder handlebars, PflichtDie Vorlagensprache.
descriptionString bis 2.000 Zeichen oder null
tagsArray aus bis zu 20 Strings mit bis zu 40 ZeichenWerden so gespeichert, wie Sie sie senden; siehe „Ändern und archivieren“ unten.
html, css, headStrings bis 2 MB, 1 MB und 256 KBInhalt, Stylesheet und zusätzlicher <head>-Inhalt der Vorlage. html ist bei pdf und image Pflicht.
settingsObjektPapier, Ränder, Kopf- und Fußzeile und die übrigen Einstellungen.
sample_dataObjektDie Daten, mit denen der Editor die Vorschau zeigt und aus denen das Schema abgeleitet wird. Sie füllen nie ein API-Rendering.
data_schemaJSON Schema oder nullDer gespeicherte Datenvertrag, an dem validate_data und die Schema-Prüfung Daten messen.
i18nObjekt oder nullÜbersetzungswörterbücher für den Helper t (Lokalisierung).
partialsObjekt, Name → QuelltextFragmente, die die Vorlage einbindet; bis zu 100, jedes bis 1 MB, zusammen 2 MB. Ein Name ist ein relativer Pfad (letterhead, blocks/address) ohne ...
publishBoolean, Standard falseDie erste Version sofort veröffentlichen.

Wo der Plan die Zahl der Vorlagen begrenzt (fünf im Free-Plan, unbegrenzt in den bezahlten Plänen), ergibt eine Vorlage über dem Limit 403 forbidden mit "feature": "templates" und dem limit des Plans. Gezählt werden die nicht archivierten Vorlagen der ganzen Organisation; eine archivierte wiederherzustellen zählt wie das Anlegen einer neuen. Archivieren Sie eine Vorlage oder wechseln Sie den Plan, um Platz zu schaffen.

Versionen​

Jede Änderung ist eine neue Version; Versionen werden nie nachträglich bearbeitet.

# Versionen auflisten, neueste zuerst
curl https://api-eu.formfeed.dev/v1/templates/delivery-note/versions -H "Authorization: Bearer $FORMFEED_API_KEY"

# eine Version mit allen Dateien lesen: "published", "latest", eine Nummer oder ein Channel-Name
curl https://api-eu.formfeed.dev/v1/templates/delivery-note/versions/latest -H "Authorization: Bearer $FORMFEED_API_KEY"

which im Pfad ist published (die Version, die Renderings standardmäßig verwenden), latest (die neueste Version, veröffentlicht oder nicht; draft bedeutet dasselbe), eine Versionsnummer oder der Name eines Release Channels, der für die Version steht, auf die der Channel zeigt. Eine unbekannte Version oder ein unbekannter Channel ergibt 404 (template_not_found oder channel_not_found).

Eine Version enthält:

FeldBedeutung
id, numberDie eigene ID der Version und ihre Nummer, pro Vorlage ab 1 gezählt.
statusdraft, published oder archived. Das Veröffentlichen einer Version archiviert die zuvor veröffentlichte.
checksumEin Hash dessen, was gerendert wird: html, css, head, settings, partials, i18n und die Datei einer Office-Vorlage. Beispieldaten, Datensätze und Schema gehören nicht dazu.
change_note, created_at, published_at
html, css, head, settings, sample_data, data_schema, i18n, partialsDie Dateien, wie unter Vorlage anlegen beschrieben.
data_setsBenannte Beispieldatensätze neben sample_data (Name → Daten), wie der Editor sie zeigt.
source_fileNur Word- und PowerPoint-Vorlagen: sha256, bytes und format des Dokuments der Version; sonst null.

Die Liste lässt die Dateien weg und liefert die übrigen Felder; lesen Sie eine Version über ihr which, um sie zu bekommen.

partials sind die Fragmente, die die Vorlage einbindet (name → Quelltext), also die, die formfeed templates push aus dem Ordner partials/ des Projekts sammelt. Sie werden mit der Version gerendert, und die checksum deckt sie ab: Ein geändertes Partial ist eine neue Version. Siehe Partials. Geteilte Partials der Organisation gehören nicht zur Version: Sie werden beim Rendern aufgelöst, nach den eigenen Partials der Version.

Version anlegen und veröffentlichen​

curl https://api-eu.formfeed.dev/v1/templates/delivery-note/versions \
-H "Authorization: Bearer $FORMFEED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"html": "<h1>Delivery note {{ number }}</h1><p>{{ customer.name }}</p>",
"change_note": "Add customer name",
"base_checksum": "9f2c…",
"publish": false
}'

curl -X POST https://api-eu.formfeed.dev/v1/templates/delivery-note/versions/4/publish \
-H "Authorization: Bearer $FORMFEED_API_KEY"

POST /templates/{id}/versions nimmt die Dateien aus Vorlage anlegen an (html ist bei pdf- und image-Vorlagen Pflicht) sowie diese Felder und antwortet mit 201 und der neuen Version:

FeldBedeutung
data_setsBenannte Beispieldatensätze (Name → Daten), bis zu 50.
change_noteBis 500 Zeichen, im Versionsverlauf sichtbar.
base_checksumDie checksum der Version, von der Sie ausgegangen sind; siehe „Die Arbeit anderer nicht überschreiben“ unten.
publishtrue veröffentlicht die neue Version sofort. Standard false.
allow_breakingMit publish: veröffentlichen, obwohl die Schema-Prüfung eine brechende Änderung findet.

Felder, die Sie weglassen, sind in der neuen Version leer und werden nicht aus der vorherigen übernommen. Senden Sie also die vollständige Vorlage. POST …/versions/{number}/publish veröffentlicht eine vorhandene Version und antwortet mit 200 und dieser Version. Das Veröffentlichen archiviert die bisher veröffentlichte Version, und Renderings verwenden die neue innerhalb einer Minute.

Die Schema-Prüfung​

Beim Veröffentlichen wird das Datenschema der neuen Version mit dem der veröffentlichten verglichen. Speichern beide Versionen ein data_schema und würde die neue Daten ablehnen, die die veröffentlichte annimmt (ein neues Pflichtfeld, ein engerer Typ, ein entfernter Enum-Wert), antwortet die Anfrage mit 409 schema_breaking_change und den brechenden Änderungen in breaking, und nichts wird veröffentlicht. Mit "allow_breaking": true veröffentlichen Sie trotzdem:

curl -X POST https://api-eu.formfeed.dev/v1/templates/delivery-note/versions/4/publish \
-H "Authorization: Bearer $FORMFEED_API_KEY" -H "Content-Type: application/json" \
-d '{ "allow_breaking": true }'

Dasselbe gilt für POST /templates/{id}/versions mit "publish": true. Die Antwort enthält schema_check: die Quelle source (stored, inferred oder none) sowie die Änderungen in breaking und safe. Hat eine der Versionen kein gespeichertes Schema, werden aus den Beispieldaten abgeleitete Schemas verglichen, und das Ergebnis ist nur eine Warnung, nie eine Ablehnung. none heißt, dass es nichts zu vergleichen gab, etwa beim ersten Veröffentlichen. Was als brechend gilt listet alle Regeln.

Die Arbeit anderer nicht überschreiben​

Senden Sie die checksum der Version, von der Sie ausgegangen sind, als base_checksum. Hat inzwischen jemand eine neuere Version mit anderen Dateien angelegt, im Editor oder auf einem anderen Rechner, antwortet die API mit 409 conflict und legt nichts an, statt dessen Arbeit stillschweigend zu ersetzen. Holen Sie die neueste Version, führen Sie die Änderungen zusammen und versuchen Sie es erneut. formfeed templates push macht genau das. Ohne base_checksum wird die neue Version angelegt, egal was inzwischen geschehen ist.

Verglichen wird mit der checksum der neuesten Version; eine neuere Version, die nur Beispieldaten, Datensätze oder das Schema geändert hat, gilt also nicht als Konflikt.

Word- und PowerPoint-Vorlagen​

Eine Vorlage der Art docx oder pptx ist eine Word- oder PowerPoint-Datei mit Tags im Text (wie man sie schreibt, erklärt Word- und PowerPoint-Vorlagen). Ihre Versionen enthalten diese Datei statt html, css, head und partials; beim Anlegen senden Sie die Datei deshalb als multipart/form-data:

curl https://api-eu.formfeed.dev/v1/templates \
-H "Authorization: Bearer $FORMFEED_API_KEY" \
-F name="Angebot" \
-F slug=offer \
-F kind=docx \
-F engine=jinja2 \
-F 'sample_data={"customer": {"name": "Olvarest GmbH"}, "offer": {"number": "A-1001"}}' \
-F 'settings={"office": {"output": "pdf"}, "locale": "de-DE"}' \
-F file=@angebot.docx
  • file ist das Dokument, bis 20 MB (darüber 413 file_too_large). Der Typ wird aus dem Inhalt gelesen: Eine docx-Vorlage nimmt ein Word-Dokument, eine pptx-Vorlage eine PowerPoint-Präsentation, alles andere, auch Dateien mit Makros, beantwortet die API mit 415 file_type_unsupported. Eine passwortgeschützte Datei ergibt 422 source_encrypted, eine beschädigte 422 office_document_invalid.
  • Die übrigen Felder sind Formularfelder. Objekte und Arrays (settings, sample_data, data_schema, i18n, data_sets und tags) sind JSON-Text, publish und allow_breaking sind true oder false.
  • Eine Office-Vorlage lässt sich nicht ohne ihre Datei anlegen, und eine Vorlage anderer Art nimmt keine an (400 invalid_request). Partials gibt es bei Office-Vorlagen nicht.

Neue Versionen funktionieren genauso: POST /templates/{id}/versions mit einer neuen file ersetzt das Dokument. Eine Version ohne Datei, als Multipart oder als reines JSON, übernimmt die Datei der neuesten Version; eine Änderung an Beispieldaten, Schema oder Einstellungen braucht also keinen Upload. Wie bei jeder Version sind die übrigen Felder, die Sie weglassen, in der neuen Version leer; senden Sie Einstellungen, Beispieldaten und Schema also mit:

# ein neues Dokument, sofort veröffentlicht
curl https://api-eu.formfeed.dev/v1/templates/offer/versions \
-H "Authorization: Bearer $FORMFEED_API_KEY" \
-F change_note="Neues Layout" -F publish=true -F file=@angebot.docx \
-F 'sample_data={"customer": {"name": "Olvarest GmbH"}, "offer": {"number": "A-1001"}}' \
-F 'settings={"office": {"output": "pdf"}, "locale": "de-DE"}'

# ab jetzt standardmäßig Word; die Datei bleibt
curl https://api-eu.formfeed.dev/v1/templates/offer/versions \
-H "Authorization: Bearer $FORMFEED_API_KEY" -H "Content-Type: application/json" \
-d '{
"settings": { "office": { "output": "docx" }, "locale": "de-DE" },
"sample_data": { "customer": { "name": "Olvarest GmbH" }, "offer": { "number": "A-1001" } },
"change_note": "Standardmäßig Word"
}'

Eine Version einer Office-Vorlage enthält source_file mit sha256, bytes und format der Datei; die checksum der Version schließt den Hash der Datei ein, ein neues Dokument ist also immer eine Änderung. Die Datei selbst liefert nur GET /templates/{id}/versions/{which}/file (Scope template:read), which wie beim Lesen einer Version. Sie kommt als Download mit dem Namen <Slug>-v<Nummer>.docx (oder .pptx). Bei einer Vorlage, die keine Word- oder PowerPoint-Vorlage ist, antwortet der Pfad mit 404 not_found. Wo die Datei gespeichert ist, zeigt die API nie, und einen öffentlichen Link darauf gibt es nicht.

curl -o angebot.docx https://api-eu.formfeed.dev/v1/templates/offer/versions/published/file \
-H "Authorization: Bearer $FORMFEED_API_KEY"

Die SDKs senden Multipart, sobald Sie eine Datei übergeben: client.templates.create({ …, kind: 'docx', file: { data, name: 'angebot.docx' } }) und client.templates.versions.create(id, { file }) in TypeScript, client.templates.create(…, file=data, file_name="angebot.docx") und create_version(id, file=data) in Python. client.templates.versions.file(id, 'published') und client.templates.version_file(id, "published") laden das Dokument als Bytes herunter.

POST /templates/{id}/validate prüft die Tags des gespeicherten Dokuments wie das Panel Tags der App und formfeed validate, füllt es einmal mit den Daten und prüft die Daten gegen das gespeicherte Schema.

Release Channels​

Ein Release Channel ist ein benannter Zeiger auf eine Version, etwa staging; auch published ist einer. Ein Rendering wählt ihn mit "version": "staging". Release Channels erklärt den ganzen Ablauf.

MethodePfadWirkung
GET/templates/{id}/channelsListet published und die benannten Channels mit Version, Canary, previous_version, den Renderings der letzten 24 Stunden und den limits des Plans
PUT/templates/{id}/channels/{name}Legt einen Channel an oder verschiebt ihn: { "version": 8, "canary": { "version": 9, "percent": 10 } }; bei published ist das Veröffentlichen. 201 beim Anlegen, 200 beim Verschieben
POST/templates/{id}/channels/{name}/promoteDer Canary wird die Hauptversion; 400, wenn es keinen Canary gibt
POST/templates/{id}/channels/{name}/rollbackZurück zu previous_version; 400, wenn es keine gibt
DELETE/templates/{id}/channels/{name}Löscht einen benannten Channel (published lässt sich nicht löschen); ?force=true, wenn Renderings der letzten Stunde ihn verwendet haben, sonst 409 channel_in_use

Verschieben, Promoten und Zurückrollen führen die Schema-Prüfung gegen die Version aus, auf die der Channel gerade zeigt, nehmen allow_breaking an und liefern schema_check. Channel-Namen bestehen aus 1 bis 32 Kleinbuchstaben, Ziffern und Bindestrichen und beginnen mit einem Buchstaben; latest und draft sind reserviert (422 channel_name_invalid). Eine Verschiebung erreicht Renderings innerhalb einer Minute. Benannte Channels brauchen den Starter-Plan (zwei pro Vorlage; zehn in Pro und Business), Canaries den Pro-Plan; darüber hinaus antwortet die API mit 403 forbidden und "feature": "channels" oder "canary" (Pläne).

Datenschema​

curl https://api-eu.formfeed.dev/v1/templates/delivery-note/schema -H "Authorization: Bearer $FORMFEED_API_KEY"

Liefert das JSON Schema (Draft 2020-12, Content-Type: application/schema+json) der data, die die Vorlage erwartet: das Schema, das Sie als data_schema gespeichert haben, oder das aus den Beispieldaten abgeleitete. Nutzen Sie es, um Daten in Ihrer Anwendung vor dem Rendern zu validieren oder um ein Formular zu bauen. 404 not_found bedeutet, dass die Version keines von beiden hat. Ohne ?version= ist es das Schema der veröffentlichten Version (sonst der neuesten); ?version=staging, eine Versionsnummer oder latest liest das einer anderen Version, sodass eine Staging-Umgebung gegen das prüft, was sie rendert. formfeed types macht aus den Schemas TypeScript- oder Python-Typen; siehe Typisierte Vorlagendaten.

?format= wählt die Form der Antwort:

formatAntwort
json-schema (Standard)Das JSON Schema selbst.
makeParameterdefinitionen für Make: eine data-Collection, dazu eine version-Auswahl mit den Release Channels, wenn die Vorlage außer published welche hat. Das lädt die Make-App als dynamische Felder. Eine Vorlage ohne Schema und Beispieldaten bekommt statt 404 ein einzelnes JSON-Feld.
swagger{ "schema": … } im Dialekt von OpenAPI 2.0 (ein Typ pro Eigenschaft, eine Beschriftung in x-ms-summary), das lädt der Power-Platform-Connector. Ohne Schema und Beispieldaten ist es ein Objekt ohne Eigenschaften.

Jeder andere Wert ergibt 400 invalid_request.

Validieren​

curl -X POST https://api-eu.formfeed.dev/v1/templates/delivery-note/validate \
-H "Authorization: Bearer $FORMFEED_API_KEY" -H "Content-Type: application/json" \
-d '{"version": "latest", "data": {"order": {"number": 1042}}}'

Prüft eine Version mit Daten, ohne zu rendern, und ist kostenlos. Gemeldet wird, was auch der Editor und formfeed validate melden, dazu das, was sich erst auf dem Server zeigt: Syntaxfehler und Warnungen in Inhalt, Kopf- und Fußzeile, Includes ohne gespeichertes Partial, Fehler, die erst beim Ausführen der Vorlage mit diesen Daten auftreten, und jede Stelle, an der die Daten nicht zum gespeicherten Datenschema passen. Geprüft wird mit dem aktuellen Brand Kit und den geteilten Partials der Organisation, wie ein Rendering sie bekäme. version ist published (Standard), latest, eine Nummer oder der Name eines Release Channels; data ist ein Objekt, ohne data werden die Beispieldaten der Version geprüft.

Bei einer Word- oder PowerPoint-Vorlage treten die Tags des Dokuments der Version an die Stelle von Inhalt, Kopf- und Fußzeile. Ihre Meldungen nennen den Dokumentteil part (word/document.xml, ppt/slides/slide2.xml) und den Absatz paragraph darin, ab 1 gezählt wie im Panel Tags. Bilder werden nicht geladen; ein Bild, das sich nicht laden lässt, zeigt sich erst beim Rendern.

{
"ok": false,
"template": {
"id": "tpl_3e8b0c1a5d2f4e6a9b7c8d0e1f2a3b4c",
"slug": "delivery-note",
"version": 4
},
"diagnostics": [
{
"severity": "error",
"code": "data-validation",
"path": "data.order.number",
"message": "data.order.number: must be string"
}
]
}

Jede Diagnose hat eine severity (error, warning oder info), einen code und eine message; Probleme der Vorlage ergänzen eine location (line, column), Probleme der Daten den Pfad path in die Daten, Office-Vorlagen part und paragraph. ok ist false, sobald mindestens eine Diagnose ein Fehler ist. Eine Vorlage mit Problemen liefert trotzdem 200; nur eine unbekannte Vorlage oder Version antwortet mit 404.

Um die Daten eines echten Renderings zu prüfen, senden Sie "validate_data": true mit. Passen die Daten nicht zum gespeicherten Schema der Vorlage, antwortet das Rendering mit 422 data_validation_error, bevor etwas gerendert oder gezählt wird, und mit 400, wenn die Vorlage keines hat. Bei einem Batch wird nichts eingereiht, solange nicht jeder Eintrag passt, der die Prüfung verlangt.

Ändern und archivieren​

curl -X PUT https://api-eu.formfeed.dev/v1/templates/delivery-note \
-H "Authorization: Bearer $FORMFEED_API_KEY" -H "Content-Type: application/json" \
-d '{ "name": "Delivery note (EU)", "tags": ["billing", "eu"] }'

curl -X DELETE https://api-eu.formfeed.dev/v1/templates/delivery-note \
-H "Authorization: Bearer $FORMFEED_API_KEY"

PUT /templates/{id} ändert name, description (null entfernt sie) und tags und antwortet mit 200 und der Vorlage; senden Sie mindestens eines davon. Slug, Art und Engine einer Vorlage ändert die API nicht. tags ersetzt die ganze Liste. Tags werden genau so gespeichert, wie Sie sie senden, und der Filter ?tag= der Liste vergleicht sie exakt; die App schreibt Tags kleingeschrieben mit Bindestrichen (billing-eu), nehmen Sie also diese Form, wenn App und Code dieselben Vorlagen finden sollen.

DELETE /templates/{id} archiviert die Vorlage und antwortet mit 204: Sie verschwindet aus Listen, lässt sich über die API weder rendern noch lesen (404 template_not_found), und ihre Render-Historie bleibt erhalten. Ihr Slug bleibt vergeben. Archivierte Vorlagen zählen nicht gegen das Vorlagenlimit des Plans; wiederherstellen lässt sich eine in der Vorlagenliste der App mit Wiederherstellen.

Mit den SDKs​

import { Formfeed } from '@formfeed/sdk';

const client = new Formfeed({ apiKey: process.env.FORMFEED_API_KEY! });

const version = await client.templates.versions.get('delivery-note', 'latest');
const next = await client.templates.versions.create('delivery-note', {
...version, // alle Dateien behalten: css, head, Einstellungen, Beispieldaten, Schema, i18n, Partials, Datensätze
html: (version.html ?? '').replace('Delivery note', 'Packing slip'),
base_checksum: version.checksum,
change_note: 'Rename',
});
await client.templates.versions.publish('delivery-note', next.number);
import os

from formfeed import Formfeed

client = Formfeed(os.environ["FORMFEED_API_KEY"])

version = client.templates.version("delivery-note", "latest")
next_version = client.templates.create_version(
"delivery-note",
html=version.html.replace("Delivery note", "Packing slip"),
css=version.css, head=version.head, settings=version.settings, sample_data=version.sample_data,
data_schema=version.data_schema, i18n=version.i18n, partials=version.partials,
base_checksum=version.checksum, change_note="Rename",
)
client.templates.publish("delivery-note", next_version.number)

In Python nennen Sie jede Datei, die Sie behalten wollen, wie oben; eine Vorlage mit benannten Datensätzen braucht außerdem data_sets=version.model_extra["data_sets"], weil das Versionsmodell dafür kein eigenes Feld hat. Auflisten geht in beiden SDKs mit client.templates.list(…) und client.templates.all(…) (mit tag, kind, engine und q), das Schema mit client.templates.schema(id) und die Prüfung mit client.templates.validate(id, …).

Das Veröffentlichen nimmt in TypeScript { allowBreaking: true } und in Python allow_breaking=True, um über die Schema-Prüfung hinwegzugehen. Channels liegen unter client.templates.channels:

await client.templates.channels.set('delivery-note', 'staging', {
version: next.number,
});
client.templates.channels.set("delivery-note", "staging", version=next_version.number)