Bỏ qua để đến nội dung

MiniMax Hailuo

Hailuo là dòng tạo video của MiniMax. Một kênh phục vụ hai thế hệ API: MiniMax-H3 và MiniMax-H3-Max dùng API /v2 của MiniMax với mảng content và quyết toán theo giây, còn dòng MiniMax-Hailuo-2.3 dùng API /v1 cũ với giá cố định theo tác vụ (trình bày ở cuối trang).

Tác vụ được gửi, truy vấn và tải xuống qua các endpoint chung mô tả tại Tạo tác vụ và Truy vấn tác vụ. Trang này nói rõ nhà cung cấp này đọc những trường nào, yêu cầu được dựng ra sao và cách tính phí.

ID mô hìnhĐộ phân giảiThời lượng (giây nguyên)Mặc địnhMở rộng prompt
MiniMax-H3768P, 2K4–15768P, 5 giâyKhông
MiniMax-H3-Max480P, 768P5–15768P, 5 giâyCó
  • ID mô hình phân biệt hoa thường, hãy ghi đúng như bảng trên. Tài khoản chỉ dùng được những mô hình được định tuyến tới nó, và giá phụ thuộc từng tài khoản; GET /v1/models là danh sách có thẩm quyền cho khóa của bạn.
  • Chỉ MiniMax-H3-Max nhận extra. Gửi extra tới MiniMax-H3 trả về 400.
  • Cả hai mô hình đều hỗ trợ văn bản thành video, khung đầu, khung đầu và cuối, cùng ảnh / video / âm thanh tham chiếu.
TrườngKiểuBắt buộcMặc địnhMô tả
modelstringCó—ID mô hình từ GET /v1/models
promptstringCó—Prompt; rỗng sau khi bỏ khoảng trắng sẽ bị từ chối. Tối đa 7000 ký tự
resolutionstringKhông768PKhông phân biệt hoa thường; phải là một trong các độ phân giải của mô hình
durationintegerKhông5Số giây nguyên trong phạm vi của mô hình
secondsstringKhông—Dạng chuỗi của thời lượng; chỉ đọc khi không có duration hoặc duration là 0
ratiostringKhôngxem bên dướiTỷ lệ khung hình
imagesstring[]Không—1 ảnh = khung đầu, 2 ảnh = khung đầu rồi khung cuối. Tối đa 2 ảnh
imagestringKhông—Một ảnh duy nhất; chỉ dùng khi images trống
metadataobjectKhông—Tham số của MiniMax, xem phần tiếp theo

Quy tắc ưu tiên:

  • metadata.resolution, metadata.duration và metadata.ratio ghi đè các trường cùng tên ở cấp cao nhất.
  • seconds chỉ được đọc khi duration cấp cao nhất không có hoặc bằng 0, và metadata.duration ưu tiên hơn cả hai.
  • metadata.duration được phân tích như số, nên 5.5 báo invalid duration. Khác với duration cấp cao nhất, 0 ở đây không phải “chưa đặt” mà là ngoài phạm vi. Muốn giữ mặc định thì bỏ hẳn khóa này.
  • Không hỗ trợ size. size ở cấp cao nhất hoặc metadata.size trả về MiniMax-H3 请使用 resolution(480P/768P/2K),不支持 size; hãy dùng resolution.
  • Ngoài size, các trường cấp cao nhất mà nhà cung cấp này không đọc (ví dụ generate_audio, input_reference) bị bỏ qua chứ không bị từ chối.
TrườngKiểuMô tả
contentarrayVật liệu đầu vào, xem Mục content và giới hạn. Không dùng chung với images / image cấp cao nhất
resolutionstringGhi đè resolution cấp cao nhất
durationnumberGhi đè duration và seconds cấp cao nhất; phải là số nguyên trong phạm vi
ratiostringGhi đè ratio cấp cao nhất
aigc_watermarkboolean hoặc stringtrue / false. Cũng nhận chuỗi "true" / "false", đúng như biểu mẫu multipart gửi đi. Bỏ trống thì upstream quyết định
extra.prompt_expansion_modestringdisabled, balanced hoặc quality. Chỉ MiniMax-H3-Max
size—Bị từ chối với 400

metadata được giải mã vào cấu trúc có kiểu: sai kiểu JSON ở một trong các khóa trên (ví dụ "duration": "abc", hay content là object) trả về 400 với invalid metadata: ... và không bị tính phí. Các khóa không có trong bảng — seed, callback_url… — bị bỏ qua và không bao giờ tới MiniMax; không có callback nào được gửi, hãy truy vấn để lấy kết quả.

Giá trị hợp lệ: adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16. Không phân biệt hoa thường.

Dạng yêu cầuBỏ trống ratioQuy tắc
Chỉ văn bản (không khung, không tham chiếu)16:9adaptive bị từ chối với text-to-video does not support ratio adaptive
Khung đầu, hoặc khung đầu và cuốiadaptiveBị ép thành adaptive; giá trị bạn gửi bị bỏ qua và không được kiểm tra
Vật liệu tham chiếuadaptiveDùng được cả bảy giá trị

metadata.content là mảng có thứ tự. Mỗi mục có một type, một trường payload tương ứng với kiểu đó, và role tùy chọn:

typePayloadrole được phépGiới hạn
texttextkhông1, và phải bằng prompt
image_urlimage_url.urlfirst_frame1
image_urlimage_url.urllast_frame1, và cần có first_frame
image_urlimage_url.urlreference_image9
image_urlimage_url.urlkhôngchỉ khi là vật liệu duy nhất
video_urlvideo_url.urlreference_video (bắt buộc)3
audio_urlaudio_url.urlreference_audio (bắt buộc)3
{ "type": "image_url", "role": "reference_image", "image_url": { "url": "https://..." } }
{ "type": "video_url", "role": "reference_video", "video_url": { "url": "https://..." } }
{ "type": "audio_url", "role": "reference_audio", "audio_url": { "url": "https://..." } }

Các quy tắc được kiểm tra trước khi gửi:

  • Tối đa 12 vật liệu mỗi yêu cầu, trong đó tối đa 9 ảnh tham chiếu, 3 video tham chiếu và 3 âm thanh tham chiếu.
  • Ảnh khung đầu / khung cuối và vật liệu tham chiếu không được trộn. reference_image, reference_video và reference_audio kết hợp tự do với nhau.
  • Mục image_url không có role chỉ được phép khi nó là vật liệu duy nhất; khi đó được coi là first_frame.
  • Nếu content không có mục text, RouteAPI thêm một mục ở đầu mang prompt cấp cao nhất. Nếu có, chỉ được một mục và nội dung phải bằng prompt sau khi bỏ khoảng trắng đầu cuối, nếu không sẽ báo prompt 与 metadata.content 中的 text 冲突.
  • content và images / image cấp cao nhất loại trừ nhau.
  • Chỉ trường khớp với type của mục được chuyển tiếp; các khóa thừa bị bỏ.
  • URL vật liệu — kể cả images / image cấp cao nhất — phải là http://, https:// hoặc data: URI (ví dụ data:image/png;base64,...) và tải được mà không cần đăng nhập. Không hỗ trợ ID tệp mm_file:// của MiniMax. URL mà MiniMax trích lại trong thông báo từ chối được thay bằng [url omitted], nên link có chữ ký không xuất hiện trong thông báo lỗi.
  • Giới hạn định dạng, kích thước, thời lượng và dung lượng của từng vật liệu do MiniMax quy định; RouteAPI không kiểm tra. Vật liệu không hợp lệ hoặc bị từ chối ngay khi gửi (400, không tính phí), hoặc bị từ chối trong quá trình tạo (tác vụ thành FAILURE và khoản tạm giữ được hoàn).
Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMax-H3",
"prompt": "A paper boat drifting down a rain-soaked street, cinematic lighting",
"resolution": "768P",
"ratio": "16:9",
"duration": 5
}'
Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMax-H3",
"prompt": "The camera slowly pushes in as the subject looks up and smiles",
"images": ["https://cdn.example.com/first.jpg"],
"resolution": "768P",
"duration": 5
}'

Hai phần tử trong images lần lượt thành first_frame và last_frame. ratio bị ép thành adaptive.

Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMax-H3",
"prompt": "The scene transitions from morning to sunset while the camera pans smoothly",
"images": [
"https://cdn.example.com/first.jpg",
"https://cdn.example.com/last.jpg"
],
"resolution": "768P",
"duration": 5
}'

Dùng metadata.content khi cần hơn hai ảnh hoặc cần video / âm thanh tham chiếu. Video tham chiếu có tính phí, nên giữ thời lượng trong khoảng 2–15 giây — xem Tính phí.

Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMax-H3",
"prompt": "The character in the image dances to the rhythm of the reference audio, copying the motion of the reference video",
"resolution": "768P",
"ratio": "9:16",
"duration": 8,
"metadata": {
"content": [
{ "type": "image_url", "role": "reference_image", "image_url": { "url": "https://cdn.example.com/character.jpg" } },
{ "type": "video_url", "role": "reference_video", "video_url": { "url": "https://cdn.example.com/motion.mp4" } },
{ "type": "audio_url", "role": "reference_audio", "audio_url": { "url": "https://cdn.example.com/music.mp3" } }
]
}
}'
Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMax-H3-Max",
"prompt": "A rainy city street at night, neon signs reflected in puddles",
"resolution": "480P",
"duration": 6,
"metadata": {
"aigc_watermark": false,
"extra": { "prompt_expansion_mode": "quality" }
}
}'
task.status của MiniMaxdata.statusdata.progress
queuedQUEUED20%
runningIN_PROGRESS50%
succeeded có content.urlSUCCESS100%
succeeded nhưng không có content.urlFAILURE100%
failed, cancelledFAILURE100%
giá trị khácIN_PROGRESS30%

Tác vụ succeeded mà không có URL video bị coi là thất bại với fail_reason là upstream succeeded without video url, và khoản tạm giữ được hoàn. Với failed hoặc cancelled, fail_reason lấy từ task.error.message của MiniMax (mọi URL được thay bằng [url omitted]); khi MiniMax không gửi lý do, giá trị là task failed hoặc task cancelled.

Nếu phản hồi truy vấn là phong bì lỗi ({"type":"error","error":{...}}), vòng truy vấn đó được tính là lỗi và tác vụ được hỏi lại lần sau. Phản hồi hoàn toàn không có đối tượng tác vụ sẽ quay về dạng /v1 cũ, vốn rỗng, nên tác vụ chỉ đơn giản giữ nguyên IN_PROGRESS. Tác vụ không bao giờ đạt trạng thái kết thúc sẽ bị đánh thất bại do hết thời gian chờ của nền tảng — mặc định 24 giờ — với fail_reason là 任务超时(1440分钟), và khoản tạm giữ được hoàn.

GET /v1/video/generations/{task_id} trả về dòng tác vụ của RouteAPI; mọi trường được mô tả tại Truy vấn tác vụ. Với nhà cung cấp này, các trường hữu ích là:

TrườngMô tả
data.status / data.progressTrạng thái và tiến độ, theo bảng trên
data.result_urlURL video sau khi tác vụ thành công
data.fail_reasonLý do thất bại, ngược lại để trống
data.quotaHạn mức đã trừ cho tác vụ
data.properties.inputẢnh chụp yêu cầu RouteAPI gửi lên upstream, URL vật liệu được thay bằng [omitted, N bytes]; hữu ích khi khiếu nại khoản trừ
data.dataPhản hồi mới nhất của MiniMax
{
"code": "success",
"message": "",
"data": {
"task_id": "task_FQvcRkHE9wjSWwyISDcrWCKoqCPNdkCx",
"platform": "35",
"group": "default",
"action": "generate",
"status": "SUCCESS",
"progress": "100%",
"fail_reason": "",
"result_url": "https://cdn.minimax.example/video/424010985738629.mp4?Expires=...",
"submit_time": 1792412645,
"start_time": 1792412650,
"finish_time": 1792412780,
"data": {
"task": {
"id": "424010985738629",
"status": "succeeded",
"content": { "url": "https://cdn.minimax.example/video/424010985738629.mp4?Expires=..." },
"resolution": "768P",
"usage": {
"output_seconds": 5,
"input_seconds": 0,
"input_image_count": 1
}
}
}
}
}

Các trường bên trong đáng đọc:

TrườngMô tả
data.data.task.idID tác vụ của MiniMax, khác với task_id của RouteAPI
data.data.task.statusqueued, running, succeeded, failed hoặc cancelled
data.data.task.content.urlURL video khi thành công; đây chính là giá trị trong result_url
data.data.task.resolutionĐộ phân giải MiniMax báo cáo. Tính phí theo độ phân giải yêu cầu, không theo giá trị này
data.data.task.usage.output_secondsSố giây video thực tế tạo ra, dùng để quyết toán
data.data.task.usage.input_secondsSố giây video tham chiếu, dùng để quyết toán
data.data.task.usage.input_image_countSố ảnh MiniMax báo cáo; quyết toán dùng số ảnh lúc gửi
data.data.task.error.code / .messageChi tiết lỗi khi MiniMax cung cấp

Trước lần truy vấn thành công đầu tiên, data.data là phản hồi gốc lúc gửi ({"task_id": "..."}) và không có trường task. task.usage xuất hiện khi MiniMax trả về, thường là lúc thành công. Luôn rẽ nhánh theo data.status ở lớp ngoài.

data.result_url đã trỏ thẳng tới CDN của MiniMax. Liên kết này hết hạn theo lịch của MiniMax, nên hãy tải ngay khi tác vụ báo SUCCESS.

  • Liên kết CDN trực tiếp: tải mà không kèm header Authorization; một số kho lưu trữ từ chối header xác thực thừa.
  • https://api.routeapi.ai/v1/videos/{task_id}/content: truyền lại đúng liên kết đã lưu qua RouteAPI và cần Authorization: Bearer $ROUTEAPI_KEY. Nó lấy lại liên kết đã lưu mỗi lần, nên không kéo dài hạn. Dùng khi không muốn lộ host upstream cho client, hoặc khi CDN từ chối truy cập trực tiếp. Trả 404 Task not found với tác vụ không tồn tại và 400 Task is not completed yet, current status: ... trước khi tác vụ thành công.
Terminal window
# direct CDN link
curl -L -o out.mp4 "$RESULT_URL"
# RouteAPI proxy
curl -L -o out.mp4 -H "Authorization: Bearer $ROUTEAPI_KEY" \
"https://api.routeapi.ai/v1/videos/$TASK_ID/content"

Tính phí theo giây áp dụng khi mô hình có giá cố định được cấu hình cho tài khoản (trang chi tiết mô hình trong console hiển thị giá này). Nếu mô hình chỉ được định giá theo tỷ lệ, áp dụng khoản trừ theo tác vụ thông thường và không có quyết toán khi hoàn tất. Với tính phí theo giây, chi phí gồm ba thành phần:

Thành phầnĐơn giáTính khi gửi (tạm giữ)Tính khi quyết toán
Video đầu ramỗi giây, theo độ phân giải yêu cầuduration yêu cầumin(usage.output_seconds, duration)
Video tham chiếu đầu vàomỗi giây, theo độ phân giải yêu cầu15 giây khi content có reference_videousage.input_seconds, chỉ hợp lệ trong khoảng 2–15 giây
Ảnhmỗi ảnh vượt số miễn phítoàn bộ mục ảnh trong content đã dựng, kể cả khung đầu/cuốiđúng số ảnh trong ảnh chụp lúc gửi

Giá và số ảnh miễn phí được cấu hình theo tài khoản; giá trị tích hợp cho 5 ảnh miễn phí với MiniMax-H3 và 2 với MiniMax-H3-Max, nhưng console là căn cứ. Trang này không nêu bất kỳ mức giá nào.

Thời điểmSố giây đầu raSố giây video tham chiếu
Tạm giữ khi gửiduration yêu cầu15 giây nếu yêu cầu có video tham chiếu
Quyết toán khi thành côngusage.output_seconds, không vượt quá duration yêu cầuusage.input_seconds khi nằm trong 2–15 giây

Quy tắc:

  • Quyết toán chỉ hoàn lại: khoản trừ cuối cùng là giá trị nhỏ hơn giữa số tính lại và khoản tạm giữ.
  • Quyết toán dùng đơn giá đã chốt lúc gửi. Đổi giá trong lúc tác vụ chạy không ảnh hưởng.
  • Không có video tham chiếu thì hoàn toàn không có thành phần số giây đầu vào, và usage.input_seconds bị bỏ qua.
  • Âm thanh tham chiếu miễn phí, thành phần ảnh không đổi khi quyết toán.
  • Vì yêu cầu có video tham chiếu tạm giữ 15 giây đầu vào, số dư phải đủ cho trường hợp xấu nhất này dù video ngắn hơn.
  • Nếu thiếu usage, output_seconds bằng 0 hoặc lớn hơn 15, hoặc (khi có video tham chiếu) input_seconds thiếu hay ngoài 2–15, RouteAPI giữ toàn bộ khoản tạm giữ và không hoàn. Giữ video tham chiếu trong 2–15 giây để tránh điều này.
  • Tác vụ thất bại hoặc hết thời gian chờ hoàn toàn bộ khoản tạm giữ; yêu cầu bị từ chối với 400 không bị tính phí.
  • Khi tính phí theo giây, header X-New-Api-Other-Ratios trong phản hồi gửi mang hệ số nhân áp lên đơn giá mô hình dưới khóa h3_units (tác vụ 5 giây 768P là {"h3_units": 5}). Với dòng 2.3 và mô hình H3 không có giá cố định, header là {}.

Giá dưới đây chỉ là giả định để minh hoạ phép tính: MiniMax-H3 ở 768P giá $0.10 mỗi giây đầu ra, $0.10 mỗi giây video tham chiếu, và $0.04 mỗi ảnh vượt 5 ảnh miễn phí. Yêu cầu 10 giây với hai ảnh tham chiếu và một video tham chiếu:

  • Tạm giữ: 10 × 0.10 (đầu ra) + 15 × 0.10 (video tham chiếu, theo mức trần) + max(0, 2 − 5) × 0.04 (ảnh) = $2.50.
  • MiniMax trả output_seconds: 8 và input_seconds: 6: 8 × 0.10 + 6 × 0.10 + 0 = $1.40.
  • Chênh lệch $1.10 được hoàn về số dư.

Yêu cầu được kiểm tra đầy đủ trước khi tạm giữ, nên 400 không mất phí. Các từ chối nghiệp vụ của MiniMax nằm trong phản hồi HTTP 200 và được ánh xạ như sau:

base_resp.status_code của MiniMaxÝ nghĩaHTTP trả vềcode
1026Từ chối nội dung / an toàn4001026
2013Lỗi tham số4002013
1002Bị giới hạn tần suất4291002
1004, 2049Lỗi khóa / xác thực upstream401, thường trả về 5031004 / 2049, hoặc get_channel_failed
1008Cạn số dư upstream503get_channel_failed
mã khácLỗi nghiệp vụ không rõ502mã số
— (body không đọc được, hoặc phong bì type: "error")Phản hồi gửi sai định dạng502invalid_response
— (task_id rỗng)Upstream không trả ID tác vụ502upstream_task_id_missing

Lỗi tài khoản upstream không bao giờ được trả nguyên văn. Bộ chuyển đổi ánh xạ 1008 thành 402, 1004 / 2049 thành 401; sau đó RouteAPI phân loại lỗi là lỗi kênh và trả 503 get_channel_failed kèm câu chung “dịch vụ upstream tạm thời không khả dụng”, sau khi thử kênh khác nếu có. 402 từ 1008 cũng được trả thành 503 vì lý do tương tự. Trong các trường hợp này, status_msg của MiniMax không tới được bạn. 429 giữ nguyên mã trạng thái nhưng thông báo được thay bằng nhắc thử lại chung. 400 mang văn bản gốc của MiniMax với tiền tố hailuo api error: .

Nếu MiniMax trả mã HTTP khác 200, body không được phân tích: bạn nhận mã fail_to_fetch_task cùng mã trạng thái đó. Truy vấn task_id không tồn tại hoặc thuộc tài khoản khác trả 400 với mã task_not_exist.

Lỗi phát sinh trước khi yêu cầu tới MiniMax tuân theo quy tắc chung trong Lỗi thường gặp: 401 khi thiếu hoặc sai API Key, 403 insufficient_user_quota khi số dư không đủ cho khoản tạm giữ (kể cả trường hợp xấu nhất 15 giây video tham chiếu), và 403 kèm This token has no access to model ... khi khóa không được phép dùng mô hình.

Các thông báo 400 thường gặp (mã invalid_request trừ khi có ghi chú):

messageNguyên nhân
prompt is requiredThiếu prompt hoặc prompt rỗng
seconds must be between 1 and 3600 (mã invalid_seconds)duration cấp cao nhất âm hoặc lớn hơn 3600
invalid seconds: abcseconds không phải chuỗi số nguyên
<model> 请使用 resolution(480P/768P/2K),不支持 sizeĐã gửi size ở cấp cao nhất hoặc trong metadata; thông báo nêu mô hình bạn yêu cầu và luôn liệt kê 480P/768P/2K
invalid resolution: 1080P, MiniMax-H3 supports 768P, 2KĐộ phân giải không được mô hình đó hỗ trợ
invalid duration: 3, MiniMax-H3 supports integer 4-15Thời lượng dưới mức tối thiểu, trên 15, hoặc không nguyên
invalid ratio: 2:1, supports adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16Tỷ lệ không có trong danh sách
text-to-video does not support ratio adaptiveadaptive trên yêu cầu không có khung và không có tham chiếu
at most 2 top-level images (first_frame, last_frame), got 3; use metadata.content for reference mediaimages có hơn 2 phần tử
images must not contain empty valuesCó phần tử rỗng trong images
metadata.content cannot be combined with top-level imagesGửi cả hai
metadata.content must be a non-empty arraycontent là []
prompt 与 metadata.content 中的 text 冲突Mục text khác với prompt
metadata.content accepts at most one text itemNhiều hơn một mục text
text exceeds 7000 charactersPrompt dài hơn 7000 ký tự
invalid content type "foo"type không rõ
invalid role "foo" for image_urlrole của ảnh không rõ
image_url without role is only allowed as the single input imageẢnh không có role dùng chung với vật liệu khác
last_frame requires first_frameChỉ gửi khung cuối
at most one first_frame and one last_frameTrùng role khung
first/last frame images cannot be combined with reference mediaTrộn khung với vật liệu tham chiếu
at most 9 reference images / at most 3 reference videos / at most 3 reference audios / at most 12 media itemsVượt giới hạn theo loại hoặc tổng số vật liệu
video_url requires role reference_video / audio_url requires role reference_audioSai hoặc thiếu role cho loại mục đó
image_url.url must be an http(s) URL or data URI (tương tự video_url / audio_url)Scheme URL không hỗ trợ, kể cả mm_file://
MiniMax-H3 does not support extraGửi metadata.extra cho mô hình không phải Max
invalid extra.prompt_expansion_mode: balance, supports disabled, balanced, qualityChế độ mở rộng không rõ
invalid metadata: ...Khóa metadata sai kiểu JSON

Lỗi sau khi gửi thành công — kiểm duyệt nội dung, vật liệu không tải được, tác vụ bị huỷ hoặc hết thời gian chờ — không bao giờ hiện dưới dạng lỗi HTTP. Chúng hiện trên bản ghi tác vụ là FAILURE kèm fail_reason, và khoản tạm giữ được hoàn.

  • Đường dẫn là của RouteAPI: POST /v1/video/generations và GET /v1/video/generations/{task_id}. Các endpoint /v2/video_generation và /v2/query/video_generation/{id} của MiniMax không được mở ra, nên chỉ đổi Base URL trong SDK chính thức sẽ không dùng được.
  • Prompt nằm ở prompt cấp cao nhất, còn mảng content của MiniMax nằm ở metadata.content. RouteAPI dựng content cho upstream, gồm cả mục text, và cách viết tắt khung đầu / khung cuối qua images không có tương đương bên MiniMax.
  • task_id bạn nhận là của RouteAPI. ID tác vụ của MiniMax chỉ xuất hiện ở data.data.task.id.
  • RouteAPI kiểm tra kiểu mục, role, số lượng và scheme URL trước khi chuyển tiếp — chặt hơn MiniMax, vốn để phần lớn cho bước tạo.
  • Chỉ model, content, resolution, duration, ratio, aigc_watermark và extra được chuyển tiếp. Các tham số MiniMax khác, kể cả callback_url, bị bỏ.
  • Vật liệu phải là URL http(s) công khai hoặc data:; không dùng được ID tệp mm_file:// của MiniMax.
  • Khi bỏ trống resolution và duration, RouteAPI điền 768P, 5 giây, nên upstream luôn nhận giá trị tường minh.
  • Khi thành công, RouteAPI lưu thẳng content.url của MiniMax làm result_url; không cần gọi bước lấy tệp riêng.

Cần bash, curl và jq. Script gửi tác vụ văn bản thành video 5 giây, truy vấn mỗi 15 giây tối đa 30 phút, tải kết quả (chỉ thêm Authorization cho dạng proxy RouteAPI) và in usage phục vụ tính phí.

#!/usr/bin/env bash
set -euo pipefail
: "${ROUTEAPI_KEY:?export ROUTEAPI_KEY first}"
BASE="${ROUTEAPI_BASE:-https://api.routeapi.ai}"
AUTH="Authorization: Bearer $ROUTEAPI_KEY"
TASK_ID=$(curl -sS -X POST "$BASE/v1/video/generations" \
-H "$AUTH" -H "Content-Type: application/json" \
-d '{
"model": "MiniMax-H3",
"prompt": "A paper boat drifting down a rain-soaked street, cinematic lighting",
"resolution": "768P",
"ratio": "16:9",
"duration": 5
}' | jq -er '.task_id')
echo "task: $TASK_ID"
for _ in $(seq 1 120); do
RESP=$(curl -sS "$BASE/v1/video/generations/$TASK_ID" -H "$AUTH")
STATUS=$(jq -r '.data.status // empty' <<<"$RESP")
echo "status: ${STATUS:-unknown} $(jq -r '.data.progress // ""' <<<"$RESP")"
case "$STATUS" in
SUCCESS)
URL=$(jq -r '.data.result_url' <<<"$RESP")
OUT="$TASK_ID.mp4"
if [[ "$URL" == *"/v1/videos/"*"/content" ]]; then
curl -sSL -o "$OUT" -H "$AUTH" "$URL"
else
curl -sSL -o "$OUT" "$URL"
fi
echo "saved: $OUT"
jq -r '.data.data.task.usage // {}' <<<"$RESP"
exit 0
;;
FAILURE)
echo "failed: $(jq -r '.data.fail_reason' <<<"$RESP")" >&2
exit 1
;;
esac
sleep 15
done
echo "gave up after 30 minutes" >&2
exit 1

MiniMax-Hailuo-2.3 và MiniMax-Hailuo-2.3-Fast dùng API /v1/video_generation của MiniMax và tính phí theo tác vụ, không theo giây. RouteAPI gửi yêu cầu, truy vấn /v1/query/video_generation, rồi lấy kết quả qua /v1/files/retrieve của MiniMax và lưu URL tải xuống vào result_url.

ID mô hìnhGhi chú
MiniMax-Hailuo-2.3Văn bản thành video và ảnh thành video
MiniMax-Hailuo-2.3-FastBản nhanh và rẻ hơn của 2.3

Cả hai mặc định 768P và 6 giây. API tác vụ không kiểm tra phạm vi độ phân giải hay thời lượng của dòng này ngoài giới hạn chung 0–3600: giá trị được chuyển nguyên trạng và MiniMax quyết định. Playground trong console cung cấp 768P / 1080P và 6 hoặc 10 giây, trong đó 1080P chỉ cho phép 6 giây.

Trường của khung chungBộ chuyển đổi làm gì
promptGửi thành prompt; metadata.prompt ghi đè nếu có
durationGửi thành duration; thiếu hoặc 0 thì thành 6
sizeĐổi thành resolution theo chuỗi con: 1080 → 1080P, 768 → 768P, 720 → 720P, 512 → 512P; giá trị khác về mặc định của mô hình
images / imageKhông đọc. Ảnh đầu vào phải đi qua metadata.first_frame_image
ratio, generate_audio, secondsKhông đọc. Dòng này không có tham số tỷ lệ khung hình hay nhạc nền
metadataGiải mã thành các trường của MiniMax theo đúng tên trường của MiniMax

Dòng này không đọc resolution ở cấp cao nhất: hãy dùng size hoặc metadata.resolution.

Tất cả nằm dưới metadata. Sai kiểu JSON (ví dụ "duration": "abc") khiến chuyển đổi thất bại với 500 build_request_failed, không phải 400; khóa lạ bị bỏ qua.

TrườngKiểuMô tả
resolutionstring768P hoặc 1080P; ghi đè giá trị do size tạo ra
durationinteger6 hoặc 10 giây; ghi đè duration cấp cao nhất
first_frame_imagestringẢnh khung đầu (URL công khai hoặc data: URI base64), chuyển nguyên trạng
last_frame_imagestringKhung cuối cho chế độ đầu-cuối, chuyển nguyên trạng
subject_referencearrayTham chiếu chủ thể: [{"type": "character", "image": ["<url>"]}]
prompt_optimizerbooleanĐể MiniMax viết lại prompt; false tường minh vẫn được chuyển
fast_pretreatmentbooleanCờ tiền xử lý nhanh của MiniMax, chuyển nguyên trạng
aigc_watermarkbooleanThêm watermark AIGC của nhà cung cấp
callback_urlstringChuyển cho MiniMax. RouteAPI không đăng ký và không nhận callback — hãy truy vấn kết quả
promptstringGhi đè prompt cấp cao nhất

metadata.model bị ghi đè bằng tên mô hình upstream của kênh, nên không thể chuyển sang mô hình khác (ví dụ đắt hơn) qua metadata.

Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMax-Hailuo-2.3",
"prompt": "The camera slowly pushes in as the subject looks up and smiles",
"duration": 6,
"metadata": {
"resolution": "1080P",
"first_frame_image": "https://cdn.example.com/first.jpg"
}
}'

MiniMax v1 trả Preparing, Queueing, Processing, Success và Fail.

Trạng thái upstreamTrạng thái bản ghiTiến độ
Preparing, QueueingIN_PROGRESS30%
ProcessingIN_PROGRESS50%
SuccessSUCCESS100%
FailFAILURE100%

Khi thành công, bộ chuyển đổi gọi endpoint lấy tệp của MiniMax với file_id trả về và lưu URL tải xuống vào result_url. URL này hết hạn theo lịch của MiniMax; GET /v1/videos/{task_id}/content truyền URL đã lưu qua RouteAPI và cần Authorization.

Dòng 2.3 tính theo đơn giá tác vụ cấu hình trong console. Độ phân giải và thời lượng bạn gửi không làm đổi khoản trừ, và không có quyết toán chênh lệch khi hoàn tất; tác vụ thất bại hoàn lại khoản tạm giữ. X-New-Api-Other-Ratios là {}.

Trạng tháicodeÝ nghĩa
400invalid_requestThiếu hoặc rỗng prompt, hoặc JSON sai định dạng
400invalid_secondsduration / seconds âm hoặc lớn hơn 3600
400Mã số của MiniMaxMiniMax từ chối tác vụ; thông báo là status_msg của nó
400task_not_existtask_id không rõ hoặc thuộc tài khoản khác
500build_request_failed, do_request_failedChuyển đổi metadata thất bại, hoặc không tới được upstream
500unmarshal_response_body_failedMiniMax trả về dạng mà bộ chuyển đổi không nhận ra
502upstream_task_id_missingPhản hồi gửi không có ID tác vụ
mã upstreamfail_to_fetch_taskMiniMax trả mã HTTP khác 200

Với dòng này, mọi từ chối nghiệp vụ của MiniMax đều trả 400, kể cả giới hạn tần suất; mã số và status_msg được chuyển nguyên, nên hãy xem mã số thay vì mã HTTP. Ngoại lệ là lỗi thiếu số dư upstream: khi status_msg của MiniMax khớp từ khóa tính phí tích hợp của RouteAPI (thiếu số dư và tương tự), phản hồi được làm sạch thành 503 get_channel_failed với thông báo chung, và lỗi được ghi nhận là lỗi kênh (kênh chỉ tự động bị vô hiệu hoá khi tính năng tự động vô hiệu hoá được bật và kênh cho phép).

Lỗi sau khi gửi (kiểm duyệt, quá thời gian phía nhà cung cấp) hiện trên bản ghi tác vụ là FAILURE kèm fail_reason, và khoản đã tạm giữ được hoàn.