Was ist die Flyo Import Integration?
Die Flyo Import Integration dient dazu, Inhalte automatisiert aus externen Quellen in das Flyo System zu importieren. Typische Quellen sind JSON-APIs oder veröffentlichte CSV-Dateien.
Der wichtigste Zweck dieser Integration ist nicht nur der einmalige Import, sondern die laufende Synchronisation. Wenn sich die Quelldaten ändern, kann Flyo bestehende Inhalte wiedererkennen, Änderungen übernehmen und je nach Konfiguration auch Vorschläge für Aktualisierungen erzeugen.
Damit das zuverlässig funktioniert, muss jeder Datensatz aus der Quelle eindeutig identifizierbar sein. Flyo verwendet dafür einen stabilen Quell-Identifier, der im Mapping auf source_id gelegt wird. Nur so kann Flyo erkennen, ob ein Datensatz neu ist, geändert wurde oder unverändert geblieben ist.
Allgemeine Anforderungen an die Quelle
Damit eine Quelle mit der Import Integration verwendet werden kann, sollte sie die folgenden Anforderungen erfüllen:
- Die Quelle muss über eine
https://-URL erreichbar sein. Verlangt sie eine Anmeldung, hinterlegst du diese als Zugangsdaten und eigene Header. - Die URL muss beim Abruf erfolgreich antworten.
- Als Format werden insbesondere
CSVundJSONunterstützt. - Die Struktur der Daten muss konsistent sein, damit Flyo Spalten und Werte sauber zuordnen kann.
- Jeder Datensatz muss ein eindeutiges und stabiles Identifier-Feld enthalten.
Dieser Identifier ist besonders wichtig. Er darf sich für denselben Datensatz nicht bei jedem Export ändern. Geeignet sind zum Beispiel externe IDs, ERP-IDs, Event-IDs, Produktnummern oder andere dauerhafte Schlüssel aus dem Quellsystem.
Anforderungen an die Struktur
Für alle Quellen gilt:
- Jeder Datensatz muss als eigenständige Zeile oder als eigenes Objekt vorliegen.
- Alle Datensätze sollten dieselbe Grundstruktur haben.
- Pflichtfelder sollten nicht nur gelegentlich, sondern möglichst durchgehend vorhanden sein.
- Leere oder wechselnde Spaltennamen erschweren den Import und sollten vermieden werden.
Für CSV gilt zusätzlich:
- Die erste Zeile sollte eine Header-Zeile mit klaren Spaltennamen enthalten.
- Eine dieser Spalten muss den eindeutigen Identifier enthalten.
- Die Datei sollte als vollständiger Export der gewünschten Datensätze bereitgestellt werden.
Für JSON gilt zusätzlich:
- Die Daten sollten als Liste von Objekten bereitgestellt werden.
- Jedes Objekt sollte dieselben zentralen Keys enthalten.
Anforderungen an den Identifier
Der Identifier muss:
- pro Datensatz eindeutig sein,
- dauerhaft stabil bleiben,
- nicht zufällig pro Export neu erzeugt werden,
- für denselben Eintrag immer denselben Wert liefern.
Flyo mappt diesen Wert auf source_id. Fehlt dieser Wert oder ändert er sich laufend, kann Flyo Datensätze nicht mehr korrekt verfolgen.
Pagination
Wenn die Quelle viele Datensätze enthält, sollte die Bereitstellung vorab sauber geplant werden:
- Bei
JSONkann Pagination verwendet werden. - Empfohlen sind HTTP-
Link-Header mitrel="next", damit Folgeseiten automatisch geladen werden können. - Die Pagination sollte stabil aufgebaut sein und keine Endlosschleifen erzeugen.
- Bei
CSVist in der Regel ein vollständiger Export über eine einzelne URL sinnvoller als Pagination.
Beispiel für einen Link-Header:
Link: <https://example.org/api/items?page=2>; rel="next"Geschützte Quellen: Zugangsdaten und eigene Header
Nicht jede Quelle ist öffentlich. Verlangt sie einen Schlüssel, ein Token oder einen Benutzernamen mit Passwort, brauchst du dafür zwei Dinge:
- Zugangsdaten: die eigentlichen Geheimnisse. Sie werden verschlüsselt gespeichert und verlassen den Server nie wieder.
- Eigene Header: die Angaben, die Flyo bei jedem Abruf mitschickt. Sie enthalten nicht das Geheimnis selbst, sondern nur einen Platzhalter auf einen der hinterlegten Werte.
Diese Trennung ist Absicht: Die Header-Konfiguration gehört zur Integration und ist in der Konsole lesbar, das Geheimnis dahinter nicht.
Zugangsdaten hinterlegen
Im Schritt Quelle des Import-Assistenten findest du unter der API-Adresse das Feld Zugangsdaten. Über den grünen +-Knopf daneben legst du neue an:
- Bezeichnung: ein frei wählbarer Name, an dem du den Eintrag später wiedererkennst, zum Beispiel «Stellenportal Produktiv».
- Name des Werts: der Name, unter dem du den Wert anschliessend im Header ansprichst, zum Beispiel
apikey. Erlaubt sind Buchstaben, Zahlen, Punkt, Bindestrich und Unterstrich, maximal 64 Zeichen. - Wert: das Geheimnis selbst, also der Schlüssel, das Token oder das Passwort.
Über Weiteren Wert hinzufügen hinterlegst du mehrere Werte in einem Eintrag, zum Beispiel user und password. Pro Eintrag sind bis zu 20 Werte möglich.
Nach dem Speichern sind nur noch die Namen der Werte sichtbar, die Werte selbst werden nie mehr angezeigt, weder in der Konsole noch über die API.
Zugangsdaten sind eine Verbindung und können von mehreren Import-Integrationen genutzt werden. Unter Einstellungen → Verbindungen → Integrationen erscheinen sie mit dem Typ «Import» und lassen sich dort umbenennen oder löschen. Löschen geht erst, wenn keine Integration sie mehr verwendet.
Wert ändern
Ein bereits gespeicherter Wert kann in der Konsole aktuell nicht bearbeitet werden. Um einen Schlüssel zu wechseln, legst du neue Zugangsdaten an und wählst sie in der Integration aus.
Header konfigurieren
Unterhalb der Zugangsdaten fügst du mit Header hinzufügen so viele Zeilen hinzu, wie die Quelle verlangt. Jede Zeile besteht aus Name und Wert:
- Name ist der HTTP-Header, zum Beispiel
AuthorizationoderX-Api-Key. - Wert ist das, was gesendet wird. Ein Platzhalter der Form
{{name}}wird dabei serverseitig durch den gespeicherten Wert aus den gewählten Zugangsdaten ersetzt.
Typische Beispiele:
| Name | Wert | Wofür |
|---|---|---|
Authorization | Bearer {{apikey}} | Token-Zugriff, der häufigste Fall |
X-Api-Key | {{apikey}} | Quellen mit eigenem Schlüssel-Header |
Authorization | Basic {{basic}} | Benutzername und Passwort |
Accept | application/json | fester Wert, ganz ohne Zugangsdaten |
Bei Basic erwartet die Quelle den bereits kodierten Wert von benutzer:passwort. Diesen hinterlegst du als einen Wert in den Zugangsdaten, Flyo kodiert nicht selbst.
Unter der Header-Liste zeigt die Konsole an, welche Namen aus den gewählten Zugangsdaten zur Verfügung stehen. Ist noch nichts ausgewählt, steht dort ein Hinweis darauf.
Es gelten folgende Grenzen:
- maximal 20 Header pro Integration,
- maximal 4096 Zeichen pro Wert,
- keine Zeilenumbrüche in einem Wert,
- die Header
Host,Content-Length,Transfer-Encoding,Connectionsowie alles, was mitProxy-beginnt, werden von der Verbindung selbst gesetzt und sind nicht konfigurierbar.
Die Header gelten auch für die Vorschau und die Simulation im Assistenten. Eine geschützte Quelle lässt sich damit vollständig testen, bevor die Integration gespeichert wird.
Was gespeichert wird und was nicht
- Die Werte der Zugangsdaten werden pro Organisation verschlüsselt abgelegt. Die API gibt ausschliesslich ihre Namen heraus, nie die Werte.
- In der Header-Konfiguration steht nur der Platzhalter. Erst unmittelbar vor dem Abruf setzt der Server den Klartext ein.
- Die Header reisen nur mit, solange der Abruf auf demselben Ursprung wie die konfigurierte Adresse bleibt, also gleiches Protokoll, gleicher Host und gleicher Port. Antwortet die Quelle mit einer Weiterleitung auf einen anderen Host, auf
http://oder auf einen anderen Port, wird die Weiterleitung zwar verfolgt, die Header werden dabei aber nicht mitgeschickt. Dasselbe gilt für die Folgeseiten einerLink-Pagination. - Nennt ein Header einen Wert, den die gewählten Zugangsdaten nicht enthalten, wird er nicht leer gesendet. Der Import bricht stattdessen mit einem Hinweis im Protokoll ab, denn ein leeres
Authorization: Bearerführt nur zu einem 401, den niemand deuten kann.
Anforderungen an JSON-Quellen
JSON ist das empfohlene Format, wenn Daten strukturiert und flexibel bereitgestellt werden sollen.
Eine gültige JSON-Quelle sollte folgende Anforderungen erfüllen:
- Der oberste JSON-Wert ist ein Array. Verpackt die Quelle die Einträge in ein Objekt, gibst du den Pfad zu den Einträgen an.
- Das Array ist nicht leer.
- Jeder Eintrag im Array ist ein Objekt.
- Das erste Objekt enthält bereits die relevanten Keys, damit Flyo die Struktur erkennen kann.
- Jedes Objekt enthält ein stabiles ID-Feld für das Mapping auf
source_id.
Nicht geeignet sind zum Beispiel:
- ein leeres Array
[], - ein Array mit primitiven Werten wie
["a", "b"], - ein einzelnes Objekt statt einer Liste von Datensätzen.
Beispiel für ein gültiges JSON:
[
{
"id": "1001",
"title": "Sommerfestival",
"starts_at": "2026-08-10T18:00:00.000Z",
"image": "https://cdn.example.org/images/festival.jpg"
},
{
"id": "1002",
"title": "Herbstmarkt",
"starts_at": "2026-10-12T09:30:00.000Z",
"image": "https://cdn.example.org/images/markt.jpg"
}
]Empfohlene Content-Types für JSON:
application/jsontext/json
Einträge in einem verschachtelten JSON
Standardmässig erwartet Flyo, dass die Antwort selbst die Liste der Datensätze ist. Viele APIs verpacken die Liste aber in ein Objekt und stellen Zusatzangaben daneben:
{
"count": 12,
"page": 1,
"data": [
{ "id": "1001", "title": "Sommerfestival" },
{ "id": "1002", "title": "Herbstmarkt" }
]
}Für solche Quellen gibt es im Schritt Quelle das Feld Pfad zu den Einträgen. Es ist hinter dem Hinweis «Pfad zu den Einträgen angeben» versteckt, weil die meisten Quellen es nicht brauchen. Im Beispiel oben trägst du dort data ein.
Liegt die Liste tiefer, trennst du die Ebenen mit einem Punkt:
{
"status": "ok",
"result": {
"items": [
{ "id": "1001", "title": "Sommerfestival" }
]
}
}Hier lautet der Pfad result.items.
Was du sonst noch wissen solltest:
- Alles ausserhalb des Pfads wird ignoriert. Angaben wie
count,pageoderstatusstehen im Mapping nicht zur Verfügung, gemappt werden nur die Felder der einzelnen Einträge. - Das Feld bleibt leer, wenn die Antwort bereits die Liste selbst ist.
- Bei einer
Link-Pagination wird jede Folgeseite mit demselben Pfad ausgepackt. - Auch mit Pfad gelten die Anforderungen an JSON-Quellen: hinter dem Pfad muss eine nicht leere Liste von Objekten stehen.
Geht etwas schief, unterscheidet Flyo bewusst drei Fälle, damit der Fehler im Protokoll lesbar bleibt:
- Der Pfad existiert nicht. Die Meldung nennt die Keys, die in der Antwort tatsächlich vorhanden sind. Meist ein Tippfehler oder eine Ebene zu viel.
- Der Pfad existiert, enthält aber nichts. Das passiert typischerweise, wenn die Quelle einen Fehler in einer ansonsten normalen Antwort meldet, zum Beispiel bei einem ungültigen Schlüssel. Flyo zitiert dazu die Meldung der Quelle, sofern sie eine mitliefert.
- Der Pfad zeigt auf einen einzelnen Wert statt auf eine Liste. Dann stimmt der Pfad, zeigt aber auf die falsche Stelle.
Beispiel: Google Spreadsheet als CSV-Quelle verwenden
Eine einfache Möglichkeit für nicht-technische Teams ist es, Inhalte in Google Sheets zu pflegen und das Spreadsheet als CSV-Quelle für Flyo zu veröffentlichen.
Tabelle vorbereiten
Erstelle in Google Sheets eine Tabelle mit einer klaren Header-Zeile, zum Beispiel:
| id | title | description | image |
|---|---|---|---|
| evt-1001 | Sommerfestival | Open-Air Event im Park | https://example.org/image1.jpg |
| evt-1002 | Herbstmarkt | Markt mit regionalen Produkten | https://example.org/image2.jpg |
Wichtig ist dabei:
- Die Spalte
identhält den stabilen eindeutigen Identifier. - Jede weitere Spalte entspricht einem späteren Mapping-Feld in Flyo.
- Bild- oder Dateispalten sollten direkte
https://-URLs enthalten.
Tabelle veröffentlichen
In Google Sheets:
- Öffne das gewünschte Spreadsheet.
- Wähle
Datei>Freigeben>Im Web veröffentlichen. - Wähle das gewünschte Tabellenblatt.
- Wähle als Format
CSV. - Veröffentliche das Blatt.
Google Sheets erzeugt danach eine öffentliche CSV-URL.
Sie sieht typischerweise so aus:
https://docs.google.com/spreadsheets/d/e/EXAMPLE/pub?gid=0&single=true&output=csvDiese veröffentlichte CSV-URL kann direkt als Import-Quelle in Flyo verwendet werden. Dadurch lassen sich Inhalte auch ohne eigene API automatisiert aus einem Spreadsheet nach Flyo importieren.
Wenn das veröffentlichte Google Sheet aktualisiert wird, kann Flyo die Änderungen beim nächsten Importlauf erkennen und den zugehörigen Inhalt aktualisieren oder als Änderungsvorschlag verarbeiten.
Mehrsprachige Felder importieren
Ist ein Feld der Ziel-Entität als mehrsprachig markiert, speichert Flyo darin nicht einen Wert, sondern einen Wert pro Sprache. Der Import bildet das direkt im Mapping ab: Ein solches Feld erscheint im Schritt Mapping nicht einmal, sondern einmal pro Sprache deiner Organisation, jeweils mit dem Sprachkürzel im Namen.
| Feld in der Entität | Zeilen in der Feld-Zuordnung |
|---|---|
| «Titel», einsprachig | Titel |
| «Titel», mehrsprachig | Titel (DE), Titel (EN) |
Zuoberst steht immer die Hauptsprache deiner Organisation, also jene Sprache, die unter Einstellungen: Sprachen & Zeitzone als Standard markiert ist.
Übersetzungen automatisch befüllen
Die meisten Quellen liefern ihre Inhalte nur in einer Sprache. Dafür gibt es im Schritt Ziel & Einstellungen die Option «Übersetzungen automatisch befüllen». Sie ist standardmässig aktiv.
Ist die Option aktiv, ordnest du nur die Hauptsprache zu. Die übrigen Sprachzeilen lassen sich nicht zuordnen und zeigen stattdessen an, woher ihr Inhalt kommt. Flyo verhält sich dann so:
- Beim Anlegen eines Eintrags wird der Wert der Hauptsprache in alle Sprachen geschrieben. Der Eintrag ist damit in jeder Sprache lesbar, statt in den Übersetzungen leer zu bleiben.
- Bei jeder weiteren Aktualisierung wird nur noch die Hauptsprache überschrieben. Eine Übersetzung, die jemand in Flyo von Hand erfasst hat, bleibt erhalten und wird vom nächsten Importlauf nicht überschrieben.
Ist die Option deaktiviert, ordnest du jede Sprache einzeln zu. Flyo schreibt dann ausschliesslich das, was du zugeordnet hast, und eine Sprachzeile ohne Zuordnung bleibt leer.
Später ergänzte Sprachen
Kommt eine Sprache erst nach dem ersten Import zur Organisation dazu, bleibt sie bei aktiver Option in den bestehenden Einträgen leer, weil eine Aktualisierung nur die Hauptsprache schreibt. Das ist der Preis dafür, nie eine bestehende Übersetzung zu überschreiben. Betrifft es viele Einträge, deaktivierst du die Option und ordnest die neue Sprache einmalig einer Quellspalte zu.
Quelle mit einer Spalte pro Sprache
Liefert die Quelle für jede Sprache eine eigene Spalte, deaktivierst du die Option und ordnest jede Sprachzeile ihrer Spalte zu:
{
"source_id": "evt-1001",
"title_de": "Sommerfestival",
"title_en": "Summer Festival"
}Titel (DE): Quellspaltetitle_deTitel (EN): Quellspaltetitle_en
Quelle mit einem Sprachobjekt
Liefert die Quelle die Sprachen als Objekt innerhalb einer Spalte, ordnest du dieselbe Spalte allen Sprachzeilen zu und holst mit dem Filter «Wert eines Array-Keys» die jeweilige Sprache heraus:
{
"source_id": "evt-1001",
"title": { "de": "Sommerfestival", "en": "Summer Festival" }
}Titel (DE): Quellspaltetitle, Filter «Wert eines Array-Keys» mit dem WertdeTitel (EN): Quellspaltetitle, Filter «Wert eines Array-Keys» mit dem Werten
Das gilt für jeden Feldtyp. Jeder Sprachwert durchläuft dieselbe Verarbeitung wie bei einem einsprachigen Feld: Ein Datum wird als Datum gelesen, eine Bild-URL wird heruntergeladen, und die Anforderungen unter Transformationen und Feldanforderungen gelten unverändert pro Sprache.
Transformationen und Feldanforderungen
Beim Import werden Werte abhängig vom Ziel-Feldtyp verarbeitet. Deshalb sollte die Quelle nicht nur formal korrekt sein, sondern auch inhaltlich passende Werte liefern.
Es gelten dabei einige Grundregeln für alle Feldtypen:
- Leere Werte werden nicht übertragen.
null,""und der Text"null"führen dazu, dass für dieses Feld kein Wert aus der Quelle übernommen wird. Was das bei einer Aktualisierung bedeutet, hängt vom Aktualisierungsmodus ab (siehe unten). 0gilt nicht als leer und wird geschrieben.- Mehrsprachige Felder werden pro Sprache zugeordnet. Wie das aussieht und was die Option «Übersetzungen automatisch befüllen» macht, steht unter Mehrsprachige Felder importieren.
- Mehrere Quellspalten in einem Feld ergeben immer eine Zeichenkette. Wenn du im Mapping mehrere Spalten (oder Spalten und Freitext) zu einem Feld kombinierst, entsteht ein zusammengesetzter Text. Feldtypen, die ein Array oder Objekt erwarten, brauchen darum genau eine Quellspalte.
- Filter im Mapping helfen beim Anpassen der Quellwerte. Zur Verfügung stehen:
Wert eines Array-Keys(z.B.bild.src, um aus einem verschachtelten JSON-Objekt einen Wert zu holen),Zeichenkette teilen(erzeugt aus"a,b,c"ein Array),HTML-Tags entfernen,KürzenundURL-Endung (Slug) generieren. - Ein Datensatz, der die Validierung nicht besteht, wird nicht importiert. Im Protokoll der Integration erscheint eine nach Problem gruppierte Zusammenfassung mit den betroffenen Quell-IDs.
- Inhalte, die es in der Zielorganisation nicht gibt, werden übersprungen statt zu scheitern. Das betrifft heute die benutzerdefinierten Elemente in
wysiwyg-Feldern, die Links im Fliesstext, die auf die Quellorganisation zeigen, und alles in einem HTML-Fragment, was der Editor nicht aufnehmen kann (zum Beispiel ein Bild, für das das Feld kein Elementimagehat). Der Eintrag wird importiert, und das Protokoll zeigt als Hinweis, was weggelassen wurde und bei welchen Quell-IDs.
Aktualisierungsmodus beachten
Werden Änderungen als Vorschlag übernommen (Standard), bleiben die bestehenden Inhalte in Flyo unverändert. Die Werte aus der Quelle landen als Änderungsvorschlag und werden erst durch das Annehmen des Vorschlags aktiv.
Werden Änderungen direkt übernommen, wird der Eintrag vollständig aus dem Mapping neu geschrieben. Das heisst: Ein leerer Wert in der Quelle löscht den bisherigen Inhalt in Flyo, und Felder, die gar nicht im Mapping enthalten sind, werden dabei ebenfalls geleert – auch wenn sie zuvor manuell in Flyo befüllt wurden.
Verwende den direkten Modus darum nur, wenn die Quelle die alleinige Wahrheit für alle Felder der Entität ist. Felder, die redaktionell in Flyo gepflegt werden, gehören in diesem Modus in eine eigene Entität oder es braucht den Vorschlagsmodus.
Feldtypen im Überblick
Die folgende Liste führt zu den Anforderungen des jeweiligen Feldtyps. Was ein Feldtyp in Flyo grundsätzlich macht und wie er konfiguriert wird, ist unter Feldtypen beschrieben – hier geht es ausschliesslich darum, wie der Wert in der Quelle aussehen muss.
text: einzeiliger Texttextarea: mehrzeiliger Textwysiwyg: formatierter Inhalt (HTML oder JSON mit benutzerdefinierten Elementen)slug: URL-Endungnumber: Zahlcheckbox: Ja/Neindropdown: Auswahl aus einer Listeradiolist: Auswahl aus einer Liste (Radiobuttons)checkboxList: Mehrfachauswahldatepicker: Datumdatetimepicker: Datum und Zeitopeninghours: Öffnungszeitenemail: E-Mail-Adressetel: Telefonnummerurl: Webadresselink: Verweis (URL, E-Mail, Telefon oder Datei)youtube: YouTube-Videoaddress: Adresselatlng: Koordinatencolor: Farbeimage: Bildfile: Dateiimages: mehrere Bilderfiles: mehrere Dateienschema: Verknüpfung zu einem Eintragschemas: Verknüpfungen zu mehreren Einträgenschemarow: Verknüpfung zu einem beliebigen Eintragpool: Verknüpfung zu einem Pooljson: freie JSON-Strukturmultipleinputtype: Tabelle mit mehreren Zeilen
Kommen die Einträge aus einer anderen Flyo-Organisation, gilt zusätzlich Import aus einer anderen Flyo-Organisation.
Alle Feldtypen in einem Beispiel
Das folgende JSON zeigt für jeden Feldtyp, wie der Wert in der Quelle aussehen soll. Die Keys sind hier absichtlich nach dem Feldtyp benannt – in einer echten Quelle heissen sie natürlich so, wie es zu deinen Daten passt (title, starts_at, image, …).
{
"source_id": "evt-1001",
"text": "Sommerfestival",
"textarea": "Open-Air Event im Stadtpark.\nEintritt frei.",
"wysiwyg": "<p>Open-Air Event im <strong>Stadtpark</strong>.</p>",
"slug": "sommerfestival-2026",
"number": 500,
"checkbox": 1,
"dropdown": "concert",
"radiolist": "indoor",
"checkboxList": ["music", "family"],
"datepicker": "2026-12-30",
"datetimepicker": "2026-12-30T18:00:00.000Z",
"openinghours": {
"regular": [{ "weekday": 1, "t1": "09:00", "t2": null, "t3": null, "t4": "18:00" }],
"specials": []
},
"email": "info@example.org",
"tel": "+41791234567",
"url": "https://example.org/programm",
"link": "https://example.org/tickets",
"youtube": "https://www.youtube.com/watch?v=xTJOOj51Aug",
"address": "Bahnhofstrasse 102, 5000 Aarau",
"latlng": { "lat": 47.3925, "lng": 8.0442 },
"color": "#FF6600",
"image": "https://cdn.example.org/images/festival.jpg",
"file": "https://example.org/dokumente/programmheft.pdf",
"images": [1042, 1043],
"files": [1044],
"schema": 512,
"schemas": "512,513,514",
"schemarow": 512,
"pool": 7,
"json": { "capacity": 500, "tags": ["open-air"] },
"multipleinputtype": [{ "stage": "Bühne A", "capacity": 250 }]
}text
Erwartet eine einzeilige Zeichenkette.
- HTML-Tags werden entfernt.
- Sonderzeichen werden anschliessend HTML-kodiert. Ein
&bleibt dabei als&erhalten. - Reiner Plain Text ist als Quelle am zuverlässigsten.
{ "text": "Sommerfestival im Stadtpark" }textarea
Wie text, Zeilenumbrüche (\n) bleiben erhalten.
{ "textarea": "Open-Air Event im Stadtpark.\nEintritt frei." }wysiwyg
Ein WYSIWYG-Feld kann auf zwei Arten befüllt werden.
Als HTML-Fragment (Zeichenkette). Das ist die passende Form für CSV-Quellen und für alle Quellen, die nur formatierten Text liefern. Flyo baut daraus beim Import das Dokument des Editors, damit der Eintrag im Editor genau so aussieht wie auf der Webseite.
{ "wysiwyg": "<p>Open-Air Event im <strong>Stadtpark</strong>.</p>" }Übernommen wird, was der Editor kann: Absätze, Überschriften, Listen, Zitate, Codeblöcke, Trennlinien, fett, kursiv, durchgestrichen und Links. Bilder und Videos gehen in die benutzerdefinierten Elemente des Zielfelds:
| Im HTML | Wird übernommen in das Element | Voraussetzung |
|---|---|---|
<img src="https://…"> | image, das Bild wird heruntergeladen | Element image mit der Eigenschaft src, optional alt |
<iframe> mit einem YouTube-Video | youtube | Element youtube mit der Eigenschaft src |
<iframe> mit dem Vimeo-Player | vimeo | Element vimeo mit der Eigenschaft src |
Die Vorlagen «Bild», «YouTube» und «Vimeo» der benutzerdefinierten Elemente erfüllen diese Voraussetzungen. Was der Editor nicht aufnehmen kann, wird weggelassen: Bilder und Videos ohne passendes Element, andere eingebettete Inhalte (iframes anderer Dienste, <video>, SVG), Bilder ohne vollständige Webadresse, Farben, Schriftgrössen, Klassen und Inline-Styles. Der Text bleibt dabei immer erhalten, eine Tabelle zum Beispiel als Absätze. Das Protokoll der Integration führt als Hinweis auf, was bei welchen Quell-IDs weggelassen wurde, damit du siehst, welche Elemente sich einzurichten lohnen. Die Einzelheiten stehen unter Inhalte, die als HTML ankommen.
Als Objekt mit html und json. Genau diese Form liefert eine andere Flyo-Organisation über ihr API SDK oder über Nitro CMS. Flyo importiert dann den JSON-Teil und übernimmt dabei auch die benutzerdefinierten Elemente, also zum Beispiel eine Bildergalerie oder eine Info-Box mitten im Text. So lassen sich Blogbeiträge oder Magazin-Artikel von einer Organisation in eine andere übernehmen, ohne dass die Elemente unterwegs verloren gehen.
{
"wysiwyg": {
"html": "<p>Open-Air Event im <strong>Stadtpark</strong>.</p>",
"json": {
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [{ "type": "text", "text": "Open-Air Event im Stadtpark." }]
},
{
"type": "gallery",
"attrs": {
"images": [
{ "source": "https://storage.flyo.cloud/img1_0ae75102.png", "caption": null, "name": "img1.png" }
],
"lightbox": true
}
}
]
}
}
}Der mitgelieferte html-Teil wird nicht weiterverwendet, sondern nach dem Import aus dem JSON neu erzeugt, und zwar mit den HTML-Vorlagen der importierenden Organisation. Die beiden Seiten müssen ihre Elemente also nicht gleich darstellen.
Voraussetzungen für benutzerdefinierte Elemente
Damit ein Element übernommen wird, müssen auf beiden Seiten übereinstimmen:
- Der Elementname (im JSON der
typedes Knotens), zum Beispielgalleryhier wie dort. - Die Identifier der Eigenschaften, zum Beispiel
imagesundlightbox. - Der Feldtyp der Eigenschaft muss zum gelieferten Wert passen.
Alles andere darf abweichen: Bezeichnung, Reihenfolge, Icon und HTML-Vorlage des Elements, und die importierende Organisation darf mehr oder weniger Eigenschaften definiert haben als die Quelle.
Was nicht übernommen wird
Alles, was es in der importierenden Organisation nicht gibt, wird weggelassen. Der Eintrag selbst wird trotzdem importiert. Im Protokoll der Integration erscheint am Ende des Laufs eine nach Grund gruppierte Übersicht mit den betroffenen Quell-IDs, damit du siehst, welche Elemente sich einzurichten lohnen.
| Fall | Verhalten |
|---|---|
| Das Element gibt es hier nicht | Das Element wird samt seinem Inhalt weggelassen |
| Die Eigenschaft gibt es im Element hier nicht | Nur die Eigenschaft wird weggelassen, das Element bleibt |
| Die Eigenschaft gibt es hier, die Quelle liefert sie nicht | Die Eigenschaft bleibt leer |
| Der Feldtyp passt nicht zum gelieferten Wert | Die Eigenschaft wird weggelassen |
| Die Quelle liefert einen Dropdown-Schlüssel, den es hier nicht gibt | Die Eigenschaft wird weggelassen |
| Die Eigenschaft verweist auf einen Eintrag oder einen Pool der Quellorganisation | Die Eigenschaft wird weggelassen |
| Ein Link in einer Eigenschaft zeigt auf eine Seite, einen Eintrag oder eine Datei der Quellorganisation | Der Link wird weggelassen, Links auf Webadressen, E-Mail und Telefon bleiben |
| Ein Link im Fliesstext zeigt auf eine Seite, einen Eintrag oder eine Datei der Quellorganisation | Der Link wird entfernt, der verlinkte Text bleibt stehen |
Ein Link auf eine Seite oder einen Eintrag der Quelle ist eine Adresse innerhalb der Quell-Webseite und würde in deiner Webseite ins Leere führen, eine verlinkte Datei liegt in der Dateiverwaltung der Quelle. Soll der Beitrag bei dir auf denselben Inhalt verweisen, setze den Link nach dem Import neu.
Feldtypen der Eigenschaften
Für jeden Feldtyp, den ein Element als Eigenschaft haben kann, ist festgelegt, wie der gelieferte Wert übernommen wird:
| Feldtyp | Übernahme |
|---|---|
text, textarea, number, checkbox, slug, color, email, tel, url, youtube | Unverändert |
datepicker, datetimepicker | Der gelieferte Zeitstempel wird in das gespeicherte Datumsformat überführt |
dropdown, radiolist | Der gelieferte Schlüssel muss hier als Option konfiguriert sein, sonst wird die Eigenschaft weggelassen |
image, file, images, files | Die Datei wird heruntergeladen und hier abgelegt, siehe unten |
link | Webadresse, E-Mail und Telefon werden übernommen. Ein Link auf eine Seite, einen Eintrag oder eine Datei der Quellorganisation wird weggelassen |
multipleinputtype | Zeile für Zeile, jedes Unterfeld nach der Regel seines Feldtyps |
schema, schemas, schemarow, pool | Nicht möglich, der Wert ist eine ID der Quellorganisation. Die Eigenschaft wird weggelassen |
Bilder und Dateien in Elementen
Bilder und Dateien innerhalb eines Elements werden heruntergeladen und in der Dateiverwaltung der importierenden Organisation abgelegt, genau wie beim Feldtyp image. Eine identische Datei (gleiche Prüfsumme) wird wiederverwendet. Das gilt auch für Mehrfach-Eigenschaften wie eine Galerie, anders als beim Feldtyp images auf Feldebene. Schlägt ein Download fehl, wird nur dieses eine Bild weggelassen.
In Flyo gibt es keine freistehenden Bilder im Text: Ein Bild ist immer ein benutzerdefiniertes Element, standardmässig die Vorlage «Bild» mit den Eigenschaften src und alt. Ein Bild aus der Quelle findet sein Gegenstück deshalb über den Elementnamen image, ein YouTube-Video über youtube und ein Vimeo-Video über vimeo. Das gilt für ein Dokument aus einer anderen Flyo-Organisation genauso wie für ein HTML-Fragment.
slug
Erwartet eine URL-taugliche Zeichenkette (Kleinbuchstaben, Bindestriche, keine Leerzeichen und Sonderzeichen). Der Wert wird unverändert übernommen.
Liefert die Quelle nur einen Titel, verwende im Mapping den Filter URL-Endung (Slug) generieren: aus Sommerfestival 2026 wird damit sommerfestival-2026.
Ist das Feld als eindeutig konfiguriert, muss der Wert über alle Einträge hinweg eindeutig sein.
{ "slug": "sommerfestival-2026" }number
Erwartet einen numerischen Wert. Verwende keine Tausendertrennzeichen und als Dezimaltrenner einen Punkt. Bei der Ausgabe wird der Wert als Ganzzahl geliefert, Dezimalstellen werden abgeschnitten.
{ "number": 500 }checkbox
Erwartet 1 (angewählt) oder 0 (nicht angewählt). In JSON funktionieren auch die booleschen Werte true und false.
Werte wie "ja", "yes" oder "wahr" werden nicht erkannt und führen zu einem Validierungsfehler.
{ "checkbox": 1 }dropdown
Erwartet genau einen der im Feld konfigurierten Options-Schlüssel – nicht die angezeigte Bezeichnung. Ist im Feld z.B. der Schlüssel concert mit der Bezeichnung «Konzert» konfiguriert, muss die Quelle concert liefern.
{ "dropdown": "concert" }radiolist
Identisch zu dropdown: genau ein konfigurierter Options-Schlüssel.
{ "radiolist": "indoor" }checkboxList
Erwartet ein Array von konfigurierten Options-Schlüsseln. Nicht konfigurierte Schlüssel werden ignoriert.
Bei einer CSV-Quelle (oder einer Textspalte in JSON) liefere die Schlüssel kommagetrennt und verwende im Mapping den Filter Zeichenkette teilen mit dem Separator ,.
{ "checkboxList": ["music", "family"] }datepicker
Datumswerte sollten im Format YYYY-MM-DD geliefert werden. Der Wert wird in dieses Format überführt und ohne Zeitanteil gespeichert.
WARNING
Ein rein numerischer Wert wird als Unix-Timestamp interpretiert. 20261230 ergibt darum kein Datum im Jahr 2026, sondern den Zeitpunkt dieses Timestamps. Liefere Datumswerte immer mit Bindestrichen.
{ "datepicker": "2026-12-30" }datetimepicker
Datums- und Zeitwerte sollten im ISO-8601-Format geliefert werden. Der Wert wird in UTC umgerechnet und als YYYY-MM-DDTHH:MM:SS.mmmZ gespeichert.
- Mit Zeitzonenangabe (
Zoder+02:00) ist der Wert eindeutig – das ist die empfohlene Variante. - Ohne Zeitzonenangabe (
2026-12-30 18:00:00) wird der Wert als Zeit inEurope/Zurichinterpretiert und entsprechend nach UTC verschoben. - Ein rein numerischer Wert wird als Unix-Timestamp interpretiert.
{ "datetimepicker": "2026-12-30T18:00:00.000Z" }openinghours
Erwartet ein Objekt mit den Schlüsseln regular (reguläre Woche) und specials (datumsbasierte Ausnahmen). Nur aus einer JSON-Quelle sinnvoll importierbar.
Bei regular gilt: weekday von 1 (Montag) bis 7 (Sonntag), t1/t4 sind Öffnung und Schliessung, t2/t3 optional Beginn und Ende der Mittagspause (null = keine Pause). Nur geöffnete Tage werden aufgeführt.
Bei specials beschreibt jeder Eintrag einen Sondertag oder einen Datumsbereich:
| Feld | Typ | Hinweis |
|---|---|---|
label | string | Pflicht. Kurze Bezeichnung, z.B. "Feiertag" |
start_date | string | Pflicht. Datum YYYY-MM-DD |
end_date | string | Pflicht. Datum YYYY-MM-DD, bei einem einzelnen Tag identisch zu start_date |
closed | boolean | true = ganzer Tag geschlossen |
periods | array | Pflicht. Liste der Öffnungsspannen, bei closed: true ein leeres Array |
periods[].open | string | Zeit HH:mm |
periods[].close | string | Zeit HH:mm |
note | string|null | Optionale Bemerkung |
Einträge in specials ohne gültiges start_date und end_date im Format YYYY-MM-DD werden verworfen.
{
"openinghours": {
"regular": [
{ "weekday": 1, "t1": "09:00", "t2": "12:00", "t3": "14:00", "t4": "18:00" },
{ "weekday": 3, "t1": "09:00", "t2": null, "t3": null, "t4": "18:00" }
],
"specials": [
{
"label": "Heiligabend",
"start_date": "2026-12-24",
"end_date": "2026-12-24",
"closed": false,
"periods": [{ "open": "09:00", "close": "13:00" }],
"note": "Nur vormittags geöffnet"
}
]
}
}email
Erwartet eine E-Mail-Adresse als Zeichenkette. Der Wert wird unverändert übernommen.
{ "email": "info@example.org" }tel
Erwartet eine Telefonnummer als Zeichenkette. Der Wert wird unverändert übernommen. Empfohlen ist das internationale Format ohne Leerzeichen.
{ "tel": "+41791234567" }url
Erwartet eine Webadresse. Fehlt das Schema, wird automatisch https:// ergänzt: aus www.example.org wird https://www.example.org. Anschliessend muss der Wert eine gültige URL sein, internationalisierte Domainnamen (IDN) sind erlaubt.
{ "url": "https://example.org/programm" }link
Erwartet eine Zeichenkette. Flyo erkennt automatisch, um welche Art von Verweis es sich handelt:
| Quellwert | erkannter Typ |
|---|---|
mailto:info@example.org oder info@example.org | email |
tel:+41791234567 oder +41 79 123 45 67 | tel |
alles andere, z.B. example.org/tickets | url (mit ergänztem https://) |
Als Telefonnummer wird ein Wert erkannt, der nur aus Ziffern und den Zeichen +, Leerzeichen, (, ), /, . und - besteht. Das Linkziel ist bei der automatischen Erkennung immer _self.
Alternativ kannst du aus einer JSON-Quelle ein vollständiges Link-Objekt liefern. Es wird unverändert übernommen:
{ "link": { "type": "url", "target": "_blank", "value": "https://example.org/tickets" } }Erlaubte Werte für type sind url, email, tel, file, nitropagelink und nitrodetaillink, für target _self, _blank, _parent und _top. Bei type: "file" muss value die ID einer bereits in Flyo vorhandenen Datei sein.
youtube
Erwartet eine YouTube-URL. Sowohl die watch- als auch die embed-Variante funktioniert – bei der Ausgabe wird /watch?v= automatisch zu /embed/.
{ "youtube": "https://www.youtube.com/watch?v=xTJOOj51Aug" }address
Adresswerte werden als einzeiliger Freitext geliefert und automatisch in die strukturierten Einzelteile street, street_nr, zip und city aufgeteilt.
Das erwartete Format ist:
<Strasse> [<Hausnummer>], [<PLZ>] <Ort>Strasse und Ortsteil werden durch ein Komma getrennt. Die Hausnummer ist optional und wird als letzter numerischer Teil des Strassenabschnitts erkannt. Die PLZ ist ebenfalls optional und muss, wenn vorhanden, am Anfang des Ortsteils stehen.
Folgende Formate werden korrekt erkannt:
| Eingabe | street | street_nr | zip | city |
|---|---|---|---|---|
Bahnhofstrasse 102, 5000 Aarau | Bahnhofstrasse | 102 | 5000 | Aarau |
Bahnhofstrasse 102, Aarau | Bahnhofstrasse | 102 | (leer) | Aarau |
Bahnhofstrasse, Aarau | Bahnhofstrasse | (leer) | (leer) | Aarau |
Hinter dem Hof 4, Aarau | Hinter dem Hof | 4 | (leer) | Aarau |
Sagenhofstrasse, 53, 6030 Ebikon | Sagenhofstrasse | 53 | 6030 | Ebikon |
, 6002 Luzern | (leer) | (leer) | 6002 | Luzern |
Hausnummern wie 4a, 12-14 oder 12/14 werden ebenfalls unterstützt. Zusätzliche Segmente nach dem Ort (z.B. Ländername) werden ignoriert.
Weitere Punkte:
- Die PLZ muss numerisch sein. Ein nicht numerischer Wert führt zu einem Validierungsfehler.
- Die Koordinaten werden aus PLZ, Ort, Strasse und Hausnummer automatisch ermittelt.
- Aus einer JSON-Quelle kannst du die Einzelteile auch direkt als Objekt liefern (
street,street_nr,zip,city, optionalcustom_cords,cords_lat,cords_lng). Ein Objekt wird unverändert übernommen und nicht geparst.
{ "address": "Bahnhofstrasse 102, 5000 Aarau" }latlng
Erwartet ein Objekt mit den Schlüsseln lat und lng. Beide Werte müssen gesetzt und numerisch sein – ein einzelner Wert allein führt zu einem Validierungsfehler. Nur aus einer JSON-Quelle importierbar.
{ "latlng": { "lat": 47.3925, "lng": 8.0442 } }color
Erwartet einen Hex-Farbwert. Das führende # ist optional und wird bei der Ausgabe ergänzt, Buchstaben werden in Grossschreibung ausgegeben. Ein achtstelliger Wert mit Alphakanal (#FF6600CC) ist ebenfalls möglich.
{ "color": "#FF6600" }image
Erwartet eine URL, die direkt auf eine Bilddatei zeigt:
- Die URL muss über
https://für Flyo abrufbar sein. - Das Bild wird beim Import heruntergeladen und in der Dateiverwaltung der Organisation abgelegt.
- Ist eine identische Datei (gleiche Prüfsumme) bereits vorhanden, wird sie wiederverwendet – es entstehen keine Duplikate.
- Die Datei muss tatsächlich ein Bild sein.
Ist die URL ungültig oder schlägt der Download fehl, wird der betroffene Datensatz nicht importiert.
{ "image": "https://storage.flyo.cloud/integrationsgruppe-flyowebseite_7a158241.jpg" }file
Wie image, aber für beliebige Dateitypen.
{ "file": "https://example.org/dokumente/programmheft.pdf" }images
WARNING
Für images werden keine URLs heruntergeladen. Erwartet wird ein Array mit IDs von Dateien, die in Flyo bereits vorhanden sind. Ein Import von Bild-URLs in ein Mehrfachbild-Feld ist nicht möglich – verwende dafür mehrere einzelne image-Felder.
Die IDs müssen aus deiner eigenen Organisation stammen, siehe Import aus einer anderen Flyo-Organisation.
{ "images": [1042, 1043] }files
Wie images: ein Array mit IDs von bereits in Flyo vorhandenen Dateien, keine URLs.
{ "files": [1044] }schema
Erwartet die ID eines Eintrags aus der im Feld verknüpften Entität. Die ID muss existieren, sonst wird der Datensatz nicht importiert. Sie muss aus deiner eigenen Organisation stammen, siehe Import aus einer anderen Flyo-Organisation.
{ "schema": 512 }schemas
Erwartet die IDs als kommagetrennte Zeichenkette. Ein JSON-Array führt hier zu einem Fehler. Alle IDs müssen in der verknüpften Entität existieren und aus deiner eigenen Organisation stammen.
{ "schemas": "512,513,514" }schemarow
Erwartet die ID eines Eintrags aus einer beliebigen Entität deiner eigenen Organisation.
{ "schemarow": 512 }pool
Erwartet die ID eines Pools deiner eigenen Organisation.
{ "pool": 7 }json
Erwartet eine freie JSON-Struktur (Objekt oder Array). Aus einer CSV-Quelle kann der Wert auch als JSON-Zeichenkette in einer Spalte geliefert werden.
{ "json": { "capacity": 500, "tags": ["open-air"] } }multipleinputtype
Erwartet ein Array von Objekten – ein Objekt pro Zeile. Die Schlüssel innerhalb einer Zeile entsprechen den Identifiern der im Feld konfigurierten Unterfelder. Nur aus einer JSON-Quelle sinnvoll importierbar.
{
"multipleinputtype": [
{ "stage": "Bühne A", "capacity": 250 },
{ "stage": "Bühne B", "capacity": 120 }
]
}Import aus einer anderen Flyo-Organisation
Liefert eine andere Flyo-Organisation ihre Einträge über ihr API SDK, ist dieser Endpoint für die Import-Integration eine gewöhnliche JSON-Quelle. Zwei Dinge unterscheiden sie von anderen Quellen:
- IDs gelten nur in der Quellorganisation. Einträge, Pools und Dateien haben in deiner Organisation andere IDs. Ein Feld, das eine ID erwartet, lässt sich darum nicht übernehmen.
- Das SDK liefert die Ausgabeform eines Feldes, der Import erwartet die Eingabeform. Für viele Feldtypen ist das dasselbe. Für einige wählst du im Mapping mit dem Filter
Wert eines Array-Keysden passenden Unterschlüssel.
| Feldtyp in deiner Entität | Übernahme aus dem SDK |
|---|---|
text, textarea, slug, number, checkbox, email, tel, url, youtube, color, json | Direkt |
datepicker, datetimepicker | Direkt, das SDK liefert einen Zeitstempel |
wysiwyg | Direkt, benutzerdefinierte Elemente eingeschlossen, siehe wysiwyg |
dropdown, radiolist | Unterschlüssel value |
checkboxList | Unterschlüssel values |
image, file | Unterschlüssel source, die Datei wird heruntergeladen und bei dir abgelegt |
address | Unterschlüssel address, die Adresszeile wird in ihre Einzelteile aufgeteilt |
link | Unterschlüssel href, daraus erkennt Flyo Webadresse, E-Mail oder Telefon. Links auf Seiten, Einträge oder Dateien der Quelle lassen sich nicht übernehmen |
multipleinputtype | Direkt, solange alle Unterfelder Text- oder Zahlenfelder sind. Dateien, Daten und Auswahlwerte liefert das SDK in ihrer Ausgabeform, die der Import nicht als Eingabe akzeptiert |
latlng, openinghours | Nicht möglich, das SDK liefert diese Felder in einer Form, die der Import nicht als Eingabe akzeptiert |
images, files, schema, schemas, schemarow, pool | Nicht möglich, erwartet werden IDs aus deiner Organisation |
Verweise zwischen Einträgen der Quelle, etwa von einem Blogbeitrag auf seinen Autor, lassen sich nicht automatisch nachbilden, auch wenn du beide Entitäten importierst: Der Import weiss nicht, welcher deiner Einträge dem verwiesenen Eintrag der Quelle entspricht. Setze solche Verknüpfungen nach dem Import von Hand.
Allgemeine Empfehlungen für saubere Importe
- Liefere möglichst stabile Feldnamen.
- Verändere die Struktur der Quelle nicht ohne Not.
- Verwende für gemappte Felder keine zufällig generierten Werte.
- Teste neue Quellen zuerst mit einer kleinen Datenmenge.
- Stelle sicher, dass Pflichtwerte nicht leer sind.
So bleibt die Synchronisation zwischen Quelle und Flyo langfristig stabil und nachvollziehbar.

