curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "minimax-h3-reference-to-video",
"prompt": "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
"image_urls": [
"https://example.com/character-ref.png",
"https://example.com/product-ref.png"
],
"duration": 6
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "minimax-h3-reference-to-video",
"prompt": "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
"image_urls": [
"https://example.com/character-ref.png",
"https://example.com/product-ref.png"
],
"duration": 6
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "minimax-h3-reference-to-video",
prompt: "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
image_urls: [
"https://example.com/character-ref.png",
"https://example.com/product-ref.png"
],
duration: 6
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "minimax-h3-reference-to-video",
"prompt": "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
"image_urls": []string{
"https://example.com/character-ref.png",
"https://example.com/product-ref.png",
},
"duration": 6,
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_h3_003",
"object": "video.generation",
"model": "minimax-h3-reference-to-video",
"created_at": 1786549095,
"status": "pending",
"task_id": "vid_202608130145_1c2d3e4f"
}
{
"error": {
"message": "The prompt field is required",
"type": "invalid_request_error",
"param": "prompt",
"code": 400
}
}
Hailuo Series
Hailuo 3 Reference To Video
MiniMax’s Hailuo 3 (MiniMax H3) generates 2K video guided by multimodal references — images, video clips, and audio — for character and product consistency, billed per second via Vibetool’s asynchronous API.
POST
/
v1
/
videos
/
generations
curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "minimax-h3-reference-to-video",
"prompt": "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
"image_urls": [
"https://example.com/character-ref.png",
"https://example.com/product-ref.png"
],
"duration": 6
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "minimax-h3-reference-to-video",
"prompt": "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
"image_urls": [
"https://example.com/character-ref.png",
"https://example.com/product-ref.png"
],
"duration": 6
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "minimax-h3-reference-to-video",
prompt: "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
image_urls: [
"https://example.com/character-ref.png",
"https://example.com/product-ref.png"
],
duration: 6
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "minimax-h3-reference-to-video",
"prompt": "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
"image_urls": []string{
"https://example.com/character-ref.png",
"https://example.com/product-ref.png",
},
"duration": 6,
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_h3_003",
"object": "video.generation",
"model": "minimax-h3-reference-to-video",
"created_at": 1786549095,
"status": "pending",
"task_id": "vid_202608130145_1c2d3e4f"
}
{
"error": {
"message": "The prompt field is required",
"type": "invalid_request_error",
"param": "prompt",
"code": 400
}
}
Pricing: See vibetool.ai/pricing for current rates.
Input Modalities
- Text – a prompt describing the desired video
- Image – up to 9 reference images via
image_urls - Video – up to 3 reference clips via
video_urls(each 2–15 seconds) - Audio – up to 3 reference audio tracks via
audio_url(each 2–15 seconds)
Output Modality
- Video – a 2K MP4 file, 4–15 seconds long
Authorization
string
required
All APIs require Bearer Token authentication. Format:
Bearer YOUR_API_KEYRequest Body
string
required
The model identifier. Use
"minimax-h3-reference-to-video".string
required
Text description of the video to generate. Reference the supplied assets to keep characters and products consistent.
array of strings
Up to 9 publicly accessible reference image URLs for character, product, or style consistency.
array of strings
Up to 3 publicly accessible reference video URLs, each 2–15 seconds long.
string
A publicly accessible reference audio URL, 2–15 seconds long.
integer
default:"4"
Video duration in seconds — any integer from 4 to 15. Defaults to 4 when omitted.
Billing is per second of output video. When a video reference is supplied,
the reference clip’s length is added to the billable duration; image and audio
references bill on output seconds only. Additional charges apply to input
images beyond the first five — see the pricing page. One video per request;
the
n parameter is not supported.Response Schema
string
required
Unique identifier for the generation task.
string
required
Type of object, always
"video.generation".string
required
The model used, e.g.,
"minimax-h3-reference-to-video".integer
required
Unix timestamp (seconds) of task creation.
string
required
Initial status:
"pending" or "processing". Use the Get Video Status endpoint to poll for completion.string
required
The task ID to query in the status endpoint.
curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "minimax-h3-reference-to-video",
"prompt": "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
"image_urls": [
"https://example.com/character-ref.png",
"https://example.com/product-ref.png"
],
"duration": 6
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "minimax-h3-reference-to-video",
"prompt": "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
"image_urls": [
"https://example.com/character-ref.png",
"https://example.com/product-ref.png"
],
"duration": 6
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "minimax-h3-reference-to-video",
prompt: "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
image_urls: [
"https://example.com/character-ref.png",
"https://example.com/product-ref.png"
],
duration: 6
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "minimax-h3-reference-to-video",
"prompt": "the model from the reference photos walks through a sunlit atrium wearing the featured jacket",
"image_urls": []string{
"https://example.com/character-ref.png",
"https://example.com/product-ref.png",
},
"duration": 6,
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_h3_003",
"object": "video.generation",
"model": "minimax-h3-reference-to-video",
"created_at": 1786549095,
"status": "pending",
"task_id": "vid_202608130145_1c2d3e4f"
}
{
"error": {
"message": "The prompt field is required",
"type": "invalid_request_error",
"param": "prompt",
"code": 400
}
}
task_id until status is "completed" and the generated video URL is available.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Use minimax-h3-reference-to-video.
Available options:
minimax-h3-reference-to-video Text description of the video to generate
Up to 9 reference images
Maximum array length:
9Up to 3 reference clips, 2-15s each
Maximum array length:
3Reference audio, 2-15s
Duration in seconds (4-15)
Required range:
4 <= x <= 15Was this page helpful?