# Post or schedule a video

URL: https://clippie.ai/developers/docs/post-video

Posts a finished Clippie video to a connected channel (YouTube today), now or at a scheduled time up to 180 days ahead. Clippie uploads it at that time, even with nothing open. Needs a paid Clippie plan and spends no credits. It goes out under the user's name, so confirm the channel, title, visibility and time with the user first, and never pick public for them. Get the channel id from list_social_channels; the video is a completed render job (jobId), a libraryId, or its videoUrl. Check the result later with get_post.

## At a glance

| Property | Value |
| --- | --- |
| REST | `POST https://api.clippie.ai/v1/social/posts` |
| MCP tool | `post_video` |
| Scope | `publish` |
| Cost | Spends nothing. Needs the `publish` scope and a paid plan, and posts under the user's name: confirm the details with them first. |
| Limit bucket | `social_post` (see [Rate limits](https://clippie.ai/developers/docs.md#rate-limits)) |

## Parameters

| Name | In | Type | Required | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `channelId` | body | string | Yes |  | The channel id from list_social_channels. 1-64 chars. |
| `jobId` | body | string | No |  | A completed render job (job_…), e.g. from render_video. Up to 80 chars. |
| `libraryId` | body | string | No |  | A video in the user's library (job output.libraryId). Up to 64 chars. |
| `videoUrl` | body | string (URL) | No |  | A Clippie video URL (job output.videoUrl). Up to 2000 chars. |
| `title` | body | string | Yes |  | The YouTube title (up to 100 characters). 1-100 chars. |
| `description` | body | string | No |  | The YouTube description: text, hashtags, links. Up to 5000 chars. |
| `privacy` | body | string | Yes |  | Who can see it on YouTube. Ask the user; do not assume public. One of `public`, `unlisted`, `private`. |
| `madeForKids` | body | boolean | No |  | YouTube "made for kids". Defaults to false. |
| `tags` | body | array of string | No |  | YouTube tags. Up to 30 items. |
| `scheduledFor` | body | string | No |  | When to post (ISO 8601 with a time zone, e.g. 2026-11-20T17:00:00-05:00). Leave out to post now. |

## Example

curl:

```bash
curl https://api.clippie.ai/v1/social/posts \
  -H "Authorization: Bearer $CLIPPIE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channelId": "CHANNEL_ID",
    "title": "TITLE",
    "privacy": "public"
  }'
```

post-video.mjs:

```js
const auth = { Authorization: `Bearer ${process.env.CLIPPIE_API_KEY}` };

const res = await fetch('https://api.clippie.ai/v1/social/posts', {
  method: 'POST',
  headers: { ...auth, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "channelId": "CHANNEL_ID",
    "title": "TITLE",
    "privacy": "public"
  }),
});
if (!res.ok) throw new Error((await res.json()).error.message);
console.log(await res.json());
```

## Response

`200` with JSON. The full response schema is in the [OpenAPI spec](https://api.clippie.ai/v1/openapi.json).

## From an MCP client

Your AI calls `post_video` with the same fields as JSON arguments. See [MCP server](https://clippie.ai/developers/docs.md#mcp) to connect one.

tools/call:

```json
{
  "name": "post_video",
  "arguments": {
    "channelId": "CHANNEL_ID",
    "title": "TITLE",
    "privacy": "public"
  }
}
```
