Venice AI logo

Skill

venice-video

generate and transcribe videos with Venice

Covers Text-to-Speech Transcription Video

Description

Generate and transcribe videos via Venice. Covers the async /video/quote + /video/queue + /video/retrieve + /video/complete loop, text-to-video, image-to-video, video-to-video (upscale), audio input, reference images, scene and element support, plus /video/transcriptions for YouTube URLs.

SKILL.md

Venice Video

Video is asynchronous — like audio music. Five endpoints:

EndpointPurpose
POST /video/quotePrice in USD (no charge, no job).
POST /video/queueEnqueue generation. Returns queue_id, charges (reserves) funds.
POST /video/retrievePoll status or download video/mp4.
POST /video/completeFinalize & delete media from Venice storage.
POST /video/transcriptionsSync: transcribe a YouTube URL's audio.

Use when

  • You need text-to-video, image-to-video, video upscale, video-with-audio, or video transcription.
  • You can tolerate async execution (single-digit seconds to several minutes depending on model, duration, and queue depth — inspect average_execution_time and execution_duration on /video/retrieve for your job's live estimate).
  • You want to price a job precisely before committing (/video/quote).

Lifecycle — generation

1. Price with /video/quote

curl https://api.venice.ai/api/v1/video/quote \
  -H "Authorization: Bearer $VENICE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "wan-2-7-text-to-video",
    "duration": "5s",
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "audio": true
  }'

Response: {"quote": 0.35} USD.

2. Submit with /video/queue

curl https://api.venice.ai/api/v1/video/queue \
  -H "Authorization: Bearer $VENICE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "wan-2-7-text-to-video",
    "prompt": "Commerce being conducted in the city of Venice, Italy.",
    "negative_prompt": "low resolution, worst quality, defects",
    "duration": "5s",
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "audio": true
  }'

Response: { "model": "...", "queue_id": "uuid", "download_url": "https://..." }.

  • download_url only appears for VPS-backed models. When present, the retrieve endpoint returns JSON status only — fetch this URL to download. Valid 24 h.

3. Poll with /video/retrieve

curl https://api.venice.ai/api/v1/video/retrieve \
  -H "Authorization: Bearer $VENICE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"...","queue_id":"..."}' \
  --output out.mp4
  • Processing: JSON {"status":"PROCESSING","average_execution_time":145000,"execution_duration":53200} (ms).
  • Completed (non-VPS): binary video/mp4 body.
  • Completed (VPS-backed): {"status":"COMPLETED", ...} — fetch the download_url from the queue response.
  • delete_media_on_completion: true auto-deletes after successful retrieve.

4. Finalize with /video/complete

curl https://api.venice.ai/api/v1/video/complete \
  -H "Authorization: Bearer $VENICE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"...","queue_id":"..."}'

QueueVideoRequest fields

Availability depends on the model — check GET /models?type=video.

FieldTypeNotes
modelstringRequired.
promptstring, ≤ 2500–3500Required (min length 1). Max length varies per model.
negative_promptstring, ≤ 2500–3500
durationenum 2s..30s or AutoRequired. Model-specific subset.
aspect_ratio1:1, 2:3, 3:2, 3:4, 4:3, 9:16, 16:9, 21:9Some models ignore.
resolution256p..4k, or upscale hints 2x / 4x / true_1080pUse upscale_factor for upscale models.
upscale_factor1 / 2 / 4Only for upscale models. 1 = quality enhancement.
audioboolDefault true. Audio-capable models.
image_urlURL or data: URLImage-to-video reference frame.
end_image_urlURL or data URLEnd frame / transition reference.
audio_urlURL or data URLBackground music input. WAV/MP3, ≤ 30 s, ≤ 15 MB.
video_urlURL or data URLVideo-to-video / upscale input. MP4/MOV/WebM.
reference_image_urls[]array of URLs, ≤ 9Character / style consistency images.
elements[]array, ≤ 4Advanced models (e.g. Kling O3 R2V): each has frontal_image_url, up to 3 reference_image_urls, video_url. Reference in prompt as @Element1, @Element2.
scene_image_urls[]array of URLs, ≤ 4Advanced scene refs; reference in prompt as @Image1, @Image2.

Common recipes

Text → video with audio

{
  "model": "wan-2-7-text-to-video",
  "prompt": "A golden retriever chasing a frisbee in slow motion at sunset.",
  "duration": "6s",
  "aspect_ratio": "16:9",
  "resolution": "720p",
  "audio": true
}

Image → video

{
  "model": "<image-to-video model>",
  "prompt": "Camera slowly zooms out, revealing the cityscape.",
  "image_url": "https://example.com/cityscape.jpg",
  "duration": "5s",
  "aspect_ratio": "16:9"
}

Video upscale

{
  "model": "<upscale model>",
  "video_url": "data:video/mp4;base64,...",
  "upscale_factor": 2,
  "duration": "Auto"
}

Multi-element consistency (Kling O3 R2V-style)

{
  "model": "<advanced-model>",
  "prompt": "@Element1 walks toward @Element2 against @Image1.",
  "elements": [
    { "frontal_image_url": "<char1.png>", "reference_image_urls": ["<alt1.png>"] },
    { "frontal_image_url": "<char2.png>" }
  ],
  "scene_image_urls": ["<street-scene.jpg>"]
}

/video/transcriptions (sync)

Transcribe a YouTube video URL directly — no queue.

curl https://api.venice.ai/api/v1/video/transcriptions \
  -H "Authorization: Bearer $VENICE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://www.youtube.com/watch?v=...","response_format":"json"}'

Response: {"transcript":"...","lang":"en"} (JSON) or plain text/plain body when response_format: text.

For arbitrary audio files, use venice-audio-transcription instead.

Full polling loop

async function waitForVideo(model: string, queueId: string, downloadUrl?: string) {
  while (true) {
    const res = await fetch(`${base}/video/retrieve`, {
      method: 'POST', headers,
      body: JSON.stringify({ model, queue_id: queueId }),
    })
    const ct = res.headers.get('content-type') ?? ''
    if (ct.startsWith('video/')) {
      return Buffer.from(await res.arrayBuffer())
    }
    const body = await res.json()
    if (body.status === 'COMPLETED' && downloadUrl) {
      const v = await fetch(downloadUrl)
      return Buffer.from(await v.arrayBuffer())
    }
    if (body.status !== 'PROCESSING') throw new Error(`unexpected ${body.status}`)
    await new Promise(r => setTimeout(r, 5000))
  }
}

Errors

CodeMeaning
400Bad params (duration/resolution not supported by model, missing required image_url for i2v, missing prompt, etc.).
401Auth / Pro-only.
402Insufficient balance.
403Model unavailable in your region.
413Request payload too large — shrink images / audio. (Returned from /video/queue.)
422Content policy violation. (Returned from /video/queue.)
500Inference failed.
503Model at capacity — retry later. On /video/retrieve, returned when the queue is backed up.

/video/queue does not document 503 in the spec — upstream capacity issues surface there as 500. Watch for 503 specifically on /video/retrieve.

Gotchas

  • duration is required on /video/queue. Even Auto is a valid explicit value.
  • download_url is only sometimes returned at queue time. Always handle both paths: binary from /retrieve OR fetching download_url after status COMPLETED.
  • download_url expires in 24 h — download promptly.
  • Upscale models use upscale_factor instead of resolution.
  • reference_image_urls[] is capped at 9 entries, elements[] at 4, scene_image_urls[] at 4. Over-limit is 400.
  • data: URLs count toward payload size; large base64 videos may trip 413 — prefer hosted URLs.
  • /video/transcriptions is YouTube-URL-only; it does not accept arbitrary video uploads (use ffmpeg to strip audio, then /audio/transcriptions).

© 2026 YourAI.tools. Every skill from an identity-verified publisher.

Independent catalog. Not affiliated with, endorsed by, or sponsored by Anthropic or any listed publisher. All trademarks belong to their respective owners.