Channels
Choose a publishing channel and check its delivery mode, supported variants, limits, rates and pauses.
Choose a channel to set where a publication will go. Each channel represents one account on one network and describes its delivery mode, accepted content and publishing rates.
Content seeds one channel per network when you first read the product’s channels. You can rename channels, bind connectors and update their settings. If a network was added after your product was seeded, the next read adds its channel without changing the existing ones.
The shape of a channel
Field | What it is |
|---|---|
id | Channel id — this is what a publication is scheduled against |
network | linkedin, x, youtube, instagram, reddit, facebook, tiktok, threads, pinterest, bluesky or telegram |
subjectType | member (a personal account) or organization (a company page) |
deliveryMode | auto or reminder |
displayName | The human label |
capabilities | What the channel accepts and what it costs |
connectorId | The platform connector it publishes through, or null |
pausedAt | When the connection stopped working, or null when healthy |
pauseReason | revoked, expired, or the provider’s own reason code |
createdAt, updatedAt | ISO-8601 timestamps |
Seeded channels are member channels in reminder mode with no connector.
Delivery modes
Use reminder when a person will publish the post. At the scheduled time, Content prepares the post and notifies a person. They publish on the network and call content_publications_confirm. No connector is needed, and Content sends nothing to the network.
The auto mode uses a bound connector and network adapter to publish at the scheduled time. Automatic posting supports LinkedIn member profiles and YouTube. X and Reddit have adapter code but no registered OAuth app yet, so they stay reminder-only until that lands. Instagram, Facebook, TikTok, Threads, Pinterest, Bluesky and Telegram have no publishing connector and are reminder-only.
Binding does not change delivery mode unless you pass deliveryMode: "auto" to content_channels_bind. Unbinding also preserves the mode: an auto channel left without a connector fails publications instead of switching to reminders.
Binding and pauses
content_channels_bind attaches the channel to a platform connector already attached to the product. Binding is rejected for Instagram, Facebook, TikTok, Threads, Pinterest, Bluesky, Telegram and LinkedIn company pages because they have no publishing connector. Binding also clears a pause, which is how you repair a revoked or expired connection.
When a connector stops working, every channel bound to it is paused and content/channel.paused goes out once per channel, carrying the network, the display name and the reason.
A pause freezes the channel’s queue: its publications are held, not cancelled. content_channels_resume puts them back in the queue once the connection works again, and they dispatch on the next scheduler tick — late rather than lost.
pauseReason is an open set. revoked and expired are Content’s own; anything else is the provider’s reason code from a failed credential resolution. It never carries a credential.
Capabilities
Read capabilities before writing a network variant. It supplies the limits used to validate and schedule that variant.
Field | What it is |
|---|---|
maxTextLength | Longest text the network accepts, in characters |
maxMedia | Media attachments per post |
supportsVideo | Whether video may be attached |
supportsLink | Whether a link is accepted |
costPerPostUsd | USD per published plain post |
costPerLinkPostUsd | USD per published post containing a link |
dailyPostCeiling | Published posts per rolling 24 hours, or null when the network publishes no figure |
ceilingIsRuntimeData | True where the documented figure is known to disagree with reality |
analytics | full, basic or none — what this network reports about a published post |
postTypes | Supported post types; the first is the default |
variantFields | Fields accepted alongside a network’s text |
previewFoldChars | Character position of the feed’s “more” fold, or null if absent or unknown |
The values a product starts with, per network:
Network | maxTextLength | maxMedia | Video | Link | Plain | With link | Daily ceiling | Analytics |
|---|---|---|---|---|---|---|---|---|
LinkedIn | 3,000 | 20 | yes | yes | $0 | $0 | 150 | basic |
X | 280 | 4 | yes | yes | $0.015 | $0.20 | not published | full |
YouTube | 5,000 | 1 | yes | yes | $0 | $0 | 100 | basic |
Instagram | 2,200 | 10 | yes | no | $0 | $0 | 100 (known to be unreliable) | none |
Reddit | 40,000 | 20 | yes | yes | $0 | $0 | not published | none |
Facebook | 63,206 | 80 | yes | yes | $0 | $0 | not published | none |
TikTok | 2,200 | 35 | yes | no | $0 | $0 | 15 (varies per account) | none |
Threads | 500 | 20 | yes | yes | $0 | $0 | 250 | none |
Pinterest | 800 | 5 | yes | yes | $0 | $0 | not published | none |
Bluesky | 300 | 4 | yes | yes | $0 | $0 | not published | none |
Telegram | 4,096 | 10 | yes | yes | $0 | $0 | not published | none |
The YouTube text limit applies to the video description. TikTok’s applies to the video caption; Pinterest’s to the pin description. Telegram accepts 4,096 characters for a text message but only 1,024 for a media caption. Bluesky counts graphemes, so one emoji counts as one character. Facebook’s 63,206 figure is widely measured rather than a published network limit.
The following post types and fields are built in. Numbers beside fields are maximum character lengths; fields marked required must be filled before submission.
Network | Post types (default first) | Variant fields |
|---|---|---|
LinkedIn | post | — |
X | post | — |
YouTube | video (16:9), short (9:16) — both need a video | title (required, 100) |
Instagram | post (4:5), carousel (4:5), reel (9:16, needs a video), story (9:16) | — |
Reddit | post | title (required, 300), subreddit (required, 21) |
Facebook | post, reel (9:16, needs a video), story (9:16) | — |
TikTok | video (9:16, needs a video), photo (9:16) | — |
Threads | post | — |
Pinterest | pin | title (100), link (2,048) |
Bluesky | post | — |
Telegram | post | — |
Each postTypes entry has an id, label, mediaAspect and requiresVideo. The frame is 1:1, 4:5, 9:16, 16:9 or null where no fixed frame applies. Each variantFields entry has an id, label, required and maxLength.
Treat the table’s rates and ceilings as defaults. A live account ceiling takes precedence over the built-in value, and an explicit channel override takes precedence over both. Instagram and TikTok set ceilingIsRuntimeData: true because their actual ceilings vary or disagree with the documented figure.
Use content_channels_update to merge capability overrides when a price or account limit changes. Omitted fields keep their values. Targets are checked against built-in post types and fields when written, then against the channel descriptor during validation and scheduling. An override can narrow the accepted types; it cannot add a type the network doesn’t support.
analytics: "none" means no snapshot will ever be taken for that channel. See Metrics.
Tools
Tool | What it does |
|---|---|
content_channels_list | List channels, ordered by network; filter with network |
content_channels_get | Read one channel, with its delivery mode and capabilities |
content_channels_update | Rename, change delivery mode, or override capability fields |
content_channels_bind | Bind to a platform connector, clearing any pause |
content_channels_unbind | Detach the connector and clear any pause |
content_channels_resume | Resume a paused channel once its connection works again |
There is no create tool: channels are seeded, one per network.
Next steps
- Publications: the queue these limits are checked against.
- Metrics: what each network reports back.