Zum Hauptinhalt springen

Kanäle

Ein Kanal ist ein Konto in einem Format (einer Plattform-Oberfläche), das eine Sprache spricht und eine Marke trägt. „Orchid Invest DE“ auf Instagram Reels ist ein Kanal; dasselbe Konto, das im Instagram-Feed veröffentlicht, ist ein anderer, weil die Oberfläche das Bildformat festlegt. Was ein Kanal erstellt, ist genau die Menge seiner Abonnements.

Die Oberfläche bestimmt den Clip, seine Beschreibung und seine Hashtags. Ist ein Beitrag fällig, wird er per E-Mail, per Webhook oder beidem übergeben, je nach den Schaltern deliverByEmail und deliverByWebhook des Kanals, und wer ihn erhält, veröffentlicht ihn; wo die Plattform einen Plattform-Connector hat, lässt deliverByConnector Reelwire ihn dort selbst veröffentlichen, mit den im Kanal als connector gespeicherten Zugangsdaten. Siehe unten Wie ein Beitrag übergeben wird.

MethodePfadBerechtigung
GET/v1/channelschannels:read
GET/v1/channels/surfaceschannels:read
POST/v1/channelschannels:write
PATCH/v1/channels/{id}channels:write
POST/v1/channels/connector/testchannels:write
POST/v1/channels/{id}/deletechannels:write
POST/v1/channels/{id}/duplicatechannels:write
POST/v1/channels/{id}/subscriptionschannels:write
PATCH/v1/channels/{id}/subscriptions/{subId}channels:write
POST/v1/channels/{id}/subscriptions/{subId}/deletechannels:write
PUT/v1/channels/{id}/credentialschannels:write
POST/v1/channels/{id}/credentials/deletechannels:write
GET/v1/connectionsconnections:read
PUT/v1/connections/modeconnections:write
GET/v1/deliveriesconnections:read
POST/v1/deliveries/{id}/redeliverconnections:write

Die Zugangsdaten des Plattform-Connectors eines Kanals reisen mit dem eigenen Erstellen und PATCH des Kanals, aber nur eine angemeldete Person mit der Berechtigung Verwaltung darf sie setzen oder entfernen: Ein Schlüssel mit channels:write liest sie maskiert und testet sie, und wird abgelehnt, wenn er sie sendet (siehe Zugangsdaten des Plattform-Connectors). Die beiden stillgelegten Zugangsdaten-Routen, PUT /v1/channels/{id}/credentials und ihr Löschen, liegen ebenfalls unter /v1/channels; ein Schlüssel braucht dafür also channels:write und eine angemeldete Person die Berechtigung Verwaltung, wie bei der Adresse des Webhooks. Wie Beiträge den Workspace verlassen, und das Protokoll dessen, was zugestellt wurde, sind der Bereich Activity - What went out, connections: Wer das Zustellprotokoll erhält, erhält damit nicht jeden Kanal.

Kanäle auflisten​

curl http://localhost:4000/v1/channels \
-H "Authorization: Bearer rw_your_key_here"
{
"channels": [
{
"id": "01M1VFRWE7EWSY5D7QDQ0KNK1S",
"name": "Channel 1 en",
"platform": "instagram",
"surface": "instagram-reels",
"surfaceLabel": "Instagram Reels",
"platformChoice": "instagram",
"ratio": "9x16",
"locale": "en",
"enabled": true,
"approval": "NONE",
"deliverByEmail": false,
"deliverByWebhook": true,
"deliverByConnector": false,
"connector": null,
"posting": {
"allowComments": true,
"brandedContent": false,
"allowDuetStitch": false,
"hashtagsAsFirstComment": false,
"silent": false,
"notifySubscribers": true,
"shareToFeed": true,
"protectContent": false
},
"syndicates": false,
"syndicationToken": null,
"brand": { "id": "01M1VFRWE7VHP3H54ESRJQ0SAJ", "name": "Brand 1", "enabled": true },
"subscriptions": [
{
"id": "01M2985NZZ9NR9W21JJZ8VQQ4N",
"kind": "QUEUE",
"sourceSlug": null,
"formatSlug": null,
"streamId": null,
"queueId": "01M2985NYG2GJ450CQAF3DP5YK",
"queueName": "Enterprise 2 Post list 1",
"feedId": null,
"templateId": null,
"templateVariant": null,
"templateVersion": null,
"enabled": true
},
{
"id": "01M29DSF6S2JYYXQQM4XHJMGK7",
"kind": "BROADCAST",
"sourceSlug": "crypto-spot-and-dominance",
"formatSlug": "crypto-board",
"streamId": null,
"queueId": null,
"queueName": null,
"feedId": "fd_c16f5268064a",
"templateId": "tpl_06dc2554e5ac",
"templateVariant": "Data terminal",
"templateVersion": null,
"enabled": true
}
]
}
]
}

posting trägt jeden Schalter mit seinen ausgefüllten Standardwerten: Die, die die Oberfläche nicht hat, stehen dort immer auf ihrem Standard, und visibility erscheint nur, wo die Oberfläche eine Wahl bietet und eine getroffen wurde. Welche Oberfläche welche hat, steht unter Veröffentlichungseinstellungen, und platformChoice erklärt das Dropdown Plattform weiter unten.

Jeder Kanal trägt außerdem approvers, wie viele Personen einen seiner Beiträge freigeben: 1, oder 2, wo ein Enterprise-Workspace zwei verlangt (siehe Compliance). Neben channels sagt approval, was der Tarif dieses Workspaces mit der Freigabe eines Kanals tut: { "available": true, "dual": false }, wobei available angibt, ob die Einstellung berücksichtigt wird (Small business und Enterprise) und dual, ob zwei Freigebende verlangt werden dürfen (Enterprise). In einem Tarif ohne sie bleibt die approval eines Kanals so, wie sie gesetzt wurde, und wird als NONE gelesen.

Die Oberfläche bestimmt die Form​

GET /v1/channels/surfaces ist die Liste zur Auswahl und sagt, welche Seitenverhältnisse jede anbietet.

{
"surfaces": [
{ "surface": "youtube-shorts", "platform": "youtube", "label": "YouTube Shorts", "ratios": ["9x16"] },
{ "surface": "youtube-video", "platform": "youtube", "label": "YouTube Long-form", "ratios": ["16x9"] },
{ "surface": "facebook-reels", "platform": "facebook", "label": "Facebook Reels", "ratios": ["9x16"] },
{ "surface": "facebook-feed", "platform": "facebook", "label": "Facebook Feed", "ratios": ["1x1"] },
{ "surface": "instagram-reels", "platform": "instagram", "label": "Instagram Reels", "ratios": ["9x16"] },
{ "surface": "instagram-feed", "platform": "instagram", "label": "Instagram Feed", "ratios": ["4x5", "1x1"] },
{ "surface": "tiktok", "platform": "tiktok", "label": "TikTok", "ratios": ["9x16"] },
{ "surface": "linkedin", "platform": "linkedin", "label": "LinkedIn personal", "ratios": ["1x1", "16x9", "9x16", "4x5"] },
{ "surface": "linkedin-company", "platform": "linkedin", "label": "LinkedIn company", "ratios": ["1x1", "16x9", "9x16", "4x5"] },
{ "surface": "telegram", "platform": "telegram", "label": "Telegram", "ratios": ["9x16", "1x1", "16x9", "4x5"] },
{ "surface": "discord", "platform": "discord", "label": "Discord", "ratios": ["9x16", "4x5", "1x1", "16x9"] },
{ "surface": "slack", "platform": "slack", "label": "Slack", "ratios": ["9x16", "4x5", "1x1", "16x9"] },
{ "surface": "threema", "platform": "threema", "label": "Threema", "ratios": ["9x16", "4x5", "1x1", "16x9"] },
{ "surface": "signal", "platform": "signal", "label": "Signal", "ratios": ["9x16", "4x5", "1x1", "16x9"] },
{ "surface": "wechat", "platform": "wechat", "label": "WeChat", "ratios": ["9x16", "4x5", "1x1", "16x9"] },
{ "surface": "whatsapp", "platform": "whatsapp", "label": "WhatsApp", "ratios": ["9x16", "4x5", "1x1", "16x9"] },
{ "surface": "x", "platform": "x", "label": "X", "ratios": ["9x16", "4x5", "1x1", "16x9"] },
{ "surface": "threads", "platform": "threads", "label": "Threads", "ratios": ["9x16", "4x5", "1x1", "16x9"] },
{ "surface": "pinterest", "platform": "pinterest", "label": "Pinterest", "ratios": ["2x3", "9x16", "1x1", "4x5"] },
{ "surface": "download", "platform": "download", "label": "No specific platform", "ratios": ["9x16", "4x5", "1x1", "16x9"] }
],
"platforms": [
{
"id": "not-specified",
"label": "Not specified",
"shapes": [{ "ratio": "9x16", "surface": "download" }, { "ratio": "4x5", "surface": "download" }, { "ratio": "1x1", "surface": "download" }, { "ratio": "16x9", "surface": "download" }],
"connector": null,
"fields": []
},
{
"id": "facebook",
"label": "Facebook",
"shapes": [{ "ratio": "9x16", "surface": "facebook-reels" }, { "ratio": "1x1", "surface": "facebook-feed" }],
"connector": "planned",
"fields": []
},
{
"id": "telegram",
"label": "Telegram",
"shapes": [{ "ratio": "9x16", "surface": "telegram" }, { "ratio": "1x1", "surface": "telegram" }, { "ratio": "16x9", "surface": "telegram" }, { "ratio": "4x5", "surface": "telegram" }],
"connector": "available",
"fields": [
{ "key": "botToken", "label": "Bot token", "hint": "From @BotFather in Telegram: send /newbot and copy the token it answers with.", "secret": true, "placeholder": "123456789:AAE..." },
{ "key": "chatId", "label": "Channel or group", "hint": "@name of a public channel, or the numeric id (-100...) of a private one or a group. Add the bot there as an administrator that may post messages.", "secret": false, "placeholder": "@yourchannel" }
]
}
]
}

platforms ist das Dropdown Plattform des Dashboards, in dessen Reihenfolge (das Beispiel zeigt drei seiner achtzehn): zuerst Nicht angegeben, dann die Plattformen nach Namen, jede mit den Formen, die sie annimmt, der Oberfläche, als die jede Form gespeichert wird, ob Reelwire dort selbst veröffentlichen kann (connector: available, planned oder null für Nicht angegeben) und was ihr Connector verlangt (fields, leer, sofern er nicht available ist). Vier sind heute available: discord, linkedin-personal, slack und telegram. Jede andere Plattform ist planned, Threema eingeschlossen. Ein Kanal speichert weiterhin seine surface und ratio; platformChoice bei einem Kanal sagt, zu welcher davon er gehört, sodass ein Kanal auf der Oberfläche linkedin zu linkedin-personal gehört, einer auf youtube-video (YouTube Long-form) zu youtube und einer auf download zu not-specified.

„Facebook“ ist keine Antwort auf die Frage nach der Form: Reels wollen 9x16, und der Seiten-Feed will 1x1. Eine Oberfläche mit einem Seitenverhältnis legt es fest, und ratio im Text wird ignoriert. Eine Oberfläche mit mehreren fragt danach, und ratio dort wegzulassen ist ein 400, der die Möglichkeiten nennt.

Keine bestimmte Plattform (download) ist eine eigene Oberfläche und kein Netzwerk: das Format für einen Kanal, der nicht benennt, wohin seine Clips gehen. Jedes Bildformat wird angeboten, weil die Person entscheidet, wohin der Clip geht, und seine Beschreibung wird in vier Längen aufbewahrt, eine für jede Art von Plattform. Der Schlüssel ist weiterhin download, der Name, den er hatte, als sie die eine Plattform war, deren Beiträge per E-Mail verschickt wurden. Jeder neue Workspace beginnt mit einem, genannt „Default channel“, per E-Mail übergeben.

Wie ein Beitrag übergeben wird​

FeldWas es bewirkt
deliverByEmailIst ein Beitrag fällig, erhalten die Personen, die für den Workspace veröffentlichen (der Inhaber und alle mit Betrieb), eine E-Mail zur Übergabe, die sagt, welcher Beitrag für welche Kanäle bereit ist, mit einem Button zum Beitragspaket: das Video jedes Kanals zum Herunterladen oder Teilen, sein Text zum Kopieren, seine Veröffentlichungseinstellungen sowie Als veröffentlicht markieren oder Überspringen. Siehe Per E-Mail übergebene Beiträge.
deliverByWebhookIst ein Beitrag fällig, wird er signiert und an die Webhook-Adresse des Workspaces gesendet. Siehe Webhooks.
deliverByConnectorIst ein Beitrag fällig, veröffentlicht Reelwire ihn selbst über seinen Plattform-Connector auf der Plattform des Kanals und meldet ihn mit seinem Link als veröffentlicht. Nur wo der connector der Plattform available ist und Zugangsdaten gespeichert sind; sonst ist true ein 409, der sagt, was fehlt.
connectorDie gespeicherten Zugangsdaten des Plattform-Connectors, maskiert (ein Geheimnis als seine letzten vier Zeichen), oder null: was sie beim letzten bestandenen Test erreichten (account), wann sie zuletzt getestet wurden (checkedAt), warum dieser Test fehlschlug (checkFailure, null, wenn er bestanden wurde oder keiner stattfand), wann sie ablaufen (expiresAt) und ob vorher eine Erinnerung per E-Mail verschickt wird (remindExpiry). unreadable ist true, wo sie gespeichert sind, aber nicht mehr gelesen werden können und neu eingegeben werden müssen. Siehe Zugangsdaten des Plattform-Connectors.
syndicates, syndicationTokenVeraltet und ohne Wirkung, beantwortet bis zum nächsten Major-Release. Ein Kanal hat keine eigene Seite mehr: Beiträge werden gruppenweise an Teilnehmer weitergegeben, siehe Syndikation.

Beliebige davon dürfen gemeinsam true sein: Der Beitrag wird dann per E-Mail verschickt, gesendet und veröffentlicht, wie eingeschaltet. Alle dürfen false sein: Der Beitrag geht dann an niemanden des Workspaces selbst. Er wird in dem Moment übergeben, in dem er fällig ist, erscheint mit seinen Anfragen auf der Seite Beiträge und erreicht trotzdem jeden Syndikations-Teilnehmer, dessen Gruppe den Kanal übernimmt; so entsteht ein Kanal nur für Syndikation. Syndikationsteilnehmer veröffentlichen nie über den Connector eines Kanals: Sie empfangen auf den Wegen, die ihre Gruppe erlaubt.

Ein Beitrag an mehrere Kanäle wird einmal je Batch übergeben, nicht einmal je Kanal. Seine Kanäle, die keine Freigabe brauchen, gehen zusammen, in einer E-Mail und einem signierten Webhook-Aufruf, der jeden von ihnen trägt, sobald alle gerendert und fällig sind; jeder Kanal, der eine Freigabe verlangt, folgt allein, sobald er freigegeben ist. Ein Plattform-Connector veröffentlicht jeden Kanal für sich. Siehe Ein Aufruf je Übergabe und Beiträge und Aufträge.

Zugangsdaten des Plattform-Connectors​

Nur eine angemeldete Person mit der Berechtigung Verwaltung setzt oder entfernt sie, und das tun die Einstellungen des Kanals im Dashboard über dieselben Routen. Ein API-Schlüssel, die Verbindung eines KI-Assistenten eingeschlossen, kann das nie: Ein connector in seinem Erstellen oder PATCH ist ein 403. Jeder, der Kanäle bearbeiten darf, liest sie maskiert und darf testen, was gespeichert ist.

connector bei einem Erstellen oder PATCH setzt sie: { "fields": { ... }, "expiresAt": "...", "remindExpiry": true }, mit den Schlüsseln, die der Eintrag der Plattform in platforms auflistet. Ein weggelassenes oder leeres Feld behält, was für dieselbe Plattform gespeichert ist, und ein danach noch fehlendes Feld ist ein 400, der es nennt; sind schon Zugangsdaten gespeichert, kann fields entfallen, um nur den Ablauf oder die Erinnerung zu ändern. expiresAt ist, wann sie nicht mehr funktionieren (ISO 8601, null für nie), und remindExpiry schickt dem Inhaber und allen mit Verwaltung eine E-Mail eine Woche und einen Tag vorher. Bei einer Plattform, deren Connector nicht available ist, ist es ein 409. Werte, die nicht stimmen können, etwa eine Discord-Adresse auf einem anderen Host, sind ein 400. Das Speichern fragt die Plattform nichts: Testen Sie sie mit der Route unten. Neue Werte, deren Test in der letzten halben Stunde bestanden wurde, behalten, was er fand; sonst zeigen sie account: null bis zu einem Test oder ihrem ersten Beitrag, der sie zuerst testet und mit dem Grund der Plattform stoppt, wenn sie nicht funktionieren. "connector": null entfernt sie und schaltet deliverByConnector aus. Auch der Wechsel des Kanals zu einer anderen Plattform entfernt sie und schaltet ihn aus.

{
"surface": "telegram",
"ratio": "9x16",
"connector": {
"fields": { "botToken": "123456789:AAE...", "chatId": "@companynews" },
"expiresAt": null,
"remindExpiry": false
},
"deliverByConnector": true
}
{
"channel": {
"id": "01M1VFRWE7EWSY5D7QDQ0KNK1S",
"deliverByConnector": true,
"connector": {
"platform": "telegram",
"account": "@companybot in Company News",
"checkedAt": "2026-09-30T09:12:44.120Z",
"checkFailure": null,
"expiresAt": null,
"remindExpiry": false,
"updatedAt": "2026-09-30T09:12:44.131Z",
"unreadable": false,
"fields": [
{ "key": "botToken", "value": "••••wxyz" },
{ "key": "chatId", "value": "@companynews" }
]
}
}
}

Keine Antwort enthält je ein gespeichertes Geheimnis im Klartext. Wie man die Werte jeder Plattform erhält, steht unter Per Plattform-Connector veröffentlicht.

Einen Plattform-Connector testen​

POST /v1/channels/connector/test fragt die Plattform, ob die Zugangsdaten funktionieren, und veröffentlicht nichts: Es liest nur, was sie erreichen, etwa den Bot von Telegram und seine Mitgliedschaft im Chat, die App und den Kanal von Slack, die eigenen Angaben des Discord-Webhooks oder das LinkedIn-Mitglied. { "channelId": "..." } testet, was bei diesem Kanal gespeichert ist, und behält das Ergebnis dort (checkedAt, account, wenn bestanden, checkFailure, wenn nicht); jeder Schlüssel und jede Person mit Channels: write darf das. Mit fields werden eingegebene, nicht gespeicherte Werte getestet, über das gelegt, was für dieselbe Plattform gespeichert ist, wie es ein Speichern täte, und surface nennt die Plattform, wenn es nicht die des Kanals ist; für einen noch nicht erstellten Kanal senden Sie fields und surface ohne channelId. Das Testen nicht gespeicherter Werte ist nur Personen mit Verwaltung vorbehalten, und ein Schlüssel, der fields sendet, erhält einen 403. Ein Test wartet höchstens 20 Sekunden auf die Plattform.

curl -X POST http://localhost:4000/v1/channels/connector/test \
-H "Authorization: Bearer rw_your_key_here" \
-H "Content-Type: application/json" \
-d '{"channelId":"01M1VFRWE7EWSY5D7QDQ0KNK1S"}'
{
"test": { "ok": true, "account": "@companybot in Company News", "checkedAt": "2026-10-02T09:12:44.120Z", "saved": true },
"channel": { "id": "01M1VFRWE7EWSY5D7QDQ0KNK1S", "connector": { "account": "@companybot in Company News", "checkFailure": null } }
}

Auch ein fehlgeschlagener Test ist eine Antwort, ein 200 mit "ok": false und dem reason der Plattform, etwa ein Bot, der im Kanal nicht veröffentlichen darf; eine Plattform, die gerade nicht erreichbar war, sagt das. saved ist false bei nicht gespeicherten Werten, die nicht im Kanal behalten werden und ohne channel zurückkommen. Eine Plattform, deren Connector nicht available ist, ein Kanal ohne gespeicherte Zugangsdaten für seine Plattform oder gespeicherte, die nicht mehr gelesen werden können, sind jeweils ein 409, der sagt, was zutrifft. Über MCP ist das reelwire_test_channel_connector.

Veröffentlichungseinstellungen​

posting sind die Veröffentlichungseinstellungen des Kanals, der letzte Abschnitt seines Dialogs: wie seine Beiträge auf der Plattform erscheinen sollen. Sie gehen mit jedem Weg nach draußen, ob Reelwire dort selbst veröffentlicht oder nicht: im posting des Webhook-Aufrufs, in Worten im Beitragspaket der E-Mail und angewendet vom Plattform-Connector des Kanals, wo er einen hat.

FeldWas es sagtOberflächen, die es habenStandard
visibilityWer den Beitrag sehen kann.YouTube Shorts und Long-form (public, unlisted, private), TikTok (public, private), LinkedIn persönlich (public, connections)fehlt, was öffentlich bedeutet
allowCommentsKommentare sind offen. Auf X bedeutet aus, dass nur die Konten antworten können, die der Beitrag erwähnt.YouTube, Facebook, Instagram, TikTok, LinkedIn persönlich und Unternehmen, X, Threads, Pinteresttrue
brandedContentGegenüber der Plattform als bezahlte Partnerschaft oder als Eigenwerbung der Marke gekennzeichnet.YouTube, Facebook, Instagram, TikTokfalse
allowDuetStitchAndere dürfen ein Duett oder Stitch daraus machen.TikTokfalse
hashtagsAsFirstCommentDie Hashtags kommen in einen ersten Kommentar, was die Beschreibung sauber hält.Instagram Reels und Feedfalse
silentOhne Ton gesendet: Abonnenten werden ohne Ton oder Vibration benachrichtigt.Telegramfalse
notifySubscribersDie Abonnenten des Kanals werden über das neue Video informiert.YouTube Shorts und Long-formtrue
shareToFeedDas Reel erscheint im Feed-Raster des Profils ebenso wie in Reels.Instagram Reelstrue
protectContentNiemand kann den Beitrag weiterleiten oder das Video speichern.Telegramfalse

Discord, Slack, Threema, Signal, WeChat, WhatsApp und Keine bestimmte Plattform haben keine.

Ein Wert des falschen Typs ist ein 400, und ein Schlüssel, der keiner dieser ist, wird verworfen. posting wird als Ganzes ersetzt, bei einem Erstellen wie bei einem PATCH: Ein weggelassener Schalter geht auf seinen Standard zurück, senden Sie also jeden Schalter, den Sie behalten wollen. Ein Schalter, den die Oberfläche nicht hat, wird behalten, wird als Standard gelesen, solange der Kanal dort bleibt, und gilt, sobald der Kanal auf eine Oberfläche wechselt, die ihn hat. Eine visibility, die die Oberfläche nicht bietet, wird als öffentlich gelesen.

Einen Kanal erstellen​

Ein Name genügt. Alles andere hat einen vertretbaren Standard, und ein bestehender Kanal lässt sich mit einem Aufruf korrigieren.

curl http://localhost:4000/v1/channels \
-H "Authorization: Bearer rw_your_key_here" \
-H "Content-Type: application/json" \
-d '{"name":"Orchid Invest DE","surface":"instagram-reels","locale":"de","brandId":"01M1VFRWE7VHP3H54ESRJQ0SAJ"}'
FeldErforderlichStandard
nameneinDer erste freie von „New channel“, „New channel 2“ und so weiter. Bis zu 80 Zeichen.
surfaceneininstagram-reels
ratiowo die Oberfläche mehrere bietetDas einzige Seitenverhältnis der Oberfläche. Erforderlich, wo sie mehr als eines bietet.
localeneinen. Ein ISO-639-1-Code oder einer von zh-CN, zh-TW, pt-BR.
brandIdneinDie älteste aktivierte Marke des Workspaces.
approvalneinNONE. PER_POST hält jeden Beitrag und jedes Update eines bereits veröffentlichten Beitrags für einen Prüfer an; es gibt es mit Small business und Enterprise, und in einem anderen Tarif ist es ein 409. Einen Kanal von PER_POST zurück auf NONE zu stellen erfordert einen Schlüssel, der auch approvals:write hält (eine Person: die Berechtigung Freigaben), sonst ist es ein 403. Wie viele Personen freigeben, approvers bei jedem Kanal (1 oder 2), wird unter Compliance festgelegt (Enterprise).
deliverByEmailneintrue.
deliverByWebhookneinfalse.
deliverByConnectorneinfalse. true braucht connector in derselben Anfrage, bei einer Plattform, deren Connector verfügbar ist; bei einem Erstellen kann es also nur eine angemeldete Person mit Verwaltung einschalten.
connectorneinKeine gespeichert. Siehe Zugangsdaten des Plattform-Connectors.
postingneinJeder Schalter auf seinem Standard. Siehe Veröffentlichungseinstellungen.

201, mit dem Kanal als { "channel": { ... } }. Ein bereits verwendeter Name ist ein 409.

Zwei Ablehnungen, die man kennen sollte. Ohne irgendeine Marke im Workspace: „Make a brand first: every channel wears one.“ Und ohne Webhook: „This account has no webhook yet. Set one under Webhook first.“ Ein Webhook bedient den ganzen Workspace und wird von jedem Kanal wiederverwendet, das wird also einmal festgelegt. Ein Workspace hält bis zu 200 Kanäle, sofern Reelwire keine andere Zahl gesetzt hat; ein weiterer ist ein 409, der die Zahl nennt und sagt, wie man mehr anfordert.

PATCH /v1/channels/{id} nimmt dieselben Felder und enabled zum Pausieren oder Fortsetzen. Eine Änderung von Oberfläche, Seitenverhältnis, Sprache oder Marke ändert, was der Kanal ab jetzt rendert, und deshalb ist sie erlaubt. Bereits übergebene Arbeit bleibt unberührt: Ein Beitrag hält die Form und Sprache fest, in der er veröffentlicht wurde. Ein einzeln gesendeter Schalter wird über die anderen gelegt, wie sie stehen. Eine neue Oberfläche ohne ratio behält das Seitenverhältnis des Kanals, wo die Oberfläche es bietet; wo nicht, nimmt eine Oberfläche mit einem Seitenverhältnis dieses, und eine mit mehreren ist ein 400, der die Möglichkeiten nennt.

POST /v1/channels/{id}/delete entfernt einen Kanal und antwortet mit { "deleted": "...", "cancelled": 2 }. Für ihn wird nichts mehr gerendert oder übergeben, jeder noch wartende Auftrag wird abgebrochen (cancelled zählt sie), und seine gespeicherten Zugangsdaten, die seines Plattform-Connectors eingeschlossen, werden vergessen. Was er schon übergeben hat, bleibt dort, wo es veröffentlicht wurde: Das Entfernen eines Kanals bittet nie jemanden, einen Beitrag zu löschen. Auch seine Historie bleibt, unter seinem Namen mit angehängtem „ (removed)“, sodass ein neuer Kanal den alten Namen übernehmen kann.

POST /v1/channels/{id}/duplicate mit { "name": "Instagram FR" } erstellt einen zweiten Kanal wie diesen und antwortet mit 201 und ihm, wie das Erstellen. Die Kopie hat die Oberfläche, das Seitenverhältnis, die Sprache, die Marke, die Freigabe, die Veröffentlichungseinstellungen, deliverByEmail, deliverByWebhook des Kanals und jedes Abonnement mit seiner Variante, Version und enabled. Drei Dinge sind absichtlich anders:

  • Sie beginnt pausiert (enabled false). Würde sie dieselben Quellen empfangen, würde sie sonst jeden Beitrag ein zweites Mal rendern und auf denselben Wegen übergeben. Ändern Sie mit PATCH, was abweichen soll, und senden Sie dann enabled: true.
  • Der Plattform-Connector wird nicht kopiert, weder seine Zugangsdaten noch sein Schalter: connector ist null und deliverByConnector false. Zugangsdaten veröffentlichen als ein Konto und werden von einer Person mit der Berechtigung Verwaltung gesetzt.
  • Der Name ist erforderlich, und ein Name, den ein anderer Kanal hat, ist ein 409.

Es ist Duplizieren in der Tabelle Kanäle und reelwire_duplicate_channel für einen KI-Assistenten.

Abonnements: was ein Kanal empfängt​

Ein Abonnement nennt genau eine Eingabe, und kind sagt, welche.

kindNennt die Eingabe mitDie Vorlage stammt aus
BROADCASTsourceSlug und formatSlugDer Bindung des Feeds im Katalog
STREAMstreamIdDem Stream
QUEUEqueueIdJedem Beitrag der Liste

Die Quelle legt die Vorlage fest; der Kanal wählt den Zuschnitt und den Build. Einem Produzenten, der in einen Stream schreibt, wurde eine Form versprochen, und ein Kanal darf sie nicht überstimmen. Was der Kanal wählt, ist templateVariant und templateVersion, eine exakte major.minor.patch oder "latest". Weggelassen ist die Variante bei einem BROADCAST diejenige, an die der Feed gebunden ist, und bei einem STREAM die erste der Vorlage, und die Version ist "latest".

Ein BROADCAST-Abonnement kann außerdem language tragen, die Sprache, in der der Feed auf diesem Kanal geliefert wird: ein Code wie "es" oder "pt-BR", oder null für die eigene Sprache des Kanals, womit ein Abonnement beginnt. Ein Feed, dessen multilingual in GET /v1/feeds true ist, nimmt jede Sprache an und wird per KI in die Sprachen übersetzt, die seine Kanäle gewählt haben. Ein Feed, dessen multilingual false ist, kommt in den Sprachen, die sein languages nennt, die Standardsprache zuerst, jede vom eigenen Code des Feeds geschrieben und nie von KI: Eine davon wird akzeptiert und jede andere ist ein 409, und mit null kommt er in der eigenen Sprache des Kanals, wo diese genannt ist, sonst in der Standardsprache des Feeds. Eine language bei einem Stream oder einer Beitragsliste ist ebenfalls ein 409, da ihre Ereignisse und Beiträge ihre eigenen Sprachen tragen. Jedes Abonnement antwortet mit seiner language, null, wo es dem Kanal folgt.

Ein BROADCAST- oder STREAM-Abonnement kann außerdem look tragen, wie seine Clips auf diesem Kanal aussehen: die Look-Schalter der Vorlage nach Schlüssel, etwa { "theme": "dark", "pace": "calm", "hideHeader": true }. Welche Schalter eine Vorlage hat und welche Werte jeder annimmt, steht in clipData.look ihres Schemas (GET /v1/formats/template/{id}?variant= für die Variante des Abonnements): Theme, Pace, Corners, Text alignment, Logo, Logo size, Hide logo and title, Hide footer line, Background pattern und, bei einem Hintergrund, Strength. Sie werden beim Erstellen jedes Clips über das gelegt, was der Inhalt sagt, da der Kanal wählt, wie seine eigenen Clips aussehen. Ein weggelassener Schalter, "auto" oder false ist der des Stils, und null bedeutet, dass jeder Schalter der des Stils ist, womit ein Abonnement beginnt. Ein Schlüssel oder Wert, den der Build nicht annimmt, ist ein 400, der nennt, was er annimmt; ein Look bei einem QUEUE-Abonnement ist ein 409, da jeder Beitrag der Liste seinen eigenen in seinem Inhalt setzt. Jedes Abonnement antwortet mit seinem look, null für den des Stils.

Ein BROADCAST-Abonnement auf einen Feed, dessen usable in GET /v1/feeds false ist, ist ein 403, der die nötigen Tarife nennt: Der Feed ist nur in anderen Tarifen verfügbar (plans). Ein Kanal, der ihn vor dem Tarifwechsel des Workspaces empfing, behält sein Abonnement und empfängt nichts vom Feed, bis der Tarif ihn wieder enthält.

curl http://localhost:4000/v1/channels/01M1VFRWE7EWSY5D7QDQ0KNK1S/subscriptions \
-H "Authorization: Bearer rw_your_key_here" \
-H "Content-Type: application/json" \
-d '{"kind":"STREAM","streamId":"st_d84d89e39bfc","templateVariant":"Corporate glass","templateVersion":"latest"}'

201, und der ganze Kanal kommt zurück, mit dem neuen Abonnement in seiner Liste:

{
"channel": {
"id": "01M1VFRWE7EWSY5D7QDQ0KNK1S",
"name": "Channel 1 en",
"subscriptions": [
{
"id": "01M2SQZVBYJJ5YF2QFYNEG5A78",
"kind": "STREAM",
"sourceSlug": null,
"formatSlug": null,
"streamId": "st_d84d89e39bfc",
"queueId": null,
"queueName": null,
"feedId": null,
"templateId": "tpl_dd7e6b264fb8",
"templateVariant": "Corporate glass",
"templateVersion": null,
"enabled": true
}
]
}
}

Auch die anderen Felder des Kanals sind da, genau wie GET /v1/channels sie zeigt.

"latest" wird als null gespeichert, was eine echte Antwort und keine Abwesenheit ist: Es folgt dem neuesten Build, aufgelöst, wenn etwas gerendert wird. Alles andere muss eine exakte dreiteilige Version sein, denn eine Festlegung, die fast eine Version ist, ist eine Festlegung auf nichts, und eine Variante oder Version, für die die Vorlage keinen Build hat, wird abgelehnt, statt nichts rendern zu lassen. Ein QUEUE-Abonnement legt nichts fest: Jeder Beitrag der Liste wählt seine eigene.

Einen Kanal zweimal auf dieselbe Eingabe zu abonnieren ist ein 409. Ein Feed, Stream oder eine Beitragsliste, den oder die es nicht gibt, ist ein 404, und ein fertiger Feed, der dem Konto nach den gewählten Branchen nicht angeboten wird, ist ein 403, der den Feed nennt. Ein Kanal empfängt bis zu 100 Quellen, sofern Reelwire dem Workspace keine andere Zahl gesetzt hat; eine weitere ist ein 409, der das sagt.

PATCH /v1/channels/{id}/subscriptions/{subId} ändert die Variante, die Version, enabled, releaseSchedule, language oder look und liefert den Kanal; eine Variante oder Version bei einem QUEUE-Abonnement ist ein 409, da jeder Beitrag der Liste seine eigene wählt. Ein gesendeter look ersetzt den gewählten und wird gegen den Build geprüft, den das Abonnement nach der Änderung rendert; eine neue Variante oder Version ohne einen behält die Schalter, die der neue Build noch hat.

releaseSchedule sagt, wann die Updates eines fertigen Feeds auf diesem Kanal ausgehen: null für sobald sie eintreffen, Bei Eingang senden (so beginnt jedes Abonnement), oder { "days": [1, 2, 3, 4, 5], "times": ["09:00"] }, ISO-Wochentage (1 Montag bis 7 Sonntag) und eine bis sechs Tageszeiten, HH:MM in UTC, oder monatlich, { "monthDay": 1, "times": ["09:00"] }, ein Tag des Monats von 1 bis 28, oder verzögert, { "delayMinutes": 30 }, jedes Update so viele Minuten nach seinem Eintreffen, 1 bis 1440 (24 Stunden). Es wird nur bei BROADCAST-Abonnements akzeptiert, auch beim Erstellen; bei einem Stream oder einer Beitragsliste ist es ein 409. Jedes Update wartet dann auf die nächste Veröffentlichung (oder das Ende seiner Verzögerung), und ein früher eintreffendes neueres ersetzt es und geht im selben Moment hinaus, sodass nur das neueste veröffentlicht wird; eine Veröffentlichung, bei der nichts wartet, veröffentlicht nichts. Jedes Abonnement im Kanal antwortet mit releaseSchedule, releaseLabel (der Plan in Worten) und waiting: Wartet ein Update, { "since", "goesAt", "skipped" }, dem Moment seines Eintreffens, seiner Veröffentlichung und wie viele ältere Updates es ersetzt hat; sonst null. null zu setzen, während eines wartet, sendet es sofort. POST /v1/channels/{id}/subscriptions/{subId}/delete entfernt es und liefert den Kanal, wie er jetzt steht; eines, das schon Beiträge erzeugt hat, wird verborgen behalten statt gelöscht, damit diese Beiträge weiterhin nennen, woher sie kommen. Die Eingabe selbst, der Feed, Stream oder die Liste, bleibt unberührt.

Alles stoppen​

Jeder Kanal des Workspaces auf einmal angehalten, in jedem Tarif, und geplante Pausen, dasselbe für einen im Voraus festgelegten Zeitraum, bei Enterprise (die Seite Alles stoppen des Dashboards sagt, was das Anhalten bewirkt). Gelesen mit Channels: read, geändert mit Channels: write; eine angemeldete Person braucht Betrieb oder Freigaben.

  • GET /v1/channels/stop antwortet mit stopped ({ since, by, reason } oder null), silentNow (warum gerade nichts hinausgeht: { kind: "stopped" } oder { kind: "silence", name, until } oder null), waiting ({ posts, deliveries }, zurückgehalten), silencesAvailable, den silences ({ id, name, startsAt, endsAt, state }, state planned, on oder over) und den limits.
  • POST /v1/channels/stop mit einem optionalen { "reason": "..." } stoppt alles; POST /v1/channels/stop/resume setzt fort. Beide antworten mit dem Zustand wie oben.
  • POST /v1/channels/silences mit { "name", "startsAt", "endsAt" } (ISO-8601-Zeitpunkte) plant eine Pause, PATCH /v1/channels/silences/{id} ändert eine, POST /v1/channels/silences/{id}/delete entfernt sie und beendet sie sofort, wenn sie läuft. Unterhalb von Enterprise ist das Planen ein 403; eine Pause dauert höchstens 366 Tage.
curl -X POST http://localhost:4000/v1/channels/stop \
-H "Authorization: Bearer rw_..." -H "Content-Type: application/json" \
-d '{"reason":"A wrong figure went out this morning"}'

Solange der Workspace gestoppt oder in einer Pause ist, erzeugt eintreffender Inhalt keinen Beitrag, geplante Beiträge warten, und nichts im Postausgang geht hinaus außer einer Löschanfrage; das Zustellprotokoll zeigt diese Zeilen als wartend. Dafür gibt es kein MCP-Tool.

Der stillgelegte Connector und das Zustellprotokoll​

Die Routen, die den ersten Connector einrichteten, aus der Zeit, bevor jeder Beitrag übergeben wurde, sind stillgelegt. Sie haben nichts mit den oben genannten Plattform-Connectors zu tun, die am Kanal selbst gesetzt werden. Sie antworten noch, jede mit einem Header Deprecation: true, bis zum nächsten Major-Release, und fallen dann weg:

  • GET /v1/connections antwortet mit dem Modus des Workspaces, der jetzt immer SELF_HOSTED ist, und den Zugangsdatenfeldern, die Kanäle einst speicherten.
  • PUT /v1/connections/mode nimmt { "mode": "SELF_HOSTED" } und lehnt MANAGED mit einem 409 ab: Reelwire veröffentlicht nicht mehr mit gespeicherten Zugangsdaten.
  • PUT /v1/channels/{id}/credentials und POST /v1/channels/{id}/credentials/delete speichern und vergessen weiterhin die Plattform-Zugangsdaten eines Kanals, und nichts liest sie.
  • GET /v1/connector/env, /v1/connector/script/{language} und /v1/connector/adapters/{platform} antworten mit dem alten selbst gehosteten Connector, geschrieben für die erste Version des Webhooks. Bauen Sie nicht darauf auf: Bauen Sie stattdessen einen Empfänger für Webhooks.

Wie die Beiträge eines Kanals den Workspace verlassen, ist seine eigene Sache über deliverByEmail, deliverByWebhook und deliverByConnector: siehe oben Wie ein Beitrag übergeben wird.

GET /v1/deliveries ist das Protokoll jedes Wegs, auf dem jede Übergabe hinausging, eine Zeile für ihre E-Mail, eine für ihren Webhook-Aufruf und eine für jeden Beitrag, den ein Plattform-Connector erstellt hat (mechanism CONNECTOR), und GET /v1/deliveries/{id} eine Zeile ganz, mit dem, was sie trug und was zurückkam. POST /v1/deliveries/{id}/redeliver sendet eine erneut, außer einer Connector-Zeile, die durchgekommen ist, was ein 409 ist: Die Plattform würde den Beitrag ein zweites Mal annehmen. Alle drei stehen mit Beispielen unter Webhooks.

Häufige Fehler​

Die Plattform als Ziel behandeln. Die Oberfläche ist das Ziel. Instagram Reels und der Instagram-Feed sind verschiedene Kanäle mit verschiedenen Formen.

Ein Seitenverhältnis wählen, das die Oberfläche nicht bietet. Es wird abgelehnt oder ignoriert, wo die Oberfläche nur eines hat.

Erwarten, dass ein Kanal in zwei Sprachen veröffentlicht. Das geht nicht. Ein Kanal spricht eine Sprache, und zwei Sprachen sind zwei Kanäle, die dieselbe Eingabe abonniert haben.

Nur den geänderten Schalter in posting senden. posting wird als Ganzes ersetzt, daher geht jeder weggelassene Schalter auf seinen Standard zurück. Senden Sie das ganze Objekt, wie GET /v1/channels es liefert, mit Ihrer Änderung darin.

templateId bei einem Abonnement setzen. Die Eingabe legt sie fest. Senden Sie templateVariant und templateVersion.

templateVersion festlegen und nie wieder überprüfen. Eine Festlegung folgt neuen Builds nicht mehr. Senden Sie "latest", wenn Sie keinen Grund haben.

Einen Kanal löschen, um ihn zu pausieren. PATCH mit enabled: false. Ein pausierter Kanal behält seine Abonnements und kann fortgesetzt werden; ein entfernter behält nur seine Historie, und was auf ihn wartete, wird abgebrochen.