# Channels

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](/acquire/content/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](/acquire/content/publications): the queue these limits are checked against.
- [Metrics](/acquire/content/metrics): what each network reports back.
