MiniMax H3 Max Relight
VIDEOFeaturedminimax-h3-max-relight
MiniMax H3 Max Relight from MiniMax 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.
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>" } ]}'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())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);}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
$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;}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();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_bodyvar 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);Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Id of the workspace that owns the resource.
Id of the workspace that owns the resource.
Query Parameters
Section titled “Query Parameters”Organize this run under a named session. A new session is created if none matches.
Organize this run under a named session. A new session is created if none matches.
Header Parameters
Section titled “Header Parameters”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
Section titled “Request Bodyrequired”object
The shape and size of the output. Auto follows the shape of the input.
The starting point for the model’s randomness. The same seed and settings give the same result.
Advanced field.
The video to modify
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
Where the light comes from, how bright it is and its colour.
object
object
object
object
Example
{ "aspect_ratio": "LANDSCAPE_16_9_480p", "guidance_file_init_video": [ { "url": "<file_url>" } ]}Responses
Section titled “Responses”Successful Response
object
Unique identifier for this forge run.
Current status: IN_PROGRESS.
Estimated price in Creative Units.
Suggested polling interval in seconds.
Timestamp of when the run was created.
Session ID the run was added to, if a session was specified.
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
Resolved output width in pixels.
Resolved output height in pixels.
Number of outputs to generate.
Resolved number of diffusion steps.
Resolved guidance scale.
Resolved output length in seconds — video duration or audio clip length.
Resolved FPS.
Example
{ "status": "in_progress"}Unauthenticated — missing or invalid Bearer token.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Forbidden — insufficient permissions, or the access token lacks the scope the operation requires.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Resource not found.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}The request with this Idempotency-Key is still running — retry after the number of seconds in Retry-After.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Invalid input parameters, or an Idempotency-Key reused for a different request.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Rate limited — retry after the number of seconds in Retry-After.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Internal server error.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}