Social-Media-Beiträge mit einer REST-API planen
Eine Mellow-Hub-Anleitung: verbundene Kanäle prüfen, einen Beitrag validieren, mit einem Idempotenzschlüssel planen und das Endergebnis jedes Ziels lesen.
Von Mellow · Aktualisiert amDie vollständige Abfolge
Um einen Beitrag über Mellow Hub zu planen, kläre die Berechtigungen des Zugangsschlüssels, wähle verbundene Kanäle, validiere eine Anfrage und erstelle sie dann mit einem stabilen Idempotenzschlüssel. Lies den entstandenen Beitrag erneut, um festzustellen, was auf jedem Ziel passiert ist. Eine erfolgreiche Antwort auf das Erstellen beweist nicht, dass jedes Netzwerk veröffentlicht hat.
Diese Anleitung nutzt REST. Ein MCP-Client folgt der gleichwertigen Abfolge whoami → list_channels → validate_post → create_post → get_post, die im MCP-Leitfaden für Social Media beschrieben ist.
Probiere die Eingabeprüfung mit einem fertigen Beispiel aus
Lade das Node.js-Prüfskript und die Vorlage post.example.json in denselben Ordner. Das Skript braucht Node.js 22 oder neuer und keine Pakete. Lies seinen Quellcode und stelle dann einen vorhandenen Hub-Zugangsschlüssel über deine geschützte Umgebung als MELLOW_HUB_KEY bereit.
Für diese Prüfung genügen channels:read und posts:read. Wähle in den Zugriffseinstellungen von Hub nur die Kanäle, die du nutzen willst. Zum Auflisten der Kanäle reicht die erste Berechtigung. Für diese Eingabeprüfung ist weder eine Veröffentlichungsberechtigung noch ein Abo nötig.
node mellow-hub-check.mjs --channels
# Ersetze die Kanal-IDs und die Medien-URL in post.example.json.
node mellow-hub-check.mjs post.example.jsonDas Skript prüft die für den Zugangsschlüssel verfügbaren Kanäle, sendet dein bearbeitetes JSON an den authentifizierten Validierungs-Endpunkt von Mellow Hub und gibt die blockierenden Probleme und Hinweise aus. Es endet mit 0, wenn diese Eingabeprüfungen bestehen, mit 1 bei Eingabeproblemen oder mit 2 bei einem Datei-, Berechtigungs- oder Verbindungsfehler oder einer unerwarteten Antwort. HTTP 200 mit ok: false lässt die Prüfung trotzdem fehlschlagen.
Es erstellt keinen Beitrag, lädt keine Medien und sendet keine Anfrage an ein soziales Netzwerk. Eine bestandene Prüfung verifiziert weder Dateidauer und Seitenverhältnis noch die spätere Kontoautorisierung oder Veröffentlichung. Der herunterladbare Code wird mit isolierten Fixtures geprüft; das ist keine aufgezeichnete Live-Veröffentlichung eines Kunden. Speichere für die curl-Anfragen unten deine bearbeitete Datei als post.json.
1. Konto und Zugangsschlüssel prüfen
Verbinde deine eigenen Kanäle in Hub und erstelle einen Zugangsschlüssel mit den Kanälen und dem Modus, die du delegieren willst. Speichere ihn in der geschützten Umgebung deines Servers als MELLOW_HUB_KEY; lege ihn nie in Frontend-JavaScript oder ein öffentliches Repository. Die Beispiele lesen diese Umgebungsvariable, ohne ihren Wert anzuzeigen.
curl --fail-with-body https://www.mellow.world/api/hub/v1/whoami \
-H "Authorization: Bearer $MELLOW_HUB_KEY"
curl --fail-with-body https://www.mellow.world/api/hub/v1/channels \
-H "Authorization: Bearer $MELLOW_HUB_KEY"Verwende die Kanal-IDs, die für dieses Konto zurückgegeben werden. Die Werte spc_… unten sind Platzhalter. Prüfe Modus und verfügbares Kontingent, bevor du etwas erstellst. Ein Zugangsschlüssel im Freigabemodus bereitet einen Beitrag zur Freigabe durch eine Person vor. Ein Zugangsschlüssel im Autopilot kann innerhalb seines delegierten Umfangs, seiner Obergrenze und seiner Gültigkeit handeln.
2. Den eigentlichen Beitrag beschreiben
Speichere die folgende Struktur als post.json. Ersetze beide Kanal-IDs, die Beispieladresse der Medien, den Text und das Beispieldatum. Verwende einen expliziten ISO-8601-Zeitzonen-Offset oder UTC Z; der Zeitstempel steht für einen Zeitpunkt, nicht für die lokale Uhr des Lesers. Das Datum 2030 im Beispiel ist bewusst illustrativ.
{
"caption": "A short look at how this piece was made.",
"channels": [
"spc_your_instagram_channel",
"spc_your_youtube_channel"
],
"media": [
"https://cdn.example.com/your-video.mp4"
],
"scheduledAt": "2030-01-15T10:00:00Z",
"options": {
"instagram": {
"placement": "reels"
},
"youtube": {
"title": "How this piece was made",
"privacyStatus": "public"
}
}
}Das Netzwerk lädt die Medien zum Zeitpunkt der Veröffentlichung, die echte HTTPS-URL muss also dann noch erreichbar sein. Eine private lokale Datei oder eine abgelaufene signierte URL funktioniert nicht. Dieses Beispiel gibt YouTube einen eigenen Titel und wählt für Instagram die Platzierung Reels. Welche Formate verfügbar sind, hängt weiterhin von deinen verbundenen Konten und dem Anbieter ab.
3. Validieren, ohne zu veröffentlichen
curl --fail-with-body https://www.mellow.world/api/hub/v1/validate \
-H "Authorization: Bearer $MELLOW_HUB_KEY" \
-H "Content-Type: application/json" \
--data-binary @post.jsonPrüfe ok, issues und notes in der Antwort. Behebe jedes blockierende Problem, bevor du weitermachst. Die Validierung kann HTTP 200 mit ok: false zurückgeben, der HTTP-Status allein reicht also nicht. Der authentifizierte Endpunkt prüft neben den Eingaberegeln auch, ob dir die Kanäle tatsächlich gehören.
Für eine Vorschau der Prüfungen von Beitragstext, Titel und Medienanzahl ohne Konto nutze den kostenlosen Beitrags-Check. Keine der beiden Vorschauen misst Dauer oder Seitenverhältnis deiner echten Datei, und ein Anbieter kann die Zustellung trotzdem ablehnen.
4. Einmal erstellen, konsistent wiederholen
Der Zugangsschlüssel aus dem Einstieg hat nur Lesezugriff und kann keine Beiträge erstellen. Nutze vor diesem Schritt eine Verbindung mit posts:write und posts:publish für die vorgesehenen Kanäle. Diese Scopes sind auch im Freigabemodus nötig; der Freigabemodus überlässt die Entscheidung zu veröffentlichen weiterhin einer Person. Ohne sie gibt die Anfrage einen Berechtigungsfehler zurück.
Die nächste Anfrage erstellt den Beitrag. Führe sie nur aus, wenn Inhalt und Berechtigung für das Ziel stimmen. Im Freigabemodus wartet er auf die Freigabe; im Autopilot kann die delegierte Aktion zur geplanten Zeit ablaufen.
curl --fail-with-body https://www.mellow.world/api/hub/v1/posts \
-H "Authorization: Bearer $MELLOW_HUB_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: studio-process-video-slot-001" \
--data-binary @post.jsonSpeichere den Idempotenzschlüssel zusammen mit dem Job in deiner Anwendung. Geht die Antwort verloren, wiederhole dieselbe Anfrage mit demselben Schlüssel. Erzeuge keinen neuen Schlüssel, nur weil ein Timeout aufgetreten ist. Ein anderer Beitrag braucht einen anderen Schlüssel; einen Schlüssel für geänderten Inhalt wiederzuverwenden wird abgelehnt.
5. Das Ergebnis pro Ziel lesen
Speichere die zurückgegebene post.id und rufe sie mit GET /api/hub/v1/posts/{id} ab, mit demselben Authorization-Header. Prüfe jeden Eintrag in targets und seine öffentliche URL. Ein Beitrag für mehrere Netzwerke kann teilweise gelingen: Ein Ziel kann Erfolg haben, während ein anderes fehlschlägt.
Halte geplante Zeit, Hub-Beitrags-ID, Idempotenzschlüssel und die Ergebnisse pro Ziel zusammen in deinem eigenen Job-Datensatz fest. Logge keine Zugangsschlüssel oder vollständigen Authorization-Header. Wenn ein Ziel fehlschlägt, entscheide anhand des gemeldeten Fehlers über den nächsten Schritt, statt blind den ganzen Beitrag neu zu erstellen.
Einen Beitrag nach Timeout oder Teilveröffentlichung wiederherstellen
Ein Timeout bedeutet, dass der Aufrufer das Ergebnis nicht kennt. Ein Ergebnis partial bedeutet, dass Hub für die gewählten Ziele unterschiedliche Ergebnisse festgehalten hat. Halte diese Fälle auseinander, wenn du entscheidest, was du als Nächstes sendest.
Die Antwort auf das Erstellen ging verloren
Lege die ursprüngliche Payload und den Idempotenzschlüssel schon vor der ersten Anfrage in deinem Job-Datensatz ab. Wiederhole diese unveränderte Anfrage mit demselben Schlüssel und gültiger Berechtigung. Hat Hub den Beitrag bereits, gibt es dessen ID und aktuellen Zustand zurück. Die REST-Antwort ist weiterhin HTTP 201, ein 201 allein sagt dir also nicht, ob dieser Versuch einen neuen Datensatz angelegt hat. Sobald du die ID hast, verfolge den Zustand per GET.
Erhältst du 409 idempotency_key_reused, vergleiche die Anfrage mit deinem gespeicherten Job. Erzeuge nicht automatisch einen weiteren Schlüssel, um den Fehler zu umgehen: Das würde eine neue Operation beschreiben und könnte die ursprüngliche Veröffentlichung duplizieren.
Ein Ziel ist fehlgeschlagen, nachdem ein anderes veröffentlicht hat
Lies targets, bevor du eine Wiederherstellung vorbereitest. Ist zum Beispiel Instagram published und YouTube failed, behebe das gemeldete YouTube-Problem und validiere eine neue Payload, die nur diesen YouTube-Kanal enthält. Eine bewusste Wiederherstellung nutzt einen neuen Schlüssel, etwa studio-process-video-slot-001-youtube-recovery-1. Halte ihre neue Beitrags-ID neben dem ursprünglichen Job fest. Die üblichen Kanalberechtigungen, der Freigabemodus und das Veröffentlichungskontingent gelten weiterhin.
Das erneute Senden des ursprünglichen Schlüssels gibt den bestehenden Beitrag zurück; es startet seine fehlgeschlagenen Ziele nicht neu. Ein Ziel, das noch wartet oder gerade veröffentlicht, ist kein bestätigter Fehlschlag. Sende es nicht erneut, nur weil der Aufrufer nicht mehr gewartet hat, und nimm keine bereits veröffentlichten Ziele in die Wiederherstellungsanfrage auf.
Fragen, die in echten Integrationen auftauchen
Kann ich auf einem Netzwerk einen anderen Beitragstext verwenden?
Ja. Ein perChannel-Eintrag mit der echten Kanal-ID als Schlüssel überschreibt Beitragstext oder Medien dieses Kanals. Plattformweite Felder gehören in options. Sieh dir die ausgearbeiteten Beispiele in der Hub-Referenz an.
Kann ein Agent meine Social-Media-Konten selbst verbinden?
Nein. Der Kontoinhaber schließt den jeweiligen Verbindungsablauf selbst ab. Ein API-Schlüssel ist eine Delegation für bereits autorisierte Aktionen, keine Erlaubnis, sich am Login eines Netzwerks als Inhaber auszugeben.
Verbraucht eine Anfrage eine Veröffentlichung aus meinem Tarif?
Das Kontingent wird pro Netzwerkziel gezählt. Prüfe die aktuellen Tarife und das verbleibende Kontingent des Zugangsschlüssels, bevor du Ziele wählst.