---
title: "Upload a video file to YouTube"
method: POST
path: "/api/v1/posts/youtube"
tags: ["Posts"]
---

# Upload a video file to YouTube

`POST /api/v1/posts/youtube`

## Request

- Base URL: `https://app.tryadeli.com`
- URL: `https://app.tryadeli.com/api/v1/posts/youtube`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/adeli/apis/adeli-api/docs/api/v1/posts/youtube/post.ts> (a function with typed inputs; its response is checked against the schema)

Recommended: send JSON with staged video and optional thumbnail upload references created by `createMediaUploads`. Legacy multipart remains supported for compatibility.

## Request body

- object
  - `platform` 'youtube', required
  - `accountId` string, uuid, required
  - `profileId` string, uuid
  - `title` string, required
  - `description` string
  - `tags` string[]
  - `category_id` string
  - `privacy_status` 'public' | 'unlisted' | 'private', required
  - `made_for_kids` boolean, required
  - `contains_synthetic_media` boolean
  - `publish_at` string, date-time
  - `notify_subscribers` boolean
  - `video` union, required
    - object
      - `url` string, uri, required
    - object
      - `content_type` 'video/mp4' | 'video/quicktime' | 'video/webm', required
      - `base64` string, required
    - object
      - `upload_id` string, required
  - `thumbnail` object
    - `upload_id` string, required

## Response `202`

Success

- object
  - `id` string, required
  - `platform` 'youtube', required
  - `accountId` string, uuid, required
  - `profileId` string, uuid, required
  - `publishId` string, required
  - `videoId` string, required
  - `permalink` string, uri, required
  - `status` 'ACCEPTED', required
  - `requestedPrivacy` 'public' | 'unlisted' | 'private', required
  - `appliedPrivacy` 'public' | 'unlisted' | 'private', required
  - `privacyRestricted` boolean, required
  - `publishAt` string, date-time, nullable, required
  - `thumbnail` 'set' | 'not_allowed' | 'failed', nullable, required
  - `statusUrl` string, required
  - `warnings` object[]
    - `code` string, required
    - `message` string, required

## Other responses

- `400`: Invalid request or provider failure
- `401`: Missing or invalid API key
- `402`: Billing is required: a card is needed to connect more accounts or use X (`billing_required`, `x_billing_required`), or the workspace has used its free monthly allowance (`usage_limit_reached`)
- `403`: The connection lacks a permission or provider-confirmed resource
- `413`: Uploaded media is too large
- `415`: Unsupported media type
- `422`: The connected account cannot perform this operation
- `429`: Provider quota or rate limit exhausted
- `502`: Invalid request or provider failure

---

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