Syndikation
Die Syndikation gibt die Beiträge der Kanäle eines Workspaces an seine Teilnehmer weiter: wer sich in einem der Iframes seiner Gruppen anmeldet. Der Workspace bildet Gruppen aus seinen Kanälen, jede mit einem eigenen Iframe, das er in sein eigenes Portal einbindet. Darin wählt ein Teilnehmer die Kanäle der Gruppe, die er möchte, und abonniert eine E-Mail-Adresse und/oder einen Webhook, wie die Gruppe es erlaubt, jeweils per E-Mail bestätigt, und erhält jeden Beitrag dieser Kanäle, wenn er an den Workspace übergeben wird. Von einem Teilnehmer kommt nichts zurück: Er hält keinen Schlüssel und meldet nichts. Die API nennt Teilnehmer partners (/v1/syndication/partners), wie das Kontingent des Tarifs.
Die Syndikation gehört zu Enterprise. In jedem anderen Tarif antwortet jede Route unten, die etwas ändert, sendet oder rendert, mit 409, Vorschauen und Test-E-Mails eingeschlossen; Lesen funktioniert weiterhin, ebenso das Entfernen einer Gruppe und eines Teilnehmers, sodass ein Workspace, der eine Stufe abgestiegen ist, trotzdem aufräumen kann, was er hatte. Wie viele Teilnehmer ein Workspace haben darf, ist sein Kontingent an Syndikationsteilnehmern, partners in GET /v1/syndication/settings, wobei die zählen, die etwas empfangen können.
| Methode | Pfad | Berechtigung |
|---|---|---|
GET | /v1/syndication/settings | syndication:read |
PUT | /v1/syndication/settings | syndication:write |
POST | /v1/syndication/preview | syndication:read |
POST | /v1/syndication/sender/test | syndication:write |
GET | /v1/syndication/groups | syndication:read |
GET | /v1/syndication/groups/{id} | syndication:read |
POST | /v1/syndication/groups | syndication:write |
PATCH | /v1/syndication/groups/{id} | syndication:write |
POST | /v1/syndication/groups/{id}/delete | syndication:write |
POST | /v1/syndication/groups/{id}/partners | syndication:write |
GET | /v1/syndication/partners | syndication:read |
GET | /v1/syndication/partners/{id} | syndication:read |
PATCH | /v1/syndication/partners/{id} | syndication:write |
POST | /v1/syndication/partners/{id}/delete | syndication:write |
GET | /v1/syndication/deliveries | syndication:read |
POST | /v1/syndication/deliveries/{id}/redeliver | syndication:write |
Die Vorschau ist nur ein POST, weil das, was sie rendert, als Dokument gesendet wird; sie ändert nichts, sodass ein Schlüssel, der Syndikation nur lesen darf, eine verlangen darf.
Gruppen
curl -X POST http://localhost:4000/v1/syndication/groups \
-H "Authorization: Bearer rw_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "All channels",
"description": "Our daily clips, ready to post: choose the channels you want.",
"channelIds": ["01M1VFRWE7EWSY5D7QDQ0KNK1S", "01M1VFRWE7EWSY5D7QDQ0KNK1T"],
"byEmail": true,
"byWebhook": true,
"allowedOrigins": ["https://portal.example.com"]
}'
| Feld | Was es ist |
|---|---|
name | Der eigene Name des Workspaces dafür, bis zu 80 Zeichen. Wird Teilnehmern nie gezeigt. |
pageTitle | Optional: die Überschrift ihres Iframes, bis zu 100 Zeichen; null oder weggelassen liest „Ready-to-post videos from“ und den Titel des Brandings. |
description | Optional: was Teilnehmer oben in ihrem Iframe lesen, bis zu 300 Zeichen. |
channelIds | Ihre Kanäle, jeder einer Ihrer und nicht entfernt, höchstens 500. Das Iframe bietet sie zur Auswahl an; bei einem gibt es nichts zu wählen, und jeder Teilnehmer erhält ihn. Eine ID, die keinem Ihrer Kanäle gehört, ist ein 404, der sie nennt. |
byEmail, byWebhook | Wie ihre Beiträge die Teilnehmer erreichen: eine E-Mail mit dem Beitragspaket, ein Aufruf ihres Webhooks oder beides. Mindestens eines; standardmäßig beide. Die Gruppe entscheidet, auf welchem Weg ihre Kanäle auch übergeben. |
allowedOrigins | Die Websites, deren Seiten sie zeigen dürfen, als Origins wie https://portal.example.com (ein Pfad wird verworfen), höchstens 20. Gesendet als Content-Security-Policy: frame-ancestors der Seite, und eine Seite, die Websites nennt, öffnet sich nicht für sich allein. Leer oder weggelassen ist jede Website. |
showHeader | Ob die Seite das Logo und den Titel über ihren Karten zeigt. Standardmäßig true; false für ein Portal, das sie unter einem eigenen Header einbindet. |
position | Nur PATCH: wo die Gruppe in der Liste steht, ab 0. |
Jede Gruppe kommt zurück mit page.url, der Adresse ihrer Seite, page.frame, dem Iframe-Code zum Kopieren in das HTML des Portals (er trägt allow="clipboard-write", damit die Kopieren-Buttons der Seite im Frame funktionieren), portalKey, dem Schlüssel, mit dem Teilnehmer-IDs und E-Mail-Adressen signiert werden (unten), channels, jedem ihrer Kanäle mit Name, Oberfläche, Seitenverhältnis und Sprache, position und partners, wie viele sich darin angemeldet haben. GET /v1/syndication/groups antwortet mit allen in ihrer Reihenfolge und GET /v1/syndication/groups/{id} mit einer davon. PATCH ändert jedes der obigen Felder; ein hinzugefügter Kanal wird seinen Teilnehmern als neue Auswahl angeboten, ein herausgenommener wird nicht mehr weitergegeben. POST .../delete entfernt sie mit ihrer Seite und ihren Teilnehmern. Die Adresse einer Seite ändert sich nie: Eine Gruppe, deren Iframe sich verirrt hat, wird durch eine neue Gruppe ersetzt. Solange der Workspace nicht bei Enterprise ist, antwortet die Seite jeder Gruppe mit 404.
Was die Teilnehmer erreicht, hängt nie von den eigenen Wegen eines Kanals ab (deliverByEmail, deliverByWebhook, deliverByConnector): Ein Kanal, bei dem alle aus sind, gibt seine Beiträge trotzdem an jeden Teilnehmer weiter, dessen Gruppe ihn übernimmt. Dem Webhook eines Teilnehmers werden fünf Sekunden zum Antworten gegeben, und einer, der es nicht tut, wird auf der Wiederholungsleiter erneut versucht, sodass ein langsamer Empfänger die anderen nie aufhält. GET /v1/syndication/deliveries ist das Protokoll jeder E-Mail und jedes Aufrufs und nimmt neben seinen anderen Filtern groupId; jede Zeile nennt ihre group.
Eine Zahl begrenzt sowohl Gruppen als auch Teilnehmer: das Kontingent des Tarifs an Syndikationsteilnehmern. Ein Workspace darf so viele Gruppen haben und so viele Teilnehmer über alle seine Gruppen zusammen (nur die zählen, die etwas empfangen können), sodass eine Gruppe alle halten kann oder jede Gruppe einen. Eine Gruppe mehr wird mit 409 und einem Satz abgelehnt, der die Zahl nennt.
Jede Gruppe hat außerdem ein Webhook-Signaturgeheimnis, mit ihr erstellt. Es wird im Iframe der Gruppe den Teilnehmern neben dem Webhook-Feld gezeigt. Die eine Route, die es beantwortet, ist das Hinzufügen eines Teilnehmers mit einem Webhook (unten), einmal, damit der Workspace es weitergeben kann; keine andere Route liefert es.
Die Seite teilt dem Frame um sie herum mit einer postMessage von { type: "partner-frame:height", height } mit, wie hoch sie ist.
Teilnehmer-IDs und E-Mail-Adressen
Ein Portal, das weiß, wer angemeldet ist, kann ihn der Seite nennen, die ihm dann zeigt, womit er abonniert hat. Fügen Sie der Adresse des Iframes zwei Werte für die eigene ID des Portals für ihn, zwei für seine E-Mail-Adresse oder alle vier hinzu:
<iframe src="https://reelwire.io/embed/<code>?participant=C-1001&sig_participant=<signature>&email=anna%40smith.test&sig_email=<signature>" ...></iframe>
participant ist die eigene ID des Portals für ihn, seine Teilnehmer-ID: 1 bis 100 druckbare Zeichen, kein Leerzeichen an einem der Enden, in der Adresse URL-kodiert. sig_participant ist der HMAC-SHA256 der ID, mit dem portalKey der Gruppe als Schlüssel, hexadezimal. email ist seine Adresse und sig_email ihre Signatur, auf dieselbe Weise gebildet, von der Adresse wie übergeben oder in Kleinbuchstaben. Mit der Adresse fragt die Seite nach keiner: Bestätigungen gehen an sie, und die Seite findet darüber sein Abonnement. Bilden Sie jede Signatur auf dem Server des Portals:
import crypto from "node:crypto";
const key = process.env.REELWIRE_PORTAL_KEY;
const sig_participant = crypto.createHmac("sha256", key).update(participantId).digest("hex");
const sig_email = crypto.createHmac("sha256", key).update(email).digest("hex");
$key = getenv("REELWIRE_PORTAL_KEY");
$sig_participant = hash_hmac("sha256", $participantId, $key);
$sig_email = hash_hmac("sha256", $email, $key);
Der Schlüssel geht nie an einen Browser. Eine Seite, deren Adresse einen Teilnehmer oder eine Adresse ohne die richtige Signatur nennt, antwortet mit 403 und zeigt nichts zum Abonnieren, ebenso jeder Aufruf der Seite, der eine trägt: Die ID und die Adresse entscheiden, wessen Abonnement die Seite zeigt, sodass eine unsignierte jedem erlauben würde, das eines anderen zu lesen und zu ändern, indem er die Adresse bearbeitet. Ein Teilnehmer hat ein Abonnement je Gruppe, und customerId zeigt die ID beim Teilnehmer. Die ersten Namen dieser Werte, customer, sig und esig, werden weiterhin genommen, wo die neuen fehlen.
Abonnieren und Abbestellen
Im Iframe wählt ein Teilnehmer die Kanäle, die er möchte, wo es mehrere gibt, und abonniert eine E-Mail-Adresse, einen Webhook oder beides, wie die Gruppe es erlaubt, jeweils in einer eigenen Karte. Jedes Abonnement, jede Änderung der Kanäle und jedes Abbestellen wird per E-Mail in zwei Schritten bestätigt: Der Link der E-Mail öffnet eine Bestätigungsseite, und nur der Button auf dieser Seite handelt (GET fragt, POST tut es), sodass ein Mail-Scanner, der Links öffnet, nichts ändert:
- Eine E-Mail-Adresse erhält eine E-Mail mit der Bitte, das Abonnement zu bestätigen (
/v1/partner/confirm/...). Nichts anderes wird an sie gesendet, bis der Button der Seite gedrückt wird. Dieselbe Adresse kann eine Gruppe nicht zweimal abonnieren. - Ein Webhook wird mit einer E-Mail-Adresse angegeben, von der aus er bestätigt wird und die keine Beiträge erhält; sie wird nicht gefragt, wo das Portal eine Adresse übergeben hat oder der Teilnehmer vorher eine angegeben hat, und wird als
contactEmailbehalten. Die Bestätigung (/v1/partner/webhook/...) macht ihn zum Webhook des Teilnehmers und ruft ihn mit einem Test auf, signiert mit dem Geheimnis der Gruppe, das das Iframe mit Beispielcode für Node.js, Python, PHP und C# zeigt. Kein Beitrag geht an ihn, bis ein Testaufruf mit einem 2xx geantwortet hat. Das Iframe bietet immer einen Test an, vor dem Abonnieren ebenso wie danach: Er probiert die angezeigte oder eingegebene Adresse, und nur eine Antwort vom eigenen Webhook des Teilnehmers zählt. Der Test einer Adresse, die nicht seine ist, behält nichts, und sein Ping trägt keinen Hinweissyndication. - Abonnieren / Aktualisieren, für jemanden, den das Portal nicht benannt hat: Eine Adresse oder ein Webhook, die schon empfangen, erhalten eine E-Mail mit der Bitte, die jetzt gewählten Kanäle zu bestätigen (
/v1/partner/channels/...), und sie ändern sich mit der Bestätigung. Die Kanäle, für die eine Bestätigung gilt, reisen in ihrem Link, sodass jemand, der etwas empfängt, bis dahin seine Kanäle behält. Ein Teilnehmer, den das Portal benannt hat, ändert sie sofort. - Abbestellen sendet die Bestätigung per E-Mail: bei den E-Mails an die Adresse, bei einem Webhook an die Adresse, von der aus er bestätigt wurde; in Benutzung oder noch wartend gleichermaßen (
/v1/partner/stop/...,/v1/partner/webhook-stop/...). Der Stopp-Link in jeder Beitrags-E-Mail ist dieselbe Seite, und der Ein-Klick-List-Unsubscribe-Post, den eine Mail-App sendet, wirkt sofort. Ein Teilnehmer, dem gar kein Weg bleibt, wird gelöscht, mit seinen Protokollzeilen, statt als unbestätigt behalten zu werden.
Ein Bestätigungslink funktioniert drei Tage; der Stopp-Link in einer Beitrags-E-Mail läuft nie ab, da ein Ausweg, der abläuft, kein Ausweg ist. Für jemanden, den das Portal nicht benannt hat, ist jede Antwort dieselbe, ob die Adresse oder der Webhook abonniert ist oder nicht (neutral), sodass die Seite nie sagt, wer es ist. Es gibt kein Konto und keine Einstellungsseite: Ein Webhook endet auch, indem er den Aufruf eines Beitrags mit 410 Gone beantwortet, und beide Wege können erneut abonnieren.
Jeder Button im Iframe ist ein Aufruf, den die Seite an ihre eigene Adresse macht, POST /embed/<code>/ gefolgt von subscribe-email, subscribe-webhook, unsubscribe-email, unsubscribe-webhook oder channels: Sie gehören der Seite, nicht der API, und nehmen zehn Aufrufe pro Stunde von einer Internetadresse. Testaufruf senden ist POST /embed/<code>/test, zwanzig pro Minute. An einen Teilnehmer gehen höchstens fünf Bestätigungs-E-Mails am Tag, nie zwei innerhalb einer Minute. Eine Seite, die ihren Besucher nennt, fragt alle fünf Sekunden POST /embed/<code>/state, ob sich etwas geändert hat, sodass eine in einer E-Mail gedrückte Bestätigung dort ohne Neuladen erscheint. Teilnehmer, die nie etwas bestätigen, werden nach einer Woche entfernt.
Teilnehmer
GET /v1/syndication/partners antwortet mit einer Seite der Teilnehmer, die neuesten zuerst, mit total, page, perPage und room (used, die Teilnehmer, die etwas empfangen können, und max, das Höchstmaß). Es nimmt q (eine Teilnehmer-ID, eine Adresse oder einen Webhook), groupId, page, perPage (50, wenn weggelassen, bis 500) und ascending. Das Dashboard zeigt dieselbe Liste je Gruppe, hinter Teilnehmer in der Zeile der Gruppe. GET /v1/syndication/partners/{id} antwortet mit einem, so aufgebaut wie jeder Eintrag der Liste:
{
"partner": {
"id": "01M3QZ2F6T0Y4G3X9J8K7N5B2C",
"label": "C-1001",
"customerId": "C-1001",
"source": "self",
"blocked": false,
"blockedAt": null,
"groupId": "01M3M6X0CB978K4MC4PC59706X",
"group": { "id": "01M3M6X0CB978K4MC4PC59706X", "name": "All channels" },
"channelIds": ["01M1VFRWE7EWSY5D7QDQ0KNK1S"],
"feeds": [{ "id": "01M1VFRWE7EWSY5D7QDQ0KNK1S", "name": "Daily news" }],
"paused": false,
"email": "anna@smith-invest.com",
"emailConfirmedAt": "2026-09-28T10:04:40.000Z",
"pendingEmail": null,
"pendingEmailAt": null,
"webhook": { "url": "https://smith-invest.com/hooks/posts", "since": "2026-09-28T10:02:11.000Z", "verifiedAt": "2026-09-28T10:03:02.000Z" },
"pendingWebhook": null,
"contactEmail": "anna@smith-invest.com",
"reachable": true,
"lastDelivery": null,
"createdAt": "2026-09-28T10:02:11.000Z",
"updatedAt": "2026-09-28T10:04:40.000Z"
}
}
label ist, als was ein Teilnehmer bekannt ist: seine Teilnehmer-ID (customerId), wo das Portal ihn benannt hat, sonst seine Adresse, sonst der Host seines Webhooks, mit „(not confirmed)“ dahinter bei einem, der noch wartet. pendingWebhook (url, at) ist ein im Iframe angegebener Webhook, der darauf wartet, dass sein Inhaber ihn per E-Mail bestätigt, und contactEmail ist, wohin seine Bestätigungen gehen. channelIds und feeds sind die Kanäle seiner Gruppe, die er jetzt empfängt. source ist self für ein Abonnement im Iframe und owner für eines, das der Workspace hinzugefügt hat; blocked sagt, ob der Workspace ihn gesperrt hat, und seit wann. reachable sagt, ob ihn jetzt etwas erreichen kann, und lastDelivery ist die neueste Protokollzeile für ihn (state, mechanism, event, at, error).
PATCH /v1/syndication/partners/{id} ändert nur die Felder, die es erhält:
| Feld | Was es bewirkt |
|---|---|
paused | Solange pausiert, wird nichts gesendet, und nichts wartet auf später. |
blocked | Es wird nichts gesendet, dieselbe Adresse, derselbe Webhook oder dieselbe Teilnehmer-ID kann in der Gruppe nicht erneut abonnieren, und sie zählen nicht gegen das Kontingent. false hebt die Sperre auf. |
customerId | Seine Teilnehmer-ID, die eigene des Workspaces, eine je Gruppe; null löscht sie. |
channelIds | Seine Kanäle, aus denen der Gruppe, mindestens einer, wo die Gruppe mehrere hat. |
email | Eine andere Adresse erhält eine E-Mail, die ihren Inhaber bittet, sie zu bestätigen, und die Antwort sagt das in pendingEmail; die bestätigte Adresse empfängt bis dahin weiter. null stoppt die E-Mails. |
webhookUrl | Ein anderer Webhook wird sofort mit einem Test aufgerufen, die Antwort trägt test, und er erhält Beiträge, sobald er mit einem 2xx antwortet. null entfernt ihn (ebenso webhook: null). |
Eine Adresse oder ein Webhook, die ein anderer Teilnehmer der Gruppe hat, oder eine gesperrte, wird mit 409 abgelehnt, ebenso die Teilnehmer-ID eines anderen. Wo die Bestätigungs-E-Mail gerade nicht abgehen konnte, trägt die Antwort letterProblem mit dem Grund, und der Rest der Änderung bleibt trotzdem erhalten. POST /v1/syndication/partners/{id}/delete entfernt einen Teilnehmer endgültig, mit seinen Zeilen im Protokoll, und er kann erneut abonnieren. Einen gesperrten Teilnehmer zu entfernen beendet die Sperre mit ihm; sperren Sie also jemanden, der draußen bleiben soll, statt ihn zu entfernen.
POST /v1/syndication/groups/{id}/partners fügt im Namen des Workspaces einen Teilnehmer hinzu, mit denselben Feldern wie das Iframe: channelIds (wo die Gruppe mehrere hat), email und/oder webhookUrl, wie die Gruppe es erlaubt, und eine optionale Teilnehmer-ID, customerId. Es antwortet mit 201 und dem partner (source owner), pendingEmail, wo eine Bestätigungs-E-Mail hinausging (eine Adresse wird von ihrem Inhaber bestätigt, wer sie auch hinzugefügt hat), letterProblem, wo sie nicht abgehen konnte, test, wo ein Webhook aufgerufen wurde, und, bei einem Webhook, webhookSecret: das Signaturgeheimnis der Gruppe, einmal, damit der Workspace es weitergibt. Dieselbe Adresse, derselbe Webhook oder dieselbe Teilnehmer-ID, die schon in der Gruppe ist, wird mit 409 abgelehnt, ebenso ein gesperrter, und ebenso jeder Neue, sobald das Kontingent erreicht ist.
Was ein Teilnehmer erhält
Jede Übergabe eines Kanals, den ein Teilnehmer übernimmt, wird an ihn weitergegeben, auf den Wegen, die seine Gruppe erlaubt, auf welchen Wegen auch immer der Kanal an Sie übergibt, oder auf keinem. Ein Kanal, der eine Freigabe verlangt, gibt einen Beitrag weiter, sobald er freigegeben ist. Ein Update oder ein Löschen geht nur an die Teilnehmer, die diesen Beitrag erhalten haben; ein erneutes Senden eines Beitrags an Ihre eigenen Leute wird nicht weitergegeben. An einen pausierten Teilnehmer wird nichts gesendet. Hat ein Workspace mehr Teilnehmer als sein Kontingent, werden die ältesten zuerst bedient.
Um einen Beitrag erneut weiterzugeben, sendet POST /v1/jobs/{id}/resend-participants (posts:write) ihn, wie er jetzt lautet, an jeden Teilnehmer, dessen Gruppe den Kanal übernimmt; ein 409, wo keine Gruppe mit einem Abonnenten ihn übernimmt. Siehe Einen Beitrag erneut senden.
Per E-Mail
Eine E-Mail in Ihrem Branding: „Your video is ready to post“, „This post changed“, „Please take this post down“, mit einem Button zum Beitragspaket des Teilnehmers. Das Paket enthält das Video zum Herunterladen oder Teilen, sein Titelbild, den Text mit einem Kopieren-Button und einen Prompt für einen KI-Assistenten und nichts, womit man etwas melden könnte. Sein Link funktioniert 14 Tage. Jede E-Mail endet mit einem Link, um sie zu stoppen, der auch ihr Header List-Unsubscribe ist. Jede E-Mail, die ein Teilnehmer erhält, die Bestätigungen eingeschlossen, nennt das Abonnement in einem Kasten unter ihrer ersten Zeile: den pageTitle der Gruppe (oder „Ready-to-post videos from“ und den Titel des Brandings) und die Kanäle, um die es geht, jeweils mit Plattform, Bildformat und Sprache; die E-Mail, die zur Bestätigung eines Abonnements auffordert, trägt außerdem die description der Gruppe.
Per Webhook
Dasselbe Dokument wie Ihr eigener Webhook-Aufruf (Webhooks), mit denselben Headern, auf dieselbe Weise mit dem Geheimnis der Gruppe signiert, und:
channelsenthält nur die Kanäle, die der Teilnehmer übernimmt;deliveryIdist die eigene des Teilnehmers, undattemptzählt seine Wiederholungen;syndicationsagt, dass es weitergegeben wurde:{ "partnerId": "...", "from": "Acme Markets" };- bei einer Veröffentlichung nennt
omittednur Kanäle, die er übernimmt; - wer einen Beitrag freigegeben hat (
approvedBy,approvedAt), die Beitragsliste oder der Stream, aus dem er kam, der Titel eines manuellen Beitrags und die Kanäle, die er nicht übernimmt, bleiben weg.
postId kennzeichnet einen Beitrag über ein späteres post.update oder post.delete hinweg; ein Teilnehmer kann dagegen nichts melden. Der Testaufruf ist ein ping mit demselben syndication.
Ein Aufruf, der nicht innerhalb von fünf Sekunden mit einem 2xx beantwortet wird, wird nach 10 Sekunden, einer Minute, 5 Minuten, 15 Minuten, einer Stunde und zwei Stunden erneut versucht und gibt dann auf; eine E-Mail, die der Mailserver ablehnt, steigt dieselbe Leiter hinauf. Ein Aufruf, der mit 410 Gone beantwortet wird, nimmt den Webhook heraus, und seine Zeile liest SKIPPED; ein Teilnehmer, dem damit gar kein Weg bleibt, wird dann vom stündlichen Durchlauf mit seinen Zeilen entfernt.
Branding und E-Mail-Einstellungen
GET /v1/syndication/settings antwortet mit dem Gespeicherten (look und sender, null, wo der Standard gilt), was das ergibt (effective), den Standards, der Sendedomain und dem Kontingent. sender sagt außerdem, wie die E-Mails gehen:
{
"sender": {
"name": null,
"local": null,
"replyTo": "desk@acme-markets.com",
"mode": "smtp",
"smtp": {
"host": "mail.acme-markets.com",
"port": 587,
"security": "starttls",
"user": "no-reply@acme-markets.com",
"from": "no-reply@acme-markets.com",
"password": true
}
}
}
password sagt nur, ob eines aufbewahrt wird: Keine Route antwortet mit dem Passwort selbst.
PUT /v1/syndication/settings speichert jedes davon; null setzt eines auf seinen Standard zurück:
| Feld | Was es festlegt |
|---|---|
title | Neben dem Logo oben, bis zu 80 Zeichen. Standard: der Name des Workspaces. |
footer | Unter der Karte, bis zu 600 Zeichen. Zeilenumbrüche bleiben erhalten. |
logo | media://<id> eines PNG, JPEG oder GIF in der Mediathek, höchstens 512 KB. |
background, card, accent, signature | Farben als #RRGGBB: die Seite, die Karte, Buttons und Links, der Titel und die Überschriften. |
font | Die Schrift der Seite jeder Gruppe und der Seiten, die die E-Mails öffnen, { font, size, file }: font eine der vorinstallierten Schriften, die eine Marke verwenden kann (etwa inter; open-sans, wo weggelassen), size von 0,8 bis 1,4 (Standard 1) und file eine Schriftdatei aus der Mediathek (media://<id>, WOFF2, WOFF, TTF oder OTF), die stattdessen gerendert wird. null ist die gewohnte. Sie gilt für die Seiten und die E-Mails; eine Mail-App, die keine Webfonts lädt, zeigt die nächste, die sie hat. |
senderName | Der Name der Absenderzeile, bis zu 60 Zeichen, ohne ", <, >, @ oder \. Standard: der Titel. |
senderMode | Wie die E-Mails gehen: reelwire, von einer Adresse auf der Sendedomain von Reelwire über den Mail-Dienst von Reelwire (der Standard), oder smtp, über den eigenen Mailserver des Workspaces. Das eine oder das andere. |
senderLocal | Mit reelwire: der Teil vor dem @ der Absenderadresse, auf der Sendedomain von Reelwire: 2 bis 40 Kleinbuchstaben, Ziffern, Punkte und Bindestriche, beginnend und endend mit einem Buchstaben oder einer Ziffer. Kein Postfach steht dahinter. Eigene Adressen von Reelwire (support, billing, no-reply und dergleichen) und alles mit „reelwire“ darin werden abgelehnt, und eine, von der ein anderer Workspace sendet, ist ein 409. Standard: die No-Reply-Adresse von Reelwire. |
smtpHost | Mit smtp: der Mailserver, etwa mail.example.com. Er muss im Internet liegen: Ein Name oder eine Adresse innerhalb eines privaten Netzwerks wird abgelehnt. |
smtpPort | Mit smtp: 587, 465, 25 oder 2525, die Ports, auf denen E-Mail gesendet wird. |
smtpSecurity | Mit smtp: starttls (üblich mit 587), tls (465) oder none. |
smtpUser, smtpPassword | Mit smtp: der Login des Mailkontos. Das Passwort wird verschlüsselt aufbewahrt; ein leeres oder fehlendes behält das gespeicherte. |
smtpFrom | Mit smtp: die Adresse, von der die E-Mails kommen, eine, als die das Konto senden darf. |
replyTo | Wohin die Antwort eines Teilnehmers geht: eine Adresse, die E-Mails empfangen kann. |
Mit smtp muss jedes seiner Felder gesetzt sein, und der Server wird erprobt, bevor irgendetwas darüber gespeichert wird: Einer, der nicht antwortet oder den Login nicht annimmt, ist ein 400, der den Server zitiert, und nichts wird gespeichert.
Jede andere Farbe ergibt sich aus den vier: Wörter sind dunkel oder hell, je nachdem, worauf sie stehen. Dasselbe Branding tragen das Iframe jeder Gruppe, jede E-Mail und das Beitragspaket, und keines davon trägt den Namen von Reelwire, außer wo weder logo noch title gesetzt ist: Dann stehen das Logo und der Name von Reelwire oben (effective.house ist true), und die Texte verwenden den Namen des Workspaces.
POST /v1/syndication/preview zeigt, was ein Teilnehmer sieht, im gespeicherten Branding mit allem aus draft darübergelegt:
kind | Was es zeigt |
|---|---|
post (der Standard) | Die E-Mail, dass ein Beitrag bereit ist: ihr subject, from, replyTo, html und text. |
confirm | Die E-Mail, die eine neue Adresse um Bestätigung bittet, in denselben Feldern. |
kit | Das Beitragspaket, das eine E-Mail öffnet, als html: aufgebaut aus dem neuesten Beitrag der Kanäle der Gruppe, wo es einen gibt (sample: false), sonst aus einem Muster. |
page | Die Anmeldeseite einer Gruppe, als html, mit ausgeschalteten Buttons und einem Platzhalter, wo das Signaturgeheimnis hingehört. |
groupId nennt die Gruppe, deren Kanäle und Wege es zeigt. group (pageTitle, description, channelIds, byEmail, byWebhook, showHeader) legt ungespeicherte Werte über die dieser Gruppe oder steht für eine noch nicht erstellte Gruppe, so zeigt Was Teilnehmer sehen im Gruppendialog die Seite, eine E-Mail und das Beitragspaket, bevor irgendetwas gespeichert ist.
POST /v1/syndication/sender/test sendet eine Test-E-Mail im Branding, so wie die gespeicherten Einstellungen es sagen, mit allem aus draft darübergelegt (dieselben Felder wie PUT), sodass ein Mailserver erprobt werden kann, bevor er gespeichert wird. Sie geht an die angemeldete Person oder, mit einem API-Schlüssel, an den Inhaber des Workspaces und an niemanden sonst. Es antwortet mit { "ok": true, "to": "...", "via": "smtp", "state": "sent", "error": null }: state ist sent, skipped, wo diese Adresse keine E-Mail empfangen kann, oder failed, mit den eigenen Worten des Mailservers in error. Zehn pro Minute.
Das Protokoll
GET /v1/syndication/deliveries listet jede E-Mail (EMAIL) und jeden Webhook-Aufruf (WEBHOOK) an einen Teilnehmer auf, die neuesten zuerst, wie es die Karte Syndikationsprotokoll auf der Seite Syndikation zeigt: partnerLabel (seine Teilnehmer-ID, Adresse oder der Webhook-Host), group, event, channels, state (PENDING, DELIVERING, DELIVERED, RETRYING, DEAD oder SKIPPED, wo der Weg fällig geworden war, als er schon weg war), attempt, wohin es ging (target) und was zurückkam (lastStatusCode, lastError). Es nimmt partnerId, groupId, state, mechanism, event, q, ascending, page und perPage (50, wenn weggelassen, bis 200) und antwortet mit total, all (jede Zeile, ungefiltert) und facets, den Werten, die jeder Filter annehmen kann.
POST /v1/syndication/deliveries/{id}/redeliver sendet eine Zeile ab ihrem ersten Versuch erneut: eine E-Mail mit einem frischen Link zum Beitragspaket, einen Aufruf mit neu signierten Clip-Links. Eine Zeile, die noch unterwegs ist, ist ein 409.
Über einen KI-Assistenten
Alles auf dieser Seite ist ein Tool des Syndikations-Satzes, aufgelistet unter /mcp/all und von /mcp aus mit reelwire_find_tools zu finden: reelwire_list_syndication_groups, reelwire_add_syndication_group, reelwire_update_syndication_group und reelwire_remove_syndication_group für die Gruppen; reelwire_list_partners, reelwire_add_subscriber (einen Teilnehmer hinzufügen), reelwire_update_partner und reelwire_remove_partner für die Teilnehmer; reelwire_syndication_settings, reelwire_set_syndication_look, reelwire_syndication_preview und reelwire_syndication_test_email für das Branding und die E-Mails; reelwire_list_partner_deliveries und reelwire_resend_to_partner für das Protokoll. Siehe Jedes Tool.