Patch the edit state for an orientation
Partial update: only the given fields change (subtitles merged field by field, lists replaced, music: null = removed); the edit row is created with the account subtitle preset if missing. Plan gating (403): subtitles.overrides non-empty needs edit_captions; subtitles.lang != "original" needs translate; non-empty broll/music needs broll_music. Validation (400, the message names the field): zones inside 0..1, keyframe zone count must match the layout (vertical/spotlight/centered 1, split 2, trio 3, horizontal 0), cuts end > start, B-roll/emojis inside the clip bounds. Returns the full stored edit.
Request
- Base URL: https://cliponit.app
- URL: https://cliponit.app/api/clips/{id}/edit
- Auth: one of:
- HTTP bearer
- API key in cookie session
- OAuth 2 (authorization code, authorization URL https://cliponit.app/oauth/authorize, token URL https://cliponit.app/oauth/token, scopes: clips)
Path parameters
Clip id (UUID)
Query parameters
vertical = 9:16 1080x1920 (TikTok/Reels/Shorts), horizontal = 16:9 1920x1080 (YouTube), square = 1:1 1080x1080 (feed), portrait45 = 4:5 1080x1350 (Instagram feed). auto-reframe supports vertical|horizontal only.
Which edit/export: vertical (9:16, default), horizontal (16:9), square (1:1) or portrait45 (4:5). Each clip has one independent edit per orientation.
Request body
Example request
{
"subtitles": {
"style": "boxed",
"color": "yellow"
},
"cuts": [
{
"start": 130.2,
"end": 131
}
]
}Response
Stored edit
Example response
{
"keyframes": [
{
"t": 0,
"layout": "vertical",
"zones": [
{
"x": 0.3,
"y": 0,
"w": 0.4,
"h": 1
}
],
"ease": "cut"
}
],
"subtitles": {
"enabled": true,
"color": "yellow",
"case": "normal",
"lang": "original",
"overrides": [],
"style": "karaoke",
"font": "Inter",
"position": "bottom",
"size": 2,
"words_per_line": 5,
"animate": true
},
"music": {
"music_id": "6f1c2d6e-3b1a-4c0f-9a0e-2f5d1c7b8e90"
},
"emojis": [
{
"emoji": "🔥"
}
]
}Changes
No recorded changes to this operation across all 1 revision of this API.