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-Parameter | Bedeutung |
|---|---|
kind | pdf, image, docx oder pptx. |
engine | jinja2, liquid oder handlebars. |
tag | Vorlagen mit genau diesem Tag. Der Vergleich ist exakt und unterscheidet Groß- und Kleinschreibung: ?tag=billing findet Billing nicht. |
q | Ein Teil des Namens oder des Slugs, ohne Rücksicht auf Groß- und Kleinschreibung. |
limit | Seitengröße, 1 bis 200, Standard 50. |
cursor | Der 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.
| Feld | Typ | Bedeutung |
|---|---|---|
name | String, 1 bis 200 Zeichen, Pflicht | Wird in der App angezeigt. |
slug | String, Pflicht | Der 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. |
kind | pdf, image, docx oder pptx, Pflicht | Was die Vorlage erzeugt. docx und pptx sind Word- und PowerPoint-Vorlagen, die aus einer Datei entstehen. |
engine | jinja2, liquid oder handlebars, Pflicht | Die Vorlagensprache. |
description | String bis 2.000 Zeichen oder null | |
tags | Array aus bis zu 20 Strings mit bis zu 40 Zeichen | Werden so gespeichert, wie Sie sie senden; siehe „Ändern und archivieren“ unten. |
html, css, head | Strings bis 2 MB, 1 MB und 256 KB | Inhalt, Stylesheet und zusätzlicher <head>-Inhalt der Vorlage. html ist bei pdf und image Pflicht. |
settings | Objekt | Papier, Ränder, Kopf- und Fußzeile und die übrigen Einstellungen. |
sample_data | Objekt | Die Daten, mit denen der Editor die Vorschau zeigt und aus denen das Schema abgeleitet wird. Sie füllen nie ein API-Rendering. |
data_schema | JSON Schema oder null | Der gespeicherte Datenvertrag, an dem validate_data und die Schema-Prüfung Daten messen. |
i18n | Objekt oder null | Übersetzungswörterbücher für den Helper t (Lokalisierung). |
partials | Objekt, Name → Quelltext | Fragmente, die die Vorlage einbindet; bis zu 100, jedes bis 1 MB, zusammen 2 MB. Ein Name ist ein relativer Pfad (letterhead, blocks/address) ohne ... |
publish | Boolean, Standard false | Die 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:
| Feld | Bedeutung |
|---|---|
id, number | Die eigene ID der Version und ihre Nummer, pro Vorlage ab 1 gezählt. |
status | draft, published oder archived. Das Veröffentlichen einer Version archiviert die zuvor veröffentlichte. |
checksum | Ein 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, partials | Die Dateien, wie unter Vorlage anlegen beschrieben. |
data_sets | Benannte Beispieldatensätze neben sample_data (Name → Daten), wie der Editor sie zeigt. |
source_file | Nur 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:
| Feld | Bedeutung |
|---|---|
data_sets | Benannte Beispieldatensätze (Name → Daten), bis zu 50. |
change_note | Bis 500 Zeichen, im Versionsverlauf sichtbar. |
base_checksum | Die checksum der Version, von der Sie ausgegangen sind; siehe „Die Arbeit anderer nicht überschreiben“ unten. |
publish | true veröffentlicht die neue Version sofort. Standard false. |
allow_breaking | Mit 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
fileist das Dokument, bis 20 MB (darüber413 file_too_large). Der Typ wird aus dem Inhalt gelesen: Einedocx-Vorlage nimmt ein Word-Dokument, einepptx-Vorlage eine PowerPoint-Präsentation, alles andere, auch Dateien mit Makros, beantwortet die API mit415 file_type_unsupported. Eine passwortgeschützte Datei ergibt422 source_encrypted, eine beschädigte422 office_document_invalid.- Die übrigen Felder sind Formularfelder. Objekte und Arrays (
settings,sample_data,data_schema,i18n,data_setsundtags) sind JSON-Text,publishundallow_breakingsindtrueoderfalse. - 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.
| Methode | Pfad | Wirkung |
|---|---|---|
GET | /templates/{id}/channels | Listet 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}/promote | Der Canary wird die Hauptversion; 400, wenn es keinen Canary gibt |
POST | /templates/{id}/channels/{name}/rollback | Zurü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:
format | Antwort |
|---|---|
json-schema (Standard) | Das JSON Schema selbst. |
make | Parameterdefinitionen 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)