---
title: "Publish a video to social media"
method: POST
path: "/publications"
tags: ["Publishing"]
---

# Publish a video to social media

`POST /publications`

Publishes a completed video to one or more connected social media channels (YouTube, TikTok, Instagram, Facebook, Threads, and X).

**Prerequisites:**
1. Connect channels via the AITuber dashboard (cannot be done via API).
2. Video must have `status: completed` (check via `GET /videos/{id}`).
3. Active paid subscription with the Publish feature (Creator plan or higher).

**How it works:**
1. If the video has not been exported to MP4 yet, an export is automatically started.
2. Once the MP4 is ready, it is uploaded to each selected platform.
3. Each channel gets its own publication with independent status tracking.

**After publishing:**
Poll `GET /publications/{publicationId}` for each publication ID until it reaches a terminal state.
Immediate publishes typically end in `published` or `failed`. Scheduled publishes may enter `scheduled` first, depending on platform behavior.
Typical time: 2-10 minutes (longer if export is needed first).

**Platform-specific settings:**
Each entry in the `channels` array can include platform-specific metadata. Only include settings relevant to the channel's platform.

**Cost:** Free. Publishing does not consume credits.

## Request body

- object
  - `videoId` string, uuid, required — The video to publish. Must have `status: completed`.
  - `sceneExportId` string, uuid — Optional export ID if the video has already been exported. If omitted, an export is triggered automatically.
  - `caption` string — Description or long caption used for YouTube, TikTok, Instagram, and Facebook. Max 2200 characters.
  - `shortCaption` string — Short caption shared by X and Threads. It is kept within X's standard weighted 280-character limit. Defaults to `caption` when omitted.
  - `addMadeWithCaption` boolean — Add "Made with AITuber, the AI video generator: aituber.app" at the end of each caption. Default: true. Each caption is shortened when needed to stay within its platform limit.
  - `publishNow` boolean — Set to `true` (default) to publish immediately. Set to `false` and provide `scheduledAt` to schedule.
  - `scheduledAt` string, date-time, nullable — ISO 8601 datetime to schedule publication. Must be in the future. Only used when `publishNow` is `false`.
  - `channels` object[], required — One or more channels to publish to. Each entry can include platform-specific settings.
    - `channelId` string, uuid, required — Channel ID from `GET /channels`. Must have `status: connected`.
    - `title` string — Video title (YouTube). Max 100 characters. Defaults to the video title from generation.
    - `tags` string[] — YouTube tags for search discovery. Max 30 tags, each up to 100 characters.
    - `categoryId` string — YouTube category ID. Default: "22" (People & Blogs). Common: "24" Entertainment, "27" Education, "26" Howto & Style, "28" Science & Technology, "20" Gaming, "10" Music, "17" Sports, "1" Film & Animation, "23" Comedy.
    - `madeForKids` boolean — YouTube COPPA compliance flag. Default: false.
    - `allowComment` boolean — Let viewers comment. Default: true. Only TikTok and X support this. TikTok turns comments off. X has no full off switch, so it limits replies to accounts you mention. Ignored on YouTube, Instagram, Facebook, and Threads.
    - `tiktokPrivacyStatus` 'public' | 'friends' | 'private' — Privacy setting. Default: "public".
    - `allowDuet` boolean — Allow duets. Default: true.
    - `allowStitch` boolean — Allow stitches. Default: true.
    - `isAiGenerated` boolean — Label video as AI-generated on TikTok. Default: false.
    - `instagramPlacement` 'reels' | 'stories' | 'timeline' — Instagram: where to post. Default: "reels".
    - `shareToFeed` boolean — Instagram: also share Reel to feed. Default: true.

## Response `200`

OK

- object
  - `publications` object[], required — One publication record per channel.
    - `publicationId` string, uuid, required — Publication ID. Poll status with `GET /publications/{publicationId}`.
    - `channelId` string, uuid, required — The channel this publication targets.
    - `status` 'exporting' | 'uploading' | 'scheduled' | 'published' | 'failed' | 'canceled', required — Initial status for this publication. - `exporting`: Waiting for the MP4 export to finish before upload can start. - `uploading`: Upload task has been queued or started. - `scheduled`: The platform accepted a future publish time. - `published`: Upload completed on the platform. - `failed`: Something went wrong before or during upload. - `canceled`: The scheduled publication was canceled before going live.
    - `needsExport` boolean, required — Whether this publication is waiting for video export to complete.
  - `needsExport` boolean, required — Whether a video export had to be started. If true, adds 1-5 minutes before upload begins.

## Other responses

- `401` — 401
- `402` — 402
- `403` — 403

---

[API](https://skmtc.net/aituber/apis/aituber-api.md) · [All operations](https://skmtc.net/aituber/apis/aituber-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/aituber/aituber-api/revisions/35448566f143/schema)
