---
title: "Make a short vertical video from a post's words (for YouTube and TikTok)"
method: POST
path: "/api/media/video"
---

# Make a short vertical video from a post's words (for YouTube and TikTok)

`POST /api/media/video`

## Request

- Base URL: `https://postwire.io`
- URL: `https://postwire.io/api/media/video`
- Auth: HTTP bearer

YouTube takes only video and TikTok video or photos. This turns the words of a post into an MP4 you can publish there: 1080x1920 (9:16), 8 to 12 seconds, H.264 High with AAC sound, 30 fps. The first line (or first sentence) appears as a large heading and up to two more sentences appear one after another over a softly moving plain background, inside the area TikTok and Shorts leave clear of their buttons and caption. Emoji, links and trailing hashtags are left out; nothing is added that you did not write, and there is no PostWire watermark. Music: one of three royalty-free beds (Pixabay Content License, checked free of YouTube Content ID) at about -14 LUFS, or silence. No AI is used and nothing is published: pass the returned media_url as video_url to /api/post or /api/schedule. The file is stored like an upload: deleted the day after the last scheduled post that uses it is published, or 7 days after it is made if no scheduled post uses it. Draws Latin, Greek and Cyrillic text. 10 videos an hour per account; per day 10 on the Free plan and 60 on paid plans. Takes about 3 to 10 seconds.

## Request body

- object
  - `text` string, required: The post's words. The first line or sentence becomes the heading; up to two more sentences follow.
  - `style` 'light' | 'dark': Warm off-white or dark background.
  - `music` 'auto' | 'lofi' | 'piano' | 'upbeat' | 'none': auto picks one of the three beds from the text; none gives a silent AAC track.
  - `footer` string: Optional short line under the text, e.g. the brand or shop name.

## Response `200`

{ ok, media_url, path, kind: "video", content_type: "video/mp4", bytes, width: 1080, height: 1920, duration_s, music, text_on_video[], poster_url (the last frame as a JPEG), render_ms, expires_at }

## Other responses

- `400`: code no_text (not enough words) or unsupported_script (an alphabet the font cannot draw)
- `429`: 10 an hour per account, or code video_daily_limit (the plan's videos a day)
- `503`: code video_unavailable: the renderer is not available on this server

---

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