---
title: "Post a finished video to connected accounts, now or scheduled (async)"
method: POST
path: "/videos/{id}/publish"
tags: ["Publishing"]
---

# Post a finished video to connected accounts, now or scheduled (async)

`POST /videos/{id}/publish`

## Request

- Base URL: `https://app.makeaivideo.ai/api/v1`
- URL: `https://app.makeaivideo.ai/api/v1/videos/{id}/publish`
- Auth: HTTP bearer

## Path parameters

- `id` string, required

## Request body

- object
  - `account_ids` string[], required: acc_... ids from GET /publishing/accounts (1-20)
  - `caption` string, required: Caption for every platform
  - `caption_overrides` object: Per-platform caption keyed by platform id; replaces caption there
  - `youtube_title` string, nullable: YouTube title. Default: the video's title
  - `scheduled_for` string, date-time, nullable: Omit or null to post now. Posts go out within about 2 minutes of this time
  - `timezone` string: IANA timezone, e.g. Europe/London
  - `idempotency_key` string: Same key within 24 hours returns the same post instead of posting again

## Response `202`

Accepted. Poll GET /publishing/posts/{id} until done is true

- object
  - `data` Post
    - `id` string: pub_...
    - `status` 'preparing' | 'importing' | 'pending' | 'scheduled' | 'publishing' | 'published' | 'partial' | 'failed': Terminal: published, partial, failed
    - `done` boolean
    - `video_id` string, nullable
    - `video_title` string, nullable
    - `caption` string, nullable
    - `account_ids` string[]
    - `scheduled_for` string, nullable
    - `error` string, nullable: Why the whole job failed before posting (per-destination errors are on destinations)
    - `destinations` PostDestination[]
      - `platform` string, nullable
      - `account_id` string, nullable
      - `account_name` string, nullable
      - `status` 'pending' | 'published' | 'failed'
      - `platform_status` string, nullable: The publishing service's own value: queued, scheduled, publishing, done, failed, cancelled
      - `url` string, nullable: The live post, once published
      - `published_at` string, nullable
      - `error` string, nullable
      - `next_retry_at` string, nullable
    - `summary` object
      - `total` integer
      - `published` integer
      - `failed` integer
      - `pending` integer
    - `created_at` string, nullable
    - `updated_at` string, nullable
    - `poll_after_seconds` integer, nullable: null when done
  - `error` unknown
  - `meta` Meta
    - `request_id` string
    - `timestamp` string, date-time

## Other responses

- `400`: Video not ready, or a bad account id
- `403`: publishing_unavailable, or the key lacks the write scope
- `404`: Unknown video
- `409`: no_accounts, account_unavailable (details.account_ids need reconnecting), or an idempotency_key still in flight
- `422`: video_too_large (a platform's size or length limit, such as X's 140 seconds)
- `502`: The publishing service refused or failed (retryable)

---

[API](https://skmtc.dev/makeaivideo/apis/makeaivideo-api.md) · [All operations](https://skmtc.dev/makeaivideo/apis/makeaivideo-api/llms.txt) · [OpenAPI document](https://skmtc.dev/makeaivideo/apis/makeaivideo-api/revisions/8c6351087d6d?raw)
