---
title: "Publish short video to YouTube Shorts, Instagram Reels, and/or TikTok"
method: POST
path: "/api/agent/shorts/publish"
tags: ["Shorts"]
---

# Publish short video to YouTube Shorts, Instagram Reels, and/or TikTok

`POST /api/agent/shorts/publish`

## Request body

- ShortsPublishRequest
  - `video_url` string, uri, required — HTTPS URL of the video. Must be hosted on download.citedy.com (path must start with `/agent/shorts/` or `/agent/reels/`) or Supabase storage. The R2 prefix restriction ensures Meta's `facebookexternalhit` crawler can fetch the video via our `/media/shorts/...` proxy on www.citedy.com — direct R2 URLs are blocked by the bucket's default `Disallow: /` robots.txt and cause Instagram Reel publish to fail.
  - `speech_text` string, required — Spoken text from the video for metadata generation
  - `targets` ShortsPublishTarget[], required — Platforms to publish to (max 3). Duplicate platforms are rejected by runtime validation.
    - `platform` 'youtube_shorts' | 'instagram_reels' | 'tiktok', required
    - `account_id` string, uuid, required — Connected social account ID
  - `privacy_status` 'public' | 'unlisted' | 'private' — Publish privacy. YouTube supports public/unlisted/private. TikTok uses tiktok_privacy_level from the account's current creator_info options; privacy_status=private remains a compatibility fallback for SELF_ONLY. Instagram Reels ignores this field.
  - `tiktok_privacy_level` 'PUBLIC_TO_EVERYONE' | 'FOLLOWER_OF_CREATOR' | 'MUTUAL_FOLLOW_FRIENDS' | 'SELF_ONLY' — TikTok-only visibility level selected from the account's current TikTok creator_info options.
  - `tiktok_title` string — TikTok-only reviewed post title/caption.
  - `tiktok_disable_comment` boolean — TikTok-only flag to disable comments for the post.
  - `tiktok_disable_duet` boolean — TikTok-only flag to disable duets for the post.
  - `tiktok_disable_stitch` boolean — TikTok-only flag to disable stitches for the post.
  - `tiktok_brand_content_toggle` boolean — TikTok-only commercial disclosure flag for third-party branded content. Branded content cannot use SELF_ONLY visibility.
  - `tiktok_brand_organic_toggle` boolean — TikTok-only commercial disclosure flag for content promoting the creator's own brand.
  - `tiktok_is_aigc` boolean — TikTok-only flag indicating AI-generated content.

## Response `200`

Publish completed (check per-platform results)

- ShortsPublishResponse
  - `results` object[]
    - `platform` string
    - `ok` boolean
    - `post_id` string
    - `error` object
      - `code` string, required
      - `message` string, required
  - `metadata_provider` string — LLM provider used for metadata generation
  - `metadata_degraded` boolean — True if AI metadata generation failed and static fallback was used
  - `timings` object
    - `metadata_ms` number
    - `total_ms` number
  - `credits_charged` number

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `402` — Insufficient credits
- `429` — Rate limit exceeded
- `500` — Internal server error

## Changes

- **2026-06-04** `03aa71ad8eee` — 1 breaking, 8 info
  - removed `subschema #1, subschema #2` from the `allOf[subschema #1]/then/` request property `anyOf` list
  - added the new optional request property `tiktok_brand_content_toggle`
  - added the new optional request property `tiktok_brand_organic_toggle`
  - added the new optional request property `tiktok_disable_comment`
  - …5 more
- **2026-05-02** `e6e070a2d2cd` — 1 breaking, 2 info
  - added `subschema #1` to the request body `allOf` list
  - added the new optional request property `tiktok_privacy_level`
  - the `privacy_status` request property default value `public` was removed
- **2026-04-23** `61d28edfbc57` — 1 breaking, 3 info
  - the `results/items/error` response's property type/format changed from `string`/`` to `object`/`` for status `200`
  - added the new `tiktok` enum value to the request property `targets/items/platform`
  - added the required property `results/items/error/code` to the response with the `200` status
  - added the required property `results/items/error/message` to the response with the `200` status
- **2026-04-03** `7cc54edf9ffd` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/citedy/apis/citedy-agent-api/changes/api/agent/shorts/publish/post.md)

---

[API](https://skmtc.dev/citedy/apis/citedy-agent-api.md) · [All operations](https://skmtc.dev/citedy/apis/citedy-agent-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/citedy/citedy-agent-api/revisions/b5785d3fe446/schema)
