Social

Post to social channels

social_post · Changes data · Markdown

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

$0.02 per channel posted to

From your agent’s balance. A call that fails costs nothing.

An example

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."

Your agent callssocial_post$0.02 per channel posted to

The example business is Halverson Cycle & Repair, a bike shop with a repair workshop in Portland, Oregon. The reply is the one the tool really gives.

With these arguments
{
  "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"
}
What comes back
{
  "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."
}

Use it when

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

What it does

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.

What comes back

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. Every reply also carries cost_usd and balance_usd.

Inputs

NameTypeWhat it is
channelsRequiredarray of strings1 to 20 items.
textstring1 to 100,000 characters.
mediaarray of stringsfile_ids from the store: images (JPEG, PNG, GIF, WebP, AVIF; up to 10 MB) or MP4 videos. Up to 10 items.
threadarray of stringsFollow-up posts after the first: a thread on X, Bluesky, Mastodon and Threads, comments on the others. Up to 20 items.
whenstringe.g. 2026-10-20T09:00:00-07:00; left out: now. Up to 40 characters.
per_channelobject

The call

Over MCP, call social_post on https://api.conecto.chat/mcp/social. Over REST:

Terminal
curl -X POST 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"}'

When it refuses

A refused call costs nothing and says what to do next.

CodeWhenWhat to do
invalid_input400when 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_found404A channel or a media file is not the business's.Use channel_ids from social_channels and file_ids from files_list.
channel_disabled409A channel is switched off in the posting service.Connect it again with social_connect.
unsupported_type400A media file is not an image or an MP4 video.Post images or MP4 videos only.
too_large413An 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_channels409The business has no connected channel yet.Connect one with social_connect.
not_switched_on503Social posting is not switched on yet.Try again later; nothing was charged.
social_unavailable503The 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.
refused400The posting service refused the request; the message gives its reason.Fix what the reason names, then call again.
refused422The posting service reported a conflict with what is there.Read the channel or post again, then call again.
rate_limited429The posting service's limit of posts an hour was reached.Try again later.

Give this to your agent.

Set up Conecto from https://conecto.chat/SKILL.md