# ID-V2V Relight

> Change a video’s lighting using a relit reference frame while preserving the scene, subjects, and original performance. ID-V2V Relight propagates the new illumination across the video.


## Overview

- **Endpoint**: `https://fal.run/fal-ai/id-v2v/relight`
- **Model ID**: `fal-ai/id-v2v/relight`
- **Category**: video-to-video
- **Kind**: inference
**Description**: ID-V2V Relight changes the illumination of an existing video while aiming to preserve the full scene, including foreground subjects, background, objects, and original performance. It is the dedicated relighting workflow of ID-V2V, developed by researchers at Eyeline Labs and Netflix.

Provide the source video, a relit first-frame image showing the desired lighting, and a text prompt. The model propagates that lighting treatment through the video while retaining the subjects’ identity, expressions, gaze, and motion. Optional keyframes provide additional visual anchors.

Unlike general scene restylization, this workflow uses the source video directly as its conditioning signal without subject-segmentation preprocessing. This fal endpoint supports 480p and 720p output, with orientation following the source video.

Project: https://eyeline-labs.github.io/ID-V2V/
Code: https://github.com/Eyeline-Labs/ID-V2V
Weights: https://huggingface.co/Eyeline-Labs/ID-V2V
License: Apache-2.0.

**Tags**: relighting, editing, cinematic



## Pricing

- **Price**: $0.2 per seconds

For more details, see [fal.ai pricing](https://fal.ai/pricing).

## API Information

This model can be used via our HTTP API or more conveniently via our client libraries.
See the input and output schema below, as well as the usage examples.


### Input Schema

The API accepts the following input parameters:


- **`prompt`** (`string`, _required_):
  The prompt describing the restyled video to generate.
  - Examples: "An astronaut walking through an autumn forest"

- **`video_url`** (`string`, _required_):
  URL of the source video whose motion and framing drive the generation.
  - Examples: "https://storage.googleapis.com/falserverless/model_tests/video_models/mmaudio_input.mp4"

- **`image_url`** (`string`, _required_):
  URL of the restyled first frame. The video is regenerated in this frame's identity/style.
  - Examples: "https://storage.googleapis.com/falserverless/example_inputs/ltxv-image-input.jpg"

- **`keyframes`** (`list<Keyframe>`, _optional_):
  Optional restyled keyframes pinned at specific output frame indices to anchor identity over long videos.
  - Array of Keyframe

- **`resolution`** (`ResolutionEnum`, _optional_):
  Output resolution tier. Orientation follows the source video (720p is 1280x720 or 720x1280; 480p is 832x480 or 480x832). Default value: `"720p"`
  - Default: `"720p"`
  - Options: `"480p"`, `"720p"`

- **`num_frames`** (`integer`, _optional_):
  Maximum number of output frames. Capped at the source video's frame count. Default value: `81`
  - Default: `81`
  - Range: `17` to `241`

- **`num_inference_steps`** (`integer`, _optional_):
  Number of diffusion sampling steps per clip. Higher improves quality but is slower. Default value: `30`
  - Default: `30`
  - Range: `2` to `40`

- **`guidance_scale`** (`float`, _optional_):
  Classifier-free guidance scale. Controls prompt adherence versus creativity. Default value: `5`
  - Default: `5`
  - Range: `1` to `10`

- **`vace_scale`** (`float`, _optional_):
  VACE conditioning scale. Controls how strongly the source video's structure constrains the generation. Default value: `1`
  - Default: `1`
  - Range: `0` to `2`

- **`seed`** (`integer`, _optional_):
  Random seed for reproducibility. The same seed is used for every clip of a multi-clip generation.

- **`enable_safety_checker`** (`boolean`, _optional_):
  Enable safety checking of inputs and outputs. Default value: `true`
  - Default: `true`



**Required Parameters Example**:

```json
{
  "prompt": "An astronaut walking through an autumn forest",
  "video_url": "https://storage.googleapis.com/falserverless/model_tests/video_models/mmaudio_input.mp4",
  "image_url": "https://storage.googleapis.com/falserverless/example_inputs/ltxv-image-input.jpg"
}
```

**Full Example**:

```json
{
  "prompt": "An astronaut walking through an autumn forest",
  "video_url": "https://storage.googleapis.com/falserverless/model_tests/video_models/mmaudio_input.mp4",
  "image_url": "https://storage.googleapis.com/falserverless/example_inputs/ltxv-image-input.jpg",
  "keyframes": [
    {
      "image_url": "https://storage.googleapis.com/falserverless/example_inputs/ltxv-image-input.jpg",
      "frame_index": 80
    }
  ],
  "resolution": "720p",
  "num_frames": 81,
  "num_inference_steps": 30,
  "guidance_scale": 5,
  "vace_scale": 1,
  "enable_safety_checker": true
}
```


### Output Schema

The API returns the following output format:

- **`video`** (`File`, _required_):
  The generated video file.
  - Examples: {"content_type":"video/mp4","file_name":"output.mp4","file_size":1048576,"url":"https://storage.googleapis.com/falserverless/example_outputs/scail2-output.mp4"}

- **`seed`** (`integer`, _required_):
  The seed used for generation.



**Example Response**:

```json
{
  "video": {
    "content_type": "video/mp4",
    "file_name": "output.mp4",
    "file_size": 1048576,
    "url": "https://storage.googleapis.com/falserverless/example_outputs/scail2-output.mp4"
  }
}
```


## Usage Examples

### cURL

```bash
curl --request POST \
  --url https://fal.run/fal-ai/id-v2v/relight \
  --header "Authorization: Key $FAL_KEY" \
  --header "Content-Type: application/json" \
  --data '{
     "prompt": "An astronaut walking through an autumn forest",
     "video_url": "https://storage.googleapis.com/falserverless/model_tests/video_models/mmaudio_input.mp4",
     "image_url": "https://storage.googleapis.com/falserverless/example_inputs/ltxv-image-input.jpg"
   }'
```

### Python

Ensure you have the Python client installed:

```bash
pip install fal-client
```

Then use the API client to make requests:

```python
import fal_client

def on_queue_update(update):
    if isinstance(update, fal_client.InProgress):
        for log in update.logs:
           print(log["message"])

result = fal_client.subscribe(
    "fal-ai/id-v2v/relight",
    arguments={
        "prompt": "An astronaut walking through an autumn forest",
        "video_url": "https://storage.googleapis.com/falserverless/model_tests/video_models/mmaudio_input.mp4",
        "image_url": "https://storage.googleapis.com/falserverless/example_inputs/ltxv-image-input.jpg"
    },
    with_logs=True,
    on_queue_update=on_queue_update,
)
print(result)
```

### JavaScript

Ensure you have the JavaScript client installed:

```bash
npm install --save @fal-ai/client
```

Then use the API client to make requests:

```javascript
import { fal } from "@fal-ai/client";

const result = await fal.subscribe("fal-ai/id-v2v/relight", {
  input: {
    prompt: "An astronaut walking through an autumn forest",
    video_url: "https://storage.googleapis.com/falserverless/model_tests/video_models/mmaudio_input.mp4",
    image_url: "https://storage.googleapis.com/falserverless/example_inputs/ltxv-image-input.jpg"
  },
  logs: true,
  onQueueUpdate: (update) => {
    if (update.status === "IN_PROGRESS") {
      update.logs.map((log) => log.message).forEach(console.log);
    }
  },
});
console.log(result.data);
console.log(result.requestId);
```


## Additional Resources

### Documentation

- [Model Playground](https://fal.ai/models/fal-ai/id-v2v/relight)
- [API Documentation](https://fal.ai/models/fal-ai/id-v2v/relight/api)
- [OpenAPI Schema](https://fal.ai/api/openapi/queue/openapi.json?endpoint_id=fal-ai/id-v2v/relight)

### fal.ai Platform

- [Platform Documentation](https://fal.ai/docs/documentation)
- [Python Client](https://fal.ai/docs/api-reference/client-libraries/python)
- [JavaScript Client](https://fal.ai/docs/api-reference/client-libraries/javascript)

### Other agent-readable surfaces

This file covers one model. To find anything else:

- [Platform overview](https://fal.ai/llms.txt): Entry points and representative endpoint IDs
- [Documentation index](https://fal.ai/docs/llms.txt): Every documentation page
- [Full documentation text](https://fal.ai/docs/llms-full.txt): The whole documentation inlined
- Any other model: `https://fal.ai/models/<endpoint-id>/llms.txt`
