Ein Draft-Link macht einen Inhalt, der in Flyo offline ist, auf der produktiven Webseite anschaubar, für alle, die den Link haben, und nur für eine begrenzte Zeit.
Diese Seite richtet sich sowohl an Redaktor:innen (wie erstelle ich einen Link) als auch an Entwickler:innen (was muss meine Applikation dafür tun). Nicht zu verwechseln mit den Preview-URLs der Vorproduktionsumgebung: jene binden deine Vorschau-Umgebung in den Inhaltseditor ein, ein Draft-Link zeigt einen einzelnen Inhalt auf der produktiven Webseite.
Warum es sie gibt
Was in Flyo offline ist, verlässt Flyo nicht. Ein Inhalt, der nicht publiziert ist, wird gar nicht erst an eine Integration ausgeliefert. Er steht in keinem Index, hat keine URL und ist über die Entities-Endpunkte nicht auffindbar. Das ist so gewollt und ändert sich nicht.
Genau deshalb fehlte bisher etwas: der ganz normale Fall, jemandem einen noch unpublizierten Artikel zum Gegenlesen zu schicken. Ein Draft-Link löst das, ohne die Regel aufzuweichen: er liefert eine Momentaufnahme des Inhalts aus, adressiert über ein Token, das niemand erraten kann, und läuft von selbst ab.
Voraussetzungen
Ein Draft-Link führt auf die Detailseite deines Inhaltstyps. Damit einer erstellt werden kann, muss also beides zutreffen:
- Mindestens eine Nitro CMS Integration ist als online markiert und hat eine Domain hinterlegt.
- Für den betreffenden Inhaltstyp ist eine Route definiert, zum Beispiel
/news/{entity_unique_id}/{entity_slug}.
Fehlt eines davon, gibt es keine Adresse, auf die der Link zeigen könnte, und der Knopf bleibt dann ohne Funktion und weist darauf hin.
Wie ein Link entsteht
Im Inhalt selbst: Solange der Inhalt offline ist, steht anstelle des Knopfes Ansehen der Knopf Draft-Link erzeugen. Im Dialog vergibst du eine Bezeichnung, wählst die Webseite und die Gültigkeit und erstellst den Link. Standard sind drei Wochen, mehr als zwei Monate sind nicht möglich. Die Bezeichnung ist frei wählbar und dient nur der Übersicht in Flyo; lässt du sie leer, trägt der Link den Namen der Webseite.
Beim Erstellen passiert Folgendes:
- Der aktuelle Stand der Inhaltsfelder wird eingefroren. Spätere Änderungen am Inhalt sind im Link nicht sichtbar: wer den Link öffnet, sieht den Stand von damals. Für einen neueren Stand erstellst du einen neuen Link.
- Es wird ein Token erzeugt, das im URL die Stelle von Unique-ID und Slug einnimmt.
- Der Link wird fix mit einer Integration verbunden, nämlich der gewählten. Das Token löst nur auf jener Webseite auf: auch eine zweite Webseite derselben Organisation antwortet darauf mit einem 404.
Ein Link kann jederzeit vorzeitig entfernt werden. Er hört dann sofort auf zu funktionieren.
Wurde der Inhalt nach dem Erstellen bearbeitet, weist der Dialog darauf hin. Über Aktualisieren holst du die Momentaufnahme auf den aktuellen Stand, ohne dass sich die Adresse ändert. Das Ablaufdatum bleibt dabei bestehen.
Der Link sieht so aus, wobei {token} für das erzeugte Token steht:
https://deine-domain.ch/news/{token}/{token}Mehrsprachige Webseiten
Ist die Integration mehrsprachig konfiguriert, entsteht pro Sprache eine eigene Adresse, weil sowohl die Route als auch der Slug pro Sprache definiert sind. Der Dialog listet sie alle auf, sodass du der reviewenden Person direkt die Adresse in ihrer Sprache schicken kannst. Es ist derselbe Link, nur unter der jeweiligen Sprachroute:
https://deine-domain.ch/de/story/{token}
https://deine-domain.ch/en/story/{token}Mehrere Webseiten
Liefert derselbe Inhaltstyp an mehrere Nitro CMS Webseiten aus, wählst du beim Erstellen aus, welche gemeint ist. Es entsteht bewusst nicht automatisch auf jeder Webseite eine Adresse: ein Draft-Link ist öffentlich erreichbar, sobald jemand ihn hat, und wo er entsteht, sollst du selbst bestimmen. Brauchst du zwei Webseiten, erstellst du zwei Links, jeder mit eigener Bezeichnung, eigener Gültigkeit und einzeln entfernbar. Gibt es nur eine mögliche Webseite, fällt die Auswahl weg.
Was deine Applikation dafür können muss
Die eine echte Einschränkung
Das Token ist kein Slug und keine Unique-ID im gewohnten Format. Wenn dein Router die URL-Parameter gegen ein Muster prüft (etwa nur Kleinbuchstaben, oder eine feste Länge), fällt der Draft-Link durch, bevor er je bei Flyo ankommt. Das ist die einzige Stelle, an der du für Draft-Links etwas tun musst.
Reiche den Parameter deiner Detailroute unverändert an Flyo weiter, statt ihn vorher gegen ein enges Muster zu prüfen: Flyo entscheidet, ob dahinter ein publizierter Inhalt, ein Draft oder gar nichts steckt, und antwortet im letzten Fall mit einem 404. Das Token steht sowohl für {entity_unique_id} als auch für {entity_slug}, deine bestehende Detailroute funktioniert also unverändert, solange sie es durchlässt.
Ansonsten ist nichts zu tun: Du fragst den Inhalt über dieselben Endpunkte ab wie immer, mit deinem Produktions-Token.
GET /entities/uniqueid/{uniqueid}
GET /entities/slug/{slug}Nur Produktions-Tokens
Ein Development-Token löst Draft-Links nicht auf. Eine Vorproduktionsumgebung sieht unpublizierte Inhalte ohnehin und ist in der Regel zusätzlich durch ein eigenes Gateway geschützt.
Beim Slug-Endpunkt lässt du den Parameter typeId weg, wenn du ein Draft-Token abfragst: das Token ist kein Slug, auf den ein Typ-Filter passen würde.
Woran du einen Draft erkennst
Die Antwort enthält zwei zusätzliche Felder. Beide sind immer vorhanden, auch bei ganz normalen Abfragen, du brauchst also keine Existenzprüfung:
{
"entity": { "…": "…" },
"model": { "…": "…" },
"is_draft": true,
"draft_expires_at": 1774000000
}| Feld | Bedeutung |
|---|---|
is_draft | true, wenn die Antwort aus einem Draft-Link stammt. Bei publizierten Inhalten immer false. |
draft_expires_at | Unix-Timestamp, an dem der Link aufhört zu funktionieren. Bei publizierten Inhalten null. |
Damit kannst du im Frontend einen Hinweis einblenden, denn die Person, die den Link geöffnet hat, sieht sonst nicht, dass sie einen Entwurf und nicht die Live-Seite vor sich hat:
if (response.is_draft) {
// z.B. ein Banner: "Vorschau: dieser Inhalt ist noch nicht veröffentlicht."
}Zwei weitere Dinge sind an der Antwort erwähnenswert:
entity.entity_unique_idundentity.entity_slugenthalten das Token, nicht die echten Werte. Wenn deine Seite aus der Antwort heraus weiterverlinkt, bleibt sie damit im Draft, statt bei der nächsten Navigation ins Leere zu laufen.entity.is_visibleistfalse. Ein Draft ist der Offline-Zustand eines Inhalts und gibt sich nicht als etwas anderes aus.
Was ein Draft-Link nicht tut
- Er erscheint nicht in der Sitemap und nicht in der Suche. Beide lesen den Index, in den ein offline Inhalt gar nie gelangt. Ein Draft-Link wird also nicht zufällig gefunden und nicht indexiert.
- Er zeigt keine Änderungen an, die nach dem Erstellen gemacht wurden. Der Inhalt ist eingefroren. Die Darstellung dagegen nicht: Änderst du das Mapping oder eine Route in der Integration, wirkt sich das auch auf bestehende Draft-Links aus.
- Er überlebt das Publizieren nicht. Sobald der Inhalt online geht, ist er unter seiner richtigen URL erreichbar; die Draft-Links darauf werden entfernt, damit keine eingefrorene Kopie neben der Live-Seite stehen bleibt. Dasselbe gilt, wenn der Inhalt in den Papierkorb wandert.
Ablauf und Aufräumen
Jeder Link hat ein Ablaufdatum, das ist nicht optional. Nach Ablauf antwortet dieselbe URL mit einem 404 wie jede unbekannte Entität. Ein nächtlicher Lauf räumt abgelaufene Links weg und benachrichtigt die Person, die den Link erstellt hat. In der Meldung steht auch, ob der Link überhaupt je geöffnet wurde. Ein Link, den nie jemand gebraucht hat, muss beim nächsten Mal vielleicht gar nicht erst erstellt werden.

