Developer docs

Create a lyric video, a Canvas or a music video

MCP tool
create_lyric_video
CLI
kinetune create lyric-video
MCP tool
create_canvas
CLI
kinetune create canvas
MCP tool
create_music_video
CLI
kinetune create music-video
POST/api/v1/videos

Not sent from the docs: it spends credits. Run it with curl, the CLI or its MCP tool.

Make the lyric video a quote priced (spends credits)

Send the same request as the quote plus its quote_id. Returns the video ids at once; poll get_video until status is completed (or failed). Each video has one file per format. Needs an active plan (402 plan_required without one; get_account: plan.active) and room in its storage (402 storage_full when it would not fit; get_account: storage).

Make the Canvas a quote priced (spends credits)

Send the same request as the quote plus its quote_id. Returns the video ids at once; poll get_video until status is completed. Upload the file in Spotify for Artists. Needs an active plan (402 plan_required without one; get_account: plan.active) and room in its storage (402 storage_full when it would not fit; get_account: storage).

Make the music video a quote priced (spends credits)

Send the same request as the quote plus its quote_id. Returns the video ids at once; poll get_video until status is completed. It takes about 5 minutes for a minute of song, longer for the whole song. Needs an active plan (402 plan_required without one; get_account: plan.active) and room in its storage (402 storage_full when it would not fit; get_account: storage).

Authorization

headerAuthorizationBearer <token>

An organization API key (kt_live_…) or an OAuth access token

Request Body

application/json
  1. body
type*unknown
song_id*string

The song id

Length1 <= length <= 120
variations?integer

1–4 different New Looks, one video each (an Existing Look renders one)

Range1 <= value <= 4
Default1
callback_url?string

An https URL to POST the finished video to (signed; see Callbacks). Quote and create with the same value

Lengthlength <= 2000
metadata?

Your own JSON (an order id, for example): kept with the video and returned in its request. Quote and create with the same value

look*|

{"mode":"existing","id":"look_…"} to reuse a saved Look (add "lyric_style" to render it in another lyric style, at no extra cost), or {"mode":"new","category":"…","lyric_style":"…","background":{"source":"ai-image","quality":"high"},"visibility":"private","direction":"…"} to have one designed (background.source "upload-photo"/"upload-video" with background.upload_id from upload_background designs it around your own media; such a Look stays private. "stock-photo"/"stock-video" with background.stock_id from search_stock uses that stock photo or clip instead of the director's pick). lyric_style (optional, from get_options) sets how the lyrics are presented and animated: block-stack, punch, player, neon, terminal, cinematic… Omit it and the director picks one. background.scenes (2–4, AI image only) makes that many shots of the same world that cut on the song's sections, each priced like the first. background.references "stock" (AI image or AI video, default "none") with feature_artist "always" makes the background one real stock photo of a place the director picks, with the artist put into it and restyled a little for the Look; no extra cost. The singer is left out unless asked: feature_artist "always" (default "never") makes them the subject of the background, recognizable from their artist photos (add_artist_photos); it needs an AI image or AI video background, a private Look and display.cover false (the cover would hide them), and that Look then only serves this artist's songs. A saved Look that shows an artist (featured_artist) only serves that artist's songs, also with display.cover false

aspect_ratios?array<>

Formats to render, each its own file: "9:16" (vertical), "16:9" (wide), "1:1" (square)

Items1 <= items <= 3
Default
[
  "9:16"
]
display?

Which elements show (title, artist, cover, lyrics, badges, headline) and their sizes. cover must be false to show the artist in the background

Default
{
  "title": true,
  "artist": true,
  "cover": true,
  "lyrics": true,
  "badges": true
}
trim?

Render only this section of the song (at least 8 seconds). Best: a part from get_song_analysis (parts[]: its start and end never cut a word)

quote_id*string

The quote_id from the matching quote: the request must be identical

Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid

Response Body

OK

Example Request
curl -X POST 'https://kinetune.com/api/v1/videos' \
  -H 'Content-Type: application/json' \
  -d '{
  "type": "lyric-video",
  "song_id": "string",
  "look": {
    "mode": "new",
    "category": "release"
  },
  "quote_id": "3c071a1d-db86-46a7-9dc8-72ba3fbca992"
}'
Example Response
Empty