Reihenfolge beim Anlegen
Was vor jedem Aufruf existieren muss, woher jede ID kommt, die Abfolge der gängigen Abläufe und die Fehler, die erscheinen, wenn ein Schritt übersprungen wird.
Fast alles bei Memberfy hängt von etwas ab, das vorher angelegt wurde: Die Lektion braucht das Modul, das Modul den Kurs, der Kurs den Bereich. Ruft man die API in der falschen Reihenfolge auf, geht nichts kaputt, aber jeder vorgezogene Aufruf wird abgelehnt. Dieser Leitfaden zeigt die richtige Reihenfolge und die ID, die von einem Aufruf an den nächsten weitergegeben wird.
Die Abhängigkeitskarte
Anders gelesen:
| Um … anzulegen | brauchst du vorher … | und übergibst |
|---|---|---|
| Bereich | einen Abschnitt | sectionId |
| Beitrag, Veranstaltung, Kurs, Bild | einen Bereich | spaceId |
| Kursmodul | einen Kurs | courseId |
| Lektion | ein Modul | moduleId |
| Plan | die Abrechnungsoptionen (Produkte vom Typ SUBSCRIPTION) | productIds |
| Zusatzprodukt im Plan | den Plan und ein monatliches Produkt, das keine Option eines Plans ist | addOnProductIds |
| Zugriff auf einen Bereich per Plan oder Produkt | den Plan oder das Produkt | access.subscriptionGroupIds, access.productIds |
| Gutschein nur für bestimmte Produkte | die Produkte | applicableProducts |
| Jeder Verkauf und jede Auszahlung | genehmigte Geschäftsinformationen und ein genehmigtes Auszahlungskonto | — |
Bei allen Aufrufen unten gehören Authorization und X-CommunityId dazu. Siehe Authentifizierung und X-CommunityId.
Kurs
- Abschnitt (falls noch keiner existiert):
POST /api/sectionsmittitleundvisibility. Speicheredata.idalssectionId. - Kursbereich:
POST /api/spacesmitsectionId,titleundmodule: "courses". Speichere diespaceId. - Kurs:
POST /api/coursesmitcommunityId(dieselbe wie im Header),spaceId,title,slugundlevel(beginner,intermediate,advanced). Er entsteht als Entwurf. Speichere diecourseId. - Module:
POST /api/courses/modulemitcourseIdundtitle, eines pro Modul. Speichere jedemoduleId. - Lektionen:
POST /api/courses/lessonmitmoduleId,titleundtype(text,image,video,link). - Veröffentlichen:
PUT /api/courses/{id}mitstatus: "published". Nur ein veröffentlichter Kurs nimmt Einschreibungen an.
Für spätere Anpassungen: PUT und DELETE /api/courses/module/{moduleId} benennen ein Modul um, ändern seine Reihenfolge und löschen es (samt Lektionen); PUT und DELETE /api/courses/lesson/{lessonId} ändern Titel, Typ, Dauer und Reihenfolge einer Lektion, verschieben sie in ein anderes Modul desselben Kurses (moduleId) und löschen sie. Beim Löschen bleibt der Fortschritt aller erhalten, die sie schon angesehen haben.
Um den Kurs zu verkaufen, mach weiter mit einem Produkt, das den Bereich freigibt (siehe Veranstaltung, Schritte 3 und 4, die genauso gelten).
Mentoring
Eine Gruppe mit eigener Pinnwand, Treffen und monatlicher Abrechnung. (Mit der Vertragslaufzeit bekommt die Option aus Schritt 3 zusätzlich commitmentMonths.)
- Privater Bereich der Gruppe:
POST /api/spacesmitmodule: "feed"undvisibility: "private". Speichere diespaceId. - Treffen:
POST /api/events, eines pro Treffen, mitspaceId,title,slug,type: "online",startTimeundendTime. - Abrechnungsoption:
POST /api/productsmittype: "SUBSCRIPTION",title,price,billingInterval: "MONTHLY"undallowedPaymentMethods. Speichere dieiddes Produkts. - Plan:
POST /api/subscription-groupsmitnameundproductIds: [<ID aus Schritt 3>]. Speichere dieiddes Plans. - Den Bereich für den Plan freigeben:
PUT /api/spaces/{id}mitaccess: { "subscriptionGroupIds": [<ID des Plans>] }.
Schritt 5 funktioniert erst nach Schritt 4: Der Plan muss existieren, damit er im Zugriff genannt werden kann.
Veranstaltung
Eine Präsenzveranstaltung mit bezahltem Ticket und Hinweis im Feed.
- Veranstaltungsbereich:
POST /api/spacesmitmodule: "events". - Veranstaltung:
POST /api/eventsmitspaceId,title,slug,type: "in_person",startTime,endTimeund der Adresse (street,number,city…). - Ticket:
POST /api/productsmittype: "ONE_TIME",price,hasStock: trueundstockQuantity. Danach veröffentlichen. - Den Bereich für Käufer freigeben:
PUT /api/spaces/{id}mitvisibility: "private"undaccess: { "productIds": [<ID des Tickets>] }. - Angehefteter Hinweis:
POST /api/contentim Feed-Bereich undPUT /api/feed/{type}/{id}/pinmit der ID des Beitrags.
Plan mit Zusatzprodukten
- Abrechnungsoptionen des Plans: ein
POST .../productspro Option (Monatlich, Jährlich),type: "SUBSCRIPTION". - Das Zusatzprodukt: ein weiteres
POST .../products,type: "SUBSCRIPTION",billingInterval: "MONTHLY". Es kommt in keineproductIdseines Plans. - Plan:
POST .../subscription-groupsmit denproductIdsaus Schritt 1. - Zusatzprodukte im Plan:
PUT .../subscription-groups/{id}mitaddOnProductIds: [<ID aus Schritt 2>].
Vor dem Verkaufen: das Auszahlungskonto
Eine Reihenfolge, die für jeden Verkauf gilt:
POST .../business-informationund.../submit.POST .../payout-settingsund.../submit.- Auf beide Genehmigungen warten (bis zu 7 Werktage).
GET .../payout-settings/prerequisitessagt, was noch fehlt.
Produkte, Optionen, Pläne, Add-ons, Gutscheine und Downsell-Angebote kannst du schon vor der Genehmigung anlegen und bearbeiten: Das Produkt entsteht als DRAFT, in der Währung des Landes aus den Geschäftsinformationen (in jedem Status) oder ohne sie in BRL. Das Veröffentlichen (POST .../products/{id}/publish oder PUT .../products/{id} mit status: ACTIVE), der Checkout und die Auszahlung warten auf die Genehmigung. Werden genehmigte Geschäftsinformationen bearbeitet, gehen sie zurück auf PENDING und brauchen erneut .../submit; bis zur neuen Genehmigung lehnt der Checkout ab.
Die Fehler, wenn ein Schritt fehlt
| Aufruf | Was fehlte | Antwort |
|---|---|---|
POST /api/spaces | der Abschnitt | 400 · Abschnitt nicht gefunden oder gehört nicht zu dieser Community |
POST /api/spaces (oder PUT) | der Abschnitt ist enger gefasst | 400 · This space cannot be more open than the section "…", which is … |
PUT /api/spaces/{id} mit access | der genannte Plan, das Produkt oder die Gruppe | 400 · The access grant "…" does not exist in this community. (param: access) |
POST /api/courses | der Bereich | 400 · Bereichs-ID ist Pflicht, oder Bereich nicht gefunden bzw. gehört nicht zu dieser Community |
POST /api/courses/module | der Kurs | 404 · Course not found |
POST /api/courses/lesson | das Modul | 404 · Module not found |
POST .../subscription-groups | die Abrechnungsoptionen | 400 · Produkt nicht gefunden |
PUT .../subscription-groups/{id} mit addOnProductIds | das Produkt des Zusatzes, oder es ist schon Option eines Plans | 400 · Eines der Add-ons existiert in dieser Community nicht oder wurde gelöscht. / Ein Produkt, das Abrechnungsoption eines Tarifs ist, kann kein Add-on eines anderen sein. |
| Checkout-Konfiguration | das genehmigte Auszahlungskonto | 400 · Für diese Community wurde keine Zahlungskonfiguration eingerichtet |
POST .../products/{id}/publish (oder PUT mit status: ACTIVE) | die genehmigten Geschäftsinformationen | 403 · Um zu veröffentlichen und zu verkaufen, braucht die Community genehmigte Geschäftsinformationen… |
POST .../products/{id}/publish | das Produkt in der Währung des genehmigten Landes | 400 · Dieses Produkt ist in …, die genehmigten Geschäftsinformationen verwenden aber … (param: currency) |
POST /api/checkout | die genehmigten Geschäftsinformationen | 403 · Die Community muss genehmigte Geschäftsinformationen haben, um bezahlte Produkte zu aktivieren |
POST .../payouts | Guthaben für Betrag und Gebühr | 400 · Unzureichendes Guthaben. Verfügbar: … |
| Jeder | der Header | 400 · X-CommunityId ist Pflicht |
Einige Formatvalidierungen antworten noch auf Englisch (etwa Valid course ID is required, wenn die ID keine UUID ist).
Tipps
- Speichere jede ID, die in
data.idzurückkommt: Genau die verlangt der nächste Aufruf. - Schick dieselbe
communityIdim Body (wenn die Route sie verlangt) und im Header. - Wiederholen macht nichts rückgängig: Bricht eine Abfolge mittendrin ab, mach bei dem Schritt weiter, der fehlgeschlagen ist, statt neu anzufangen (Neuanfangen erzeugt Duplikate).
- Im MCP werden die zusammengesetzten Werkzeuge diese Reihenfolge selbst einhalten.