# MiniMax H3 Max Relight

VIDEOFeaturedminimax-h3-max-relight

**MiniMax H3 Max Relight** from [MiniMax](https://www.minimaxi.com/) lights an existing clip again from a light setup: place each light around the subject and set its colour and brightness, and the footage is re-rendered under that light while its subjects, motion, camera, and soundtrack stay as they were. Provide a source clip of up to 15 seconds; the output runs the same length at 480p, 768p, 1080p, or 2K. Built for matching shots to a scene’s time of day, adding mood to game trailers, and trying lighting looks on a cutscene without re-rendering it.

Best for

Changing the direction, colour, and brightness of the light in existing footage, Keeping the source subjects, motion, camera, and audio, 480p, 768p, 1080p, or 2K output

POST

/v2/workspaces/{workspace\_id}/base-models/minimax-h3-max-relight/inferences

```bash
curl --request POST \
  --url https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/minimax-h3-max-relight/inferences \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "aspect_ratio": "LANDSCAPE_16_9_480p",
  "guidance_file_init_video": [
    {
      "url": "<file_url>"
    }
  ]
}'
```

```python
import requests


url = "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/minimax-h3-max-relight/inferences"


payload = {
    "aspect_ratio": "LANDSCAPE_16_9_480p",
    "guidance_file_init_video": [{ "url": "<file_url>" }]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}


response = requests.post(url, json=payload, headers=headers)


print(response.json())
```

```js
const url = 'https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/minimax-h3-max-relight/inferences';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"aspect_ratio":"LANDSCAPE_16_9_480p","guidance_file_init_video":[{"url":"<file_url>"}]}'
};


try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main


import (
  "fmt"
  "strings"
  "net/http"
  "io"
)


func main() {


  url := "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/minimax-h3-max-relight/inferences"


  payload := strings.NewReader("{\n  \"aspect_ratio\": \"LANDSCAPE_16_9_480p\",\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\n}")


  req, _ := http.NewRequest("POST", url, payload)


  req.Header.Add("Authorization", "Bearer <token>")
  req.Header.Add("Content-Type", "application/json")


  res, _ := http.DefaultClient.Do(req)


  defer res.Body.Close()
  body, _ := io.ReadAll(res.Body)


  fmt.Println(res)
  fmt.Println(string(body))


}
```

```php
<?php


$curl = curl_init();


curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/minimax-h3-max-relight/inferences",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode([
    'aspect_ratio' => 'LANDSCAPE_16_9_480p',
    'guidance_file_init_video' => [
        [
                'url' => '<file_url>'
        ]
    ]
  ]),
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer <token>",
    "Content-Type: application/json"
  ],
]);


$response = curl_exec($curl);
$err = curl_error($curl);


curl_close($curl);


if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
```

```java
OkHttpClient client = new OkHttpClient();


MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n  \"aspect_ratio\": \"LANDSCAPE_16_9_480p\",\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\n}");
Request request = new Request.Builder()
  .url("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/minimax-h3-max-relight/inferences")
  .post(body)
  .addHeader("Authorization", "Bearer <token>")
  .addHeader("Content-Type", "application/json")
  .build();


Response response = client.newCall(request).execute();
```

```ruby
require 'uri'
require 'net/http'


url = URI("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/minimax-h3-max-relight/inferences")


http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true


request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"aspect_ratio\": \"LANDSCAPE_16_9_480p\",\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\n}"


response = http.request(request)
puts response.read_body
```

```csharp
var client = new RestClient("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/minimax-h3-max-relight/inferences");
var request = new RestRequest("", Method.Post);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"aspect_ratio\": \"LANDSCAPE_16_9_480p\",\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\n}", ParameterType.RequestBody);
var response = client.Execute(request);
```

* Layer API

## Authorizations

* **[bearerAuth](/docs/v2/rest-api#bearerauth)**
* **[oauth2](/docs/v2/rest-api#oauth2)**

## Parameters

### Path Parameters

**workspace\_id**

required

_Workspace Id_

Id of the workspace that owns the resource.

string format: uuid

Id of the workspace that owns the resource.

### Query Parameters

**session\_name**

_Session Name_

Organize this run under a named session. A new session is created if none matches.

string

nullable

Organize this run under a named session. A new session is created if none matches.

### Header Parameters

**Idempotency-Key**

string

<= 255 characters

Opaque key making this request safe to retry. The first request with a given key executes; a later request with the same key returns that first response with `Idempotent-Replayed: true` instead of executing again. The key covers the method, path, query, and body it was first used with; reusing it for a different request is rejected with 422\. Replayable for 24 hours.

## Request Bodyrequired

_MiniMax H3 Max Relight_object

**aspect\_ratio**

_Aspect ratio_

The shape and size of the output. Auto follows the shape of the input.

string

default: LANDSCAPE\_16\_9\_480p

Allowed values: AUTO AUTO\_480p AUTO\_768p AUTO\_1080p AUTO\_1440p LANDSCAPE\_21\_9\_480p LANDSCAPE\_16\_9\_480p LANDSCAPE\_4\_3\_480p SQUARE\_480p PORTRAIT\_3\_4\_480p PORTRAIT\_9\_16\_480p LANDSCAPE\_21\_9\_768p LANDSCAPE\_16\_9\_768p LANDSCAPE\_4\_3\_768p SQUARE\_768p PORTRAIT\_3\_4\_768p PORTRAIT\_9\_16\_768p LANDSCAPE\_21\_9\_1080p LANDSCAPE\_16\_9\_1080p LANDSCAPE\_4\_3\_1080p SQUARE\_1080p PORTRAIT\_3\_4\_1080p PORTRAIT\_9\_16\_1080p LANDSCAPE\_21\_9\_1440p LANDSCAPE\_16\_9\_1440p LANDSCAPE\_4\_3\_1440p SQUARE\_1440p PORTRAIT\_3\_4\_1440p PORTRAIT\_9\_16\_1440p

**seed**

_Seed_

The starting point for the model’s randomness. The same seed and settings give the same result.

_Advanced field._

integer

nullable

**guidance\_file\_init\_video**

required

_Source video_

The video to modify

Array<object>

\>= 1 items

_InferenceFormFileRef_

A single guidance/reference file supplied to a `reference_image_list` field.

The slot’s guidance `type` is fixed by the field it’s attached to; the caller supplies the file URL and, where the model supports per-file weighting, a weight.

object

**url**

required

_Url_

string

**weight**

_Weight_

number

nullable

**scene\_lighting**

_Lighting_

Where the light comes from, how bright it is and its colour.

object

**lights**

_Lights_

Array<object>

_OrbitLight_object

**id**

required

_Id_

string

**distance**

required

_Distance_

number

\>= 0.0001

**rotation**

required

_OrbitLightRotation_object

**pitch**

required

_Pitch_

number

\>= -90 <= 90

**yaw**

required

_Yaw_

number

\>= -360 <= 360

**properties**

required

_OrbitLightProperties_object

**intensity**

required

_Intensity_

number

**color\_hex**

required

_Color Hex_

string

/^#(\[A-Fa-f0-9\]{6})$/

**cast\_shadows**

_Cast Shadows_

boolean

nullable

##### Example

```json
{
  "aspect_ratio": "LANDSCAPE_16_9_480p",
  "guidance_file_init_video": [
    {
      "url": "<file_url>"
    }
  ]
}
```

## Responses

### 202

Successful Response

_ExecuteForgeOutput_object

**inference\_id**

required

_Inference Id_

Unique identifier for this forge run.

string format: uuid

**status**

required

_InferenceStatus_

Current status: IN\_PROGRESS.

string

Allowed values: in\_progress complete failed cancelled deleted

**estimated\_price\_creative\_units**

_Estimated Price Creative Units_

Estimated price in Creative Units.

number

nullable

**poll\_interval\_seconds**

required

_Poll Interval Seconds_

Suggested polling interval in seconds.

integer

**created\_at**

required

_Created At_

Timestamp of when the run was created.

string format: date-time

**session\_id**

_Session Id_

Session ID the run was added to, if a session was specified.

string format: uuid

nullable

**normalized\_parameters**

Any of:

**NormalizedInferenceParameters**

_NormalizedInferenceParameters_

Inference parameters after model-specific normalization.

These reflect the actual values used for generation, including model defaults applied for any parameters not explicitly set.

object

**width**

_Width_

Resolved output width in pixels.

integer

nullable

**height**

_Height_

Resolved output height in pixels.

integer

nullable

**batch\_size**

_Batch Size_

Number of outputs to generate.

integer

nullable

**num\_inference\_steps**

_Num Inference Steps_

Resolved number of diffusion steps.

integer

nullable

**guidance\_scale**

_Guidance Scale_

Resolved guidance scale.

number

nullable

**duration\_seconds**

_Duration Seconds_

Resolved output length in seconds — video duration or audio clip length.

number

nullable

**fps**

_Fps_

Resolved FPS.

integer

nullable

**null**

null

##### Example

```json
{
  "status": "in_progress"
}
```

### 401

Unauthenticated — missing or invalid Bearer token.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 403

Forbidden — insufficient permissions, or the access token lacks the scope the operation requires.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 404

Resource not found.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 409

The request with this `Idempotency-Key` is still running — retry after the number of seconds in `Retry-After`.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 422

Invalid input parameters, or an `Idempotency-Key` reused for a different request.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 429

Rate limited — retry after the number of seconds in `Retry-After`.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 500

Internal server error.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```
