---
name: "social_post"
area: "social"
title: "Post to social channels"
price: "$0.02 per channel posted to"
method: "POST"
url: "https://api.conecto.chat/v1/tools/social_post"
mcp_server: "https://api.conecto.chat/mcp/social"
auth: "Authorization: Bearer <conecto_sk_ key>"
docs_url: "https://conecto.chat/tools/social/social_post"
---

# Post to social channels (`social_post`)

Posts now or at a set time to one or several channels, with pictures, video or a thread.

Post now, or at when (ISO 8601 with its offset, up to a year ahead), to one or several channels. text is the post; thread adds follow-up posts; media are file_ids from the store, uploaded to Postiz by Conecto. per_channel gives one channel its own text, media, thread or settings: some networks need settings (Discord and Slack a channel id, Medium, Dev.to, Hashnode and WordPress a title, Instagram a post_type; social_channel_rules says). Postiz checks every channel first and takes all or none. TikTok (one MP4 video, or pictures; settings.title is a photo post's title) requires its owner to confirm each post: a TikTok channel comes back under waiting_for_owner. Ask them in your chat (social_post_check gives what to show and ask) and pass their answer to social_confirm_post, or give them its confirm_url to do it on a page. Then social.post_confirmed and social.post_published follow, or social.post_declined when they say no or 3 days pass (a day past when, if later); it is refunded. With settings {"content_posting_method": "UPLOAD"} it goes at once as a draft to their TikTok inbox instead, to finish in TikTok's app within 24 hours. $0.02 per channel, refunded when a post fails or is deleted before it goes out; social.post_published and social.post_failed tell you how each went.

Price: $0.02 per channel posted to. A call that fails costs nothing.

## Use it when

Something should go out on the business's social accounts.

- For a message to the team in Slack or Teams, use [notify_send](https://conecto.chat/tools/notify/notify_send.md).
- For an email to subscribers, use [newsletters_send_issue](https://conecto.chat/tools/newsletters/newsletters_send_issue.md).

## Say this to your agent

> Post the gravel bike photo on LinkedIn and Bluesky on Monday at 9: "The new Tabor gravel bikes are in, in sage and rust. Take one out for a ride from 1830 SE Ash St."

## Inputs

| Name | Type | Required | Description | Allowed values | Default |
|---|---|---|---|---|---|
| `channels` | array of strings | yes | 1 to 20 items. |  |  |
| `text` | string | no | 1 to 100,000 characters. |  |  |
| `media` | array of strings | no | file_ids from the store: images (JPEG, PNG, GIF, WebP, AVIF; up to 10 MB) or MP4 videos. Up to 10 items. |  |  |
| `thread` | array of strings | no | Follow-up posts after the first: a thread on X, Bluesky, Mastodon and Threads, comments on the others. Up to 20 items. |  |  |
| `when` | string | no | e.g. 2026-10-20T09:00:00-07:00; left out: now. Up to 40 characters. |  |  |
| `per_channel` | object | no |  |  |  |

## Example

Written for Halverson Cycle & Repair, a bike shop with a repair workshop in Portland, Oregon.

MCP: call `social_post` on the MCP server `https://api.conecto.chat/mcp/social` with these arguments:

```json
{
  "channels": [
    "clx0d6k2v0001",
    "clx0d6k2v0002"
  ],
  "text": "The new Tabor gravel bikes are in, in sage and rust. Take one out for a ride from 1830 SE Ash St.",
  "media": [
    "7a1d3c5e-2b4f-4a6c-8e0d-9f1b3d5c7e2a"
  ],
  "when": "2026-10-19T09:00:00-07:00"
}
```

REST:

```bash
curl https://api.conecto.chat/v1/tools/social_post \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channels": ["clx0d6k2v0001", "clx0d6k2v0002"], "text": "The new Tabor gravel bikes are in, in sage and rust. Take one out for a ride from 1830 SE Ash St.", "media": ["7a1d3c5e-2b4f-4a6c-8e0d-9f1b3d5c7e2a"], "when": "2026-10-19T09:00:00-07:00"}'
```

## Response

```json
{
  "call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
  "tool": "social_post",
  "status": "succeeded",
  "replayed": false,
  "cost_usd": "$0.04",
  "balance_usd": "$19.75",
  "result": {
    "posts": [
      {
        "post_id": "post0005xbddb07b8",
        "channel_id": "clx0d6k2v0001",
        "network": "linkedin",
        "status": "scheduled",
        "publish_at": "2026-10-19T09:00:00-07:00"
      },
      {
        "post_id": "post0006x76722c32",
        "channel_id": "clx0d6k2v0002",
        "network": "bluesky",
        "status": "scheduled",
        "publish_at": "2026-10-19T09:00:00-07:00"
      }
    ],
    "note": "social.post_published or social.post_failed follows for each."
  }
}
```

`result`: posts: one per channel, each with its post_id, channel_id, network, status and publish_at, and a note on the event that follows for each. A TikTok channel is under waiting_for_owner instead, with the confirm_url its owner opens to check the post, choose who can see it and post it.

## Errors

| Code | Status | When | Fix |
|---|---|---|---|
| `invalid_input` | 400 | when has no time zone, is in the past or more than a year ahead; a channel has neither text nor media; the post uses more than 10 different files; a Discord settings.channel is not a channel of the connected server; or a TikTok post has no media, mixes a video with pictures, has a thread or a caption over 2,000 characters. | Send when like 2026-10-19T09:00:00-07:00 and text or media for every channel; find Discord channels with social_channel_lookup; give TikTok one MP4 video or pictures. |
| `not_found` | 404 | A channel or a media file is not the business's. | Use channel_ids from social_channels and file_ids from files_list. |
| `channel_disabled` | 409 | A channel is switched off in the posting service. | Connect it again with social_connect. |
| `unsupported_type` | 400 | A media file is not an image or an MP4 video. | Post images or MP4 videos only. |
| `too_large` | 413 | An image is over 10 MB, or the post's files add up to more than 100 MB. | Shrink images with image_transform, or post fewer files. |
| `no_channels` | 409 | The business has no connected channel yet. | Connect one with social_connect. |
| `not_switched_on` | 503 | Social posting is not switched on yet. | Try again later; nothing was charged. |
| `social_unavailable` | 503 | The posting service did not answer, or could not open the business's social workspace. | Call again in a minute; when the message says so, tell Conecto's support. |
| `refused` | 400 | The posting service refused the request; the message gives its reason. | Fix what the reason names, then call again. |
| `refused` | 422 | The posting service reported a conflict with what is there. | Read the channel or post again, then call again. |
| `rate_limited` | 429 | The posting service's limit of posts an hour was reached. | Try again later. |

The refusals every tool can give (401 key, 402 balance, 429 limits) are on the errors page: https://conecto.chat/docs/errors.md

## Related

- [social_networks](https://conecto.chat/tools/social/social_networks.md): Every network the business can post to, how each connects (a link, a login, Telegram's code, or its own bot or webhook), and whether it is switched on yet. Free up to 1,000,000 reads a month.
- [social_connect](https://conecto.chat/tools/social/social_connect.md): Connects one of the business's own social accounts as a channel: by a link for the owner, a login, or a code posted in a Telegram channel. Free.
- [social_channels](https://conecto.chat/tools/social/social_channels.md): The business's connected social accounts (channels), with their network, name and profile. Free up to 1,000,000 reads a month.
- [social_channel_rules](https://conecto.chat/tools/social/social_channel_rules.md): What a channel's network accepts: lengths, media counts, the settings a post needs, and its lookups. Free up to 1,000,000 reads a month.
- [social_channel_lookup](https://conecto.chat/tools/social/social_channel_lookup.md): Runs one of a channel's lookups, like the channels of a Discord server or the boards on Pinterest. Free up to 1,000,000 reads a month.
- [social_find_slot](https://conecto.chat/tools/social/social_find_slot.md): The next free time to post on a channel, from its posting times and what is already scheduled. Free up to 1,000,000 reads a month.
- [social_post_check](https://conecto.chat/tools/social/social_post_check.md): Reads a TikTok post waiting for its owner, with what to show and ask them from TikTok just now. Free up to 1,000,000 reads a month.
- [social_confirm_post](https://conecto.chat/tools/social/social_confirm_post.md): Posts a TikTok post waiting for its owner with the choices they made in your chat, or drops it. Free.
- [social_posts](https://conecto.chat/tools/social/social_posts.md): Posts in a time window (the last 7 days and the next 30 by default), each with its status and link. Free up to 1,000,000 reads a month.
- [social_delete_post](https://conecto.chat/tools/social/social_delete_post.md): Deletes a post with its thread; one still waiting for its time never goes out and is refunded. Free.
- [social_analytics](https://conecto.chat/tools/social/social_analytics.md): How a channel did over 7, 30 or 90 days, or how one published post did: each metric the network reports, by day. Free up to 1,000,000 reads a month.
- [social_disconnect](https://conecto.chat/tools/social/social_disconnect.md): Removes a channel; its waiting posts are deleted, and refunded when their time had not come. Free.
