# DispoLoop – Schnittstelle zur Datenübertragbarkeit, Version 1

Stand: 08.09.2026. Register: https://dispoloop.de/datenexport-technik

Diese unentgeltliche, ausschließlich lesende Schnittstelle dient dem Datenexport durch den aktiven Inhaber eines Unternehmens. Sie ist keine allgemeine Schreib- oder ERP-API. Bei fremden technischen Empfängern kann der Inhaber die exportierte Datei übergeben oder mit info@dispoloop.de einen autorisierten sicheren Übergabeweg vereinbaren. Keine Passwörter weitergeben.

## Aufruf

POST https://europe-west1-b2b-order-saas.cloudfunctions.net/exportTenantData

Content-Type: application/json

Authorization: Bearer <Firebase-ID-Token des angemeldeten Inhabers>

```json
{"data":{"tenantId":"eigene-unternehmens-id","dataset":"customers"}}
```

Alternativ: Firebase Functions SDK, Region `europe-west1`, `httpsCallable(functions, 'exportTenantData')`. Die Authentifizierung wird über die vorhandene Anmeldung vorgenommen. Konto und E-Mail müssen bestätigt/aktiv sein; jede Seite prüft die Inhabermitgliedschaft erneut. Status `trial_expired`, eine Unternehmenssperrung oder ein fehlender/alter AVV sperren diesen gesonderten Herausgabeweg nicht. Eine gesperrte persönliche Mitgliedschaft erlaubt keinen Zugriff; in diesem Fall Identität und Vertretungsmacht über den Support prüfen lassen.

## Antwort und Fortsetzung

```json
{"result":{"dataset":"customers","records":[{"id":"kunde-1","data":{"tenantId":"eigene-unternehmens-id","companyName":"Muster GmbH"}}],"nextCursor":null}}
```

Ist `nextCursor` eine Zeichenkette, denselben Datensatz erneut mit `cursor` gleich diesem Wert abrufen, bis `nextCursor` null ist. Nie Cursor selbst erzeugen. Die Seite umfasst bis zu 50 Datensätze und rund 4 MiB Nutzdaten (ein einzelner größerer Datensatz bleibt vollständig). Der Cursor bezeichnet die letzte übertragene Dokument-ID; leere Folgeseiten sind zulässig. Für `files` bezeichnet der Cursor die nächste Datei. Wiederholte identische Aufrufe sind lesend und erzeugen keine Bestellung, Kündigung oder Löschung.

Verfügbare `dataset`-Werte:

- tenant
- products
- productDetails
- customers
- orders
- orderTemplates
- routes
- customerChangeRequests
- memberships
- teamMembers
- employeeInvitations
- customerAssignments
- orderAssignments
- assignmentHistory
- announcements
- notifications
- auditLogs
- dataProcessingAgreements
- termsAcceptances
- files

Strukturen und Bedeutungen siehe Online-Register. Alle gespeicherten Fachfelder bleiben erhalten, mit ausdrücklich dokumentierten Sicherheitsausnahmen bei Unternehmens-, Mitgliedschafts- und Einladungsdaten. IDs sind Zeichenketten, Beziehungen verweisen auf diese IDs; JSON (RFC 8259), UTF-8, ISO-8601-Zeitstempel in UTC, Kalendertage YYYY-MM-DD. Optionale nicht gespeicherte Felder fehlen. Listen und Objekte bleiben verschachtelt. Original-Vertragsfassungen sind in `contractSnapshot` enthalten; `contentHash` ist SHA-256 des per JSON.stringify serialisierten Originaldokuments.

`files` liefert je Seite eine Brandingdatei als `{id, name, contentType, size, base64}`. `base64` nach RFC 4648 dekodieren und als Binärdatei unter `name` speichern. Bereits vorhandene Dateien größer als das reguläre Uploadlimit von 2 MiB werden über den Support bereitgestellt. Keine fremden Objektpfade übergeben. Der Browser-Gesamtexport bündelt diese Seiten in einer JSON-Datei und beschränkt den Arbeitsspeicher auf ungefähr 100 Millionen JSON-Zeichen; die Schnittstelle selbst hat kein Gesamtmengenlimit. Größere Übergaben können abschnittsweise gespeichert oder mit dem Support koordiniert werden.

## Konsistenz, Fehler und Wiederholung

Ein mehrseitiger Export ist kein über alle Seiten eingefrorener Datenbankstand. Währenddessen veränderte Datensätze können verschiedene Zeitstände haben. Für eine endgültige Migration einen Zeitraum ohne Schreibvorgänge vereinbaren, abschließend erneut exportieren und Vollständigkeit anhand von IDs, Mengen und Zeitangaben abgleichen. DispoLoop unterstützt dies auf Anfrage kostenfrei. Die Zielsoftware muss die Fachfelder selbst zuordnen und eigene Benutzerzugänge anlegen.

Fehler verwenden das Firebase-Callable-Format `error.status` und `error.message`, insbesondere UNAUTHENTICATED, PERMISSION_DENIED, INVALID_ARGUMENT und RESOURCE_EXHAUSTED. Nach temporären Netz-/Serverfehlern dieselbe Seite mit begrenzten Wiederholungen erneut abrufen. Ein Teilergebnis nicht als vollständig kennzeichnen. Das reguläre Kunden-/Bestellportal und andere Unternehmensbereiche werden durch diese Schnittstelle nicht freigeschaltet.
