Luma Uni 1.1 API, Luma Dream Machine 1.5 API, 1.0 API: Pricing, Documentation
by Luma AI
Luma Uni 1.1 API, developers can generate videos from text prompts or images with exceptional visual quality and temporal consistency. The API supports multiple versions including v1.5 for enhanced capabilities, making it ideal for filmmakers, advertisers, and creative professionals.

Models Version
Get $5 Free Credit on First Payment
No strings attached — add funds and get $5 bonus instantly
Luma Ray 3.2 API Documentation
POST https://gateway.pixazo.ai/luma-agent-ray-v3-2-text-to-video/v1/text-to-video
Authentication
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 - Luma Ray v3.2
Request Code
POST https://gateway.pixazo.ai/luma-agent-ray-v3-2-text-to-video/v1/text-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A herd of wild horses galloping across a dusty desert plain under a blazing midday sun; wide tracking shot.",
"aspect_ratio": "16:9",
"resolution": "540p",
"duration": "5s"
}
import requests
url = "https://gateway.pixazo.ai/luma-agent-ray-v3-2-text-to-video/v1/text-to-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
payload = {
"prompt": "A herd of wild horses galloping across a dusty desert plain under a blazing midday sun; wide tracking shot.",
"aspect_ratio": "16:9",
"resolution": "540p",
"duration": "5s"
}
resp = requests.post(url, headers=headers, json=payload)
print(resp.json()) # { "request_id": "...", "status": "QUEUED", "polling_url": "..." }
const res = await fetch("https://gateway.pixazo.ai/luma-agent-ray-v3-2-text-to-video/v1/text-to-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
prompt: "A herd of wild horses galloping across a dusty desert plain under a blazing midday sun; wide tracking shot.",
aspect_ratio: "16:9",
resolution: "540p",
duration: "5s"
})
});
const data = await res.json();
console.log(data); // { request_id, status: "QUEUED", polling_url }
curl -X POST "https://gateway.pixazo.ai/luma-agent-ray-v3-2-text-to-video/v1/text-to-video" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "A herd of wild horses galloping across a dusty desert plain under a blazing midday sun; wide tracking shot.",
"aspect_ratio": "16:9",
"resolution": "540p",
"duration": "5s"
}'
Output
{
"request_id": "luma-agent-ray-v3-2-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Instead of polling, you can receive a callback when the request reaches a terminal state. Pass the webhook headers on the submit request; the gateway will POST the result to your URL.
| Header | Type | Required | Description |
|---|---|---|---|
| X-Webhook-URL | string | No | HTTPS URL to receive the callback. Providing it enables webhook delivery. |
| X-Webhook-Mode | string | No | terminal (default) fires once on COMPLETED/ERROR; sync fires on each status transition. |
Example: enable webhook
curl -X POST "https://gateway.pixazo.ai/luma-agent-ray-v3-2-text-to-video/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/webhooks/pixazo" \
-H "X-Webhook-Mode: terminal" \
--data-raw '{"prompt": "A herd of wild horses galloping across a dusty desert plain under a blazing midday sun; wide tracking shot.", "aspect_ratio": "16:9", "resolution": "540p", "duration": "5s"}'
Callback Payload (success)
{
"request_id": "luma-agent-ray-v3-2-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-agent-ray-v3-2-text-to-video",
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-agent-ray-v3-2-text-to-video_019dxxxx.../output.mp4"],
"media_type": "video/mp4"
}
}
Failure callback shape
{
"request_id": "luma-agent-ray-v3-2-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"error": "Failed to download the file. Please check if the URL is accessible."
}
- terminal mode delivers one callback on COMPLETED or ERROR; sync mode delivers on each status transition.
- Deliveries are keyed by
request_id— make your handler idempotent. - Respond with HTTP 200 within a few seconds; non-2xx responses are retried.
- The webhook URL must be HTTPS and publicly reachable.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | Text prompt describing the video to generate. |
| aspect_ratio | No | string | 16:9 | 3:4, 4:3, 1:1, 9:16, 16:9, 21:9 | Aspect ratio of the generated video. |
| resolution | No | string | 540p | 540p, 720p, 1080p | Output resolution. Higher resolutions cost more. |
| duration | No | string | 5s | 5s, 10s | Duration of the generated video. |
| loop | No | boolean | false | true, false | Generate a seamless loop. Only valid for 5s SDR generations without an end frame. |
| hdr | No | boolean | false | true, false | Generate an HDR-encoded MP4. Requires HDR account access and 720p/1080p; not supported with 10s or loop. Billed at 2x the SDR rate. |
| exr_export | No | boolean | false | true, false | Also export an EXR sidecar alongside the MP4. Requires hdr=true. Billed at 3x the SDR rate. |
Example Request
{
"prompt": "A herd of wild horses galloping across a dusty desert plain under a blazing midday sun; wide tracking shot.",
"aspect_ratio": "16:9",
"resolution": "540p",
"duration": "5s"
}
Example Response
{
"request_id": "luma-agent-ray-v3-2-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Required | Description |
|---|---|---|
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| Content-Type | Yes | Must be application/json. |
| X-Webhook-URL | No | HTTPS callback URL (see Webhook section). |
Response Handling
Common status codes returned by the submit endpoint.
| Status Code | Meaning |
|---|---|
| 202 Accepted | Request queued. Returns request_id, status: "QUEUED", and polling_url. |
| 400 Bad Request | Invalid request body or unknown model. |
| 401 Unauthorized | Missing or invalid subscription key. |
| 402 Payment Required | Insufficient wallet balance. |
| 403 Forbidden | Subscription not permitted to access this API. |
| 429 Too Many Requests | Rate limit exceeded. |
| 500 Internal Server Error | Unexpected gateway error. |
Error Responses
Queue-system errors are returned at submit time; generation errors are surfaced via the status endpoint / webhook with status: "ERROR".
// 402 — insufficient balance
{ "error": "Insufficient balance", "message": "Wallet balance is too low for this request." }
// 400 — model not found / invalid body
{ "error": "Model not found", "message": "Model 'luma-agent-ray-v3-2-text-to-video' not found or is disabled" }
// generation failure (via status / webhook)
{ "request_id": "luma-agent-ray-v3-2-text-to-video_019dxxxx...", "status": "ERROR", "error": "Failed to download the input file." }
Retrieving Results
Poll the status endpoint with the request_id until status is COMPLETED (or FAILED/ERROR).
curl -X GET "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY"
Completed response
{
"request_id": "luma-agent-ray-v3-2-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-agent-ray-v3-2-text-to-video",
"error": null,
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-agent-ray-v3-2-text-to-video_019dxxxx.../output.mp4"],
"media_type": "video/mp4"
},
"created_at": "2026-06-30T09:20:33.812Z",
"completed_at": "2026-06-30T09:22:19.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier for the request. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request (luma-agent-ray-v3-2-text-to-video). |
| error | string | null | Error message when the request fails; null otherwise. |
| output.media_url | string[] | Array of URLs to the generated MP4 video. |
| output.media_type | string | MIME type of the output (video/mp4). |
| created_at | string | ISO-8601 timestamp when the request was created. |
| completed_at | string | ISO-8601 timestamp when the request reached a terminal state. |
| polling_url | string | URL to poll for status (returned on submit). |
Status Values & Flow
| Status | Meaning |
|---|---|
| QUEUED | Request accepted and waiting to be processed. |
| PROCESSING | The video generation job is running. |
| COMPLETED | Done — output.media_url contains the generated video. |
| FAILED / ERROR | Generation failed — see error. |
Typical workflow
QUEUED → PROCESSING → COMPLETED (or FAILED / ERROR). Submit the request, then poll GET /v2/requests/status/{request_id} (or use a webhook) until the status is terminal, then download the video from output.media_url.
Luma Ray 3.2 API Pricing
Luma Ray 3.2 API Documentation
POST https://gateway.pixazo.ai/luma-agent-ray-v3-2-image-to-video/v1/image-to-video
Authentication
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 - Luma Ray v3.2
Request Code
POST https://gateway.pixazo.ai/luma-agent-ray-v3-2-image-to-video/v1/image-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Low-angle shot of a majestic tiger prowling through a snowy landscape, leaving paw prints on the white blanket.",
"image_url": "https://storage.googleapis.com/falserverless/gallery/example_inputs_liuyifei.png",
"aspect_ratio": "16:9",
"resolution": "540p",
"duration": "5s"
}
import requests
url = "https://gateway.pixazo.ai/luma-agent-ray-v3-2-image-to-video/v1/image-to-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
payload = {
"prompt": "Low-angle shot of a majestic tiger prowling through a snowy landscape, leaving paw prints on the white blanket.",
"image_url": "https://storage.googleapis.com/falserverless/gallery/example_inputs_liuyifei.png",
"aspect_ratio": "16:9",
"resolution": "540p",
"duration": "5s"
}
resp = requests.post(url, headers=headers, json=payload)
print(resp.json()) # { "request_id": "...", "status": "QUEUED", "polling_url": "..." }
const res = await fetch("https://gateway.pixazo.ai/luma-agent-ray-v3-2-image-to-video/v1/image-to-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
prompt: "Low-angle shot of a majestic tiger prowling through a snowy landscape, leaving paw prints on the white blanket.",
image_url: "https://storage.googleapis.com/falserverless/gallery/example_inputs_liuyifei.png",
aspect_ratio: "16:9",
resolution: "540p",
duration: "5s"
})
});
const data = await res.json();
console.log(data); // { request_id, status: "QUEUED", polling_url }
curl -X POST "https://gateway.pixazo.ai/luma-agent-ray-v3-2-image-to-video/v1/image-to-video" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "Low-angle shot of a majestic tiger prowling through a snowy landscape, leaving paw prints on the white blanket.",
"image_url": "https://storage.googleapis.com/falserverless/gallery/example_inputs_liuyifei.png",
"aspect_ratio": "16:9",
"resolution": "540p",
"duration": "5s"
}'
Output
{
"request_id": "luma-agent-ray-v3-2-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Instead of polling, you can receive a callback when the request reaches a terminal state. Pass the webhook headers on the submit request; the gateway will POST the result to your URL.
| Header | Type | Required | Description |
|---|---|---|---|
| X-Webhook-URL | string | No | HTTPS URL to receive the callback. Providing it enables webhook delivery. |
| X-Webhook-Mode | string | No | terminal (default) fires once on COMPLETED/ERROR; sync fires on each status transition. |
Example: enable webhook
curl -X POST "https://gateway.pixazo.ai/luma-agent-ray-v3-2-image-to-video/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/webhooks/pixazo" \
-H "X-Webhook-Mode: terminal" \
--data-raw '{"prompt": "Low-angle shot of a majestic tiger prowling through a snowy landscape, leaving paw prints on the white blanket.", "image_url": "https://storage.googleapis.com/falserverless/gallery/example_inputs_liuyifei.png", "aspect_ratio": "16:9", "resolution": "540p", "duration": "5s"}'
Callback Payload (success)
{
"request_id": "luma-agent-ray-v3-2-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-agent-ray-v3-2-image-to-video",
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-agent-ray-v3-2-image-to-video_019dxxxx.../output.mp4"],
"media_type": "video/mp4"
}
}
Failure callback shape
{
"request_id": "luma-agent-ray-v3-2-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"error": "Failed to download the file. Please check if the URL is accessible."
}
- terminal mode delivers one callback on COMPLETED or ERROR; sync mode delivers on each status transition.
- Deliveries are keyed by
request_id— make your handler idempotent. - Respond with HTTP 200 within a few seconds; non-2xx responses are retried.
- The webhook URL must be HTTPS and publicly reachable.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | Text prompt describing the motion/scene to generate. |
| image_url | No | string | — | — | URL of the first-frame image. Provide image_url (optionally with end_image_url) OR keyframes — mutually exclusive. |
| end_image_url | No | string | — | — | Optional last-frame image; the model interpolates between image_url and end_image_url. Cannot be combined with keyframes. |
| aspect_ratio | No | string | 16:9 | 3:4, 4:3, 1:1, 9:16, 16:9, 21:9 | Aspect ratio of the generated video. |
| resolution | No | string | 540p | 540p, 720p, 1080p | Output resolution. Higher resolutions cost more. |
| duration | No | string | 5s | 5s, 10s | Duration of the generated video. 10s requires multi-keyframe input (keyframes / keyframe_indexes); not supported with a single image_url / end_image_url anchor. |
| loop | No | boolean | false | true, false | Generate a seamless loop. SDR only, no end frame or keyframes. |
| hdr | No | boolean | false | true, false | HDR-encoded MP4. Requires HDR account access and 720p/1080p; not supported with loop. Billed at 2x the SDR rate. |
| exr_export | No | boolean | false | true, false | Also export an EXR sidecar. Requires hdr=true. Billed at 3x the SDR rate. |
| keyframes | No | list<string> | — | 1-64 URLs | Multi-keyframe guide frames pinned at keyframe_indexes. Mutually exclusive with image_url/end_image_url/loop; unlocks 10s and HDR. |
| keyframe_indexes | No | list<integer> | — | 1-64 | Output-frame positions (5s -> 0-120, 10s -> 0-240) for each keyframes[i]. Non-negative, unique, same length as keyframes. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP | Start or end frame image. |
Example Request
{
"prompt": "Low-angle shot of a majestic tiger prowling through a snowy landscape, leaving paw prints on the white blanket.",
"image_url": "https://storage.googleapis.com/falserverless/gallery/example_inputs_liuyifei.png",
"aspect_ratio": "16:9",
"resolution": "540p",
"duration": "5s"
}
Example Response
{
"request_id": "luma-agent-ray-v3-2-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Required | Description |
|---|---|---|
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| Content-Type | Yes | Must be application/json. |
| X-Webhook-URL | No | HTTPS callback URL (see Webhook section). |
Response Handling
Common status codes returned by the submit endpoint.
| Status Code | Meaning |
|---|---|
| 202 Accepted | Request queued. Returns request_id, status: "QUEUED", and polling_url. |
| 400 Bad Request | Invalid request body or unknown model. |
| 401 Unauthorized | Missing or invalid subscription key. |
| 402 Payment Required | Insufficient wallet balance. |
| 403 Forbidden | Subscription not permitted to access this API. |
| 429 Too Many Requests | Rate limit exceeded. |
| 500 Internal Server Error | Unexpected gateway error. |
Error Responses
Queue-system errors are returned at submit time; generation errors are surfaced via the status endpoint / webhook with status: "ERROR".
// 402 — insufficient balance
{ "error": "Insufficient balance", "message": "Wallet balance is too low for this request." }
// 400 — model not found / invalid body
{ "error": "Model not found", "message": "Model 'luma-agent-ray-v3-2-image-to-video' not found or is disabled" }
// generation failure (via status / webhook)
{ "request_id": "luma-agent-ray-v3-2-image-to-video_019dxxxx...", "status": "ERROR", "error": "Failed to download the input file." }
Retrieving Results
Poll the status endpoint with the request_id until status is COMPLETED (or FAILED/ERROR).
curl -X GET "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY"
Completed response
{
"request_id": "luma-agent-ray-v3-2-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-agent-ray-v3-2-image-to-video",
"error": null,
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-agent-ray-v3-2-image-to-video_019dxxxx.../output.mp4"],
"media_type": "video/mp4"
},
"created_at": "2026-06-30T09:20:33.812Z",
"completed_at": "2026-06-30T09:22:19.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier for the request. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request (luma-agent-ray-v3-2-image-to-video). |
| error | string | null | Error message when the request fails; null otherwise. |
| output.media_url | string[] | Array of URLs to the generated MP4 video. |
| output.media_type | string | MIME type of the output (video/mp4). |
| created_at | string | ISO-8601 timestamp when the request was created. |
| completed_at | string | ISO-8601 timestamp when the request reached a terminal state. |
| polling_url | string | URL to poll for status (returned on submit). |
Status Values & Flow
| Status | Meaning |
|---|---|
| QUEUED | Request accepted and waiting to be processed. |
| PROCESSING | The video generation job is running. |
| COMPLETED | Done — output.media_url contains the generated video. |
| FAILED / ERROR | Generation failed — see error. |
Typical workflow
QUEUED → PROCESSING → COMPLETED (or FAILED / ERROR). Submit the request, then poll GET /v2/requests/status/{request_id} (or use a webhook) until the status is terminal, then download the video from output.media_url.
Luma Ray 3.2 API Pricing
Luma Ray 3.2 API Documentation
POST https://gateway.pixazo.ai/luma-agent-ray-v3-2-video-to-video/v1/video-to-video
Authentication
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 - Luma Ray v3.2
Request Code
POST https://gateway.pixazo.ai/luma-agent-ray-v3-2-video-to-video/v1/video-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Restyle the footage as a hand-painted watercolor animation with soft pastel colors.",
"video_url": "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4",
"resolution": "540p",
"duration": "5s"
}
import requests
url = "https://gateway.pixazo.ai/luma-agent-ray-v3-2-video-to-video/v1/video-to-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
payload = {
"prompt": "Restyle the footage as a hand-painted watercolor animation with soft pastel colors.",
"video_url": "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4",
"resolution": "540p",
"duration": "5s"
}
resp = requests.post(url, headers=headers, json=payload)
print(resp.json()) # { "request_id": "...", "status": "QUEUED", "polling_url": "..." }
const res = await fetch("https://gateway.pixazo.ai/luma-agent-ray-v3-2-video-to-video/v1/video-to-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
prompt: "Restyle the footage as a hand-painted watercolor animation with soft pastel colors.",
video_url: "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4",
resolution: "540p",
duration: "5s"
})
});
const data = await res.json();
console.log(data); // { request_id, status: "QUEUED", polling_url }
curl -X POST "https://gateway.pixazo.ai/luma-agent-ray-v3-2-video-to-video/v1/video-to-video" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "Restyle the footage as a hand-painted watercolor animation with soft pastel colors.",
"video_url": "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4",
"resolution": "540p",
"duration": "5s"
}'
Output
{
"request_id": "luma-agent-ray-v3-2-video-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-video-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Instead of polling, you can receive a callback when the request reaches a terminal state. Pass the webhook headers on the submit request; the gateway will POST the result to your URL.
| Header | Type | Required | Description |
|---|---|---|---|
| X-Webhook-URL | string | No | HTTPS URL to receive the callback. Providing it enables webhook delivery. |
| X-Webhook-Mode | string | No | terminal (default) fires once on COMPLETED/ERROR; sync fires on each status transition. |
Example: enable webhook
curl -X POST "https://gateway.pixazo.ai/luma-agent-ray-v3-2-video-to-video/v1/video-to-video" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-H "X-Webhook-URL: https://your-server.com/webhooks/pixazo" \
-H "X-Webhook-Mode: terminal" \
--data-raw '{"prompt": "Restyle the footage as a hand-painted watercolor animation with soft pastel colors.", "video_url": "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4", "resolution": "540p", "duration": "5s"}'
Callback Payload (success)
{
"request_id": "luma-agent-ray-v3-2-video-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-agent-ray-v3-2-video-to-video",
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-agent-ray-v3-2-video-to-video_019dxxxx.../output.mp4"],
"media_type": "video/mp4"
}
}
Failure callback shape
{
"request_id": "luma-agent-ray-v3-2-video-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"error": "Failed to download the file. Please check if the URL is accessible."
}
- terminal mode delivers one callback on COMPLETED or ERROR; sync mode delivers on each status transition.
- Deliveries are keyed by
request_id— make your handler idempotent. - Respond with HTTP 200 within a few seconds; non-2xx responses are retried.
- The webhook URL must be HTTPS and publicly reachable.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | Text prompt describing how to edit the source video. |
| video_url | Yes | string | — | — | URL of the source video to edit. |
| start_image_url | No | string | — | — | Optional first-frame image (e.g. a restyled opening frame) to steer the edit's look. Leave unset to derive from the source. |
| resolution | No | string | 540p | 540p, 720p, 1080p | Output resolution. Higher resolutions cost more. |
| duration | No | string | 5s | 5s, 10s | Duration of the edited video. |
| edit_strength | No | string | — | adhere_1, adhere_2, adhere_3, flex_1, flex_2, flex_3, reimagine_1, reimagine_2, reimagine_3 | How closely the edit preserves the source (adhere = closest, reimagine = most divergent). Cannot be combined with auto_controls. |
| auto_controls | No | boolean | false | true, false | Let the model derive the edit conditioning schedule from the source. Cannot be combined with edit_strength. |
| hdr | No | boolean | false | true, false | HDR-encoded MP4. Requires HDR account access and 720p/1080p. Billed at 2x the SDR rate. |
| exr_export | No | boolean | false | true, false | Also export an EXR sidecar. Requires hdr=true. Billed at 3x the SDR rate. |
| controls | No | object | — | — | Per-signal conditioning controls (pose, depth, normals, trajectory, face) for finer edit control than edit_strength. Cannot be combined with auto_controls. |
| keyframes | No | list<string> | — | up to 64 URLs | Multi-keyframe guide frames pinned at keyframe_indexes. Mutually exclusive with start_image_url. |
| keyframe_indexes | No | list<integer> | — | 1-64 | Source-frame positions for each keyframes[i]. Non-negative, unique, same length as keyframes. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| video | 1 | MP4, MOV | Source video to edit. |
| image | 1 | JPG, PNG, WEBP | Start frame image. |
Example Request
{
"prompt": "Restyle the footage as a hand-painted watercolor animation with soft pastel colors.",
"video_url": "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4",
"resolution": "540p",
"duration": "5s"
}
Example Response
{
"request_id": "luma-agent-ray-v3-2-video-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-video-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Required | Description |
|---|---|---|
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| Content-Type | Yes | Must be application/json. |
| X-Webhook-URL | No | HTTPS callback URL (see Webhook section). |
Response Handling
Common status codes returned by the submit endpoint.
| Status Code | Meaning |
|---|---|
| 202 Accepted | Request queued. Returns request_id, status: "QUEUED", and polling_url. |
| 400 Bad Request | Invalid request body or unknown model. |
| 401 Unauthorized | Missing or invalid subscription key. |
| 402 Payment Required | Insufficient wallet balance. |
| 403 Forbidden | Subscription not permitted to access this API. |
| 429 Too Many Requests | Rate limit exceeded. |
| 500 Internal Server Error | Unexpected gateway error. |
Error Responses
Queue-system errors are returned at submit time; generation errors are surfaced via the status endpoint / webhook with status: "ERROR".
// 402 — insufficient balance
{ "error": "Insufficient balance", "message": "Wallet balance is too low for this request." }
// 400 — model not found / invalid body
{ "error": "Model not found", "message": "Model 'luma-agent-ray-v3-2-video-to-video' not found or is disabled" }
// generation failure (via status / webhook)
{ "request_id": "luma-agent-ray-v3-2-video-to-video_019dxxxx...", "status": "ERROR", "error": "Failed to download the input file." }
Retrieving Results
Poll the status endpoint with the request_id until status is COMPLETED (or FAILED/ERROR).
curl -X GET "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-video-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY"
Completed response
{
"request_id": "luma-agent-ray-v3-2-video-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-agent-ray-v3-2-video-to-video",
"error": null,
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-agent-ray-v3-2-video-to-video_019dxxxx.../output.mp4"],
"media_type": "video/mp4"
},
"created_at": "2026-06-30T09:20:33.812Z",
"completed_at": "2026-06-30T09:22:19.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier for the request. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request (luma-agent-ray-v3-2-video-to-video). |
| error | string | null | Error message when the request fails; null otherwise. |
| output.media_url | string[] | Array of URLs to the generated MP4 video. |
| output.media_type | string | MIME type of the output (video/mp4). |
| created_at | string | ISO-8601 timestamp when the request was created. |
| completed_at | string | ISO-8601 timestamp when the request reached a terminal state. |
| polling_url | string | URL to poll for status (returned on submit). |
Status Values & Flow
| Status | Meaning |
|---|---|
| QUEUED | Request accepted and waiting to be processed. |
| PROCESSING | The video generation job is running. |
| COMPLETED | Done — output.media_url contains the generated video. |
| FAILED / ERROR | Generation failed — see error. |
Typical workflow
QUEUED → PROCESSING → COMPLETED (or FAILED / ERROR). Submit the request, then poll GET /v2/requests/status/{request_id} (or use a webhook) until the status is terminal, then download the video from output.media_url.
Luma Ray 3.2 API Pricing
Luma Ray 3.2 API Documentation
POST https://gateway.pixazo.ai/luma-agent-ray-v3-2-reframe/v1/reframe
Authentication
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 (Reframe) - Luma Ray v3.2
Request Code
POST https://gateway.pixazo.ai/luma-agent-ray-v3-2-reframe/v1/reframe
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Extend the scene into cinematic widescreen with matching lighting and background detail.",
"video_url": "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4",
"aspect_ratio": "21:9",
"resolution": "540p"
}
import requests
url = "https://gateway.pixazo.ai/luma-agent-ray-v3-2-reframe/v1/reframe"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
payload = {
"prompt": "Extend the scene into cinematic widescreen with matching lighting and background detail.",
"video_url": "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4",
"aspect_ratio": "21:9",
"resolution": "540p"
}
resp = requests.post(url, headers=headers, json=payload)
print(resp.json()) # { "request_id": "...", "status": "QUEUED", "polling_url": "..." }
const res = await fetch("https://gateway.pixazo.ai/luma-agent-ray-v3-2-reframe/v1/reframe", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
prompt: "Extend the scene into cinematic widescreen with matching lighting and background detail.",
video_url: "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4",
aspect_ratio: "21:9",
resolution: "540p"
})
});
const data = await res.json();
console.log(data); // { request_id, status: "QUEUED", polling_url }
curl -X POST "https://gateway.pixazo.ai/luma-agent-ray-v3-2-reframe/v1/reframe" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "Extend the scene into cinematic widescreen with matching lighting and background detail.",
"video_url": "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4",
"aspect_ratio": "21:9",
"resolution": "540p"
}'
Output
{
"request_id": "luma-agent-ray-v3-2-reframe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-reframe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Instead of polling, you can receive a callback when the request reaches a terminal state. Pass the webhook headers on the submit request; the gateway will POST the result to your URL.
| Header | Type | Required | Description |
|---|---|---|---|
| X-Webhook-URL | string | No | HTTPS URL to receive the callback. Providing it enables webhook delivery. |
| X-Webhook-Mode | string | No | terminal (default) fires once on COMPLETED/ERROR; sync fires on each status transition. |
Example: enable webhook
curl -X POST "https://gateway.pixazo.ai/luma-agent-ray-v3-2-reframe/v1/reframe" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-H "X-Webhook-URL: https://your-server.com/webhooks/pixazo" \
-H "X-Webhook-Mode: terminal" \
--data-raw '{"prompt": "Extend the scene into cinematic widescreen with matching lighting and background detail.", "video_url": "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4", "aspect_ratio": "21:9", "resolution": "540p"}'
Callback Payload (success)
{
"request_id": "luma-agent-ray-v3-2-reframe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-agent-ray-v3-2-reframe",
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-agent-ray-v3-2-reframe_019dxxxx.../output.mp4"],
"media_type": "video/mp4"
}
}
Failure callback shape
{
"request_id": "luma-agent-ray-v3-2-reframe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"error": "Failed to download the file. Please check if the URL is accessible."
}
- terminal mode delivers one callback on COMPLETED or ERROR; sync mode delivers on each status transition.
- Deliveries are keyed by
request_id— make your handler idempotent. - Respond with HTTP 200 within a few seconds; non-2xx responses are retried.
- The webhook URL must be HTTPS and publicly reachable.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | Text prompt describing the content to paint into the newly exposed canvas when reframing. |
| video_url | Yes | string | — | ≤30 seconds | URL of the source video to reframe. |
| aspect_ratio | Yes | string | — | 3:4, 4:3, 1:1, 9:16, 16:9, 21:9 | Target aspect ratio for the reframed video. |
| resolution | No | string | 540p | 540p, 720p, 1080p | Output resolution. Higher resolutions cost more. |
| source_position | No | object | — | — | Optional normalized source rectangle controlling where the source video sits in the output canvas. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| video | 1 | MP4, MOV | Video to reframe. |
Example Request
{
"prompt": "Extend the scene into cinematic widescreen with matching lighting and background detail.",
"video_url": "https://storage.googleapis.com/falserverless/example_inputs/birefnet-video-input.mp4",
"aspect_ratio": "21:9",
"resolution": "540p"
}
Example Response
{
"request_id": "luma-agent-ray-v3-2-reframe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-reframe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Required | Description |
|---|---|---|
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| Content-Type | Yes | Must be application/json. |
| X-Webhook-URL | No | HTTPS callback URL (see Webhook section). |
Response Handling
Common status codes returned by the submit endpoint.
| Status Code | Meaning |
|---|---|
| 202 Accepted | Request queued. Returns request_id, status: "QUEUED", and polling_url. |
| 400 Bad Request | Invalid request body or unknown model. |
| 401 Unauthorized | Missing or invalid subscription key. |
| 402 Payment Required | Insufficient wallet balance. |
| 403 Forbidden | Subscription not permitted to access this API. |
| 429 Too Many Requests | Rate limit exceeded. |
| 500 Internal Server Error | Unexpected gateway error. |
Error Responses
Queue-system errors are returned at submit time; generation errors are surfaced via the status endpoint / webhook with status: "ERROR".
// 402 — insufficient balance
{ "error": "Insufficient balance", "message": "Wallet balance is too low for this request." }
// 400 — model not found / invalid body
{ "error": "Model not found", "message": "Model 'luma-agent-ray-v3-2-reframe' not found or is disabled" }
// generation failure (via status / webhook)
{ "request_id": "luma-agent-ray-v3-2-reframe_019dxxxx...", "status": "ERROR", "error": "Failed to download the input file." }
Retrieving Results
Poll the status endpoint with the request_id until status is COMPLETED (or FAILED/ERROR).
curl -X GET "https://gateway.pixazo.ai/v2/requests/status/luma-agent-ray-v3-2-reframe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY"
Completed response
{
"request_id": "luma-agent-ray-v3-2-reframe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-agent-ray-v3-2-reframe",
"error": null,
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-agent-ray-v3-2-reframe_019dxxxx.../output.mp4"],
"media_type": "video/mp4"
},
"created_at": "2026-06-30T09:20:33.812Z",
"completed_at": "2026-06-30T09:22:19.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier for the request. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request (luma-agent-ray-v3-2-reframe). |
| error | string | null | Error message when the request fails; null otherwise. |
| output.media_url | string[] | Array of URLs to the generated MP4 video. |
| output.media_type | string | MIME type of the output (video/mp4). |
| created_at | string | ISO-8601 timestamp when the request was created. |
| completed_at | string | ISO-8601 timestamp when the request reached a terminal state. |
| polling_url | string | URL to poll for status (returned on submit). |
Status Values & Flow
| Status | Meaning |
|---|---|
| QUEUED | Request accepted and waiting to be processed. |
| PROCESSING | The video generation job is running. |
| COMPLETED | Done — output.media_url contains the generated video. |
| FAILED / ERROR | Generation failed — see error. |
Typical workflow
QUEUED → PROCESSING → COMPLETED (or FAILED / ERROR). Submit the request, then poll GET /v2/requests/status/{request_id} (or use a webhook) until the status is terminal, then download the video from output.media_url. Reframe has no duration parameter — the output length matches the source video length, and the request is billed per started source second.
Luma Ray 3.2 API Pricing
Luma Uni 1.1 API Documentation
https://gateway.pixazo.ai/luma-agent-uni-1-text-to-image/v1/luma-agent-uni-1-text-to-image-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 |
Luma Agent Uni-1 Text to Image generate request
Request Code
POST https://gateway.pixazo.ai/luma-agent-uni-1-text-to-image/v1/luma-agent-uni-1-text-to-image-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"prompt": "A retro-futurist subway station with chrome arches and warm overhead lighting, cinematic",
"aspect_ratio": "16:9",
"style": "auto",
"output_format": "png",
"enable_web_search": false
}
import requests
url = "https://gateway.pixazo.ai/luma-agent-uni-1-text-to-image/v1/luma-agent-uni-1-text-to-image-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
data = {
"prompt": "A retro-futurist subway station with chrome arches and warm overhead lighting, cinematic",
"aspect_ratio": "16:9",
"style": "auto",
"output_format": "png",
"enable_web_search": false
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/luma-agent-uni-1-text-to-image/v1/luma-agent-uni-1-text-to-image-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
};
const data = {
"prompt": "A retro-futurist subway station with chrome arches and warm overhead lighting, cinematic",
"aspect_ratio": "16:9",
"style": "auto",
"output_format": "png",
"enable_web_search": false
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data));
curl -X POST "https://gateway.pixazo.ai/luma-agent-uni-1-text-to-image/v1/luma-agent-uni-1-text-to-image-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
--data-raw '{
"prompt": "A retro-futurist subway station with chrome arches and warm overhead lighting, cinematic",
"aspect_ratio": "16:9",
"style": "auto",
"output_format": "png",
"enable_web_search": false
}'
Output
{
"request_id": "luma-agent-uni-1-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-uni-1-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your generate request to receive a POST callback instead of polling.
X-Webhook-URL: https://your-server.com/webhook/callback
Request Parameters - Luma Agent Uni-1 Text to Image generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | non-empty; ≤ 6000 chars | Text description for image generation. Must be 1–6000 characters. |
| aspect_ratio | No | enum | — | "3:1", "2:1", "16:9", "3:2", "1:1", "2:3", "9:16", "1:2", "1:3" | Image aspect ratio. |
| style | No | enum | "auto" | "auto", "manga" | Visual style of the output. |
| output_format | No | enum | — | "png", "jpeg" | Output file format. |
| enable_web_search | No | boolean | false | — | When true, the model may perform web search to enrich context and improve visual accuracy. |
| reference_image_urls | No | string[] | — | up to 9 URLs | Array of up to 9 HTTPS URLs to reference images that guide generation. Each URL must be publicly accessible. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| reference_image_urls | 8 | JPG, PNG, WEBP, GIF, AVIF | Reference image(s), up to 8. |
Example Request
{
"prompt": "A retro-futurist subway station with chrome arches and warm overhead lighting, cinematic",
"aspect_ratio": "16:9",
"style": "auto",
"output_format": "png",
"enable_web_search": false
}
Response
{
"request_id": "luma-agent-uni-1-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-uni-1-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_API_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 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 'luma-agent-uni-1-text-to-image' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "luma-agent-uni-1-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "luma-agent-uni-1-text-to-image",
"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/luma-agent-uni-1-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "luma-agent-uni-1-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-agent-uni-1-text-to-image",
"error": null,
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-agent-uni-1-text-to-image_019dxxxx/output.png"],
"media_type": "image/png"
},
"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 | 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.
Luma Uni 1.1 API Pricing
Luma Uni 1.1 API Documentation
https://gateway.pixazo.ai/luma-agent-uni-1-edit/v1/luma-agent-uni-1-edit-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 |
Luma Agent Uni-1 Edit generate request
Request Code
POST https://gateway.pixazo.ai/luma-agent-uni-1-edit/v1/luma-agent-uni-1-edit-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"prompt": "Restyle the scene as a vibrant manga panel with bold ink lines and soft color washes",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana/nano-banana-a382a80b-f8df-4de1-a0c1-a5dcfd42dae4-1758783383399.jpg",
"style": "auto",
"output_format": "png"
}
import requests
url = "https://gateway.pixazo.ai/luma-agent-uni-1-edit/v1/luma-agent-uni-1-edit-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
data = {
"prompt": "Restyle the scene as a vibrant manga panel with bold ink lines and soft color washes",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana/nano-banana-a382a80b-f8df-4de1-a0c1-a5dcfd42dae4-1758783383399.jpg",
"style": "auto",
"output_format": "png"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/luma-agent-uni-1-edit/v1/luma-agent-uni-1-edit-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
};
const data = {
"prompt": "Restyle the scene as a vibrant manga panel with bold ink lines and soft color washes",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana/nano-banana-a382a80b-f8df-4de1-a0c1-a5dcfd42dae4-1758783383399.jpg",
"style": "auto",
"output_format": "png"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data));
curl -X POST "https://gateway.pixazo.ai/luma-agent-uni-1-edit/v1/luma-agent-uni-1-edit-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
--data-raw '{
"prompt": "Restyle the scene as a vibrant manga panel with bold ink lines and soft color washes",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/Image.jpeg",
"style": "auto",
"output_format": "png"
}'
Output
{
"request_id": "luma-agent-uni-1-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-uni-1-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your generate request to receive a POST callback instead of polling.
X-Webhook-URL: https://your-server.com/webhook/callback
Request Parameters - Luma Agent Uni-1 Edit generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | 1–6000 characters | Text instruction describing the desired edit (1–6000 characters). |
| image_url | Yes | string | — | — | URL of the source image to edit. Supported formats: JPG, JPEG, PNG, WebP, GIF, AVIF. |
| style | No | enum | auto | auto, manga | Visual style to apply. Allowed values: auto, manga. |
| output_format | No | enum | — | png, jpeg | Output encoding format. Allowed values: png, jpeg. If omitted, defaults to the source image format. |
| reference_image_urls | No | string[] | — | up to 8 URLs | Up to 8 additional reference image URLs to guide the editing process. Each reference image incurs an additional $0.003 charge. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image_url | 1 | JPG, PNG, WEBP, GIF, AVIF | Image to edit. |
| reference_image_urls | 8 | JPG, PNG, WEBP, GIF, AVIF | Reference image(s), up to 8. |
Example Request
{
"prompt": "Restyle the scene as a vibrant manga panel with bold ink lines and soft color washes",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana/nano-banana-a382a80b-f8df-4de1-a0c1-a5dcfd42dae4-1758783383399.jpg",
"style": "auto",
"output_format": "png"
}
Response
{
"request_id": "luma-agent-uni-1-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/luma-agent-uni-1-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_API_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 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 'luma-agent-uni-1-edit' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "luma-agent-uni-1-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "luma-agent-uni-1-edit",
"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/luma-agent-uni-1-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "luma-agent-uni-1-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-agent-uni-1-edit",
"error": null,
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-agent-uni-1-edit_019dxxxx/output.png"],
"media_type": "image/png"
},
"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 | 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.
Luma Uni 1.1 API Pricing
| Usage | Price (USD) |
|---|---|
| Per edit (base) | $0.042 |
| Per source / reference image | $0.003 |
Luma Dream Machine Ray 2 Flash API Documentation
https://gateway.pixazo.ai/luma-dream-machine-ray-2-flash-image-to-video/v1/luma-dream-machine-ray-2-flash-image-to-video-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 |
Luma Dream Machine Ray 2 Flash Image to Video generate request - Luma Dream Machine Ray 2 Flash Image to Video
Request Code
POST /luma-dream-machine-ray-2-flash-image-to-video-request HTTP/1.1
Host: gateway.pixazo.ai
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Create a magical timelapse transition. The snow melts rapidly to reveal green grass, and the tree branches burst into bloom with pink flowers in real-time. The lighting shifts from cold winter light to warm spring sunshine. The camera pushes in slowly towards the tree. Disney-style magical transformation, cinematic, 8k.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/luma-dream-machine-ray-2-flash-image-to-video.jpg",
"end_image_url": "",
"aspect_ratio": "16:9",
"loop": false,
"resolution": "540p",
"duration": "5s"
}
import requests
url = "https://gateway.pixazo.ai/luma-dream-machine-ray-2-flash-image-to-video/v1/luma-dream-machine-ray-2-flash-image-to-video-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Create a magical timelapse transition. The snow melts rapidly to reveal green grass, and the tree branches burst into bloom with pink flowers in real-time. The lighting shifts from cold winter light to warm spring sunshine. The camera pushes in slowly towards the tree. Disney-style magical transformation, cinematic, 8k.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/luma-dream-machine-ray-2-flash-image-to-video.jpg",
"end_image_url": "",
"aspect_ratio": "16:9",
"loop": False,
"resolution": "540p",
"duration": "5s"
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const url = 'https://gateway.pixazo.ai/luma-dream-machine-ray-2-flash-image-to-video/v1/luma-dream-machine-ray-2-flash-image-to-video-request';
const data = {
prompt: "Create a magical timelapse transition. The snow melts rapidly to reveal green grass, and the tree branches burst into bloom with pink flowers in real-time. The lighting shifts from cold winter light to warm spring sunshine. The camera pushes in slowly towards the tree. Disney-style magical transformation, cinematic, 8k.",
image_url: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/luma-dream-machine-ray-2-flash-image-to-video.jpg",
end_image_url: "",
aspect_ratio: "16:9",
loop: false,
resolution: "540p",
duration: "5s"
};
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
},
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/luma-dream-machine-ray-2-flash-image-to-video/v1/luma-dream-machine-ray-2-flash-image-to-video-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "Create a magical timelapse transition. The snow melts rapidly to reveal green grass, and the tree branches burst into bloom with pink flowers in real-time. The lighting shifts from cold winter light to warm spring sunshine. The camera pushes in slowly towards the tree. Disney-style magical transformation, cinematic, 8k.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/luma-dream-machine-ray-2-flash-image-to-video.jpg",
"end_image_url": "",
"aspect_ratio": "16:9",
"loop": false,
"resolution": "540p",
"duration": "5s"
}'
Output
{
"request_id": "luma-dream-machine-ray-2-flash-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "/v2/requests/status/luma-dream-machine-ray-2-flash-image-to-video_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": "luma-dream-machine-ray-2-flash-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-dream-machine-ray-2-flash-image-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-dream-machine-ray-2-flash-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"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": "luma-dream-machine-ray-2-flash-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "luma-dream-machine-ray-2-flash-image-to-video",
"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 - Luma Dream Machine Ray 2 Flash Image to Video generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | Detailed text description guiding the video transformation. Include style, lighting, motion, and mood for best results. |
| image_url | Yes | string | — | — | The starting image. Must be a valid HTTP/HTTPS link to a JPEG, PNG, or WebP image. |
| end_image_url | No | string | "" | — | The ending image. If provided, the video will transition from the start image to this end image. Leave empty for single-image generation. |
| aspect_ratio | No | string | "16:9" | "16:9", "9:16", "4:3", "3:4", "21:9", "9:21" | Aspect ratio of the output video. Supported values: "16:9", "9:16", "4:3", "3:4", "21:9", "9:21". |
| loop | No | boolean | false | true, false | If true, the generated video will loop seamlessly. Recommended for background animations or social media content. |
| resolution | No | string | "540p" | "540p", "720p", "1080p" | Output video resolution. Supported values: "540p", "720p", "1080p". Higher resolutions increase processing time. |
| duration | No | string | "5s" | "5s", "9s" | Duration of the output video. Supported values: "5s", "9s". Longer durations allow for more complex transitions. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP | Start or end frame image. |
Minimum Request
{
"prompt": "Create a magical timelapse transition. The snow melts rapidly to reveal green grass, and the tree branches burst into bloom with pink flowers in real-time. The lighting shifts from cold winter light to warm spring sunshine. The camera pushes in slowly towards the tree. Disney-style magical transformation, cinematic, 8k.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/luma-dream-machine-ray-2-flash-image-to-video.jpg"
}
Full Request (all options)
{
"prompt": "Create a magical timelapse transition. The snow melts rapidly to reveal green grass, and the tree branches burst into bloom with pink flowers in real-time. The lighting shifts from cold winter light to warm spring sunshine. The camera pushes in slowly towards the tree. Disney-style magical transformation, cinematic, 8k.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/luma-dream-machine-ray-2-flash-image-to-video.jpg",
"end_image_url": "",
"aspect_ratio": "16:9",
"loop": false,
"resolution": "540p",
"duration": "5s"
}
Response
{
"request_id": "luma-dream-machine-ray-2-flash-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "/v2/requests/status/luma-dream-machine-ray-2-flash-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | Your subscription key |
Response Handling
Common status codes for Luma Dream Machine Ray 2 Flash Image to Video 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 'luma-dream-machine-ray-2-flash-image-to-video' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "luma-dream-machine-ray-2-flash-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "luma-dream-machine-ray-2-flash-image-to-video",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET /v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"/v2/requests/status/luma-dream-machine-ray-2-flash-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "luma-dream-machine-ray-2-flash-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "luma-dream-machine-ray-2-flash-image-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/luma-dream-machine-ray-2-flash-image-to-video_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.
Luma Dream Machine Ray 2 Flash API Pricing
| Resolution | Price (USD) |
|---|---|
| All Resolution / per second | $0.04 |