---
title: "Quote a lyric video or Quote a Canvas"
method: POST
path: "/api/v1/quotes"
tags: ["videos"]
---

# Quote a lyric video or Quote a Canvas

`POST /api/v1/quotes`

## Request

- Base URL: `https://kinetune.com`
- URL: `https://kinetune.com/api/v1/quotes`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://kinetune.com/api/auth/oauth2/authorize`, token URL `https://kinetune.com/api/auth/oauth2/token`, scopes: `videos:write`, `videos:read`)

The exact credits for a lyric video, before anything is charged

Returns quote_id, credits (total), credits_per_video and a breakdown. Always quote first and tell the user the credits before creating; credits are reserved at creation and charged only when the video is delivered. A quote is valid for 30 minutes.

The exact credits for a Spotify Canvas, before anything is charged

Returns quote_id, credits and a breakdown. Always quote first and tell the user the credits before creating; credits are reserved at creation and charged only when the video is delivered.

## Request body

- union
  - object
    - `type` 'lyric-video', required
    - `song_id` string, required: The song id
    - `variations` integer: 1–4 different New Looks, one video each (an Existing Look renders one)
    - `callback_url` string: An https URL to POST the finished video to (signed; see Callbacks). Quote and create with the same value
    - `metadata` object: 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` union, required: {"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. 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
      - object
        - `mode` 'new', required
        - `category` 'release' | 'fall' | 'halloween' | 'christmas' | 'summer' | 'valentines' | 'mood' | 'retro' | 'synthwave' | 'street' | 'nature' | 'luxury' | 'abstract' | 'minimal' | 'neon' | 'pop-art' | 'lo-fi' | 'grunge' | 'cosmic' | 'cyber' | 'dreamy', required
        - `background` object
          - `source` 'ai-image' | 'ai-video' | 'stock-photo' | 'stock-video' | 'upload-photo' | 'upload-video' | 'designed'
          - `quality` 'standard' | 'high' | 'ultra'
          - `upload_id` string
          - `scenes` integer
          - `stock_id` string
        - `visibility` 'private' | 'public'
        - `direction` string
        - `feature_artist` 'never' | 'always'
        - `lyric_style` 'showcase' | 'block-stack' | 'punch' | 'depth-scatter' | 'neon' | 'terminal' | 'cinematic' | 'player' | 'lo-fi' | 'zine' | 'glitch' | 'pop-art' | 'dreamy' | 'chrome' | 'visualizer' | 'minimal' | 'outline' | 'messages' | 'vinyl' | 'album' | 'tv' | 'cube' | 'cassette' | 'phone' | 'glass' | 'embers' | 'ink' | 'smoke' | 'stardust' | 'drip' | 'rain' | 'screen' | 'behind' | 'big-type'
      - object
        - `mode` 'existing', required
        - `id` string, required
        - `lyric_style` 'showcase' | 'block-stack' | 'punch' | 'depth-scatter' | 'neon' | 'terminal' | 'cinematic' | 'player' | 'lo-fi' | 'zine' | 'glitch' | 'pop-art' | 'dreamy' | 'chrome' | 'visualizer' | 'minimal' | 'outline' | 'messages' | 'vinyl' | 'album' | 'tv' | 'cube' | 'cassette' | 'phone' | 'glass' | 'embers' | 'ink' | 'smoke' | 'stardust' | 'drip' | 'rain' | 'screen' | 'behind' | 'big-type'
    - `aspect_ratios` string[]: Formats to render, each its own file: "9:16" (vertical), "16:9" (wide), "1:1" (square)
    - `display` object: Which elements show (title, artist, cover, lyrics, badges, headline) and their sizes. cover must be false to show the artist in the background
      - `title` boolean
      - `artist` boolean
      - `cover` boolean
      - `lyrics` boolean
      - `badges` boolean
      - `headline` 'none' | 'new-release' | 'out-now' | 'coming-soon' | 'listen-now'
      - `cover_scale` number
      - `text_scale` number
      - `artist_scale` number
      - `spacing_scale` number
    - `trim` object: Render only this section of the song (at least 8 seconds)
      - `start_seconds` number, required
      - `end_seconds` number, required
  - object
    - `type` 'canvas', required
    - `song_id` string, required: The song id
    - `variations` integer: 1–4 different Canvases
    - `callback_url` string: An https URL to POST the finished video to (signed; see Callbacks). Quote and create with the same value
    - `metadata` object: Your own JSON (an order id, for example): kept with the video and returned in its request. Quote and create with the same value
    - `source` 'ai-video' | 'ai-image' | 'stock-photo' | 'stock-video': ai-video (default), ai-image, stock-photo or stock-video
    - `quality` 'standard' | 'high': AI video model tier: standard or high
    - `resolution` '720p' | '1080p': 1080p (1080×1920) or 720p
    - `style` 'cinematic' | 'dreamy' | 'abstract' | 'surreal' | 'retro' | 'minimal' | 'dark' | 'vibrant' | 'nature' | 'urban': Optional visual style
    - `direction` string: Optional mood, motifs or references; the concept still comes from the cover
    - `feature_artist` 'auto' | 'always' | 'never': Whether the Canvas shows the artist: auto (the director decides), always or never (AI sources; needs artist photos for "always")
    - `seconds` integer: Canvas length in whole seconds, 5–8 (default 8). Spotify loops it, so no part of the song is chosen
    - `stock_id` string: With a stock source: the stock photo or video (search_stock with seconds) to use instead of the director's pick

## Response `200`

OK

## Other responses

- `201`: Created
- `400`: Invalid request
- `401`: Missing or invalid credentials
- `402`: Not enough credits
- `403`: Missing scope
- `404`: Not found
- `409`: Conflict
- `422`: Unprocessable
- `503`: Temporarily unavailable (AI video): nothing was held; try again after Retry-After seconds

---

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