Kandinsky 6 API Pro & Lite, Kandinsky 6 VSR API, Kandinsky 5 Pro API: Pricing, Documentation
by Kandinsky
Kandinsky API is an advanced AI model for generating high-quality videos from images with smooth motion and cinematic quality. Through Pixazo's API, developers can leverage Kandinsky's image-to-video capabilities to bring still images to life with realistic movement and dynamic visual storytelling. The API is designed for content creators, marketers, and developers who need reliable AI video generation with professional-grade output.

Models Version
Get 10% Cashback on Your First Payment (up to $500)
Add funds and get 10% cashback on your first payment (up to $500).
Kandinsky 6.0 Lite API Documentation
Generate a video from a text prompt with Kandinsky 6.0 Lite, the lightweight text-to-video model from Kandinsky Lab: each request returns one clip of about 5 seconds at 480p, with a synchronized audio track unless you turn it off, and can upscale it in the same request: to 1080p for a 16:9 clip, or up to four times its width and height. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url.
POST https://gateway.pixazo.ai/kandinsky-6-lite/v1/text-to-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Video - Kandinsky 6.0 Lite
Request Code
POST https://gateway.pixazo.ai/kandinsky-6-lite/v1/text-to-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A paper boat drifting down a rain-soaked city street at night, neon reflections rippling on the water, low tracking shot. Rain patters on the pavement and distant traffic hums.",
"aspect_ratio": "16:9",
"num_inference_steps": 10,
"upscale_factor": 2.25
}import requests
url = "https://gateway.pixazo.ai/kandinsky-6-lite/v1/text-to-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A paper boat drifting down a rain-soaked city street at night, neon reflections rippling on the water, low tracking shot. Rain patters on the pavement and distant traffic hums.",
"aspect_ratio": "16:9",
"num_inference_steps": 10,
"upscale_factor": 2.25
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/kandinsky-6-lite/v1/text-to-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "A paper boat drifting down a rain-soaked city street at night, neon reflections rippling on the water, low tracking shot. Rain patters on the pavement and distant traffic hums.",
"aspect_ratio": "16:9",
"num_inference_steps": 10,
"upscale_factor": 2.25
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-lite/v1/text-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "A paper boat drifting down a rain-soaked city street at night, neon reflections rippling on the water, low tracking shot. Rain patters on the pavement and distant traffic hums.", "aspect_ratio": "16:9", "num_inference_steps": 10, "upscale_factor": 2.25}'Output
{
"request_id": "kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-lite/v1/text-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"prompt": "A paper boat drifting down a rain-soaked city street at night, neon reflections rippling on the water, low tracking shot. Rain patters on the pavement and distant traffic hums.", "aspect_ratio": "16:9", "num_inference_steps": 10, "upscale_factor": 2.25}'Callback Payload (success)
{
"request_id": "kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-lite",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Failure callback shape
{
"request_id": "kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "kandinsky-6-lite",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Non-empty text | What the video shows and how it sounds: subject, action, setting, camera movement and lighting, plus any sound effects, music or speech for the audio track. |
aspect_ratio | No | string | "16:9" | 16:9, 9:16, 1:1, 4:3, 3:4 | Frame shape of the video. It does not change the amount billed. |
num_inference_steps | No | integer | 10 | 4–16 | Number of denoising steps. Lite is tuned for 10, the default. Fewer steps cost less; more steps cost more. |
upscale_factor | No | number or null | null (no upscaling) | 2, 2.25, 4, null | Upscale the 480p clip with Kandinsky 6 video super-resolution: 2 doubles, 2.25 multiplies by 2.25 (a 16:9 clip becomes 1080p) and 4 quadruples the width and height. Leave it out, or send null, to keep 480p. Each factor costs more than no upscaling. |
generate_audio | No | boolean | true | true, false | Generate a synchronized audio track. It does not change the amount billed. |
enable_prompt_expansion | No | boolean | false | true, false | Rewrite your prompt into a more detailed video and audio description before generating. It does not change the amount billed. |
seed | No | integer | Random | Any whole number | Seed for the random generator; leave it out for a random seed. It does not change the amount billed. |
Good to know
- Each request returns one video.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per video. - Every clip is about 5 seconds at 480p: there is no length or resolution setting, and
duration,seconds,num_frames,frames_per_second,resolution,width,heightandmusic_length_msare rejected. For a larger video setupscale_factor;2.25turns a 16:9 clip into 1080p. - Send every field at the top level of the JSON body, with the text in
prompt;parameters,contentandtextare rejected. - To animate an image, use the Image to Video operation;
image_url,image_urlsandimageare rejected here. - Use the JSON types shown:
num_inference_stepsis a whole number (10, not"10"), andgenerate_audioandenable_prompt_expansionaretrueorfalse, not strings. - When you leave a field out, the defaults apply: 10 steps, no upscaling (480p),
16:9and a synchronized audio track. - Only
upscale_factorandseedacceptnull. Omit the other optional fields you do not use — do not send them asnull. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_urlandwebhook_modein the JSON body are rejected.
Length, Resolution and Upscaling
Every request renders one clip of about 5 seconds at 480p. There is no length or resolution parameter: to get a larger video, set upscale_factor, and the clip is upscaled with Kandinsky 6 video super-resolution before it is returned.
| upscale_factor | Output size | A 16:9 clip comes out at |
|---|---|---|
Left out, or null (the default) | The 480p clip, not upscaled | 480p |
2 | Twice the width and height | 960p |
2.25 | 2.25 times the width and height | 1080p |
4 | Four times the width and height | 1920p |
Each upscale factor costs more than no upscaling, and 4 costs the most; see How billing is measured below.
Aspect ratios
16:9, 9:16, 1:1, 4:3, 3:4. 16:9 is the default; landscape, portrait and square shapes are all available.
Inference steps
num_inference_steps sets the number of denoising steps, from 4 to 16. Lite is tuned for 10, the default. Fewer steps cost less and more steps cost more.
Example: no audio track
{
"prompt": "Time-lapse of clouds rolling over a mountain ridge at sunset, wide shot.",
"generate_audio": false
}Example Request
{
"prompt": "A paper boat drifting down a rain-soaked city street at night, neon reflections rippling on the water, low tracking shot. Rain patters on the pavement and distant traffic hums.",
"aspect_ratio": "16:9",
"num_inference_steps": 10,
"upscale_factor": 2.25
}Example Response
{
"request_id": "kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is out of range or is not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty prompt, or prompt not a string | synchronous 400 |
upscale_factor not 2, 2.25 or 4 (leave it out for no upscaling) | synchronous 400 |
aspect_ratio not one of the allowed values (written exactly as listed) | synchronous 400 |
generate_audio or enable_prompt_expansion not true or false — for example the string "true" | synchronous 400 |
num_inference_steps not a whole number from 4 to 16 — for example 3, 17 or the string "10" | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one video per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, resolution, width, height, music_length_ms (every clip is about 5 seconds at 480p; use upscale_factor for a larger video) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body, the text in prompt) | synchronous 400 |
image_url, image_urls, image (send images to the Image to Video operation) | synchronous 400 |
webhook_url, webhook_mode in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
| A prompt the model refuses, for example under its content policy | status: "ERROR" |
A seed that is not a whole number | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing prompt (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' is required",
"violations": [
"'prompt' is required"
]
}A value that is not allowed (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\" (got \"21:9\")",
"violations": [
"'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\" (got \"21:9\")"
]
}A value out of range (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'num_inference_steps' must be <= 16 (got 20)",
"violations": [
"'num_inference_steps' must be <= 16 (got 20)"
]
}A number sent as a string (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'num_inference_steps' must be integer (got string)",
"violations": [
"'num_inference_steps' must be integer (got string)"
]
}A field this operation does not accept (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be one of: (got 10); 'duration' is not supported: Kandinsky 6.0 Lite always renders a 5-second 480p clip and has no length setting. For a larger video set upscale_factor (2.25 gives 1080p; 2 and 4 are also accepted).",
"violations": [
"'duration' must be one of: (got 10)",
"'duration' is not supported: Kandinsky 6.0 Lite always renders a 5-second 480p clip and has no length setting. For a larger video set upscale_factor (2.25 gives 1080p; 2 and 4 are also accepted)."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the video from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-lite",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — kandinsky-6-lite for this endpoint. |
| output.media_url | array of strings | URL of the video (one MP4 file per request). |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/kandinsky-6-lite/v1/text-to-video. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the video fromoutput.media_url.
How billing is measured
Billing is measured per video, by the number of inference steps and the upscale factor: the amount for this operation is set by num_inference_steps (10 when you leave it out — more steps cost more) and by upscale_factor (no upscaling when you leave it out — each factor costs more than none, and 4 costs the most). Each request generates one clip of about 5 seconds; the prompt, aspect ratio, audio, prompt expansion and seed do not change the amount. The amount is placed as a hold when the request is submitted and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
Kandinsky 6.0 Lite API Pricing
Billed per video. Each request returns one 5-second clip, rendered at 480p and optionally upscaled; the price depends on the operation, on num_inference_steps (4 to 16, default 10; fewer steps cost less) and on upscale_factor (2, 2.25 for 1080p, or 4; no upscale by default). Aspect ratio does not change the price.
| Option | Price (USD) |
|---|---|
| Text to Video, 480p, 10 steps (default) | $0.16 |
| Text to Video, 480p, 4 steps | $0.08 |
| Text to Video, 480p, 16 steps | $0.24 |
| Text to Video, upscaled 2× (upscale_factor 2), 10 steps | $0.28502 |
| Text to Video, upscaled to 1080p (upscale_factor 2.25), 10 steps | $0.31598 |
| Text to Video, upscaled 4× (upscale_factor 4), 10 steps | $0.65 |
| Image to Video, 480p, 10 steps (default) | $0.17 |
| Image to Video, 480p, 4 steps | $0.085 |
| Image to Video, 480p, 16 steps | $0.255 |
| Image to Video, upscaled 2× (upscale_factor 2), 10 steps | $0.29502 |
| Image to Video, upscaled to 1080p (upscale_factor 2.25), 10 steps | $0.34 |
| Image to Video, upscaled 4× (upscale_factor 4), 10 steps | $0.69 |
Kandinsky 6.0 Lite API Documentation
Animate a still image with Kandinsky 6.0 Lite from Kandinsky Lab: send one image and a prompt describing the motion and the sound, and get a clip of about 5 seconds at 480p that starts from your image, with a synchronized audio track unless you turn it off; the clip can be upscaled in the same request, up to four times its width and height. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url.
POST https://gateway.pixazo.ai/kandinsky-6-lite/v1/image-to-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Image to Video - Kandinsky 6.0 Lite
Request Code
POST https://gateway.pixazo.ai/kandinsky-6-lite/v1/image-to-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Slow push-in as the subject turns toward the camera, hair moving in a light breeze, warm natural light. Soft wind and distant birdsong.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"num_inference_steps": 10,
"upscale_factor": 2.25
}import requests
url = "https://gateway.pixazo.ai/kandinsky-6-lite/v1/image-to-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Slow push-in as the subject turns toward the camera, hair moving in a light breeze, warm natural light. Soft wind and distant birdsong.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"num_inference_steps": 10,
"upscale_factor": 2.25
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/kandinsky-6-lite/v1/image-to-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "Slow push-in as the subject turns toward the camera, hair moving in a light breeze, warm natural light. Soft wind and distant birdsong.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"num_inference_steps": 10,
"upscale_factor": 2.25
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-lite/v1/image-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "Slow push-in as the subject turns toward the camera, hair moving in a light breeze, warm natural light. Soft wind and distant birdsong.", "image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg", "num_inference_steps": 10, "upscale_factor": 2.25}'Output
{
"request_id": "kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-lite/v1/image-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"prompt": "Slow push-in as the subject turns toward the camera, hair moving in a light breeze, warm natural light. Soft wind and distant birdsong.", "image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg", "num_inference_steps": 10, "upscale_factor": 2.25}'Callback Payload (success)
{
"request_id": "kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-lite",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Failure callback shape
{
"request_id": "kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "kandinsky-6-lite",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Non-empty text | The motion and the sound you want: what moves, how the camera moves, the mood, and what the audio track should contain. Required here too. |
image_url | Yes | string | — | One image: a publicly reachable https URL or a data URI | The image to animate; it becomes the first frame of the video. Use a JPEG, PNG or WebP file. |
aspect_ratio | No | string | "auto" | 16:9, 9:16, 1:1, 4:3, 3:4, auto | auto uses the supported ratio closest to your image's and center-crops the image to it; or choose a shape yourself. It does not change the amount billed. |
num_inference_steps | No | integer | 10 | 4–16 | Number of denoising steps. Lite is tuned for 10, the default. Fewer steps cost less; more steps cost more. |
upscale_factor | No | number or null | null (no upscaling) | 2, 2.25, 4, null | Upscale the 480p clip with Kandinsky 6 video super-resolution: 2 doubles, 2.25 multiplies by 2.25 (a 16:9 clip becomes 1080p) and 4 quadruples the width and height. Leave it out, or send null, to keep 480p. Each factor costs more than no upscaling. |
generate_audio | No | boolean | true | true, false | Generate a synchronized audio track. It does not change the amount billed. |
enable_prompt_expansion | No | boolean | false | true, false | Rewrite your prompt into a more detailed video and audio description before generating. It does not change the amount billed. |
seed | No | integer | Random | Any whole number | Seed for the random generator; leave it out for a random seed. It does not change the amount billed. |
Good to know
- Each request returns one video.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per video. - Every clip is about 5 seconds at 480p: there is no length or resolution setting, and
duration,seconds,num_frames,frames_per_second,resolution,width,heightandmusic_length_msare rejected. For a larger video setupscale_factor;2.25turns a 16:9 clip into 1080p. - Send every field at the top level of the JSON body, with the text in
prompt;parameters,contentandtextare rejected. - Send exactly one image as
image_url;image_urlsandimageare rejected. - Use the JSON types shown:
num_inference_stepsis a whole number (10, not"10"), andgenerate_audioandenable_prompt_expansionaretrueorfalse, not strings. - When you leave a field out, the defaults apply: 10 steps, no upscaling (480p),
autoaspect ratio and a synchronized audio track. - Only
upscale_factorandseedacceptnull. Omit the other optional fields you do not use — do not send them asnull. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_urlandwebhook_modein the JSON body are rejected.
Length, Resolution and Upscaling
Every request renders one clip of about 5 seconds at 480p. There is no length or resolution parameter: to get a larger video, set upscale_factor, and the clip is upscaled with Kandinsky 6 video super-resolution before it is returned.
| upscale_factor | Output size | A 16:9 clip comes out at |
|---|---|---|
Left out, or null (the default) | The 480p clip, not upscaled | 480p |
2 | Twice the width and height | 960p |
2.25 | 2.25 times the width and height | 1080p |
4 | Four times the width and height | 1920p |
Each upscale factor costs more than no upscaling, and 4 costs the most; see How billing is measured below.
Shape
With the default aspect_ratio of auto, the supported ratio closest to your image's is used and the image is center-cropped to it. Set 16:9, 9:16, 1:1, 4:3 or 3:4 to choose the shape yourself.
Inference steps
num_inference_steps sets the number of denoising steps, from 4 to 16. Lite is tuned for 10, the default. Fewer steps cost less and more steps cost more.
Source Image
- Send exactly one image in
image_url: a publicly reachablehttpsURL, or a data URI such asdata:image/png;base64,.... A list of images is rejected. - Use a JPEG, PNG or WebP file. The image is downloaded when you submit: a URL that cannot be downloaded, or that returns a web page or an empty file instead of an image, is refused at once with a
400. - The image becomes the first frame of the video. With the default
aspect_ratioofauto, the supported ratio closest to your image's is used and the image is center-cropped to it; set a ratio to choose the shape yourself. - Describe the motion and the sound in
prompt.
Example: send the image as a data URI, in portrait
{
"prompt": "Slow push-in as the subject turns toward the light. Soft room tone.",
"image_url": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...",
"aspect_ratio": "9:16"
}Example Request
{
"prompt": "Slow push-in as the subject turns toward the camera, hair moving in a light breeze, warm natural light. Soft wind and distant birdsong.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"num_inference_steps": 10,
"upscale_factor": 2.25
}Example Response
{
"request_id": "kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is out of range or is not one of the allowed values, or a field this operation does not accept was sent, or the image could not be downloaded. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. An image that cannot be downloaded is also refused at submit with a 400, and its hold is released at once. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty prompt, or prompt not a string | synchronous 400 |
Missing or empty image_url, or image_url sent as anything other than a single string | synchronous 400 |
An image_url that cannot be downloaded when you submit, or that returns a web page or an empty file instead of an image (the hold is released at once) | synchronous 400 |
upscale_factor not 2, 2.25 or 4 (leave it out for no upscaling) | synchronous 400 |
aspect_ratio not one of the allowed values (written exactly as listed) | synchronous 400 |
generate_audio or enable_prompt_expansion not true or false — for example the string "true" | synchronous 400 |
num_inference_steps not a whole number from 4 to 16 — for example 3, 17 or the string "10" | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one video per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, resolution, width, height, music_length_ms (every clip is about 5 seconds at 480p; use upscale_factor for a larger video) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body, the text in prompt) | synchronous 400 |
image_urls, image (send exactly one image, as image_url) | synchronous 400 |
webhook_url, webhook_mode in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
| An image the model cannot use, for example a file that is not an image | status: "ERROR" |
| A prompt the model refuses, for example under its content policy | status: "ERROR" |
A seed that is not a whole number | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing prompt (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' is required",
"violations": [
"'prompt' is required"
]
}A value that is not allowed (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\", \"auto\" (got \"21:9\")",
"violations": [
"'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\", \"auto\" (got \"21:9\")"
]
}A value out of range (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'num_inference_steps' must be <= 16 (got 20)",
"violations": [
"'num_inference_steps' must be <= 16 (got 20)"
]
}A number sent as a string (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'num_inference_steps' must be integer (got string)",
"violations": [
"'num_inference_steps' must be integer (got string)"
]
}A field this operation does not accept (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be one of: (got 10); 'duration' is not supported: Kandinsky 6.0 Lite always renders a 5-second 480p clip and has no length setting. For a larger video set upscale_factor (2.25 gives 1080p; 2 and 4 are also accepted).",
"violations": [
"'duration' must be one of: (got 10)",
"'duration' is not supported: Kandinsky 6.0 Lite always renders a 5-second 480p clip and has no length setting. For a larger video set upscale_factor (2.25 gives 1080p; 2 and 4 are also accepted)."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the video from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "kandinsky-6-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-lite",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — kandinsky-6-lite for this endpoint. |
| output.media_url | array of strings | URL of the video (one MP4 file per request). |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/kandinsky-6-lite/v1/image-to-video. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the video fromoutput.media_url.
How billing is measured
Billing is measured per video, by the number of inference steps and the upscale factor: the amount for this operation is set by num_inference_steps (10 when you leave it out — more steps cost more) and by upscale_factor (no upscaling when you leave it out — each factor costs more than none, and 4 costs the most). Each request generates one clip of about 5 seconds; the prompt, aspect ratio, audio, prompt expansion and seed do not change the amount. The amount is placed as a hold when the request is submitted and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
Kandinsky 6.0 Lite API Pricing
Billed per video. Each request returns one 5-second clip, rendered at 480p and optionally upscaled; the price depends on the operation, on num_inference_steps (4 to 16, default 10; fewer steps cost less) and on upscale_factor (2, 2.25 for 1080p, or 4; no upscale by default). Aspect ratio does not change the price.
| Option | Price (USD) |
|---|---|
| Text to Video, 480p, 10 steps (default) | $0.16 |
| Text to Video, 480p, 4 steps | $0.08 |
| Text to Video, 480p, 16 steps | $0.24 |
| Text to Video, upscaled 2× (upscale_factor 2), 10 steps | $0.28502 |
| Text to Video, upscaled to 1080p (upscale_factor 2.25), 10 steps | $0.31598 |
| Text to Video, upscaled 4× (upscale_factor 4), 10 steps | $0.65 |
| Image to Video, 480p, 10 steps (default) | $0.17 |
| Image to Video, 480p, 4 steps | $0.085 |
| Image to Video, 480p, 16 steps | $0.255 |
| Image to Video, upscaled 2× (upscale_factor 2), 10 steps | $0.29502 |
| Image to Video, upscaled to 1080p (upscale_factor 2.25), 10 steps | $0.34 |
| Image to Video, upscaled 4× (upscale_factor 4), 10 steps | $0.69 |
Kandinsky 6.0 Pro API Documentation
Generate a video from a text prompt with Kandinsky 6.0 Pro, the flagship text-to-video model from Kandinsky Lab: each request returns one clip of about 5 seconds at 480p, with a synchronized audio track unless you turn it off, and can upscale it in the same request: to 1080p for a 16:9 clip, or up to four times its width and height. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url.
POST https://gateway.pixazo.ai/kandinsky-6-pro/v1/text-to-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Video - Kandinsky 6.0 Pro
Request Code
POST https://gateway.pixazo.ai/kandinsky-6-pro/v1/text-to-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A red fox trotting through fresh snow at dawn in a pine forest, its breath visible in the cold air, slow tracking shot. Snow crunches under its paws.",
"negative_prompt": "blurry, low quality, distorted faces, text, watermark",
"aspect_ratio": "16:9",
"num_inference_steps": 50,
"upscale_factor": 2.25
}import requests
url = "https://gateway.pixazo.ai/kandinsky-6-pro/v1/text-to-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A red fox trotting through fresh snow at dawn in a pine forest, its breath visible in the cold air, slow tracking shot. Snow crunches under its paws.",
"negative_prompt": "blurry, low quality, distorted faces, text, watermark",
"aspect_ratio": "16:9",
"num_inference_steps": 50,
"upscale_factor": 2.25
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/kandinsky-6-pro/v1/text-to-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "A red fox trotting through fresh snow at dawn in a pine forest, its breath visible in the cold air, slow tracking shot. Snow crunches under its paws.",
"negative_prompt": "blurry, low quality, distorted faces, text, watermark",
"aspect_ratio": "16:9",
"num_inference_steps": 50,
"upscale_factor": 2.25
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-pro/v1/text-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "A red fox trotting through fresh snow at dawn in a pine forest, its breath visible in the cold air, slow tracking shot. Snow crunches under its paws.", "negative_prompt": "blurry, low quality, distorted faces, text, watermark", "aspect_ratio": "16:9", "num_inference_steps": 50, "upscale_factor": 2.25}'Output
{
"request_id": "kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-pro/v1/text-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"prompt": "A red fox trotting through fresh snow at dawn in a pine forest, its breath visible in the cold air, slow tracking shot. Snow crunches under its paws.", "negative_prompt": "blurry, low quality, distorted faces, text, watermark", "aspect_ratio": "16:9", "num_inference_steps": 50, "upscale_factor": 2.25}'Callback Payload (success)
{
"request_id": "kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-pro",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Failure callback shape
{
"request_id": "kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "kandinsky-6-pro",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Non-empty text | What the video shows and how it sounds: subject, action, setting, camera movement and lighting, plus any sound effects, music or speech for the audio track. |
negative_prompt | No | string | Built-in | Text | What to avoid in the video. Leave it out to use the model's built-in negative prompt. It does not change the amount billed. |
aspect_ratio | No | string | "16:9" | 16:9, 9:16, 1:1, 4:3, 3:4 | Frame shape of the video. It does not change the amount billed. |
num_inference_steps | No | integer | 50 | 8–50 | Number of denoising steps. 50, the default, is the most; fewer steps cost less. |
upscale_factor | No | number or null | null (no upscaling) | 2, 2.25, 4, null | Upscale the 480p clip with Kandinsky 6 video super-resolution: 2 doubles, 2.25 multiplies by 2.25 (a 16:9 clip becomes 1080p) and 4 quadruples the width and height. Leave it out, or send null, to keep 480p. Each factor costs more than no upscaling. |
guidance_scale | No | number | 5 | 1–10 | Classifier-free guidance strength: how strongly the prompt steers the video. It does not change the amount billed. |
generate_audio | No | boolean | true | true, false | Generate a synchronized audio track. It does not change the amount billed. |
enable_prompt_expansion | No | boolean | false | true, false | Rewrite your prompt into a more detailed video and audio description before generating. It does not change the amount billed. |
seed | No | integer | Random | Any whole number | Seed for the random generator; leave it out for a random seed. It does not change the amount billed. |
Good to know
- Each request returns one video.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per video. - Every clip is about 5 seconds at 480p: there is no length or resolution setting, and
duration,seconds,num_frames,frames_per_second,resolution,width,heightandmusic_length_msare rejected. For a larger video setupscale_factor;2.25turns a 16:9 clip into 1080p. - Send every field at the top level of the JSON body, with the text in
prompt;parameters,contentandtextare rejected. - To animate an image, use the Image to Video operation;
image_url,image_urlsandimageare rejected here. - Use the JSON types shown:
num_inference_stepsis a whole number (50, not"50"), andgenerate_audioandenable_prompt_expansionaretrueorfalse, not strings. - When you leave a field out, the defaults apply: 50 steps, no upscaling (480p),
16:9and a synchronized audio track. - Only
upscale_factor,seedandnegative_promptacceptnull. Omit the other optional fields you do not use — do not send them asnull. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_urlandwebhook_modein the JSON body are rejected.
Length, Resolution and Upscaling
Every request renders one clip of about 5 seconds at 480p. There is no length or resolution parameter: to get a larger video, set upscale_factor, and the clip is upscaled with Kandinsky 6 video super-resolution before it is returned.
| upscale_factor | Output size | A 16:9 clip comes out at |
|---|---|---|
Left out, or null (the default) | The 480p clip, not upscaled | 480p |
2 | Twice the width and height | 960p |
2.25 | 2.25 times the width and height | 1080p |
4 | Four times the width and height | 1920p |
Each upscale factor costs more than no upscaling, and 4 costs the most; see How billing is measured below.
Aspect ratios
16:9, 9:16, 1:1, 4:3, 3:4. 16:9 is the default; landscape, portrait and square shapes are all available.
Inference steps
num_inference_steps sets the number of denoising steps, from 8 to 50. 50 is the default and the most; fewer steps cost less.
Example: no audio track
{
"prompt": "Time-lapse of clouds rolling over a mountain ridge at sunset, wide shot.",
"generate_audio": false
}Example Request
{
"prompt": "A red fox trotting through fresh snow at dawn in a pine forest, its breath visible in the cold air, slow tracking shot. Snow crunches under its paws.",
"negative_prompt": "blurry, low quality, distorted faces, text, watermark",
"aspect_ratio": "16:9",
"num_inference_steps": 50,
"upscale_factor": 2.25
}Example Response
{
"request_id": "kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is out of range or is not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty prompt, or prompt not a string | synchronous 400 |
upscale_factor not 2, 2.25 or 4 (leave it out for no upscaling) | synchronous 400 |
aspect_ratio not one of the allowed values (written exactly as listed) | synchronous 400 |
generate_audio or enable_prompt_expansion not true or false — for example the string "true" | synchronous 400 |
num_inference_steps not a whole number from 8 to 50 — for example 7, 51 or the string "50" | synchronous 400 |
guidance_scale not a number from 1 to 10 — for example the string "5" | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one video per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, resolution, width, height, music_length_ms (every clip is about 5 seconds at 480p; use upscale_factor for a larger video) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body, the text in prompt) | synchronous 400 |
image_url, image_urls, image (send images to the Image to Video operation) | synchronous 400 |
webhook_url, webhook_mode in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
| A prompt the model refuses, for example under its content policy | status: "ERROR" |
A seed that is not a whole number | status: "ERROR" |
A negative_prompt that is not text | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing prompt (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' is required",
"violations": [
"'prompt' is required"
]
}A value that is not allowed (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\" (got \"21:9\")",
"violations": [
"'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\" (got \"21:9\")"
]
}A value out of range (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'num_inference_steps' must be <= 50 (got 54)",
"violations": [
"'num_inference_steps' must be <= 50 (got 54)"
]
}A number sent as a string (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'num_inference_steps' must be integer (got string)",
"violations": [
"'num_inference_steps' must be integer (got string)"
]
}A field this operation does not accept (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be one of: (got 10); 'duration' is not supported: Kandinsky 6.0 Pro always renders a 5-second 480p clip and has no length setting. For a larger video set upscale_factor (2.25 gives 1080p; 2 and 4 are also accepted).",
"violations": [
"'duration' must be one of: (got 10)",
"'duration' is not supported: Kandinsky 6.0 Pro always renders a 5-second 480p clip and has no length setting. For a larger video set upscale_factor (2.25 gives 1080p; 2 and 4 are also accepted)."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the video from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-pro",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — kandinsky-6-pro for this endpoint. |
| output.media_url | array of strings | URL of the video (one MP4 file per request). |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/kandinsky-6-pro/v1/text-to-video. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the video fromoutput.media_url.
How billing is measured
Billing is measured per video, by the number of inference steps and the upscale factor: the amount for this operation is set by num_inference_steps (50 when you leave it out — more steps cost more) and by upscale_factor (no upscaling when you leave it out — each factor costs more than none, and 4 costs the most). Each request generates one clip of about 5 seconds; the prompt, aspect ratio, audio, prompt expansion, guidance scale, negative prompt and seed do not change the amount. The amount is placed as a hold when the request is submitted and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
Kandinsky 6.0 Pro API Pricing
Billed per video. Each request returns one 5-second clip, rendered at 480p and optionally upscaled; the price depends on the operation, on num_inference_steps (8 to 50, default 50; fewer steps cost less) and on upscale_factor (2, 2.25 for 1080p, or 4; no upscale by default). Aspect ratio does not change the price.
| Option | Price (USD) |
|---|---|
| Text to Video, 480p, 50 steps (default) | $1.35 |
| Text to Video, 480p, 8 steps | $0.23706 |
| Text to Video, upscaled to 1080p (upscale_factor 2.25), 50 steps | $1.53 |
| Text to Video, upscaled 4× (upscale_factor 4), 50 steps | $1.91 |
| Image to Video, 480p, 50 steps (default) | $1.40 |
| Image to Video, 480p, 8 steps | $0.24584 |
| Image to Video, upscaled to 1080p (upscale_factor 2.25), 50 steps | $1.57556 |
| Image to Video, upscaled 4× (upscale_factor 4), 50 steps | $1.98 |
Kandinsky 6.0 Pro API Documentation
Animate a still image with Kandinsky 6.0 Pro from Kandinsky Lab: send one image and a prompt describing the motion and the sound, and get a clip of about 5 seconds at 480p that starts from your image, with a synchronized audio track unless you turn it off; the clip can be upscaled in the same request, up to four times its width and height. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url.
POST https://gateway.pixazo.ai/kandinsky-6-pro/v1/image-to-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Image to Video - Kandinsky 6.0 Pro
Request Code
POST https://gateway.pixazo.ai/kandinsky-6-pro/v1/image-to-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "The subject smiles and looks out of frame as the camera slowly orbits, golden hour light, shallow depth of field. Gentle ambient street sounds.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"num_inference_steps": 50,
"upscale_factor": 2.25
}import requests
url = "https://gateway.pixazo.ai/kandinsky-6-pro/v1/image-to-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "The subject smiles and looks out of frame as the camera slowly orbits, golden hour light, shallow depth of field. Gentle ambient street sounds.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"num_inference_steps": 50,
"upscale_factor": 2.25
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/kandinsky-6-pro/v1/image-to-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "The subject smiles and looks out of frame as the camera slowly orbits, golden hour light, shallow depth of field. Gentle ambient street sounds.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"num_inference_steps": 50,
"upscale_factor": 2.25
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-pro/v1/image-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "The subject smiles and looks out of frame as the camera slowly orbits, golden hour light, shallow depth of field. Gentle ambient street sounds.", "image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg", "num_inference_steps": 50, "upscale_factor": 2.25}'Output
{
"request_id": "kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-pro/v1/image-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"prompt": "The subject smiles and looks out of frame as the camera slowly orbits, golden hour light, shallow depth of field. Gentle ambient street sounds.", "image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg", "num_inference_steps": 50, "upscale_factor": 2.25}'Callback Payload (success)
{
"request_id": "kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-pro",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Failure callback shape
{
"request_id": "kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "kandinsky-6-pro",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Non-empty text | The motion and the sound you want: what moves, how the camera moves, the mood, and what the audio track should contain. Required here too. |
image_url | Yes | string | — | One image: a publicly reachable https URL or a data URI | The image to animate; it becomes the first frame of the video. Use a JPEG, PNG or WebP file. |
negative_prompt | No | string | Built-in | Text | What to avoid in the video. Leave it out to use the model's built-in negative prompt. It does not change the amount billed. |
aspect_ratio | No | string | "auto" | 16:9, 9:16, 1:1, 4:3, 3:4, auto | auto uses the supported ratio closest to your image's and center-crops the image to it; or choose a shape yourself. It does not change the amount billed. |
num_inference_steps | No | integer | 50 | 8–50 | Number of denoising steps. 50, the default, is the most; fewer steps cost less. |
upscale_factor | No | number or null | null (no upscaling) | 2, 2.25, 4, null | Upscale the 480p clip with Kandinsky 6 video super-resolution: 2 doubles, 2.25 multiplies by 2.25 (a 16:9 clip becomes 1080p) and 4 quadruples the width and height. Leave it out, or send null, to keep 480p. Each factor costs more than no upscaling. |
guidance_scale | No | number | 5 | 1–10 | Classifier-free guidance strength: how strongly the prompt steers the video. It does not change the amount billed. |
generate_audio | No | boolean | true | true, false | Generate a synchronized audio track. It does not change the amount billed. |
enable_prompt_expansion | No | boolean | false | true, false | Rewrite your prompt into a more detailed video and audio description before generating. It does not change the amount billed. |
seed | No | integer | Random | Any whole number | Seed for the random generator; leave it out for a random seed. It does not change the amount billed. |
Good to know
- Each request returns one video.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per video. - Every clip is about 5 seconds at 480p: there is no length or resolution setting, and
duration,seconds,num_frames,frames_per_second,resolution,width,heightandmusic_length_msare rejected. For a larger video setupscale_factor;2.25turns a 16:9 clip into 1080p. - Send every field at the top level of the JSON body, with the text in
prompt;parameters,contentandtextare rejected. - Send exactly one image as
image_url;image_urlsandimageare rejected. - Use the JSON types shown:
num_inference_stepsis a whole number (50, not"50"), andgenerate_audioandenable_prompt_expansionaretrueorfalse, not strings. - When you leave a field out, the defaults apply: 50 steps, no upscaling (480p),
autoaspect ratio and a synchronized audio track. - Only
upscale_factor,seedandnegative_promptacceptnull. Omit the other optional fields you do not use — do not send them asnull. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_urlandwebhook_modein the JSON body are rejected.
Length, Resolution and Upscaling
Every request renders one clip of about 5 seconds at 480p. There is no length or resolution parameter: to get a larger video, set upscale_factor, and the clip is upscaled with Kandinsky 6 video super-resolution before it is returned.
| upscale_factor | Output size | A 16:9 clip comes out at |
|---|---|---|
Left out, or null (the default) | The 480p clip, not upscaled | 480p |
2 | Twice the width and height | 960p |
2.25 | 2.25 times the width and height | 1080p |
4 | Four times the width and height | 1920p |
Each upscale factor costs more than no upscaling, and 4 costs the most; see How billing is measured below.
Shape
With the default aspect_ratio of auto, the supported ratio closest to your image's is used and the image is center-cropped to it. Set 16:9, 9:16, 1:1, 4:3 or 3:4 to choose the shape yourself.
Inference steps
num_inference_steps sets the number of denoising steps, from 8 to 50. 50 is the default and the most; fewer steps cost less.
Source Image
- Send exactly one image in
image_url: a publicly reachablehttpsURL, or a data URI such asdata:image/png;base64,.... A list of images is rejected. - Use a JPEG, PNG or WebP file. The image is downloaded when you submit: a URL that cannot be downloaded, or that returns a web page or an empty file instead of an image, is refused at once with a
400. - The image becomes the first frame of the video. With the default
aspect_ratioofauto, the supported ratio closest to your image's is used and the image is center-cropped to it; set a ratio to choose the shape yourself. - Describe the motion and the sound in
prompt.
Example: send the image as a data URI, in portrait
{
"prompt": "Slow push-in as the subject turns toward the light. Soft room tone.",
"image_url": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...",
"aspect_ratio": "9:16"
}Example Request
{
"prompt": "The subject smiles and looks out of frame as the camera slowly orbits, golden hour light, shallow depth of field. Gentle ambient street sounds.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"num_inference_steps": 50,
"upscale_factor": 2.25
}Example Response
{
"request_id": "kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is out of range or is not one of the allowed values, or a field this operation does not accept was sent, or the image could not be downloaded. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. An image that cannot be downloaded is also refused at submit with a 400, and its hold is released at once. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty prompt, or prompt not a string | synchronous 400 |
Missing or empty image_url, or image_url sent as anything other than a single string | synchronous 400 |
An image_url that cannot be downloaded when you submit, or that returns a web page or an empty file instead of an image (the hold is released at once) | synchronous 400 |
upscale_factor not 2, 2.25 or 4 (leave it out for no upscaling) | synchronous 400 |
aspect_ratio not one of the allowed values (written exactly as listed) | synchronous 400 |
generate_audio or enable_prompt_expansion not true or false — for example the string "true" | synchronous 400 |
num_inference_steps not a whole number from 8 to 50 — for example 7, 51 or the string "50" | synchronous 400 |
guidance_scale not a number from 1 to 10 — for example the string "5" | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one video per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, resolution, width, height, music_length_ms (every clip is about 5 seconds at 480p; use upscale_factor for a larger video) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body, the text in prompt) | synchronous 400 |
image_urls, image (send exactly one image, as image_url) | synchronous 400 |
webhook_url, webhook_mode in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
| An image the model cannot use, for example a file that is not an image | status: "ERROR" |
| A prompt the model refuses, for example under its content policy | status: "ERROR" |
A seed that is not a whole number | status: "ERROR" |
A negative_prompt that is not text | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing prompt (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' is required",
"violations": [
"'prompt' is required"
]
}A value that is not allowed (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\", \"auto\" (got \"21:9\")",
"violations": [
"'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\", \"auto\" (got \"21:9\")"
]
}A value out of range (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'num_inference_steps' must be <= 50 (got 54)",
"violations": [
"'num_inference_steps' must be <= 50 (got 54)"
]
}A number sent as a string (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'num_inference_steps' must be integer (got string)",
"violations": [
"'num_inference_steps' must be integer (got string)"
]
}A field this operation does not accept (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be one of: (got 10); 'duration' is not supported: Kandinsky 6.0 Pro always renders a 5-second 480p clip and has no length setting. For a larger video set upscale_factor (2.25 gives 1080p; 2 and 4 are also accepted).",
"violations": [
"'duration' must be one of: (got 10)",
"'duration' is not supported: Kandinsky 6.0 Pro always renders a 5-second 480p clip and has no length setting. For a larger video set upscale_factor (2.25 gives 1080p; 2 and 4 are also accepted)."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the video from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "kandinsky-6-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-pro",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — kandinsky-6-pro for this endpoint. |
| output.media_url | array of strings | URL of the video (one MP4 file per request). |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/kandinsky-6-pro/v1/image-to-video. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the video fromoutput.media_url.
How billing is measured
Billing is measured per video, by the number of inference steps and the upscale factor: the amount for this operation is set by num_inference_steps (50 when you leave it out — more steps cost more) and by upscale_factor (no upscaling when you leave it out — each factor costs more than none, and 4 costs the most). Each request generates one clip of about 5 seconds; the prompt, aspect ratio, audio, prompt expansion, guidance scale, negative prompt and seed do not change the amount. The amount is placed as a hold when the request is submitted and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
Kandinsky 6.0 Pro API Pricing
Billed per video. Each request returns one 5-second clip, rendered at 480p and optionally upscaled; the price depends on the operation, on num_inference_steps (8 to 50, default 50; fewer steps cost less) and on upscale_factor (2, 2.25 for 1080p, or 4; no upscale by default). Aspect ratio does not change the price.
| Option | Price (USD) |
|---|---|
| Text to Video, 480p, 50 steps (default) | $1.35 |
| Text to Video, 480p, 8 steps | $0.23706 |
| Text to Video, upscaled to 1080p (upscale_factor 2.25), 50 steps | $1.53 |
| Text to Video, upscaled 4× (upscale_factor 4), 50 steps | $1.91 |
| Image to Video, 480p, 50 steps (default) | $1.40 |
| Image to Video, 480p, 8 steps | $0.24584 |
| Image to Video, upscaled to 1080p (upscale_factor 2.25), 50 steps | $1.57556 |
| Image to Video, upscaled 4× (upscale_factor 4), 50 steps | $1.98 |
Kandinsky 6.0 VSR API Documentation
Upscale a video with Kandinsky 6.0 VSR, the video super-resolution model from Kandinsky Lab: send one MP4 or MOV video and get it back at 2, 2.25 or 4 times its width and height — 2.25 turns 480p into 1080p. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url.
POST https://gateway.pixazo.ai/kandinsky-6-vsr/v1/upscale-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Video to Video (Upscale) - Kandinsky 6.0 VSR
Request Code
POST https://gateway.pixazo.ai/kandinsky-6-vsr/v1/upscale-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4",
"upscale_factor": 2.25
}import requests
url = "https://gateway.pixazo.ai/kandinsky-6-vsr/v1/upscale-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4",
"upscale_factor": 2.25
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/kandinsky-6-vsr/v1/upscale-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4",
"upscale_factor": 2.25
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-vsr/v1/upscale-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4", "upscale_factor": 2.25}'Output
{
"request_id": "kandinsky-6-vsr_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-vsr_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-vsr/v1/upscale-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4", "upscale_factor": 2.25}'Callback Payload (success)
{
"request_id": "kandinsky-6-vsr_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-vsr",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Failure callback shape
{
"request_id": "kandinsky-6-vsr_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "kandinsky-6-vsr",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
video_url | Yes | string | — | One MP4 or MOV video: a publicly reachable https URL | The video to upscale. It is resampled to 24 frames per second and capped at 121 frames, about 5 seconds. Its frame size and length are read when you submit and set the amount billed. |
upscale_factor | No | number | 2.25 | 2, 2.25, 4 | How much to enlarge the width and height: 2.25 turns 480p into 1080p; 2 doubles and 4 quadruples them. The amount billed grows with the output size. |
seed | No | integer | Random | Any whole number | Seed for the random generator; leave it out for a random seed. It does not change the amount billed. |
Good to know
- Each request upscales one video.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per video. - Send the video as
video_url: a publicly reachablehttpslink to an MP4 or MOV file;image_urlandimage_urlsare rejected. - There is no prompt and no step setting:
promptandnum_inference_stepsare rejected. - The output size comes only from your video and
upscale_factor, and the length from your video:duration,seconds,num_frames,frames_per_second,resolution,width,heightandmusic_length_msare rejected. - Send every field at the top level of the JSON body;
parameters,contentandtextare rejected. - When you leave
upscale_factorout,2.25applies. - Only
seedacceptsnull. Omit the other optional fields you do not use — do not send them asnull. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_urlandwebhook_modein the JSON body are rejected.
Input Video
- Send exactly one video in
video_url: a publicly reachablehttpslink to an MP4 or MOV file. A list of videos is rejected. - The frame size and length are read from the file header when you submit, because they set the amount billed. Send a direct, publicly readable link to an MP4 or MOV file: a web page, a link that needs a login, cannot be downloaded or answers too slowly, or a WebM, MKV, GIF or other file that is not MP4 or MOV is refused at once with a
400, and nothing is charged. - Clips are resampled to 24 frames per second and capped at 121 frames, about 5 seconds; send clips of 5 seconds or less.
- The output is your video's width and height multiplied by
upscale_factor; see Upscale Factors below.
Example: upscale by 4
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4",
"upscale_factor": 4
}Upscale Factors
The output is your video's width and height multiplied by upscale_factor.
| upscale_factor | Output size | A 480p video becomes |
|---|---|---|
2 | Twice the width and height | 960p |
2.25 (the default) | 2.25 times the width and height | 1080p |
4 | Four times the width and height | 1920p |
Because billing counts output pixels, the amount grows with the square of the factor: for the same video, 4 bills four times the pixels of 2.
Example Request
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4",
"upscale_factor": 2.25
}Example Response
{
"request_id": "kandinsky-6-vsr_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-vsr_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — video_url is missing or cannot be read as an MP4 or MOV file, a value is not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. A video whose frame size and length cannot be read is also refused at submit with a 400, before any hold is placed. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty video_url, or video_url sent as anything other than a single string | synchronous 400 |
A video_url whose frame size and length cannot be read when you submit — a file that is not MP4 or MOV, a web page, or a link that needs a login, cannot be downloaded or answers too slowly (nothing is charged) | synchronous 400 |
upscale_factor not 2, 2.25 or 4 | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one video per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, resolution, width, height, music_length_ms (the size comes from your video and upscale_factor, the length from your video) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body) | synchronous 400 |
image_url, image_urls (this operation takes a video, as video_url) | synchronous 400 |
prompt (the upscaler takes no prompt) | synchronous 400 |
num_inference_steps (the number of steps is fixed on this operation) | synchronous 400 |
webhook_url, webhook_mode in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
| A video the model cannot process, for example a file with no video track or one that cannot be decoded | status: "ERROR" |
A seed that is not a whole number | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing video_url (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'video_url' is required",
"violations": [
"'video_url' is required"
]
}A value that is not allowed (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'upscale_factor' must be one of: 2, 2.25, 4 (got 3)",
"violations": [
"'upscale_factor' must be one of: 2, 2.25, 4 (got 3)"
]
}A list instead of one URL (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'video_url' must be string (got array)",
"violations": [
"'video_url' must be string (got array)"
]
}A field this operation does not accept (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' must be one of: (got \"Sharpen the details\"); 'prompt' is not accepted: Kandinsky 6.0 VSR upscales the video in 'video_url' and takes no prompt.",
"violations": [
"'prompt' must be one of: (got \"Sharpen the details\")",
"'prompt' is not accepted: Kandinsky 6.0 VSR upscales the video in 'video_url' and takes no prompt."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the upscaled video from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-vsr_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "kandinsky-6-vsr_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-vsr",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — kandinsky-6-vsr for this endpoint. |
| output.media_url | array of strings | URL of the upscaled video (one MP4 file per request). |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/kandinsky-6-vsr/v1/upscale-video. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the upscaled video fromoutput.media_url.
How billing is measured
Billing is measured per output megapixel per frame: the output width times the output height times the number of frames, counted in millions of pixels and rounded up to a whole number. The output size is your video's width and height multiplied by upscale_factor (2.25 when you leave it out), so the amount grows with your video's size and with the square of the factor. The frame count is your video's length at 24 frames per second, rounded up to a whole frame, at most 121 frames (about 5 seconds). Both are read from the video file when you submit, and the amount is placed as a hold then. When the request completes, the charge is settled against the delivered video and can only go down; a failed request is not billed — its hold is released in full.
The current rate is shown in the pricing panel on this page.
Kandinsky 6.0 VSR API Pricing
Billed per megapixel of output, per frame: the output width × height (your clip's size times upscale_factor: 2, 2.25 by default, or 4) times the frame count (your clip's length at 24 frames per second, at most 121 frames, about 5 seconds); the total is rounded up to a whole megapixel. The size and length are read from the MP4 or MOV header when you submit.
| Usage | Price (USD) |
|---|---|
| Per megapixel of output, per frame | $0.00036 |
| Example: 848×480 clip, 121 frames (about 5 s), upscaled 2.25× to 1908×1080 (billed as 1920×1088) | $0.09108 |
| Example: 848×480 clip, 121 frames (about 5 s), upscaled 4× to 3392×1920 | $0.28404 |
Kandinsky 6.0 VSR Lite API Documentation
Upscale a video with Kandinsky 6.0 VSR Lite, the lightweight version of Kandinsky 6.0 VSR, the video super-resolution model from Kandinsky Lab: send one MP4 or MOV video and get it back at 2, 2.25 or 4 times its width and height — 2.25 turns 480p into 1080p. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url.
POST https://gateway.pixazo.ai/kandinsky-6-vsr-lite/v1/upscale-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Video to Video (Upscale) - Kandinsky 6.0 VSR Lite
Request Code
POST https://gateway.pixazo.ai/kandinsky-6-vsr-lite/v1/upscale-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4",
"upscale_factor": 2.25
}import requests
url = "https://gateway.pixazo.ai/kandinsky-6-vsr-lite/v1/upscale-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4",
"upscale_factor": 2.25
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/kandinsky-6-vsr-lite/v1/upscale-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4",
"upscale_factor": 2.25
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-vsr-lite/v1/upscale-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4", "upscale_factor": 2.25}'Output
{
"request_id": "kandinsky-6-vsr-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-vsr-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/kandinsky-6-vsr-lite/v1/upscale-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4", "upscale_factor": 2.25}'Callback Payload (success)
{
"request_id": "kandinsky-6-vsr-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-vsr-lite",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Failure callback shape
{
"request_id": "kandinsky-6-vsr-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "kandinsky-6-vsr-lite",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
video_url | Yes | string | — | One MP4 or MOV video: a publicly reachable https URL | The video to upscale. It is resampled to 24 frames per second and capped at 121 frames, about 5 seconds. Its frame size and length are read when you submit and set the amount billed. |
upscale_factor | No | number | 2.25 | 2, 2.25, 4 | How much to enlarge the width and height: 2.25 turns 480p into 1080p; 2 doubles and 4 quadruples them. The amount billed grows with the output size. |
seed | No | integer | Random | Any whole number | Seed for the random generator; leave it out for a random seed. It does not change the amount billed. |
Good to know
- Each request upscales one video.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per video. - Send the video as
video_url: a publicly reachablehttpslink to an MP4 or MOV file;image_urlandimage_urlsare rejected. - There is no prompt and no step setting:
promptandnum_inference_stepsare rejected. - The output size comes only from your video and
upscale_factor, and the length from your video:duration,seconds,num_frames,frames_per_second,resolution,width,heightandmusic_length_msare rejected. - Send every field at the top level of the JSON body;
parameters,contentandtextare rejected. - When you leave
upscale_factorout,2.25applies. - Only
seedacceptsnull. Omit the other optional fields you do not use — do not send them asnull. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_urlandwebhook_modein the JSON body are rejected.
Input Video
- Send exactly one video in
video_url: a publicly reachablehttpslink to an MP4 or MOV file. A list of videos is rejected. - The frame size and length are read from the file header when you submit, because they set the amount billed. Send a direct, publicly readable link to an MP4 or MOV file: a web page, a link that needs a login, cannot be downloaded or answers too slowly, or a WebM, MKV, GIF or other file that is not MP4 or MOV is refused at once with a
400, and nothing is charged. - Clips are resampled to 24 frames per second and capped at 121 frames, about 5 seconds; send clips of 5 seconds or less.
- The output is your video's width and height multiplied by
upscale_factor; see Upscale Factors below.
Example: upscale by 4
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4",
"upscale_factor": 4
}Upscale Factors
The output is your video's width and height multiplied by upscale_factor.
| upscale_factor | Output size | A 480p video becomes |
|---|---|---|
2 | Twice the width and height | 960p |
2.25 (the default) | 2.25 times the width and height | 1080p |
4 | Four times the width and height | 1920p |
Because billing counts output pixels, the amount grows with the square of the factor: for the same video, 4 bills four times the pixels of 2.
Example Request
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-6-pro_01a11b22-ab6f-79b3-3afb-38fe14d2fbb54/output.mp4",
"upscale_factor": 2.25
}Example Response
{
"request_id": "kandinsky-6-vsr-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-vsr-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — video_url is missing or cannot be read as an MP4 or MOV file, a value is not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. A video whose frame size and length cannot be read is also refused at submit with a 400, before any hold is placed. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty video_url, or video_url sent as anything other than a single string | synchronous 400 |
A video_url whose frame size and length cannot be read when you submit — a file that is not MP4 or MOV, a web page, or a link that needs a login, cannot be downloaded or answers too slowly (nothing is charged) | synchronous 400 |
upscale_factor not 2, 2.25 or 4 | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one video per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, resolution, width, height, music_length_ms (the size comes from your video and upscale_factor, the length from your video) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body) | synchronous 400 |
image_url, image_urls (this operation takes a video, as video_url) | synchronous 400 |
prompt (the upscaler takes no prompt) | synchronous 400 |
num_inference_steps (the number of steps is fixed on this operation) | synchronous 400 |
webhook_url, webhook_mode in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
| A video the model cannot process, for example a file with no video track or one that cannot be decoded | status: "ERROR" |
A seed that is not a whole number | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing video_url (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'video_url' is required",
"violations": [
"'video_url' is required"
]
}A value that is not allowed (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'upscale_factor' must be one of: 2, 2.25, 4 (got 3)",
"violations": [
"'upscale_factor' must be one of: 2, 2.25, 4 (got 3)"
]
}A list instead of one URL (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'video_url' must be string (got array)",
"violations": [
"'video_url' must be string (got array)"
]
}A field this operation does not accept (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' must be one of: (got \"Sharpen the details\"); 'prompt' is not accepted: Kandinsky 6.0 VSR Lite upscales the video in 'video_url' and takes no prompt.",
"violations": [
"'prompt' must be one of: (got \"Sharpen the details\")",
"'prompt' is not accepted: Kandinsky 6.0 VSR Lite upscales the video in 'video_url' and takes no prompt."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the upscaled video from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/kandinsky-6-vsr-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "kandinsky-6-vsr-lite_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-6-vsr-lite",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-08T10:04:54.387Z",
"completed_at": "2026-10-08 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — kandinsky-6-vsr-lite for this endpoint. |
| output.media_url | array of strings | URL of the upscaled video (one MP4 file per request). |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/kandinsky-6-vsr-lite/v1/upscale-video. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the upscaled video fromoutput.media_url.
How billing is measured
Billing is measured per output megapixel per frame: the output width times the output height times the number of frames, counted in millions of pixels and rounded up to a whole number. The output size is your video's width and height multiplied by upscale_factor (2.25 when you leave it out), so the amount grows with your video's size and with the square of the factor. The frame count is your video's length at 24 frames per second, rounded up to a whole frame, at most 121 frames (about 5 seconds). Both are read from the video file when you submit, and the amount is placed as a hold then. When the request completes, the charge is settled against the delivered video and can only go down; a failed request is not billed — its hold is released in full.
The current rate is shown in the pricing panel on this page.
Kandinsky 6.0 VSR Lite API Pricing
Billed per megapixel of output, per frame: the output width × height (your clip's size times upscale_factor: 2, 2.25 by default, or 4) times the frame count (your clip's length at 24 frames per second, at most 121 frames, about 5 seconds); the total is rounded up to a whole megapixel. The size and length are read from the MP4 or MOV header when you submit.
| Usage | Price (USD) |
|---|---|
| Per megapixel of output, per frame | $0.0003 |
| Example: 848×480 clip, 121 frames (about 5 s), upscaled 2.25× to 1908×1080 (billed as 1920×1088) | $0.07658 |
| Example: 848×480 clip, 121 frames (about 5 s), upscaled 4× to 3392×1920 | $0.23883 |
Kandinsky v5 Pro API Documentation
https://gateway.pixazo.ai/kandinsky-5-0-pro-953/v1/kandinsky-5-0-pro-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Kandinsky 5.0 Pro generate request - Kandinsky 5.0 Pro API
Request Code
POST https://gateway.pixazo.ai/kandinsky-5-0-pro-953/v1/kandinsky-5-0-pro-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "The white dragon warrior stands still, eyes full of determination and strength. The camera slowly moves closer or circles around the warrior, highlighting the powerful presence and heroic spirit of the character.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
}
import requests
url = "https://gateway.pixazo.ai/kandinsky-5-0-pro-953/v1/kandinsky-5-0-pro-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "The white dragon warrior stands still, eyes full of determination and strength. The camera slowly moves closer or circles around the warrior, highlighting the powerful presence and heroic spirit of the character.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/kandinsky-5-0-pro-953/v1/kandinsky-5-0-pro-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
};
const data = {
"prompt": "The white dragon warrior stands still, eyes full of determination and strength. The camera slowly moves closer or circles around the warrior, highlighting the powerful presence and heroic spirit of the character.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
curl -X POST "https://gateway.pixazo.ai/kandinsky-5-0-pro-953/v1/kandinsky-5-0-pro-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "The white dragon warrior stands still, eyes full of determination and strength. The camera slowly moves closer or circles around the warrior, highlighting the powerful presence and heroic spirit of the character.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
}'
Output
{
"request_id": "kandinsky-5-0-pro-953_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-5-0-pro-953_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "kandinsky-5-0-pro-953_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-5-0-pro-953",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-5-0-pro-953_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.png"
],
"media_type": "image/png"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "kandinsky-5-0-pro-953_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "kandinsky-5-0-pro-953",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - Kandinsky 5.0 Pro generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | A detailed textual description of the desired motion, camera movement, and emotional tone for the generated video. |
| image_url | Yes | string | — | — | Publicly accessible URL of the reference image to animate. This image provides the starting visual content for the video. |
| resolution | No | string | 512P | "512P", "1024P" | Output video resolution. "1024P" yields more detail but takes longer to generate. |
| duration | No | string | 5s | "5s" | Length of the generated video. Kandinsky 5.0 Pro currently supports 5-second clips only, so "5s" is the only accepted value. |
| num_inference_steps | No | integer | 28 | 1–40 | Number of denoising steps the model runs while generating. Higher values refine detail and quality but increase processing time; lower values are faster. |
| acceleration | No | string | regular | "none", "regular" | Speed-vs-quality optimization. "regular" balances quality and generation speed; "none" disables acceleration for maximum quality when generation time is not a constraint. |
| seed | No | integer | — | — | Optional seed for reproducible results. Pass a fixed integer to regenerate the same video for identical inputs; omit it (default) to get a new random seed on each run. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP | Reference image. |
Minimum Request
{
"prompt": "The white dragon warrior stands still, eyes full of determination and strength. The camera slowly moves closer or circles around the warrior, highlighting the powerful presence and heroic spirit of the character.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
}
Full Request (all options)
{
"prompt": "The white dragon warrior stands still, eyes full of determination and strength. The camera slowly moves closer or circles around the warrior, highlighting the powerful presence and heroic spirit of the character.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"resolution": "512P",
"duration": "5s",
"num_inference_steps": 28,
"acceleration": "regular"
}
Response
{
"request_id": "kandinsky-5-0-pro-953_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/kandinsky-5-0-pro-953_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for Kandinsky 5.0 Pro generate request.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'kandinsky-5-0-pro-953' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "kandinsky-5-0-pro-953_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "kandinsky-5-0-pro-953",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/kandinsky-5-0-pro-953_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "kandinsky-5-0-pro-953_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "kandinsky-5-0-pro-953",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/kandinsky-5-0-pro-953_019dxxxx-xxxx/output.ext"
],
"media_type": "application/octet-stream"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Kandinsky v5 Pro API Pricing
| Resolution | Price (USD) |
|---|---|
| 512P | $0.04 per second |
| 1024P | $0.12 per second |
⚡ Performance
Live usage measured on Pixazo's gateway, split by model version. Generation time is how long a generation takes end-to-end (lower is better). Success rate is the percent of generations that complete (higher is better).
〰 Uptime
Percent of generations that succeeded over the selected period, per model version.