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-text-to-video",
"prompt": "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
"duration": 6,
"aspect_ratio": "16:9"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "minimax-h3-text-to-video",
"prompt": "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
"duration": 6,
"aspect_ratio": "16:9"
}
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-text-to-video",
prompt: "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
duration: 6,
aspect_ratio: "16:9"
})
});
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-text-to-video",
"prompt": "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
"duration": 6,
"aspect_ratio": "16:9",
}
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_001",
"object": "video.generation",
"model": "minimax-h3-text-to-video",
"created_at": 1786549095,
"status": "pending",
"task_id": "vid_202608130137_9a1b2c3d"
}
{
"error": {
"message": "The prompt field is required",
"type": "invalid_request_error",
"param": "prompt",
"code": 400
}
}
Hailuo Series
Hailuo 3 Text To Video
MiniMax’s Hailuo 3 (MiniMax H3) generates 2K video from natural-language prompts, with 4–15 second durations, flexible aspect ratios, and per-second billing 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-text-to-video",
"prompt": "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
"duration": 6,
"aspect_ratio": "16:9"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "minimax-h3-text-to-video",
"prompt": "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
"duration": 6,
"aspect_ratio": "16:9"
}
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-text-to-video",
prompt: "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
duration: 6,
aspect_ratio: "16:9"
})
});
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-text-to-video",
"prompt": "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
"duration": 6,
"aspect_ratio": "16:9",
}
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_001",
"object": "video.generation",
"model": "minimax-h3-text-to-video",
"created_at": 1786549095,
"status": "pending",
"task_id": "vid_202608130137_9a1b2c3d"
}
{
"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 subject, action, setting, camera movement, and style
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-text-to-video".string
required
Text description of the video to generate, including subject, motion, scene, camera work, and style.
integer
default:"4"
Video duration in seconds — any integer from 4 to 15. Defaults to 4 when omitted.
string
Output aspect ratio:
"21:9", "16:9", "4:3", "1:1", "3:4", or "9:16".Hailuo 3 generates one video per request — the
n parameter is not supported.
Output resolution is fixed at 2K.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-text-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-text-to-video",
"prompt": "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
"duration": 6,
"aspect_ratio": "16:9"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "minimax-h3-text-to-video",
"prompt": "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
"duration": 6,
"aspect_ratio": "16:9"
}
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-text-to-video",
prompt: "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
duration: 6,
aspect_ratio: "16:9"
})
});
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-text-to-video",
"prompt": "a chef plating a colorful dessert in a modern kitchen, shallow depth of field",
"duration": 6,
"aspect_ratio": "16:9",
}
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_001",
"object": "video.generation",
"model": "minimax-h3-text-to-video",
"created_at": 1786549095,
"status": "pending",
"task_id": "vid_202608130137_9a1b2c3d"
}
{
"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-text-to-video.
Available options:
minimax-h3-text-to-video Text description of the video to generate
Duration in seconds (4-15)
Required range:
4 <= x <= 15Available options:
21:9, 16:9, 4:3, 1:1, 3:4, 9:16 Was this page helpful?