Canales
Un canal es una cuenta, en un formato (una superficie de plataforma), que habla un idioma y usa una marca. «Orchid Invest DE» en Instagram Reels es un canal; la misma cuenta publicando en el feed de Instagram es otro distinto, porque la superficie fija el formato. Lo que genera un canal es exactamente el conjunto de sus suscripciones.
La superficie determina el clip, su texto y sus hashtags. Cuando una publicación vence, se entrega por correo electrónico, por webhook o por ambos, según los interruptores deliverByEmail y deliverByWebhook del canal, y quien la recibe la publica; donde la plataforma tiene un conector de plataforma, deliverByConnector hace que Reelwire la publique allí por sí mismo, con las credenciales guardadas en el canal como connector. Consulte más abajo Cómo se entrega una publicación.
| Método | Ruta | Permiso |
|---|---|---|
GET | /v1/channels | channels:read |
GET | /v1/channels/surfaces | channels:read |
POST | /v1/channels | channels:write |
PATCH | /v1/channels/{id} | channels:write |
POST | /v1/channels/connector/test | channels:write |
POST | /v1/channels/{id}/delete | channels:write |
POST | /v1/channels/{id}/duplicate | channels:write |
POST | /v1/channels/{id}/subscriptions | channels:write |
PATCH | /v1/channels/{id}/subscriptions/{subId} | channels:write |
POST | /v1/channels/{id}/subscriptions/{subId}/delete | channels:write |
PUT | /v1/channels/{id}/credentials | channels:write |
POST | /v1/channels/{id}/credentials/delete | channels:write |
GET | /v1/connections | connections:read |
PUT | /v1/connections/mode | connections:write |
GET | /v1/deliveries | connections:read |
POST | /v1/deliveries/{id}/redeliver | connections:write |
Las credenciales del conector de plataforma de un canal viajan con la creación y el PATCH del propio canal, pero solo una persona con sesión iniciada y el permiso de Administración puede establecerlas o eliminarlas: una clave con channels:write las lee enmascaradas y las prueba, y se rechaza si las envía (consulte Credenciales del conector de plataforma). Las dos rutas de credenciales retiradas, PUT /v1/channels/{id}/credentials y su eliminación, también están bajo /v1/channels, así que una clave necesita channels:write para ellas y una persona con sesión iniciada el permiso de Administración, igual que para la dirección del webhook. Cómo salen las publicaciones del espacio de trabajo, y el registro de lo entregado, son el área Activity - What went out, connections: dar a alguien el registro de entregas no le da todos los canales.
Listar canales
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 lleva cada interruptor, con sus valores predeterminados rellenados: los que la superficie no tiene están siempre en su valor predeterminado ahí, y visibility solo aparece donde la superficie ofrece una opción y se ha elegido una. Consulte Ajustes de publicación para saber qué superficie tiene cuáles, y el menú desplegable Plataforma más abajo para platformChoice.
Cada canal lleva además approvers, cuántas personas aprueban una de sus publicaciones: 1, o 2 donde un espacio de trabajo Enterprise pide dos (consulte Cumplimiento). Junto a channels, approval indica qué hace el plan de este espacio de trabajo con la aprobación de un canal: { "available": true, "dual": false }, donde available es si el ajuste se respeta (Small business y Enterprise) y dual si se pueden pedir dos aprobadores (Enterprise). En un plan que no lo tiene, la approval de un canal se conserva como se estableció y se lee como NONE.
La superficie decide el formato
GET /v1/channels/surfaces es la lista para elegir, e indica qué relaciones de aspecto ofrece cada una.
{
"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 es el menú desplegable Plataforma del panel, en su orden (el ejemplo muestra tres de sus dieciocho): primero No especificada, luego las plataformas por nombre, cada una con los formatos que admite, la superficie en la que se guarda cada formato, si Reelwire puede publicar allí por sí mismo (connector: available, planned o null para No especificada) y lo que pide su conector (fields, vacío salvo que sea available). Cuatro son available hoy: discord, linkedin-personal, slack y telegram. Todas las demás plataformas son planned, Threema incluida. Un canal sigue guardando su surface y su ratio; platformChoice en un canal indica a cuál de ellas pertenece, de modo que un canal en la superficie linkedin pertenece a linkedin-personal, uno en youtube-video (YouTube Long-form) a youtube y uno en download a not-specified.
«Facebook» no es una respuesta a la pregunta sobre el formato: los Reels quieren 9x16 y el feed de la página quiere 1x1. Una superficie con una sola relación de aspecto la fija, y ratio en el cuerpo se ignora. Una superficie con varias lo pregunta, y omitir ratio ahí es un 400 que nombra las opciones.
Sin plataforma específica (download) es una superficie propia y no una red: el formato para un canal que no indica adónde van sus clips. Se ofrecen todos los formatos porque la persona decide adónde va, y su texto se conserva en cuatro longitudes, una para cada tipo de plataforma. La clave sigue siendo download, el nombre que tenía cuando era la única plataforma cuyas publicaciones se enviaban por correo. Cada espacio de trabajo nuevo empieza con uno, llamado «Default channel», entregado por correo electrónico.
Cómo se entrega una publicación
| Campo | Qué hace |
|---|---|
deliverByEmail | Cuando una publicación vence, las personas que publican por el espacio de trabajo (el propietario y todos los que tienen Operaciones) reciben un correo por la entrega, que indica qué publicación está lista para qué canales, con un botón al kit de publicación: el video de cada canal para descargar o compartir, su texto para copiar, sus ajustes de publicación y Marcar como publicada u Omitir. Consulte Publicaciones entregadas por correo electrónico. |
deliverByWebhook | Cuando una publicación vence, se firma y se envía a la dirección del webhook del espacio de trabajo. Consulte Webhooks. |
deliverByConnector | Cuando una publicación vence, Reelwire la publica por sí mismo en la plataforma del canal mediante su conector de plataforma, y la notifica como publicada con su enlace. Solo donde el connector de la plataforma es available y hay credenciales guardadas; en otro caso true es un 409 que indica cuál falta. |
connector | Las credenciales guardadas del conector de plataforma, enmascaradas (un secreto como sus últimos cuatro caracteres), o null: a qué llegaron la última vez que pasaron una prueba (account), cuándo se probaron por última vez (checkedAt), por qué falló esa prueba (checkFailure, null cuando pasó o no se hizo ninguna), cuándo caducan (expiresAt) y si antes se envía un recordatorio por correo (remindExpiry). unreadable es true cuando están guardadas pero ya no se pueden leer y hay que introducirlas de nuevo. Consulte Credenciales del conector de plataforma. |
syndicates, syndicationToken | Obsoleto y sin efecto, se sigue respondiendo hasta la próxima versión mayor. Un canal ya no tiene una página propia: las publicaciones se transmiten a los participantes por grupo, consulte Sindicación. |
Cualquiera de ellos puede ser true a la vez: la publicación se envía entonces por correo, se envía por webhook y se publica, según lo activado. Todos pueden ser false: la publicación no va entonces a nadie del propio espacio de trabajo. Se entrega en el momento en que vence, aparece en Publicaciones con sus solicitudes y aun así llega a todos los participantes de sindicación cuyo grupo incluye el canal, que es como se crea un canal solo para sindicación. Los participantes de sindicación nunca publican a través del conector de un canal: reciben por las vías que permite su grupo.
Una publicación que va a varios canales se entrega una vez por lote, no una vez por canal. Sus canales que no necesitan aprobación van juntos, en un correo y una llamada de webhook firmada que lleva todos, cuando todos están renderizados y vencidos; cada canal que pide aprobación sigue por su cuenta una vez aprobado. Un conector de plataforma publica cada canal por separado. Consulte Una llamada por entrega y Publicaciones y trabajos.
Credenciales del conector de plataforma
Solo una persona con sesión iniciada y el permiso de Administración las establece o las elimina, que es lo que hacen los ajustes del canal en el panel a través de estas mismas rutas. Una clave de API, incluida la conexión de un asistente de IA, nunca puede: un connector en su creación o PATCH es un 403. Cualquiera que pueda editar canales las lee enmascaradas y puede probar lo que está guardado.
connector en una creación o un PATCH las establece: { "fields": { ... }, "expiresAt": "...", "remindExpiry": true }, con las claves que lista la entrada de la plataforma en platforms. Un campo omitido o vacío conserva lo guardado para la misma plataforma, y un campo que sigue faltando después es un 400 que lo nombra; con credenciales ya guardadas, se puede omitir fields para cambiar solo la caducidad o el recordatorio. expiresAt es cuándo dejan de funcionar (ISO 8601, null para nunca), y remindExpiry envía un correo al propietario y a todos los que tienen Administración una semana y un día antes. En una plataforma cuyo conector no es available es un 409. Los valores que no pueden ser correctos, como una dirección de Discord en otro host, son un 400. Guardar no pregunta nada a la plataforma: pruébelas con la ruta de abajo. Los valores nuevos cuya prueba pasó en la última media hora conservan lo que encontró; si no, muestran account: null hasta una prueba o su primera publicación, que las prueba primero y se detiene con el motivo de la plataforma si no funcionan. "connector": null las elimina y desactiva deliverByConnector. Cambiar el canal a otra plataforma también las elimina y lo desactiva.
{
"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" }
]
}
}
}
Ninguna respuesta lleva nunca un secreto guardado en claro. Cómo obtener los valores de cada plataforma está en Publicado por conector de plataforma.
Probar un conector de plataforma
POST /v1/channels/connector/test pregunta a la plataforma si las credenciales funcionan y no publica nada: solo lee a qué llegan, como el bot de Telegram y su pertenencia al chat, la app y el canal de Slack, los datos propios del webhook de Discord o el miembro de LinkedIn. { "channelId": "..." } prueba lo guardado en ese canal y conserva el resultado en él (checkedAt, account si pasó, checkFailure si no); puede cualquier clave o persona con Channels: write. Añadir fields prueba valores escritos y no guardados, superpuestos a lo guardado para la misma plataforma como lo haría un guardado, y surface nombra la plataforma cuando no es la del canal; para un canal que aún no se ha creado, envíe fields y surface sin channelId. Probar valores no guardados es solo para una persona con Administración, y una clave que envía fields recibe un 403. Una prueba espera como máximo 20 segundos a la plataforma.
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 } }
}
Una prueba fallida también es una respuesta, un 200 con "ok": false y el reason de la plataforma, por ejemplo un bot que no puede publicar en el canal; una plataforma a la que no se pudo acceder en ese momento lo dice. saved es false para valores no guardados, que no se conservan en el canal y vuelven sin channel. Una plataforma cuyo conector no es available, un canal sin credenciales guardadas para su plataforma o con unas guardadas que ya no se pueden leer son cada uno un 409 que indica cuál. Mediante MCP es reelwire_test_channel_connector.
Ajustes de publicación
posting son los Ajustes de publicación del canal, la última sección de su diálogo: cómo deben salir sus publicaciones en la plataforma. Van con cada vía de salida, publique Reelwire allí por sí mismo o no: en el posting de la llamada de webhook, en palabras en el kit de publicación del correo y aplicados por el conector de plataforma del canal donde lo tiene.
| Campo | Qué dice | Superficies que lo tienen | Predeterminado |
|---|---|---|---|
visibility | Quién puede ver la publicación. | YouTube Shorts y Long-form (public, unlisted, private), TikTok (public, private), LinkedIn personal (public, connections) | ausente, lo que significa público |
allowComments | Los comentarios están abiertos. En X, desactivado significa que solo pueden responder las cuentas que menciona la publicación. | YouTube, Facebook, Instagram, TikTok, LinkedIn personal y de empresa, X, Threads, Pinterest | true |
brandedContent | Declarado a la plataforma como colaboración de pago o como promoción propia de la marca. | YouTube, Facebook, Instagram, TikTok | false |
allowDuetStitch | Otros pueden hacer un dúo o un stitch con ella. | TikTok | false |
hashtagsAsFirstComment | Los hashtags van en un primer comentario, lo que mantiene el texto limpio. | Instagram Reels y Feed | false |
silent | Enviado sin sonido: los suscriptores reciben la notificación sin sonido ni vibración. | Telegram | false |
notifySubscribers | Se avisa a los suscriptores del canal del nuevo video. | YouTube Shorts y Long-form | true |
shareToFeed | El Reel aparece en la cuadrícula del perfil además de en Reels. | Instagram Reels | true |
protectContent | Nadie puede reenviar la publicación ni guardar el video. | Telegram | false |
Discord, Slack, Threema, Signal, WeChat, WhatsApp y Sin plataforma específica no tienen ninguno.
Un valor del tipo equivocado es un 400, y una clave que no es una de estas se descarta. posting se sustituye entero, tanto en una creación como en un PATCH: un interruptor omitido vuelve a su valor predeterminado, así que envíe todos los que quiera conservar. Un interruptor que la superficie no tiene se conserva, se lee como su valor predeterminado mientras el canal permanezca ahí y se aplica cuando el canal pasa a una superficie que lo tiene. Una visibility que la superficie no ofrece se lee como pública.
Crear un canal
Basta un nombre. Todo lo demás tiene un valor predeterminado defendible, y un canal que existe se puede corregir con una llamada.
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"}'
| Campo | Obligatorio | Predeterminado |
|---|---|---|
name | no | El primero libre de «New channel», «New channel 2» y así sucesivamente. Hasta 80 caracteres. |
surface | no | instagram-reels |
ratio | donde la superficie ofrece varias | La única relación de aspecto de la superficie. Obligatoria donde ofrece más de una. |
locale | no | en. Un código ISO 639-1, o uno de zh-CN, zh-TW, pt-BR. |
brandId | no | La marca activada más antigua del espacio de trabajo. |
approval | no | NONE. PER_POST retiene cada publicación, y cada actualización de una publicación ya entregada, para un revisor; viene con Small business y Enterprise, y en otro plan es un 409. Cambiar un canal de PER_POST de vuelta a NONE necesita una clave que también tenga approvals:write (una persona: el permiso de Aprobaciones), o es un 403. Cuántas personas aprueban, approvers en cada canal (1 o 2), se establece en Cumplimiento (Enterprise). |
deliverByEmail | no | true. |
deliverByWebhook | no | false. |
deliverByConnector | no | false. true necesita connector en la misma solicitud, en una plataforma cuyo conector esté disponible, de modo que en una creación solo puede activarlo una persona con sesión iniciada y Administración. |
connector | no | Ninguna guardada. Consulte Credenciales del conector de plataforma. |
posting | no | Cada interruptor en su valor predeterminado. Consulte Ajustes de publicación. |
201, con el canal como { "channel": { ... } }. Un nombre ya en uso es un 409.
Dos rechazos que conviene conocer. Sin ninguna marca en el espacio de trabajo: «Make a brand first: every channel wears one.» Y sin webhook: «This account has no webhook yet. Set one under Webhook first.» Un webhook sirve a todo el espacio de trabajo y lo reutiliza cada canal, así que se establece una sola vez. Un espacio de trabajo tiene hasta 200 canales salvo que Reelwire haya fijado otro número; uno más es un 409 que nombra el número e indica cómo pedir más.
PATCH /v1/channels/{id} admite los mismos campos, y enabled para pausarlo o reanudarlo. Cambiar la superficie, la relación de aspecto, el idioma o la marca cambia lo que el canal renderiza a partir de ahora, que es la razón por la que se permite. El trabajo ya entregado no se toca: una publicación registra el formato y el idioma en que salió. Un interruptor enviado solo se superpone a los demás tal como están. Una superficie nueva enviada sin ratio conserva la relación de aspecto del canal donde la superficie la ofrece; donde no, una superficie con una sola relación de aspecto toma esa, y una con varias es un 400 que nombra las opciones.
POST /v1/channels/{id}/delete elimina un canal y responde { "deleted": "...", "cancelled": 2 }. Ya no se renderiza ni se entrega nada para él, cada trabajo que aún esperaba se cancela (cancelled los cuenta) y se olvidan sus credenciales guardadas, incluidas las de su conector de plataforma. Lo que ya entregó se queda donde se publicó: eliminar un canal nunca pide a nadie que retire una publicación. Su historial también se queda, bajo su nombre con « (removed)» al final, para que un canal nuevo pueda tomar el nombre antiguo.
POST /v1/channels/{id}/duplicate con { "name": "Instagram FR" } crea un segundo canal como este y responde 201 con él, como hace crear. La copia tiene la superficie, la relación de aspecto, el idioma, la marca, la aprobación, los ajustes de publicación, deliverByEmail y deliverByWebhook del canal, y cada suscripción con su variante, versión y enabled. Tres cosas son distintas, a propósito:
- Empieza en pausa (
enabledfalse). Al recibir las mismas fuentes, de otro modo renderizaría cada publicación por segunda vez y la entregaría por las mismas vías. Cambie lo que difiera conPATCHy luego envíeenabled: true. - El conector de plataforma no se copia, ni sus credenciales ni su interruptor:
connectores null ydeliverByConnectorfalse. Las credenciales publican como una cuenta y las establece una persona con el permiso de Administración. - El nombre es obligatorio, y un nombre que ya tiene otro canal es un 409.
Es Duplicar en la tabla Canales y reelwire_duplicate_channel para un asistente de IA.
Suscripciones: lo que recibe un canal
Una suscripción nombra exactamente una entrada, y kind indica cuál.
kind | Nombra la entrada con | La plantilla procede de |
|---|---|---|
BROADCAST | sourceSlug y formatSlug | El vínculo del feed en el catálogo |
STREAM | streamId | El stream |
QUEUE | queueId | Cada publicación de la lista |
La fuente fija la plantilla; el canal elige el corte y la compilación. A un productor que escribe en un stream se le prometió un formato, y un canal no puede anularlo. Lo que elige el canal es templateVariant y templateVersion, una major.minor.patch exacta o "latest". Si se omite, la variante es aquella a la que está vinculado el feed para un BROADCAST y la primera de la plantilla para un STREAM, y la versión es "latest".
Una suscripción BROADCAST también puede llevar language, el idioma en que se entrega el feed en este canal: un código como "es" o "pt-BR", o null para el idioma propio del canal, con el que empieza una suscripción. Un feed cuyo multilingual es true en GET /v1/feeds admite cualquier idioma y la IA lo traduce a los idiomas que eligieron sus canales. Un feed cuyo multilingual es false llega en los idiomas que nombra su languages, el predeterminado primero, cada uno escrito por el código propio del feed y nunca por la IA: uno de ellos se acepta y cualquier otro es un 409, y con null llega en el idioma propio del canal donde ese está entre los nombrados, y si no en el predeterminado del feed. Un language en un stream o en una lista de publicaciones también es un 409, ya que sus eventos y publicaciones llevan sus propios idiomas. Cada suscripción responde con su language, null donde sigue al canal.
Una suscripción BROADCAST o STREAM también puede llevar look, cómo se ven sus clips en este canal: los interruptores de Look de la plantilla por clave, como { "theme": "dark", "pace": "calm", "hideHeader": true }. Qué interruptores tiene una plantilla, y los valores que admite cada uno, están en el clipData.look de su esquema (GET /v1/formats/template/{id}?variant= para la variante de la suscripción): Theme, Pace, Corners, Text alignment, Logo, Logo size, Hide logo and title, Hide footer line, Background pattern y, en un fondo, Strength. Se superponen al contenido de cada clip al crearlo, por encima de lo que dice el contenido, ya que el canal elige cómo se ven sus propios clips. Un interruptor omitido, "auto" o false es el propio del estilo, y null es que cada interruptor es el propio del estilo, con lo que empieza una suscripción. Una clave o un valor que la compilación no admite es un 400 que nombra lo que admite; un look en una suscripción QUEUE es un 409, ya que cada publicación de la lista fija el suyo en su contenido. Cada suscripción responde con su look, null para el propio del estilo.
Una suscripción BROADCAST a un feed cuyo usable es false en GET /v1/feeds es un 403 que nombra los planes que necesita: el feed solo está disponible en otros planes (plans). Un canal que lo recibía antes de que el espacio de trabajo cambiara de plan conserva su suscripción y no recibe nada del feed hasta que el plan lo incluya de nuevo.
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, y vuelve el canal entero, con la nueva suscripción en su lista:
{
"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
}
]
}
}
Los demás campos del canal también están ahí, exactamente como los muestra GET /v1/channels.
"latest" se guarda como null, que es una respuesta real y no una ausencia: sigue la compilación más reciente, resuelta cuando algo se renderiza. Cualquier otra cosa debe ser una versión exacta de tres partes, porque una fijación que casi es una versión es una fijación a nada, y una variante o versión para la que la plantilla no tiene compilación se rechaza en lugar de dejar que no se renderice nada. Una suscripción QUEUE no fija nada: cada publicación de la lista elige la suya.
Suscribir un canal dos veces a la misma entrada es un 409. Un feed, stream o lista de publicaciones que no existe es un 404, y un feed predefinido que no se ofrece a la cuenta, según los sectores que eligió, es un 403 que nombra el feed. Un canal recibe hasta 100 fuentes salvo que Reelwire haya fijado otro número para el espacio de trabajo; una más es un 409 que lo dice.
PATCH /v1/channels/{id}/subscriptions/{subId} cambia la variante, la versión, enabled, releaseSchedule, language o look, y devuelve el canal; una variante o versión en una suscripción QUEUE es un 409, ya que cada publicación de la lista elige la suya. Un look enviado sustituye al elegido y se comprueba contra la compilación que genera la suscripción tras el cambio; una variante o versión nueva enviada sin uno conserva los interruptores que la nueva compilación aún tiene.
releaseSchedule indica cuándo salen en este canal las actualizaciones de un feed predefinido: null para en cuanto llegan, Enviar al llegar (con lo que empieza cada suscripción), o { "days": [1, 2, 3, 4, 5], "times": ["09:00"] }, días de la semana ISO (1 lunes a 7 domingo) y de una a seis horas del día, HH:MM en UTC, o mensual, { "monthDay": 1, "times": ["09:00"] }, un día del mes del 1 al 28, o con retraso, { "delayMinutes": 30 }, cada actualización esos minutos después de llegar, de 1 a 1440 (24 horas). Solo se acepta en suscripciones BROADCAST, también al crearlas; en un stream o una lista de publicaciones es un 409. Cada actualización espera entonces a la siguiente salida (o al fin de su retraso), y una más nueva que llegue antes la sustituye y sale en ese mismo momento, de modo que solo se publica la más reciente; una salida sin nada en espera no publica nada. Cada suscripción del canal responde con releaseSchedule, releaseLabel (el calendario en palabras) y waiting: mientras una actualización espera, { "since", "goesAt", "skipped" }, el momento en que llegó, su salida y cuántas actualizaciones anteriores sustituyó; si no, null. Establecer null mientras una espera la envía de inmediato. POST /v1/channels/{id}/subscriptions/{subId}/delete la elimina y devuelve el canal tal como queda; una que ya produjo publicaciones se conserva oculta en lugar de eliminarse, para que esas publicaciones sigan nombrando de dónde vienen. La entrada en sí, el feed, el stream o la lista, no se toca.
Detener todo
Todos los canales del espacio de trabajo retenidos a la vez, en todos los planes, y las pausas programadas, lo mismo para un período fijado de antemano, en Enterprise (la pantalla Detener todo del panel explica lo que hace retener). Se lee con Channels: read, se cambia con Channels: write; una persona con sesión iniciada necesita Operaciones o Aprobaciones.
GET /v1/channels/stopresponde constopped({ since, by, reason }, onull),silentNow(por qué no sale nada ahora mismo:{ kind: "stopped" }o{ kind: "silence", name, until }, onull),waiting({ posts, deliveries }retenidas),silencesAvailable, lassilences({ id, name, startsAt, endsAt, state },stateplanned,onuover) y loslimits.POST /v1/channels/stopcon un{ "reason": "..." }opcional lo detiene todo;POST /v1/channels/stop/resumereanuda. Ambos responden con el estado como arriba.POST /v1/channels/silencescon{ "name", "startsAt", "endsAt" }(instantes ISO 8601) programa una pausa,PATCH /v1/channels/silences/{id}cambia una,POST /v1/channels/silences/{id}/deletela elimina y la termina de inmediato si está en curso. Por debajo de Enterprise programar es un 403; una pausa dura como máximo 366 días.
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"}'
Mientras el espacio de trabajo está detenido o en pausa, el contenido que llega no crea ninguna publicación, las publicaciones programadas esperan y nada de la bandeja de salida sale salvo una solicitud de eliminación; el registro de entregas muestra esas líneas en espera. No hay herramienta MCP para ello.
El conector retirado y el registro de entregas
Las rutas que configuraban el primer conector, de antes de que cada publicación se entregara, están retiradas. No tienen nada que ver con los conectores de plataforma de arriba, que se configuran en el propio canal. Aún responden, cada una con un encabezado Deprecation: true, hasta la próxima versión mayor, y después desaparecen:
GET /v1/connectionsresponde con el modo del espacio de trabajo, que ahora es siempreSELF_HOSTED, y los campos de credenciales que los canales guardaban antes.PUT /v1/connections/modeadmite{ "mode": "SELF_HOSTED" }y rechazaMANAGEDcon un 409: Reelwire ya no publica con credenciales guardadas.PUT /v1/channels/{id}/credentialsyPOST /v1/channels/{id}/credentials/deleteaún guardan y olvidan las credenciales de plataforma de un canal, y nada las lee.GET /v1/connector/env,/v1/connector/script/{language}y/v1/connector/adapters/{platform}responden con el antiguo conector autoalojado, escrito para la primera versión del webhook. No construya sobre él: construya en su lugar un receptor para Webhooks.
Cómo salen del espacio de trabajo las publicaciones de un canal depende de sus propios deliverByEmail, deliverByWebhook y deliverByConnector: consulte más arriba Cómo se entrega una publicación.
GET /v1/deliveries es el registro de cada vía por la que salió cada entrega, una línea para su correo, una para su llamada de webhook y una para cada publicación que hizo un conector de plataforma (mechanism CONNECTOR), y GET /v1/deliveries/{id} una línea completa, con lo que llevaba y lo que volvió. POST /v1/deliveries/{id}/redeliver envía una de nuevo, salvo una línea de conector que llegó, que es un 409: la plataforma aceptaría la publicación por segunda vez. Las tres están en Webhooks, con ejemplos.
Errores frecuentes
Tratar la plataforma como el destino. La superficie es el destino. Instagram Reels y el feed de Instagram son canales distintos con formatos distintos.
Elegir una relación de aspecto que la superficie no ofrece. Se rechaza, o se ignora donde la superficie solo tiene una.
Esperar que un canal publique en dos idiomas. No puede. Un canal habla un idioma, y dos idiomas son dos canales suscritos a la misma entrada.
Enviar en posting solo el interruptor que cambió. posting se sustituye entero, así que cada interruptor omitido vuelve a su valor predeterminado. Envíe el objeto completo tal como lo responde GET /v1/channels, con su cambio dentro.
Establecer templateId en una suscripción. La entrada lo fija. Envíe templateVariant y templateVersion.
Fijar templateVersion y no volver a revisarlo. Una fijación deja de seguir las compilaciones nuevas. Envíe "latest" salvo que tenga un motivo.
Eliminar un canal para pausarlo. PATCH con enabled: false. Un canal en pausa conserva sus suscripciones y se puede reanudar; uno eliminado solo conserva su historial, y lo que lo esperaba se cancela.