Das Manifest schreiben

Jedes Feld, was es bedeutet und welche Grenzen gelten — das Manifest ist ein geschlossener Vertrag, unbekannte Felder werden abgelehnt.

Für Entwickler

Voraussetzungen

  • Eigener Server mit HTTPS
  • Erreichbare Datenschutz-, Bedingungs- und Support-Seite

Das Manifest beschreibt, was die App ist und was sie darf. Es ist ein GESCHLOSSENER Vertrag: ein Feld, das hier nicht vorgesehen ist, führt zur Ablehnung — nicht zum stillen Ignorieren. Das ist Absicht, weil ein stillschweigend verworfenes Feld sonst als Zusage gelesen würde, die nie gegolten hat.

`schemaVersion` ist 1, `apiVersion` ist „v1". `appUrl` ist die HTTPS-Adresse der extern gehosteten App, die im Dashboard eingebettet wird. `redirectUris` braucht mindestens einen Eintrag und höchstens zehn; die Adressen werden beim OAuth-Ablauf EXAKT verglichen, nicht per Präfix. `surface` darf derzeit nur „app.home" sein — andere Oberflächen gibt es noch nicht, und eine zu behaupten wäre eine Zusage ohne Einlösung.

`requiredScopes` sind die Rechte, ohne die die App nicht läuft — der Wirt kann sie nicht abwählen. `optionalScopes` darf er einzeln abwählen, die App muss dann ohne sie funktionieren. Zusammen sind höchstens 32 Rechte erlaubt. Verlangt werden darf nur, was eine tatsächlich vorhandene REST-Operation abdeckt.

`dataPurpose`, `retentionDays`, `hostingCountry` und `protectedData` sind die Datenschutzangaben, die der Wirt beim Zustimmen liest. Der Zweck darf bis 2000 Zeichen lang sein und soll im Klartext stehen, nicht in Juristensprache. `retentionDays: 0` heißt: nichts wird dauerhaft gespeichert — eine Zusage, die man einhalten muss. `hostingCountry` ist ein Länderkürzel aus zwei Großbuchstaben. Diese Angaben sind Ihre Zusage, nicht unsere Prüfung; sie stehen dem Wirt dauerhaft vor Augen.

`webhookUrl` ist optional. Ohne sie erfährt die App nichts von Ereignissen wie einer Deinstallation oder einer Löschaufforderung — dann muss sie selbst nachfragen. Zugangsdaten gehören NIEMALS ins Manifest: es wird gespeichert, geprüft und dem Wirt angezeigt.

Schritt für Schritt

  1. Kleinstes Rechteset bestimmen

    Für jede Funktion der App die eine REST-Operation nennen, die sie braucht. Was übrig bleibt, ist das Rechteset. Was sich nicht so begründen lässt, gehört nicht hinein.

  2. Zweck im Klartext schreiben

    Ein Wirt muss nach zwei Sätzen wissen, was mit seinen Daten passiert. „Verbesserung unserer Dienste" ist kein Zweck.

  3. Aufbewahrung ehrlich angeben

    Wer 30 Tage speichert, schreibt 30 — nicht 0. Die Angabe ist im Zustimmungsfenster sichtbar und damit Teil dessen, wozu der Wirt zustimmt.

  4. Version anlegen

    Die Prüfung des Manifests läuft sofort beim Anlegen der Version; Fehler werden benannt, bevor etwas eingereicht ist.

Codebeispiel

Vollständiges Manifest (Beispiel-App „Menu Display")
AusschnittJSON
{    "schemaVersion": 1,    "apiVersion": "v1",    "appUrl": "https://menu-display.example.invalid/",    "redirectUris": [        "https://menu-display.example.invalid/oauth/callback"    ],    "requiredScopes": ["menu:read"],    "optionalScopes": [],    "dataPurpose": "Anzeige der Speisekarten-Metadaten im Dashboard. Keine Gästedaten, keine dauerhafte Speicherung — Sitzungen liegen höchstens 15 Minuten im Arbeitsspeicher.",    "retentionDays": 0,    "hostingCountry": "AT",    "webhookUrl": "https://menu-display.example.invalid/webhooks",    "privacyUrl": "https://menu-display.example.invalid/privacy",    "termsUrl": "https://menu-display.example.invalid/terms",    "supportUrl": "https://menu-display.example.invalid/support",    "protectedData": false,    "surface": "app.home"}
Ausschnitt: läuft nicht für sich allein — er gehört an die passende Stelle einer bestehenden Vorlage.Diese App zeigt nur Speisekarten-Metadaten an. Deshalb genau EIN Recht, keine optionalen Rechte, keine personenbezogenen Daten und keine dauerhafte Speicherung. Die Adressen sind Platzhalter und müssen durch die eigene Domain ersetzt werden.

Wo im Dashboard

/partners/[partnerId]/apps

Im Dashboard öffnen