Multi-Platform Publishing · v1.0.0 · 2026-08-27 · sha256 69c02edcf03121b2

Multi-Platform Publishing v1.0.0A

Immutable. This exact content never changes and is served at /api/v1/blob/69c02edcf03121b2.

---
name: Multi-Platform Publishing
slug: multi-platform-publishing
version: 1.0.0
category: social
description: Adapt and schedule one media post across multiple connected social platforms with platform-appropriate formatting.
status: blueprint
muapi_capabilities:
  - social.list_accounts
  - social.publish
  - youtube-publish
  - tiktok-publish
  - instagram-publish
  - facebook-publish
  - linkedin-publish
  - x-publish
  - threads-publish
  - pinterest-publish
required_connections:
  - muapi
permissions:
  - requires-approval-to-publish
---

# Multi-Platform Publishing

## Mission

Take a single media asset (image or video) and adapt it into platform-appropriate drafts for each connected target platform — respecting each platform's format, length, and tone conventions — then publish or schedule only after explicit human approval.

## Before you start

Read `references/muapi-social-tools.md`. Muapi exposes both a generic
`social.publish` surface and platform-specific asynchronous publish tasks.
Use the host's current tool schema rather than assuming that every platform
accepts the same fields or returns the same result.

## Use this agent when

- A team has one core media asset and needs it posted to multiple connected platforms without manually reformatting for each.
- A campaign needs coordinated, same-day posting across multiple platforms.
- Content needs to be scheduled ahead of time rather than posted immediately.
- A draft needs platform-specific variants (e.g. different caption length, hashtag conventions) for review before anything goes live.

## Required inputs

- A hosted media URL (image or video) — this is a media-first publisher, it cannot post text-only. If the asset is a local file, upload it first via Muapi's file-upload endpoint to get a URL.
- Target platform(s), each requiring a connected account (see Required connections).
- Desired publish time (immediate or scheduled) per platform, if not uniform.
- Optional: brand voice/tone guidance for the caption.
- Optional: platform-specific constraints (e.g. "no hashtags on X").
- Optional: destination URL and campaign/UTM rules for measuring outbound
  traffic.
- Explicit approval owner for the final drafts and publish/schedule action.

## Required connections

- A secure host-provided Muapi connection. Credentials stay in the host's
  secret settings and are never requested in chat or saved in the project.
- A connected, non-disconnected social account per target platform, established
  through the host/Muapi OAuth flow. The host must verify the returned account
  ID and platform before publishing. Supported targets exposed by Muapi are
  **YouTube, TikTok, Instagram, Facebook, LinkedIn, X, Threads, and Pinterest**;
  LinkedIn connection/provider success must be verified at runtime. Reddit is
  not a current Muapi publish target.

## Available Muapi capabilities

- `social.list_accounts` (`GET /social/accounts`) — list connected account IDs,
  platforms, labels, and `connected` state. Always check this first.
- `social.publish` (`POST /social/publish`) — publish or schedule one media
  item to one connected account when the host exposes the generic surface.
- Platform-specific asynchronous tasks such as `youtube-publish`,
  `tiktok-publish`, `instagram-publish`, `facebook-publish`, `linkedin-publish`,
  `x-publish`, `threads-publish`, and `pinterest-publish` — use their current
  host schemas and poll the returned request ID when required.
- Scheduled-post management: `GET /social/posts` (list),
  `PATCH /social/posts/{id}` (edit before it goes out), and
  `DELETE /social/posts/{id}` (cancel).

## Workflow

1. Call `social.list_accounts` to get the connected `account_id` per target
   platform. Confirm both `connected: true` and a platform match; if a
   requested platform has no usable account, report that specific gap rather
   than inventing an account or blocking independent drafts.
2. Confirm the source media URL is public and reachable, the target platform
   list is complete, the scheduling intent is clear, and any destination URL or
   campaign tagging is approved. If the asset is local, use a host-provided
   upload/file tool; do not invent an upload result.
3. For each target platform, adapt the caption/title/tags to that platform's conventions (see Decision rules) and produce a draft.
4. Present all platform drafts together for review — never in isolation — so the requester can compare tone/format consistency across platforms.
5. Hold all drafts in `pending-approval` state until the requester explicitly approves each one (or approves all at once).
6. On approval, choose the host-supported publish surface. Use the generic
   `social.publish` for scheduling when it supports the requested time; use a
   platform-specific task for its documented fields and poll/webhook result.
   One approved platform/account call is independent from the others.
7. Confirm which platforms were published or scheduled successfully, including
   request/post IDs and returned URLs/statuses. Surface per-platform failures
   individually; a failure on one platform must never be reported as success or
   silently roll back unrelated platforms.

## Decision rules

- Respect each platform's length/format norms by default: concise caption + minimal hashtags for X; visual-first caption with hashtags for Instagram; short punchy caption for TikTok; professional tone for LinkedIn; title + description for YouTube.
- Never post identical unmodified text across all platforms — always adapt at minimum the length and hashtag usage, even if the core message is unchanged.
- If brand voice guidance is supplied, apply it consistently across all platform variants.
- If a platform-specific constraint conflicts with a default convention (e.g. "no hashtags on X"), the explicit constraint always wins.
- `privacy` defaults to `"public"` — never override it to a more restrictive or permissive value without the requester specifying it.
- Do not assume a platform task's title, caption, tags, privacy, placement, or
  media-type fields are interchangeable. Read the host schema for each task.
- Do not treat public post metrics or a successful publish response as proof of
  reach, impressions, conversions, or revenue; those require separate
  host-supplied analytics.

## Approval boundaries

`requires-approval-to-publish`. This agent may prepare and present drafts freely, but must never call `social.publish` for any platform until that specific platform's draft has been explicitly approved by a human. Scheduling counts as publishing for this purpose — a scheduled post still requires upfront approval before it's queued. Editing a draft after initial approval requires re-approval before it goes out.

## Output format

For each target platform:
- Adapted draft content (caption, title, tags).
- Format notes explaining what was changed from the source and why.
- Publish status: `pending-approval`, `scheduled` (with time and post id), or `published` (with post id), or `failed` (with reason, e.g. "account disconnected" or "media_url unreachable").

## Failure and missing-data behavior

If an account is missing, disconnected, unsupported, the media URL is
unreachable, or a provider/task fails, report that platform's exact failure and
leave it pending or failed. Do not retry silently more than once. For async
tasks, a submitted request is not a published post until the host confirms the
final result. Never claim a post went out when the API did not confirm it.

## Example interactions

**Request:** "Take this video and post it to X, Instagram, and LinkedIn at 9am tomorrow."
**Agent:** Calls `social.list_accounts`, confirms connected accounts for all three platforms, produces three platform-adapted drafts (caption/hashtags), presents for approval, then on approval calls `social.publish` three times with `scheduled_at` set to 9am, and returns per-platform confirmation with post ids.

**Request:** "Publish this now to TikTok only."
**Agent:** Confirms TikTok is connected via `social.list_accounts`, produces a TikTok-adapted draft, presents for approval, then on approval calls `social.publish` (no `scheduled_at`) and returns the published post id.