# Luma Ray 3.2 Video to Video API

> تحرير فيديو باستخدام Ray 3.2 يعيد تصميم فيديو مصدر مع إعدادات وعناصر تحكم في قوة التحرير وإطارات مفتاحية

يحرر `video_url` وفقًا لـ `prompt`، مع `start_image_url` اختياري لتوجيه الإطار الأول. يوفر `edit_strength` مستويات adhere وflex وreimagine من 1 إلى 3، بينما يوفر `auto_controls` أو كائن `controls` شرطًا بديلًا. يمكن تثبيت ما يصل إلى 64 من `keyframes` باستخدام `keyframe_indexes`. يتراوح الناتج من 540p إلى 1080p، ومدته 5s أو 10s، مع `hdr` و`exr_export` اختياريين.

- Model id: `luma/agent/ray/v3.2/video-to-video`
- Made by: Luma AI
- Category: Video to Video
- Output: video
- Price: from $0.144 / second (5 s ≈ $0.72) (cheapest run $0.72 (720 API credits))
- Run: `POST https://api.doitong.ru/v1/run/luma/agent/ray/v3.2/video-to-video`
- Quote: `POST https://api.doitong.ru/v1/quote/luma/agent/ray/v3.2/video-to-video`
- Docs page: https://doitong.com/ar/developers/models/luma/agent/ray/v3.2/video-to-video

## Pricing

Price: **from $0.144 / second (5 s ≈ $0.72)** (the lowest tier; the quote prices your exact input). Billed per second of output (`duration`, default 10).

Price rules (the first rule that matches the input wins; a parameter you leave out counts as its default):

- When `exr_export` = true and `hdr` = true and `resolution` = 1080p: $1.296 (1296 API credits) / second
- When `exr_export` = true and `hdr` = true: $0.648 (648 API credits) / second
- When `hdr` = true and `resolution` = 1080p: $0.864 (864 API credits) / second
- When `hdr` = true: $0.432 (432 API credits) / second
- When `resolution` = 1080p: $0.432 (432 API credits) / second
- When `resolution` = 720p: $0.216 (216 API credits) / second

The full example input below costs $0.72 = 720 API credits (5 s × 144 API credits).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.ru/v1/quote/luma/agent/ray/v3.2/video-to-video` with the same JSON body returns the exact price for that input; the quote is exactly what a run charges. Invalid input is never charged and failed or canceled requests are refunded automatically.

## Input parameters

Send either the canonical name or the native field name (not both). Canonical names are the same across models.

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `prompt` |  | string | yes |  | 1 – 6000 characters | تعليمات نصية لتحرير فيديو المصدر. |
| `video_url` | `video` | string (video URL) | yes |  | ≥ 1 characters | عنوان URL للفيديو الجاري تحريره. |
| `user` |  | string \| null | no |  |  | معرّف معتم اختياري يحدد المستخدم النهائي الذي يرسل الطلب. |
| `start_image_url` | `image` | string (image URL) \| null | no |  |  | تجاوز الإطار الأول للفيديو المحرر، ويُقدَّم كعنوان URL اختياري لصورة؛ وعند حذفه، يستخرج النموذج ذلك الإطار من فيديو المصدر. مثلًا، يمكن لتقديم صورة افتتاحية معاد تصميمها من المصدر أن يوجه مظهر التحرير. |
| `resolution` |  | enum (string) | no | `540p` | `540p`, `720p`, `1080p` | دقة المخرج بعد التحرير. |
| `duration` |  | enum (string) | no | `5s` | `5s`, `10s` | طول الفيديو بعد التحرير. |
| `edit_strength` |  | enum (string) \| null | no |  | `adhere_1`, `adhere_2`, `adhere_3`, `flex_1`, `flex_2`, `flex_3`, `reimagine_1`, `reimagine_2`, `reimagine_3` | إعداد الحفاظ على المصدر للتحرير، ولا يتاح إلا عند عدم استخدام auto_controls؛ ويختار الحذف الإعداد الافتراضي للنموذج. من أكبر اختلاف إلى أقرب التزام، الخيارات هي 'reimagine_*' ثم 'flex_*' للنتيجة المتوازنة ثم 'adhere_*'. |
| `auto_controls` |  | boolean | no | `false` |  | تهيئة التحرير التلقائية: يستخدم النموذج فيديو المصدر لتحديد الجدول بدلًا من قبول edit_strength مع هذا الخيار. |
| `hdr` |  | boolean | no | `false` |  | ترميز HDR لمخرج MP4 بدقة 720p أو 1080p، ولا يتاح إلا للحسابات التي تملك وصول HDR. |
| `exr_export` |  | boolean | no | `false` |  | تصدير EXR إضافي يرافق MP4، ولا يتاح إلا مع كل من وصول HDR وhdr=true. |
| `controls` |  | object {pose, depth, normals, trajectory, face} \| null | no |  |  | بديل دقيق لـ edit_strength يضبط التهيئة بصورة منفصلة للوضعية والعمق والطبيعيّات والمسار والوجه. يستبعد استخدام عناصر التحكم هذه auto_controls. |
| `controls.pose` |  | object {enabled, strength} \| null | no |  |  | تهيئة تستند إلى الوضعية أو الهيكل العظمي. |
| `controls.pose.enabled` |  | boolean | no | `true` |  | مفتاح تبديل لتهيئة الوضعية أو الهيكل العظمي أثناء التحرير. |
| `controls.pose.strength` |  | enum (string) \| null | no |  | `precise`, `coarse` | اختيار دقة تهيئة الوضعية: احتفظ بالافتراضي بحذفه، أو اختر 'coarse' لمزيد من الحرية، أو استخدم 'precise' لتتبع وضعية المصدر بدقة. |
| `controls.depth` |  | object {enabled, blur} \| null | no |  |  | تهيئة تستند إلى العمق أو هندسة المشهد. |
| `controls.depth.enabled` |  | boolean | no | `true` |  | مفتاح تبديل لتهيئة العمق أو هندسة المشهد أثناء التحرير. |
| `controls.depth.blur` |  | number \| null | no |  | 0 – 1 | إعداد تمويه العمق، ويُترك دون تحديد للاحتفاظ بالافتراضي أو يُزاد لمنح الهندسة حرية أكبر. |
| `controls.normals` |  | object {enabled, augmentation} \| null | no |  |  | تهيئة تستند إلى العموديّات السطحية. |
| `controls.normals.enabled` |  | boolean | no | `true` |  | مفتاح تبديل لتهيئة العموديّات السطحية أثناء التحرير. |
| `controls.normals.augmentation` |  | number \| null | no |  | 0 – 1 | إعداد تعزيز العموديّات السطحية؛ احتفظ بالافتراضي بحذفه أو زده للسماح بإعادة تفسير أكبر لهندسة السطح. |
| `controls.trajectory` |  | object {enabled, sparsity} \| null | no |  |  | تهيئة تستند إلى مسارات الحركة. |
| `controls.trajectory.enabled` |  | boolean | no | `true` |  | مفتاح تبديل لتهيئة مسار الحركة أثناء التحرير. |
| `controls.trajectory.sparsity` |  | number \| null | no |  | 0 – 1 | إعداد تناثر مسار الحركة؛ احذفه للاحتفاظ بالافتراضي أو زده لتقليل عدد مثبتات الحركة المستخدمة. |
| `controls.face` |  | object {enabled} \| null | no |  |  | تهيئة تستند إلى هوية الوجه. |
| `controls.face.enabled` |  | boolean | no | `true` |  | مفتاح تبديل لتهيئة هوية الوجه أثناء التحرير. |
| `keyframes` |  | array of string \| null | no |  | 1 – 64 items | إرشادات تحرير متعددة الإطارات المفتاحية تُقدَّم كعناوين URL للصور بدلًا من start_image_url. قدّم keyframes مع مصفوفة keyframe_indexes مساوية لها في الطول لتثبيت كل صورة عند موضع إطارها في فيديو المصدر؛ ويُسمح بحد أقصى 64 عنوان URL. |
| `keyframe_indexes` |  | array of integer \| null | no |  | 1 – 64 items | تعيين إطار المصدر المقترن واحدًا لواحد مع keyframes: يحدد العنصر [i] موضع تثبيت keyframes[i]. يجب أن تكون المصفوفتان متساويتين في الطول، وأن تكون المواضع متميزة وغير سالبة. |
| `enable_safety_checker` |  | boolean | no | `true` |  | يمكن تخفيف الفحص بضبط القيمة على false، شريطة أن يكون المستدعي مخولًا بذلك. |

File parameters (`video`, `image`) take a public `https://` URL, a `data:` URI up to 10 MB, or the `file_url` of an upload from `POST /files`.

## Example input

Required parameters only:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
  "video": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
}
```

A fuller example:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
  "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
}
```

## Run it

Set `DOITONG_API_KEY` to a key from https://doitong.com/developers/dashboard#keys. `?wait=20` returns the finished request in the same call when it is ready within 20 seconds; otherwise poll `GET /requests/{id}` (it also accepts `?wait=`), or pass `webhook_url`.

### curl

```bash
# Run the model; wait up to 20 s for the finished result in the same call
curl -X POST "https://api.doitong.ru/v1/run/luma/agent/ray/v3.2/video-to-video?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.ru/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.ru/v1";
const headers = {
  "Authorization": "Bearer " + process.env.DOITONG_API_KEY,
  "Content-Type": "application/json",
};

// Run the model; wait up to 20 s for the finished result in the same call
let res = await fetch(API + "/run/luma/agent/ray/v3.2/video-to-video?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  }),
});
let request = await res.json();
if (!res.ok) throw new Error(request.error.code + ": " + request.error.message);

// Not finished yet: long-poll until it is
while (request.status === "queued" || request.status === "running") {
  res = await fetch(API + "/requests/" + request.id + "?wait=20", { headers });
  request = await res.json();
}
if (request.status !== "succeeded") throw new Error(JSON.stringify(request.error));
console.log(request.outputs.map((o) => o.url), request.cost.credits + " API credits ($" + request.cost.usd + ")");
```

### Python

```python
import os
import requests

API = "https://api.doitong.ru/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/luma/agent/ray/v3.2/video-to-video", params={"wait": 20}, json=payload, headers=headers)
request = r.json()
if not r.ok:
    raise RuntimeError(request["error"]["code"] + ": " + request["error"]["message"])

# Not finished yet: long-poll until it is
while request["status"] in ("queued", "running"):
    request = requests.get(API + "/requests/" + request["id"], params={"wait": 20}, headers=headers).json()
if request["status"] != "succeeded":
    raise RuntimeError(request["error"])
print([o["url"] for o in request["outputs"]], request["cost"]["credits"], "API credits", "$" + request["cost"]["usd"])
```

### MCP

The MCP server at `https://api.doitong.ru/v1/mcp` exposes the tools `search_models`, `get_model`, `quote`, `run`, `get_request`, `cancel_request`, `list_requests`, `create_upload` and `get_account`. A `run` call for this model:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run",
    "arguments": {
      "model_id": "luma/agent/ray/v3.2/video-to-video",
      "input": {
        "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
        "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
      },
      "wait_seconds": 20
    }
  }
}
```

## Response

Every call returns a request object. `status` is one of `queued`, `running`, `succeeded`, `failed`, `canceled`. `outputs` lists the generated files with URLs on our storage (kept forever, or 7 days with `?storage=temporary`; `storage` says which); `output` is the model's own result object with the same URLs.

```json
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "luma/agent/ray/v3.2/video-to-video",
  "status": "succeeded",
  "created_at": "2026-10-20T12:00:00Z",
  "started_at": "2026-10-20T12:00:02Z",
  "completed_at": "2026-10-20T12:00:09Z",
  "queue_position": null,
  "cost": {
    "credits": 720,
    "usd": "0.72",
    "charged": 720,
    "refunded": 0
  },
  "input": {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  },
  "output": {
    "video": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_name": "0-output.mp4",
      "file_size": 1843200
    },
    "exr_file": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_name": "0-output.mp4",
      "file_size": 1843200
    }
  },
  "outputs": [
    {
      "type": "video",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_size": 1843200,
      "width": 1280,
      "height": 720,
      "duration": 5,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `video` | object {url, content_type, file_name, file_size} | الفيديو الذي أنتجه النموذج. |
| `exr_file` | object {url, content_type, file_name, file_size} \| null | ملف EXR جانبي بصيغة تصدير Luma: إما ملف EXR واحد أو أرشيف ZIP. يُولَّد عند ضبط exr_export على true. |

## Related models

- [Luma Ray 3.2 Text to Video](https://doitong.com/developers/models/luma/agent/ray/v3.2/text-to-video.md) (`luma/agent/ray/v3.2/text-to-video`): from $0.10 / second
- [Luma Ray 3.2 Image to Video](https://doitong.com/developers/models/luma/agent/ray/v3.2/image-to-video.md) (`luma/agent/ray/v3.2/image-to-video`): from $0.03 / second
- [Luma Ray 3.2 Reframe](https://doitong.com/developers/models/luma/agent/ray/v3.2/reframe.md) (`luma/agent/ray/v3.2/reframe`): from $0.06 / second of input video
- [AMT Interpolation](https://doitong.com/developers/models/amt-interpolation.md) (`amt-interpolation`): $0.000575 / second of processing time
- [AnimateDiff Turbo · Video to Video](https://doitong.com/developers/models/fast-animatediff/turbo/video-to-video.md) (`fast-animatediff/turbo/video-to-video`): $0.00125 / second of processing time
- [AnimateDiff · Video to Video](https://doitong.com/developers/models/fast-animatediff/video-to-video.md) (`fast-animatediff/video-to-video`): $0.00125 / second of processing time
- [Auto-Captioner](https://doitong.com/developers/models/auto-caption.md) (`auto-caption`): $0.10 / video
- [Bernini-R Edit Video](https://doitong.com/developers/models/bernini-r/edit-video.md) (`bernini-r/edit-video`): from $0.04 / second of output video

## Links

- HTML page: https://doitong.com/developers/models/luma/agent/ray/v3.2/video-to-video
- All models and guides for AI agents: https://doitong.com/developers/llms.txt
- OpenAPI 3.1 with this model's typed request body: https://doitong.com/developers/openapi.json?model=luma/agent/ray/v3.2/video-to-video
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.ru/v1/models/luma/agent/ray/v3.2/video-to-video
