---
title: "Create a UGC hook video"
method: POST
path: "/ugc/videos"
tags: ["UGC"]
---

# Create a UGC hook video

`POST /ugc/videos`

Builds a finished UGC-style hook video: a person reaction clip with your hook text on top, optionally followed by your product demo video.

**Inputs:**
- `reactionId`: a clip from `GET /ugc/reactions` (built-in or one you generated).
- `hookText`: the on-screen hook (5-200 characters).
- `demoVideoAssetId` (optional): a product demo video uploaded with `POST /uploads` (purpose `ugc-demo`).

Returns a `videoId`. This one is ready immediately (`status: completed`); export it with `POST /exports` and download with `GET /exports/download`, or publish it.

**Cost:** flat fee (see `creditsUsed`). Requires an active paid subscription.

## Request body

- object
  - `hookText` string, required — The on-screen hook text (5-200 characters).
  - `reactionId` string, uuid — A reaction clip from `GET /ugc/reactions`.
  - `ugcVideoId` string, uuid — Dashboard alias for `reactionId`. Public callers use `reactionId`.
  - `demoVideoAssetId` string, uuid — Optional product demo video, uploaded via `POST /uploads` (purpose `ugc-demo`). Plays after the reaction.
  - `demoVideoUrl` string, uri — Dashboard use only. Public callers pass `demoVideoAssetId` instead.
  - `demoDurationSeconds` number — Dashboard use only. Required when `demoVideoUrl` is set.
  - `demoVideoWidth` integer — Dashboard use only.
  - `demoVideoHeight` integer — Dashboard use only.
  - `hookTextPosition` 'top' | 'center' | 'bottom' — Where the hook text sits.
  - `aspectRatio` '9:16' | '16:9' | '1:1' — Video dimensions.
  - `backgroundMusicId` string, uuid — Dashboard use only. Background music track ID.
  - `backgroundMusicVolume` number — Dashboard use only. Background music volume (0-100).
  - `captionStyleId` string — Caption style ID from `GET /caption-styles`. Default: "tiktok".
  - `title` string — Optional video title.

## Response `200`

OK

- object
  - `videoId` string, uuid, required — The finished video. Export with POST /exports, download with GET /exports/download.
  - `status` 'completed', required
  - `creditsUsed` number, required
  - `durationSeconds` number, required

## 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)
