Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/sediman-agent-venice-video/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 177% | 0% |
Video is asynchronous — like audio music. Five endpoints:
| Endpoint | Purpose | |---|---| | POST /video/quote | Price in USD (no charge, no job). | | POST /video/queue | Enqueue generation. Returns queue_id, charges (reserves) funds. | | POST /video/retrieve | Poll status or download video/mp4. | | POST /video/complete | Finalize & delete media from Venice storage. | | POST /video/transcriptions | Sync: transcribe a YouTube URL's audio. |
average_execution_time and execution_duration on /video/retrieve for your job's live estimate)./video/quote)./video/quotebashcurl 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.
/video/queuebashcurl 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./video/retrievebashcurl 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
{"status":"PROCESSING","average_execution_time":145000,"execution_duration":53200} (ms).video/mp4 body.{"status":"COMPLETED", ...} — fetch the download_url from the queue response.delete_media_on_completion: true auto-deletes after successful retrieve./video/completebashcurl https://api.venice.ai/api/v1/video/complete \ -H "Authorization: Bearer $VENICE_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"...","queue_id":"..."}'
QueueVideoRequest fieldsAvailability depends on the model — check GET /models?type=video.
| Field | Type | Notes | |---|---|---| | model | string | Required. | | prompt | string, ≤ 2500–3500 | Required (min length 1). Max length varies per model. | | negative_prompt | string, ≤ 2500–3500 | — | | duration | enum 2s..30s or Auto | Required. Model-specific subset. | | aspect_ratio | 1:1, 2:3, 3:2, 3:4, 4:3, 9:16, 16:9, 21:9 | Some models ignore. | | resolution | 256p..4k, or upscale hints 2x / 4x / true_1080p | Use upscale_factor for upscale models. | | upscale_factor | 1 / 2 / 4 | Only for upscale models. 1 = quality enhancement. | | audio | bool | Default true. Audio-capable models. | | image_url | URL or data: URL | Image-to-video reference frame. | | end_image_url | URL or data URL | End frame / transition reference. | | audio_url | URL or data URL | Background music input. WAV/MP3, ≤ 30 s, ≤ 15 MB. | | video_url | URL or data URL | Video-to-video / upscale input. MP4/MOV/WebM. | | reference_image_urls[] | array of URLs, ≤ 9 | Character / style consistency images. | | elements[] | array, ≤ 4 | Advanced 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, ≤ 4 | Advanced scene refs; reference in prompt as @Image1, @Image2. |
json{ "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 }
json{ "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" }
json{ "model": "<upscale model>", "video_url": "data:video/mp4;base64,...", "upscale_factor": 2, "duration": "Auto" }
json{ "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.
bashcurl 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.
tsasync 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)) } }
| Code | Meaning | |---|---| | 400 | Bad params (duration/resolution not supported by model, missing required image_url for i2v, missing prompt, etc.). | | 401 | Auth / Pro-only. | | 402 | Insufficient balance. | | 403 | Model unavailable in your region. | | 413 | Request payload too large — shrink images / audio. (Returned from /video/queue.) | | 422 | Content policy violation. (Returned from /video/queue.) | | 500 | Inference failed. | | 503 | Model 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.
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_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).| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 20,946 | 17,335 | -17% | 1 | 1 | 0% | 4,150 | 6,281 | +51% | 0 | 0 | — |
case-02 | fail→pass | 18,837 | 13,942 | -26% | 1 | 1 | 0% | 3,608 | 5,354 | +48% | 0 | 0 | — |
case-03 | fail→pass | 20,200 | 16,077 | -20% | 1 | 1 | 0% | 3,510 | 5,754 | +64% | 0 | 0 | — |
case-04 | fail→pass | 11,503 | 7,231 | -37% | 1 | 1 | 0% | 2,103 | 4,019 | +91% | 0 | 0 | — |
case-05 | pass→pass | 7,376 | 7,221 | -2% | 1 | 1 | 0% | 1,385 | 3,967 | +186% | 0 | 0 | — |
case-06 | pass→pass | 10,820 | 7,270 | -33% | 1 | 1 | 0% | 2,110 | 3,856 | +83% | 0 | 0 | — |
case-07 | fail→pass | 7,535 | 3,279 | -56% | 1 | 1 | 0% | 1,153 | 3,193 | +177% | 0 | 0 | — |
case-08 | fail→pass | 10,210 | 3,490 | -66% | 1 | 1 | 0% | 1,676 | 3,229 | +93% | 0 | 0 | — |
case-09 | pass→pass | 10,075 | 2,925 | -71% | 1 | 1 | 0% | 1,552 | 3,034 | +95% | 0 | 0 | — |
case-10 | fail→pass | 10,713 | 2,535 | -76% | 1 | 1 | 0% | 1,542 | 3,066 | +99% | 0 | 0 | — |
case-11 | fail→pass | 11,366 | 4,075 | -64% | 1 | 1 | 0% | 1,648 | 3,328 | +102% | 0 | 0 | — |
case-12 | fail→pass | 10,072 | 2,258 | -78% | 1 | 1 | 0% | 1,514 | 3,018 | +99% | 0 | 0 | — |
case-13 | fail→pass | 10,716 | 2,683 | -75% | 1 | 1 | 0% | 1,700 | 3,078 | +81% | 0 | 0 | — |
case-14 | fail→pass | 9,655 | 1,851 | -81% | 1 | 1 | 0% | 1,514 | 2,935 | +94% | 0 | 0 | — |
case-15 | pass→pass | 5,165 | 1,940 | -62% | 1 | 1 | 0% | 755 | 2,912 | +286% | 0 | 0 | — |
case-16 | fail→pass | 7,245 | 1,580 | -78% | 1 | 1 | 0% | 1,098 | 2,840 | +159% | 0 | 0 | — |
case-17 | fail→pass | 15,064 | 2,869 | -81% | 1 | 1 | 0% | 2,554 | 3,112 | +22% | 0 | 0 | — |
case-18 | pass→pass | 13,421 | 8,035 | -40% | 1 | 1 | 0% | 2,428 | 4,108 | +69% | 0 | 0 | — |
case-19 | pass→pass | 9,951 | 1,676 | -83% | 1 | 1 | 0% | 1,464 | 2,870 | +96% | 0 | 0 | — |
case-20 | pass→pass | 7,694 | 3,439 | -55% | 1 | 1 | 0% | 1,420 | 3,238 | +128% | 0 | 0 | — |
case-21 | pass→pass | 6,635 | 2,679 | -60% | 1 | 1 | 0% | 953 | 3,074 | +223% | 0 | 0 | — |
case-22 | pass→pass | 12,067 | 2,368 | -80% | 1 | 1 | 0% | 2,166 | 3,049 | +41% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +59 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.