{
  "aboutHtml": "<p>Seedance 1.5 Pro là mô hình của ByteDance Seed để tạo kết hợp âm thanh–video trực tiếp. Mô hình mô phỏng hành động hình ảnh, lời nói và nhịp cùng nhau, cho phép cảnh gồm diễn xuất nhân vật, hội thoại đồng bộ và không gian âm thanh có thiết kế. Khác biệt trọng tâm so với yêu cầu video chỉ hình ảnh là âm thanh trở thành một phần mô tả cảnh: ai nói, cách thể hiện câu và khán giả nghe gì quanh hành động.</p><h4>Tạo kết hợp hình ảnh và âm thanh</h4><p>Phạm vi âm thanh được mô tả gồm âm thanh môi trường, hiệu ứng hành động, âm thanh tổng hợp, nhạc cụ, nhạc nền và giọng hát. Mô hình được thiết kế để nối âm thanh với điều xảy ra trên màn hình: vật chạm bàn, cửa mở hoặc nhân vật nói. Dùng cho một nhịp kịch ngắn, quảng cáo sản phẩm có lời hoặc cảnh có cảm xúc phụ thuộc cả diễn xuất lẫn âm thanh.</p><p>Bắt đầu lời nhắc bằng chủ thể và chuyển động, rồi thêm môi trường, máy quay, phong cách hình ảnh và âm thanh. Cảnh ngắn gọn có thể là: “Một đầu bếp nhấc nắp nồi nhỏ, mỉm cười và nói: ‘Xong rồi.’ Một luồng hơi nhẹ thoát ra, tiếp theo là tiếng chạm khẽ khi nắp đặt trên quầy.” Như vậy câu nói và hiệu ứng có nguyên nhân nhìn thấy được.</p><h4>Hội thoại và thuyết minh</h4><p>Mô hình hỗ trợ độc thoại và hội thoại nhiều người nói, với chuyển động môi khớp nhân vật. Hướng dẫn mô tả tiếng Quan thoại, các phương ngữ Trung Quốc gồm Quảng Đông, Thiểm Tây và Tứ Xuyên, cùng lời nói tiếng Anh, Nhật, Hàn, Tây Ban Nha và Indonesia. Ngôn ngữ lời nhắc được mô tả là tiếng Trung và Anh; ngôn ngữ lời nhắc và ngôn ngữ yêu cầu cho câu nói là các lựa chọn riêng.</p><p>Xác định mỗi người nói bằng đặc điểm nhìn thấy nhất quán và viết lời thoại trong dấu ngoặc kép. Thêm chỉ dẫn cách thể hiện như giọng bình tĩnh, trả lời ngập ngừng hoặc nhịp nhanh hơn, và làm rõ thứ tự lượt. Với hai người, mô tả ai nói trước và máy quay cho thấy phản ứng của ai. Đoạn trao đổi ngắn vừa thời lượng đã chọn cho mô hình mục tiêu diễn xuất rõ hơn một đoạn dài không xác định người nói.</p><p>Có thể chỉ đạo thuyết minh bằng âm sắc, cảm xúc, ngữ điệu và tốc độ nói. Cách này hữu ích khi giọng cần giải thích sản phẩm trong lúc máy quay vẫn ở sản phẩm, hoặc người kể tạo tâm trạng mà không có người nói trên hình. Hướng dẫn mô tả giữ âm sắc dễ nhận ra trong khi thay cách thể hiện; xem xét câu chữ thực tế, phát âm và diễn xuất cùng hình ảnh.</p><h4>Hiệu ứng âm thanh và nhạc nền</h4><p>Mô tả hiệu ứng là sự kiện gắn với hành động: tiếng bước chân khi nhân vật bước vào, mưa mạnh hơn ngoài cửa sổ hoặc vải chuyển động khi mặc áo khoác. Nhạc nền được tạo mặc định để khớp lời nhắc. Chỉ định tâm trạng, phong cách và nhịp khi quan trọng, đồng thời nêu khi nào bắt đầu hoặc nhỏ dần so với cảnh.</p><p>Với phần trình diễn yên tĩnh, yêu cầu nhạc tiết chế và nhấn âm thanh thao tác sản phẩm. Với hoạt hình, mô tả nhịp hành động cần trùng tiết tấu âm nhạc. Bản âm thanh được tạo là đơn âm. Điều khiển âm thanh được mô tả còn cho phép video im lặng khi dự án cần bản âm thanh chuẩn bị riêng.</p><h4>Chuyển cú máy và chỉ đạo máy quay</h4><p>Mô hình hỗ trợ thay cú với cách thể hiện hình ảnh nhất quán, cú đảo chiều cho hội thoại và chỉ dẫn thời điểm chuyển cảnh. Chuỗi hội thoại hữu ích có thể xác lập hai người trong trung cảnh, cắt sang người trả lời rồi trở lại phản ứng của người đầu tiên. Nêu danh tính từng người khi cú máy thay đổi.</p><p>Hướng dẫn bao quát góc cao, thấp và ngang mắt; góc qua vai và góc nhìn chủ quan; khung rộng, trung và cận. Mô tả chuyển động máy quay qua bố cục bắt đầu, hướng, biên độ và bố cục kết thúc. Ví dụ, tiến máy chậm có thể kết thúc ở biểu cảm người nói khi câu vừa xong. Gắn chuyển động với câu chuyện thay vì liệt kê nhiều kỹ thuật máy quay không có mục đích.</p><h4>Chế độ, đầu ra và xem trước</h4><p>Chế độ đầu vào được mô tả là chuyển văn bản thành video, ảnh khung đầu thành video và ảnh khung đầu–cuối thành video. Ảnh đầu đã chuẩn bị xác lập bố cục bắt đầu; ảnh cuối có thể xác định điểm kết thúc dự kiến. Đặc tả đầu ra liệt kê MP4 ở 24 fps, 480p, 720p hoặc 1080p và thiết lập thời lượng 4–12 giây. Mô hình còn có thể chọn độ dài nguyên giây trong phạm vi hỗ trợ. Các tỷ lệ được mô tả là 21:9, 16:9, 4:3, 1:1, 3:4 và 9:16, có hỗ trợ bố cục thích ứng.</p><p>Nhà sản xuất mô tả quy trình Draft hai giai đoạn: bản xem trước 480p để kiểm tra cấu trúc cảnh, lựa chọn cú máy, chuyển động và ý định lời nhắc, rồi tạo hoàn thiện bằng cách tái sử dụng đầu vào sáng tạo. Đây là cách đánh giá diễn xuất đã lên kế hoạch trước khi chọn độ phân giải cuối. Bản xem trước giới hạn ở 480p và không hỗ trợ trả khung cuối. ID tác vụ Draft của nhà sản xuất còn hiệu lực bảy ngày sau khi tạo; tạo video hoàn thiện từ nó trong thời gian đó.</p><p>Với nội dung dựa trên ảnh, chuẩn bị ảnh nguồn cho bố cục dự kiến: đổi tỷ lệ đầu ra có thể cắt ảnh. Lặp seed tạo khung tương tự thay vì bảo đảm giống hệt và chỉ dẫn máy quay cố định không phải bảo đảm khóa hoàn hảo. Quan trọng nhất, đánh giá đoạn hội thoại là một phần diễn xuất hình và tiếng thống nhất: đúng người nói, câu nghe được, phản ứng khuôn mặt và điểm nhấn máy quay đều cần phục vụ cùng sự kiện.</p>",
  "aboutText": "Seedance 1.5 Pro là mô hình của ByteDance Seed để tạo kết hợp âm thanh–video trực tiếp. Mô hình mô phỏng hành động hình ảnh, lời nói và nhịp cùng nhau, cho phép cảnh gồm diễn xuất nhân vật, hội thoại đồng bộ và không gian âm thanh có thiết kế. Khác biệt trọng tâm so với yêu cầu video chỉ hình ảnh là âm thanh trở thành một phần mô tả cảnh: ai nói, cách thể hiện câu và khán giả nghe gì quanh hành động.\n\n### Tạo kết hợp hình ảnh và âm thanh\n\nPhạm vi âm thanh được mô tả gồm âm thanh môi trường, hiệu ứng hành động, âm thanh tổng hợp, nhạc cụ, nhạc nền và giọng hát. Mô hình được thiết kế để nối âm thanh với điều xảy ra trên màn hình: vật chạm bàn, cửa mở hoặc nhân vật nói. Dùng cho một nhịp kịch ngắn, quảng cáo sản phẩm có lời hoặc cảnh có cảm xúc phụ thuộc cả diễn xuất lẫn âm thanh.\n\nBắt đầu lời nhắc bằng chủ thể và chuyển động, rồi thêm môi trường, máy quay, phong cách hình ảnh và âm thanh. Cảnh ngắn gọn có thể là: “Một đầu bếp nhấc nắp nồi nhỏ, mỉm cười và nói: ‘Xong rồi.’ Một luồng hơi nhẹ thoát ra, tiếp theo là tiếng chạm khẽ khi nắp đặt trên quầy.” Như vậy câu nói và hiệu ứng có nguyên nhân nhìn thấy được.\n\n### Hội thoại và thuyết minh\n\nMô hình hỗ trợ độc thoại và hội thoại nhiều người nói, với chuyển động môi khớp nhân vật. Hướng dẫn mô tả tiếng Quan thoại, các phương ngữ Trung Quốc gồm Quảng Đông, Thiểm Tây và Tứ Xuyên, cùng lời nói tiếng Anh, Nhật, Hàn, Tây Ban Nha và Indonesia. Ngôn ngữ lời nhắc được mô tả là tiếng Trung và Anh; ngôn ngữ lời nhắc và ngôn ngữ yêu cầu cho câu nói là các lựa chọn riêng.\n\nXác định mỗi người nói bằng đặc điểm nhìn thấy nhất quán và viết lời thoại trong dấu ngoặc kép. Thêm chỉ dẫn cách thể hiện như giọng bình tĩnh, trả lời ngập ngừng hoặc nhịp nhanh hơn, và làm rõ thứ tự lượt. Với hai người, mô tả ai nói trước và máy quay cho thấy phản ứng của ai. Đoạn trao đổi ngắn vừa thời lượng đã chọn cho mô hình mục tiêu diễn xuất rõ hơn một đoạn dài không xác định người nói.\n\nCó thể chỉ đạo thuyết minh bằng âm sắc, cảm xúc, ngữ điệu và tốc độ nói. Cách này hữu ích khi giọng cần giải thích sản phẩm trong lúc máy quay vẫn ở sản phẩm, hoặc người kể tạo tâm trạng mà không có người nói trên hình. Hướng dẫn mô tả giữ âm sắc dễ nhận ra trong khi thay cách thể hiện; xem xét câu chữ thực tế, phát âm và diễn xuất cùng hình ảnh.\n\n### Hiệu ứng âm thanh và nhạc nền\n\nMô tả hiệu ứng là sự kiện gắn với hành động: tiếng bước chân khi nhân vật bước vào, mưa mạnh hơn ngoài cửa sổ hoặc vải chuyển động khi mặc áo khoác. Nhạc nền được tạo mặc định để khớp lời nhắc. Chỉ định tâm trạng, phong cách và nhịp khi quan trọng, đồng thời nêu khi nào bắt đầu hoặc nhỏ dần so với cảnh.\n\nVới phần trình diễn yên tĩnh, yêu cầu nhạc tiết chế và nhấn âm thanh thao tác sản phẩm. Với hoạt hình, mô tả nhịp hành động cần trùng tiết tấu âm nhạc. Bản âm thanh được tạo là đơn âm. Điều khiển âm thanh được mô tả còn cho phép video im lặng khi dự án cần bản âm thanh chuẩn bị riêng.\n\n### Chuyển cú máy và chỉ đạo máy quay\n\nMô hình hỗ trợ thay cú với cách thể hiện hình ảnh nhất quán, cú đảo chiều cho hội thoại và chỉ dẫn thời điểm chuyển cảnh. Chuỗi hội thoại hữu ích có thể xác lập hai người trong trung cảnh, cắt sang người trả lời rồi trở lại phản ứng của người đầu tiên. Nêu danh tính từng người khi cú máy thay đổi.\n\nHướng dẫn bao quát góc cao, thấp và ngang mắt; góc qua vai và góc nhìn chủ quan; khung rộng, trung và cận. Mô tả chuyển động máy quay qua bố cục bắt đầu, hướng, biên độ và bố cục kết thúc. Ví dụ, tiến máy chậm có thể kết thúc ở biểu cảm người nói khi câu vừa xong. Gắn chuyển động với câu chuyện thay vì liệt kê nhiều kỹ thuật máy quay không có mục đích.\n\n### Chế độ, đầu ra và xem trước\n\nChế độ đầu vào được mô tả là chuyển văn bản thành video, ảnh khung đầu thành video và ảnh khung đầu–cuối thành video. Ảnh đầu đã chuẩn bị xác lập bố cục bắt đầu; ảnh cuối có thể xác định điểm kết thúc dự kiến. Đặc tả đầu ra liệt kê MP4 ở 24 fps, 480p, 720p hoặc 1080p và thiết lập thời lượng 4–12 giây. Mô hình còn có thể chọn độ dài nguyên giây trong phạm vi hỗ trợ. Các tỷ lệ được mô tả là 21:9, 16:9, 4:3, 1:1, 3:4 và 9:16, có hỗ trợ bố cục thích ứng.\n\nNhà sản xuất mô tả quy trình Draft hai giai đoạn: bản xem trước 480p để kiểm tra cấu trúc cảnh, lựa chọn cú máy, chuyển động và ý định lời nhắc, rồi tạo hoàn thiện bằng cách tái sử dụng đầu vào sáng tạo. Đây là cách đánh giá diễn xuất đã lên kế hoạch trước khi chọn độ phân giải cuối. Bản xem trước giới hạn ở 480p và không hỗ trợ trả khung cuối. ID tác vụ Draft của nhà sản xuất còn hiệu lực bảy ngày sau khi tạo; tạo video hoàn thiện từ nó trong thời gian đó.\n\nVới nội dung dựa trên ảnh, chuẩn bị ảnh nguồn cho bố cục dự kiến: đổi tỷ lệ đầu ra có thể cắt ảnh. Lặp seed tạo khung tương tự thay vì bảo đảm giống hệt và chỉ dẫn máy quay cố định không phải bảo đảm khóa hoàn hảo. Quan trọng nhất, đánh giá đoạn hội thoại là một phần diễn xuất hình và tiếng thống nhất: đúng người nói, câu nghe được, phản ứng khuôn mặt và điểm nhấn máy quay đều cần phục vụ cùng sự kiện.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "dfbd0786d44e45e80441f5dacdbb811b666a4ef972771c48c15326e0ade5268f",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "vi",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">ByteDance: Seedance 1.5 Pro</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Đóng\">×</button></div><div class=\"idline\"><span>ByteDance /</span><code>bytedance/seedance-1-5-pro</code><button type=\"button\" id=\"copy-id\">Sao chép ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Các phần của thẻ mô hình\"><button type=\"button\" data-card-jump=\"overview\">Bắt đầu</button><button type=\"button\" data-card-jump=\"methods\">Đầu vào &amp; phương thức</button><button type=\"button\" data-card-jump=\"pricing\">Bảng giá</button><button type=\"button\" data-card-jump=\"examples\">Ví dụ</button><button type=\"button\" data-card-jump=\"results\">Kết quả</button><button type=\"button\" data-card-jump=\"aliases\">Bí danh</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"Phương thức API\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|videos|/v1/videos|bytedance%2Fseedance-1-5-pro\">Video</button></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Bắt đầu</h3><p class=\"mdesc-full\">ByteDance Seedance 1.5 Pro tạo video cùng hội thoại, hiệu ứng âm thanh và nhạc đồng bộ. Chỉ đạo người nói, cảm xúc, máy quay và không khí âm thanh để phát triển phim ngắn, quảng cáo có lời và cảnh có nhân vật.</p><dl class=\"card-io\" data-card-io><div><dt>Đầu vào được chấp nhận</dt><dd>Văn bản · Ảnh</dd></div><div><dt>Kết quả</dt><dd>Video</dd></div></dl><details class=\"card-about\"><summary>Về mô hình</summary><p class=\"note-s\" data-model-method-boundary>Mô tả này trình bày khả năng của mô hình. Đầu vào, đầu ra và tùy chọn có trên Ailoot được liệt kê bên dưới cho phương thức đã chọn.</p><div class=\"mabout\" id=\"m-about\"><p>Seedance 1.5 Pro là mô hình của ByteDance Seed để tạo kết hợp âm thanh–video trực tiếp. Mô hình mô phỏng hành động hình ảnh, lời nói và nhịp cùng nhau, cho phép cảnh gồm diễn xuất nhân vật, hội thoại đồng bộ và không gian âm thanh có thiết kế. Khác biệt trọng tâm so với yêu cầu video chỉ hình ảnh là âm thanh trở thành một phần mô tả cảnh: ai nói, cách thể hiện câu và khán giả nghe gì quanh hành động.</p><h4>Tạo kết hợp hình ảnh và âm thanh</h4><p>Phạm vi âm thanh được mô tả gồm âm thanh môi trường, hiệu ứng hành động, âm thanh tổng hợp, nhạc cụ, nhạc nền và giọng hát. Mô hình được thiết kế để nối âm thanh với điều xảy ra trên màn hình: vật chạm bàn, cửa mở hoặc nhân vật nói. Dùng cho một nhịp kịch ngắn, quảng cáo sản phẩm có lời hoặc cảnh có cảm xúc phụ thuộc cả diễn xuất lẫn âm thanh.</p><p>Bắt đầu lời nhắc bằng chủ thể và chuyển động, rồi thêm môi trường, máy quay, phong cách hình ảnh và âm thanh. Cảnh ngắn gọn có thể là: “Một đầu bếp nhấc nắp nồi nhỏ, mỉm cười và nói: ‘Xong rồi.’ Một luồng hơi nhẹ thoát ra, tiếp theo là tiếng chạm khẽ khi nắp đặt trên quầy.” Như vậy câu nói và hiệu ứng có nguyên nhân nhìn thấy được.</p><h4>Hội thoại và thuyết minh</h4><p>Mô hình hỗ trợ độc thoại và hội thoại nhiều người nói, với chuyển động môi khớp nhân vật. Hướng dẫn mô tả tiếng Quan thoại, các phương ngữ Trung Quốc gồm Quảng Đông, Thiểm Tây và Tứ Xuyên, cùng lời nói tiếng Anh, Nhật, Hàn, Tây Ban Nha và Indonesia. Ngôn ngữ lời nhắc được mô tả là tiếng Trung và Anh; ngôn ngữ lời nhắc và ngôn ngữ yêu cầu cho câu nói là các lựa chọn riêng.</p><p>Xác định mỗi người nói bằng đặc điểm nhìn thấy nhất quán và viết lời thoại trong dấu ngoặc kép. Thêm chỉ dẫn cách thể hiện như giọng bình tĩnh, trả lời ngập ngừng hoặc nhịp nhanh hơn, và làm rõ thứ tự lượt. Với hai người, mô tả ai nói trước và máy quay cho thấy phản ứng của ai. Đoạn trao đổi ngắn vừa thời lượng đã chọn cho mô hình mục tiêu diễn xuất rõ hơn một đoạn dài không xác định người nói.</p><p>Có thể chỉ đạo thuyết minh bằng âm sắc, cảm xúc, ngữ điệu và tốc độ nói. Cách này hữu ích khi giọng cần giải thích sản phẩm trong lúc máy quay vẫn ở sản phẩm, hoặc người kể tạo tâm trạng mà không có người nói trên hình. Hướng dẫn mô tả giữ âm sắc dễ nhận ra trong khi thay cách thể hiện; xem xét câu chữ thực tế, phát âm và diễn xuất cùng hình ảnh.</p><h4>Hiệu ứng âm thanh và nhạc nền</h4><p>Mô tả hiệu ứng là sự kiện gắn với hành động: tiếng bước chân khi nhân vật bước vào, mưa mạnh hơn ngoài cửa sổ hoặc vải chuyển động khi mặc áo khoác. Nhạc nền được tạo mặc định để khớp lời nhắc. Chỉ định tâm trạng, phong cách và nhịp khi quan trọng, đồng thời nêu khi nào bắt đầu hoặc nhỏ dần so với cảnh.</p><p>Với phần trình diễn yên tĩnh, yêu cầu nhạc tiết chế và nhấn âm thanh thao tác sản phẩm. Với hoạt hình, mô tả nhịp hành động cần trùng tiết tấu âm nhạc. Bản âm thanh được tạo là đơn âm. Điều khiển âm thanh được mô tả còn cho phép video im lặng khi dự án cần bản âm thanh chuẩn bị riêng.</p><h4>Chuyển cú máy và chỉ đạo máy quay</h4><p>Mô hình hỗ trợ thay cú với cách thể hiện hình ảnh nhất quán, cú đảo chiều cho hội thoại và chỉ dẫn thời điểm chuyển cảnh. Chuỗi hội thoại hữu ích có thể xác lập hai người trong trung cảnh, cắt sang người trả lời rồi trở lại phản ứng của người đầu tiên. Nêu danh tính từng người khi cú máy thay đổi.</p><p>Hướng dẫn bao quát góc cao, thấp và ngang mắt; góc qua vai và góc nhìn chủ quan; khung rộng, trung và cận. Mô tả chuyển động máy quay qua bố cục bắt đầu, hướng, biên độ và bố cục kết thúc. Ví dụ, tiến máy chậm có thể kết thúc ở biểu cảm người nói khi câu vừa xong. Gắn chuyển động với câu chuyện thay vì liệt kê nhiều kỹ thuật máy quay không có mục đích.</p><h4>Chế độ, đầu ra và xem trước</h4><p>Chế độ đầu vào được mô tả là chuyển văn bản thành video, ảnh khung đầu thành video và ảnh khung đầu–cuối thành video. Ảnh đầu đã chuẩn bị xác lập bố cục bắt đầu; ảnh cuối có thể xác định điểm kết thúc dự kiến. Đặc tả đầu ra liệt kê MP4 ở 24 fps, 480p, 720p hoặc 1080p và thiết lập thời lượng 4–12 giây. Mô hình còn có thể chọn độ dài nguyên giây trong phạm vi hỗ trợ. Các tỷ lệ được mô tả là 21:9, 16:9, 4:3, 1:1, 3:4 và 9:16, có hỗ trợ bố cục thích ứng.</p><p>Nhà sản xuất mô tả quy trình Draft hai giai đoạn: bản xem trước 480p để kiểm tra cấu trúc cảnh, lựa chọn cú máy, chuyển động và ý định lời nhắc, rồi tạo hoàn thiện bằng cách tái sử dụng đầu vào sáng tạo. Đây là cách đánh giá diễn xuất đã lên kế hoạch trước khi chọn độ phân giải cuối. Bản xem trước giới hạn ở 480p và không hỗ trợ trả khung cuối. ID tác vụ Draft của nhà sản xuất còn hiệu lực bảy ngày sau khi tạo; tạo video hoàn thiện từ nó trong thời gian đó.</p><p>Với nội dung dựa trên ảnh, chuẩn bị ảnh nguồn cho bố cục dự kiến: đổi tỷ lệ đầu ra có thể cắt ảnh. Lặp seed tạo khung tương tự thay vì bảo đảm giống hệt và chỉ dẫn máy quay cố định không phải bảo đảm khóa hoàn hảo. Quan trọng nhất, đánh giá đoạn hội thoại là một phần diễn xuất hình và tiếng thống nhất: đúng người nói, câu nghe được, phản ứng khuôn mặt và điểm nhấn máy quay đều cần phục vụ cùng sự kiện.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Có trên Ailoot · đầu vào &amp; phương thức</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Video</b> <code>POST /v1/videos</code></summary><dl class=\"method-capabilities\"><div><dt>Đầu vào</dt><dd><code>text</code>, <code>image</code></dd></div><div><dt>Đầu ra</dt><dd><code>video</code></dd></div><div><dt>Định dạng đầu ra</dt><dd>byte MP4 gốc; không chuẩn hóa hoặc chuyển mã</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Trường</th><th>Loại</th><th>Yêu cầu</th><th>Giá trị &amp; giới hạn</th><th>Mặc định</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>bytedance/seedance-1-5-pro</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">duration</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>integer</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>4, 5, 6, 7, 8, 9, 10, 11, 12</div><div>Tối thiểu: 1</div><div>Tối đa: 600</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">resolution</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>480p, 720p, 1080p</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">aspect_ratio</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>1:1, 3:4, 9:16, 9:21, 4:3, 16:9, 21:9</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">generate_audio</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>boolean</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>false, true</div><div>Điều kiện: Bỏ tùy chọn này sẽ chọn giá có âm thanh. Đặt false để chọn giá không có âm thanh. Kiểm tra has_audio trong kết quả để biết có bản âm thanh được trả về hay không.</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">frame_images</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>array</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Số mục tối thiểu: 1</div><div>Số mục tối đa: 2</div><div>Nội dung đầu vào: Mảng đối tượng khung hình. Mỗi đối tượng có type=image_url, image_url chứa url và frame_type. Dùng URL ảnh HTTPS và đặt frame_type thành first_frame hoặc last_frame. Mỗi vai trò khung hình xuất hiện tối đa một lần.</div><div>Khóa chính xác: type, image_url, frame_type</div><div>Điều kiện: Các khóa này mô tả từng đối tượng khung hình; image_url chỉ chứa url. Bỏ frame_images đối với yêu cầu chỉ có văn bản.</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">input_references</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>array</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">size</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>480x480, 480x640, 480x854, 480x1120, 640x480, 720x720, 720x960, 720x1280, 720x1680, 854x480, 960x720, 1080x1080, 1080x1440, 1080x1920, 1080x2520, 1120x480, 1280x720, 1440x1080, 1680x720, 1920x1080, 2520x1080</div><div>Mẫu: ^[1-9][0-9]*x[1-9][0-9]*$</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">seed</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>integer</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Tối thiểu: -9.223.372.036.854.775.808</div><div>Tối đa: 9.223.372.036.854.775.807</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">callback_url</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Mẫu: ^https://</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">session_id</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">trace</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>object</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">user</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Tổ hợp tư liệu đầu vào</summary><p class=\"note-s\"><b>Văn bản thành video</b> · Câu lệnh dạng văn bản. · Bắt buộc: model, prompt, duration</p><p class=\"note-s\"><code>Cung cấp prompt dạng văn bản và duration là số giây nguyên. Chọn độ phân giải và tỷ lệ khung hình được hỗ trợ, hoặc kích thước chính xác được liệt kê.</code></p><p class=\"note-s\"><code class=\"card-field-name\">model</code>: Loại: string · bytedance/seedance-1-5-pro</p><p class=\"note-s\"><code class=\"card-field-name\">prompt</code>: Loại: string · Số byte UTF-8 tối đa: 10.000 · Bắt buộc có ký tự không phải khoảng trắng: Có</p><p class=\"note-s\"><b>Ảnh thành video</b> · Câu lệnh dạng văn bản và ảnh khung hình đầu tiên. · Bắt buộc: model, prompt, duration, frame_images</p><p class=\"note-s\"><code>frame_images là một mảng. Mỗi đối tượng khung hình có type, image_url và frame_type; image_url chứa url. Đặt type thành image_url. Dùng first_frame cùng last_frame tùy chọn. Mỗi vai trò khung hình xuất hiện tối đa một lần. Cung cấp URL ảnh HTTPS công khai cho mỗi khung hình. Chọn độ phân giải và tỷ lệ khung hình được hỗ trợ, hoặc kích thước chính xác được liệt kê.</code></p><p class=\"note-s\">Khóa chính xác: type, image_url, frame_type</p><p class=\"note-s\"><code class=\"card-field-name\">model</code>: Loại: string · bytedance/seedance-1-5-pro</p><p class=\"note-s\"><code class=\"card-field-name\">prompt</code>: Loại: string · Số byte UTF-8 tối đa: 10.000 · Bắt buộc có ký tự không phải khoảng trắng: Có</p></details><details class=\"note-s\" data-method-contract><summary>Tham số phương thức và vòng đời</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Tham số</th><th>Hợp đồng</th></tr></thead><tbody><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>content_type</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>application/json</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>required</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>model, prompt, duration</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>material_types</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>text, image</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>additional_properties</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>false</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>optional_controls</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>resolution, aspect_ratio, generate_audio, frame_images, input_references, size, seed, callback_url, session_id, trace, user</td></tr></tbody></table></div><p>Vòng đời: <code>submit_once_poll_original</code></p><p class=\"note-s\"><code>GET /v1/videos/{public_id}</code></p><p class=\"note-s\"><code>GET /v1/videos/{public_id}/content</code></p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Bảng giá</h3><div class=\"card-result-process\" data-billing-basis><h5>Cách tính phí cuối cùng</h5><p class=\"note-s\">Các đơn giá hiển thị dùng để ước tính chi phí trước khi tạo. Khoản phí cuối cùng được tính dựa trên chi phí ghi nhận cho lượt tạo gốc. Thời lượng đầu ra đo được và số lượng dự kiến không phải là số lượng cuối cùng dùng để tính phí.</p></div><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Thông tin biểu giá không bổ sung tùy chọn yêu cầu. Các tham số được hỗ trợ nằm trong phương thức đã chọn.</p><dl data-price-conditions><dt>Chế độ nhanh</dt><dd>Chưa chỉ định <span class=\"note-s\">Khi chọn chế độ nhanh</span></dd><dt>Chế độ Flex</dt><dd>Chưa chỉ định <span class=\"note-s\">Khi chọn chế độ flex</span></dd><dt>Mức độ suy luận tối đa</dt><dd>Chưa chỉ định <span class=\"note-s\">Khi áp dụng mức điều chỉnh mặc định (default) cho mức độ suy luận tối đa</span></dd></dl></div><div data-declared-tariff-pricing><h4>Mức phí ước tính để so sánh</h4><h4>Giá theo cấu hình</h4><p class=\"note-s\">Đối chiếu từng khoản phí với điều kiện hiển thị. Dùng một mức phí cho mỗi nhóm cấu hình thay thế.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Cấu hình</th><th>Biểu mức phí</th><th>Số lượng dự báo</th><th>Đơn vị tính phí</th><th>Điều kiện tính phí</th><th>Phí</th></tr></thead><tbody><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Giá cơ sở cho token</th><td data-cell-label=\"Biểu mức phí\"><span class=\"card-cell-label\">Biểu mức phí</span>Mức phí cơ bản</td><td data-cell-label=\"Số lượng dự báo\"><span class=\"card-cell-label\">Số lượng dự báo</span>—</td><td data-cell-label=\"Đơn vị tính phí\"><span class=\"card-cell-label\">Đơn vị tính phí</span>—</td><td data-cell-label=\"Điều kiện tính phí\"><span class=\"card-cell-label\">Điều kiện tính phí</span>—</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu vào · Token đầu vào · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu ra · Token đầu ra · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu vào · Đọc bộ nhớ đệm · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu vào · Ghi bộ nhớ đệm · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu vào · Ghi bộ nhớ đệm, 1 giờ · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div></td></tr><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Giá token video</th><td data-cell-label=\"Biểu mức phí\"><span class=\"card-cell-label\">Biểu mức phí</span>—</td><td data-cell-label=\"Số lượng dự báo\"><span class=\"card-cell-label\">Số lượng dự báo</span>—</td><td data-cell-label=\"Đơn vị tính phí\"><span class=\"card-cell-label\">Đơn vị tính phí</span>mỗi 1K token video</td><td data-cell-label=\"Điều kiện tính phí\"><span class=\"card-cell-label\">Điều kiện tính phí</span>Không có điều kiện bổ sung nào được khai báo trong khóa định giá này.</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu ra · Giá token video · Ước tính chỉ để so sánh</span> <b>$0.0048</b> <span class=\"price-unit\">mỗi 1K token video</span></div><p class=\"note-s\">Đơn giá token video là giá tham khảo chính. Các mức giá ước tính theo giây được nêu nổi bật là giá tham khảo riêng, không phải khoản phí bổ sung.</p></td></tr><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Giá token video</th><td data-cell-label=\"Biểu mức phí\"><span class=\"card-cell-label\">Biểu mức phí</span>—</td><td data-cell-label=\"Số lượng dự báo\"><span class=\"card-cell-label\">Số lượng dự báo</span>—</td><td data-cell-label=\"Đơn vị tính phí\"><span class=\"card-cell-label\">Đơn vị tính phí</span>mỗi 1K token video</td><td data-cell-label=\"Điều kiện tính phí\"><span class=\"card-cell-label\">Điều kiện tính phí</span>âm thanh: without_audio</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu ra · Giá token video · Ước tính chỉ để so sánh</span> <b>$0.0024</b> <span class=\"price-unit\">mỗi 1K token video</span></div><p class=\"note-s\">Đơn giá token video là giá tham khảo chính. Các mức giá ước tính theo giây được nêu nổi bật là giá tham khảo riêng, không phải khoản phí bổ sung.</p></td></tr><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Chi phí tạo ước tính</th><td data-cell-label=\"Biểu mức phí\"><span class=\"card-cell-label\">Biểu mức phí</span>—</td><td data-cell-label=\"Số lượng dự báo\"><span class=\"card-cell-label\">Số lượng dự báo</span>ước tính cho một lần tạo</td><td data-cell-label=\"Đơn vị tính phí\"><span class=\"card-cell-label\">Đơn vị tính phí</span>—</td><td data-cell-label=\"Điều kiện tính phí\"><span class=\"card-cell-label\">Điều kiện tính phí</span>—</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu ra · Chi phí tạo ước tính · Ước tính chỉ để so sánh</span> <b>$0.05184</b> <span class=\"price-unit\">ước tính trước khi tạo</span></div><p class=\"note-s\">Ước tính này không phải là khoản phí bổ sung hay mức giá cố định cho lượt tạo đã hoàn tất.</p></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot tạm giữ một khoản ước tính trước yêu cầu. Sau khi có kết quả, phí cuối cùng được quyết toán theo mức sử dụng đo được. Việc quyết toán khi truyền luồng dùng bản ghi mức sử dụng cuối cùng. <a href=\"/docs/vi/billing/reserve/\">Cách hoạt động của cơ chế tạm giữ và quyết toán →</a></p><div data-declared-reference-pricing><h4>Chi tiết giá cước tham chiếu</h4><p class=\"note-s\">Biểu tham chiếu cấp mô hình không thay đổi việc chọn phương thức, báo giá hoặc khoản phí. Khoản phí đang áp dụng dùng mức phí phương thức Ailoot đã chọn.</p><details class=\"card-price-reference\" data-declared-reference-group data-client-selectable=\"false\"><summary>Tham chiếu giá theo cấu hình video</summary><h4>Giá theo cấu hình</h4><p class=\"note-s\">Đối chiếu từng khoản phí với điều kiện hiển thị. Dùng một mức phí cho mỗi nhóm cấu hình thay thế.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Cấu hình</th><th>Điều kiện tính phí</th><th>Phí</th></tr></thead><tbody><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Giá token video</th><td data-cell-label=\"Điều kiện tính phí\"><span class=\"card-cell-label\">Điều kiện tính phí</span>Không có điều kiện bổ sung nào được khai báo trong khóa định giá này.</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu ra · Giá token video</span> <b>$0.0048</b> <span class=\"price-unit\">mỗi 1K token video</span></div><p class=\"note-s\">Đơn giá token video là giá tham khảo chính. Các mức giá ước tính theo giây được nêu nổi bật là giá tham khảo riêng, không phải khoản phí bổ sung.</p></td></tr><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Giá token video</th><td data-cell-label=\"Điều kiện tính phí\"><span class=\"card-cell-label\">Điều kiện tính phí</span>âm thanh: without_audio</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu ra · Giá token video</span> <b>$0.0024</b> <span class=\"price-unit\">mỗi 1K token video</span></div><p class=\"note-s\">Đơn giá token video là giá tham khảo chính. Các mức giá ước tính theo giây được nêu nổi bật là giá tham khảo riêng, không phải khoản phí bổ sung.</p></td></tr></tbody></table></div></details></div></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Ví dụ yêu cầu</h3><h4>Ailoot Ultra · Video</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Các phiên bản mã\"><button class=\"cg-tab\" id=\"model-code-1128-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1128-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl · tạo video</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Sao chép mã\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1128-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1128-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nfrom pathlib import Path\nPath(&#39;request.json&#39;).write_text(&#39;{&quot;aspect_ratio&quot;:&quot;16:9&quot;,&quot;duration&quot;:8,&quot;model&quot;:&quot;bytedance/seedance-1-5-pro&quot;,&quot;prompt&quot;:&quot;A serene mountain landscape at sunset&quot;,&quot;resolution&quot;:&quot;720p&quot;}&#39;, encoding=&#39;utf-8&#39;)\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nr=json.loads(Path(&#39;result.json&#39;).read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint(&#39;Keep the complete JSON and response headers; do not resubmit an unknown creation.&#39;)\nPY_RESULT\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Nhận và lưu kết quả</h3><h4>Ailoot Ultra · Video</h4><p class=\"note-s\">các URL nội dung đã ký thuộc quyền sở hữu</p><ul class=\"card-result-paths\"><li><code>GET /v1/videos/{public_id}</code></li><li><code>GET /v1/videos/{public_id}/content</code></li></ul><h5>Kiểm tra trạng thái tác vụ</h5><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Các phiên bản mã\"><button class=\"cg-tab\" id=\"model-code-1129-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1129-panel-0\" aria-selected=\"true\" tabindex=\"0\">GET trạng thái thao tác gốc</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Sao chép mã\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1129-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1129-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\npython3 - &lt;&lt;&#39;PY_STATUS_URL&#39;\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote\nr=json.loads(Path(&#39;result.json&#39;).read_text())\nif not isinstance(r.get(&#39;id&#39;),str) or not r[&#39;id&#39;]:raise SystemExit(&#39;Keep the original response and headers for reconciliation; no returned ID&#39;)\nPath(&#39;status-url.txt&#39;).write_text(&#39;https://api.ailoot.ai/v1/videos/&#39;+quote(r[&#39;id&#39;],safe=&#39;&#39;))\nPY_STATUS_URL\ncurl --fail-with-body --silent --show-error &quot;$(cat status-url.txt)&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -D status-headers.txt -o status.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nr=json.loads(Path(&#39;status.json&#39;).read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint(&#39;Keep the complete JSON and response headers; do not resubmit an unknown creation.&#39;)\nPY_RESULT\n</code></pre></div></div></div><details class=\"card-about\"><summary>Lượt đọc nội dung khác</summary><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Các phiên bản mã\"><button class=\"cg-tab\" id=\"model-code-1130-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1130-panel-0\" aria-selected=\"true\" tabindex=\"0\">Lưu mọi đầu ra đã hoàn tất thuộc về bạn</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Sao chép mã\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1130-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1130-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\nexport AILOOT_API_KEY\npython3 - &lt;&lt;&#39;PY_ASSETS&#39;\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(&#39;status.json&#39;).read_text())\nif r.get(&#39;status&#39;)!=&#39;completed&#39;:raise SystemExit(&#39;Keep the original ID and read its status; never recreate an unknown job&#39;)\nif not isinstance(r.get(&#39;data&#39;),list) or not r[&#39;data&#39;]:raise SystemExit(&#39;Keep the complete original status; no completed outputs supplied&#39;)\nurls=[]\nfor i,u in enumerate(r.get(&#39;data&#39;,[])):\n    if not isinstance(u,str):raise SystemExit(&#39;Keep the original response; unexpected asset shape&#39;)\n    urls.append((str(i),u))\nfor label,path in urls:\n    u=urljoin(&#39;https://api.ailoot.ai&#39;,path);z=urlsplit(u)\n    if z.scheme!=&#39;https&#39; or z.netloc!=&#39;api.ailoot.ai&#39; or z.username or z.password:raise SystemExit(&#39;Use the actual returned Ailoot owned content URL&#39;)\n    target=Path(&#39;owned-&#39;+label+&#39;.bin&#39;)\n    subprocess.run([&#39;curl&#39;,&#39;--fail-with-body&#39;,&#39;--silent&#39;,&#39;--show-error&#39;,u,&#39;-H&#39;,&#39;Authorization: Bearer &#39;+os.environ[&#39;AILOOT_API_KEY&#39;],&#39;-D&#39;,str(target)+&#39;.headers&#39;,&#39;-o&#39;,str(target)],check=True)\nprint(&#39;All returned owned URLs saved; complete metadata, timing and usage remain in the JSON.&#39;)\nPY_ASSETS\n</code></pre></div></div></div></details><div class=\"card-result-process\" data-all-results><h5>Lưu tất cả kết quả đã hoàn tất</h5><p class=\"note-s\">Lưu mọi video đã hoàn tất hoặc tệp trả về; truy xuất từng URL tài nguyên thực tế được trả về.</p><p class=\"note-s\">Giữ lại mọi đầu ra thực tế thuộc quyền sở hữu và siêu dữ liệu đo lường được trả về.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Nếu cần kiểm tra phản hồi gốc</h5><p class=\"note-s\">503 result_pending_check + id ban đầu + X-Should-Retry:false; tuyệt đối không gửi lại yêu cầu ban đầu</p></div><details class=\"card-about\" data-output-fields><summary>Trường phản hồi</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Trường</th><th>Loại</th><th>Ý nghĩa</th></tr></thead><tbody><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">index</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>integer</td><td data-cell-label=\"Ý nghĩa\"><span class=\"card-cell-label\">Ý nghĩa</span>Vị trí bắt đầu từ không của video này trong danh sách outputs.</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">content_url</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>string</td><td data-cell-label=\"Ý nghĩa\"><span class=\"card-cell-label\">Ý nghĩa</span>URL tải xuống HTTPS đã ký cho video đã hoàn tất này.</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">sha256</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>string | null</td><td data-cell-label=\"Ý nghĩa\"><span class=\"card-cell-label\">Ý nghĩa</span>Giá trị băm SHA-256 của các byte video gốc; null nếu không có dữ liệu.</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">size_bytes</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>integer | null</td><td data-cell-label=\"Ý nghĩa\"><span class=\"card-cell-label\">Ý nghĩa</span>Dung lượng tệp video gốc tính bằng byte; null nếu không có dữ liệu.</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">duration_ms</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>integer | null</td><td data-cell-label=\"Ý nghĩa\"><span class=\"card-cell-label\">Ý nghĩa</span>Thời lượng video đo được tính bằng mili giây; null nếu không có dữ liệu.</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">width</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>integer | null</td><td data-cell-label=\"Ý nghĩa\"><span class=\"card-cell-label\">Ý nghĩa</span>Chiều rộng video tính bằng pixel; null nếu không có dữ liệu.</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">height</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>integer | null</td><td data-cell-label=\"Ý nghĩa\"><span class=\"card-cell-label\">Ý nghĩa</span>Chiều cao video tính bằng pixel; null nếu không có dữ liệu.</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">video_codec</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>string | null</td><td data-cell-label=\"Ý nghĩa\"><span class=\"card-cell-label\">Ý nghĩa</span>Mã định danh codec video; null nếu chưa được ghi nhận.</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">has_audio</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>boolean | null</td><td data-cell-label=\"Ý nghĩa\"><span class=\"card-cell-label\">Ý nghĩa</span>Video có chứa bản âm thanh hay không; null nếu chưa được đo.</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">audio_codec</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>string | null</td><td data-cell-label=\"Ý nghĩa\"><span class=\"card-cell-label\">Ý nghĩa</span>Mã định danh codec âm thanh; null khi chưa ghi nhận mã định danh.</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Lỗi và bước tiếp theo</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Phản hồi</th><th>Điều kiện</th><th>Bước tiếp theo</th></tr></thead><tbody><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>404 · <code>not_found_error</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Không thể truy cập video hoặc không tìm thấy ID video này.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Kiểm tra quyền truy cập video. Với video hiện có, dùng ID công khai ban đầu và cùng khóa API.</td></tr><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>401 · <code>authentication_error</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Khóa API không khớp với tài khoản đã xác thực.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Kiểm tra khóa API và quyền truy cập tài khoản trước khi gửi.</td></tr><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Không thể đọc yêu cầu hoặc chỉ số tải xuống không hợp lệ.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Sửa nội dung yêu cầu. Để tải xuống, chọn một chỉ số đầu ra được tác vụ ban đầu trả về.</td></tr><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>422 · <code>price_unavailable</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Không thể định giá cấu hình video đã chọn.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Chọn cấu hình video được hỗ trợ và điền đầy đủ các tùy chọn bắt buộc trước khi gửi yêu cầu đã sửa.</td></tr><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>422 · <code>invalid_request_error</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Đầu vào video hoặc tác vụ tiếp nối ban đầu không hợp lệ.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Dùng đầu vào HTTPS hợp lệ. Để tiếp nối, dùng ID video công khai ban đầu đã hoàn tất của bạn với cùng khóa API.</td></tr><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>402 · <code>billing_error</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Số dư khả dụng hoặc các giới hạn không cho phép giữ trước số tiền.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Kiểm tra số dư khả dụng và các giới hạn trước khi gửi yêu cầu mới.</td></tr><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>503 · <code>server_error</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Tạm thời không thể xác minh video, lưu trữ hoặc truy cập dịch vụ.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Đợi dịch vụ khả dụng. Nếu đã có ID video, kiểm tra tác vụ ban đầu đó thay vì tạo thêm video.</td></tr><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>503 · <code>result_pending_check</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Kết quả video và khoản phí ban đầu cần được kiểm tra.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Giữ lại ID video được trả về và kiểm tra tác vụ đó. Không gửi yêu cầu tạo thay thế trong khi tác vụ đang được kiểm tra.</td></tr><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>503 · <code>owned_result_unavailable</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Tạm thời không thể tải xuống video hiện có.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Kiểm tra lại cùng tác vụ video sau và tải xuống đầu ra hiện có. Một lần tạo mới sẽ tạo thao tác riêng.</td></tr><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>409 · <code>video_not_ready</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Nội dung video chưa được công bố.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Kiểm tra trạng thái tác vụ ban đầu. Tải xuống sau khi trạng thái là completed; nếu là failed, làm theo thông báo kiểm tra khoản phí.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Bí danh</h3><h4>Bí danh mô hình</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=bytedance%2Fseedance-1-5-pro&amp;route=Ultra&amp;caller=bytedance%2Fseedance-1-5-pro&amp;fmt=videos\"><code>bytedance/seedance-1-5-pro</code></a></span></p><h4>Bí danh đường dẫn phương thức</h4><p class=\"note-s\">Dùng các đường dẫn phương thức hiển thị ở trên.</p><h4>ID gọi liên quan</h4><p class=\"note-s\"><a href=\"#m=bytedance%2Fseedance-1-5-pro&amp;route=Ultra&amp;caller=bytedance%2Fseedance-1-5-pro&amp;fmt=videos\"><code>bytedance/seedance-1-5-pro</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "bytedance/seedance-1-5-pro",
        "fmt": "videos",
        "http": "POST",
        "path": "/v1/videos",
        "request_model_id": "bytedance/seedance-1-5-pro",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|videos|/v1/videos|bytedance%2Fseedance-1-5-pro",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "Các đơn giá hiển thị dùng để ước tính chi phí trước khi tạo. Khoản phí cuối cùng được tính dựa trên chi phí ghi nhận cho lượt tạo gốc. Thời lượng đầu ra đo được và số lượng dự kiến không phải là số lượng cuối cùng dùng để tính phí.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Giữ lại mọi đầu ra thực tế thuộc quyền sở hữu và siêu dữ liệu đo lường được trả về.",
            "defaults": {
              "aspect_ratio": null,
              "duration": null,
              "generate_audio": "endpoint capability flag when published; omitted unknown stays unknown; never guarantees audio track",
              "resolution": null,
              "seed": null,
              "size": null,
              "wire_omissions_preserved": true
            },
            "errors": [
              {
                "condition": "Không thể truy cập video hoặc không tìm thấy ID video này.",
                "http_status": 404,
                "public_identifier_field": "error.type",
                "recovery": "Kiểm tra quyền truy cập video. Với video hiện có, dùng ID công khai ban đầu và cùng khóa API.",
                "type": "not_found_error"
              },
              {
                "condition": "Khóa API không khớp với tài khoản đã xác thực.",
                "http_status": 401,
                "public_identifier_field": "error.type",
                "recovery": "Kiểm tra khóa API và quyền truy cập tài khoản trước khi gửi.",
                "type": "authentication_error"
              },
              {
                "condition": "Không thể đọc yêu cầu hoặc chỉ số tải xuống không hợp lệ.",
                "http_status": 400,
                "public_identifier_field": "error.type",
                "recovery": "Sửa nội dung yêu cầu. Để tải xuống, chọn một chỉ số đầu ra được tác vụ ban đầu trả về.",
                "type": "invalid_request_error"
              },
              {
                "condition": "Không thể định giá cấu hình video đã chọn.",
                "http_status": 422,
                "public_identifier_field": "error.type",
                "recovery": "Chọn cấu hình video được hỗ trợ và điền đầy đủ các tùy chọn bắt buộc trước khi gửi yêu cầu đã sửa.",
                "type": "price_unavailable"
              },
              {
                "condition": "Đầu vào video hoặc tác vụ tiếp nối ban đầu không hợp lệ.",
                "http_status": 422,
                "public_identifier_field": "error.type",
                "recovery": "Dùng đầu vào HTTPS hợp lệ. Để tiếp nối, dùng ID video công khai ban đầu đã hoàn tất của bạn với cùng khóa API.",
                "type": "invalid_request_error"
              },
              {
                "condition": "Số dư khả dụng hoặc các giới hạn không cho phép giữ trước số tiền.",
                "http_status": 402,
                "public_identifier_field": "error.type",
                "recovery": "Kiểm tra số dư khả dụng và các giới hạn trước khi gửi yêu cầu mới.",
                "type": "billing_error"
              },
              {
                "condition": "Tạm thời không thể xác minh video, lưu trữ hoặc truy cập dịch vụ.",
                "http_status": 503,
                "public_identifier_field": "error.type",
                "recovery": "Đợi dịch vụ khả dụng. Nếu đã có ID video, kiểm tra tác vụ ban đầu đó thay vì tạo thêm video.",
                "type": "server_error"
              },
              {
                "code": "result_pending_check",
                "condition": "Kết quả video và khoản phí ban đầu cần được kiểm tra.",
                "http_status": 503,
                "public_identifier_field": "error.code",
                "recovery": "Giữ lại ID video được trả về và kiểm tra tác vụ đó. Không gửi yêu cầu tạo thay thế trong khi tác vụ đang được kiểm tra.",
                "type": "server_error"
              },
              {
                "code": "owned_result_unavailable",
                "condition": "Tạm thời không thể tải xuống video hiện có.",
                "http_status": 503,
                "public_identifier_field": "error.code",
                "recovery": "Kiểm tra lại cùng tác vụ video sau và tải xuống đầu ra hiện có. Một lần tạo mới sẽ tạo thao tác riêng.",
                "type": "server_error"
              },
              {
                "condition": "Nội dung video chưa được công bố.",
                "http_status": 409,
                "public_identifier_field": "error.type",
                "recovery": "Kiểm tra trạng thái tác vụ ban đầu. Tải xuống sau khi trạng thái là completed; nếu là failed, làm theo thông báo kiểm tra khoản phí.",
                "type": "video_not_ready"
              }
            ],
            "hints": [
              "No null values or duplicate keys at any JSON object level",
              "No duration/resolution/aspect default is inserted",
              "Prompt required for all21 despite broader official image-only schema",
              "A request must also pass model membership, exact price card, SKU selection and frozen quote construction",
              "Non-string known trace fields reject; other trace keys retain arbitrary JSON",
              "No n/output-count/client price fields accepted",
              "Provider passthrough disabled for all21; feed allowlist names do not supply provider slug/value contract"
            ],
            "ignored_fields": [],
            "lifecycle": {
              "cancel_endpoint": null,
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{public_id}/content",
                  "query": {
                    "index": "actual output index"
                  }
                }
              ],
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "mode": "submit_once_poll_original",
              "public_id": "video_<uuid>; owner user/key/group scope",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{public_id}"
                }
              ],
              "submit_status": 202,
              "terminal_failure_public": "200 failed + charge_pending_check=true; inspect original operation",
              "terminal_provider_states": [
                "failed",
                "cancelled",
                "expired"
              ],
              "unknown": "503 result_pending_check + id ban đầu + X-Should-Retry:false; tuyệt đối không gửi lại yêu cầu ban đầu"
            },
            "material_combinations": [
              {
                "mode": "text_to_video",
                "model": {
                  "enum": [
                    "bytedance/seedance-1-5-pro"
                  ],
                  "enum_known": true,
                  "type": "string"
                },
                "prompt": {
                  "max_utf8_bytes": 10000,
                  "non_whitespace": true,
                  "type": "string"
                },
                "representation": "Cung cấp prompt dạng văn bản và duration là số giây nguyên. Chọn độ phân giải và tỷ lệ khung hình được hỗ trợ, hoặc kích thước chính xác được liệt kê.",
                "required": [
                  "model",
                  "prompt",
                  "duration"
                ],
                "required_material": "Câu lệnh dạng văn bản."
              },
              {
                "exact_keys": [
                  "type",
                  "image_url",
                  "frame_type"
                ],
                "mode": "image_to_video",
                "model": {
                  "enum": [
                    "bytedance/seedance-1-5-pro"
                  ],
                  "enum_known": true,
                  "type": "string"
                },
                "prompt": {
                  "max_utf8_bytes": 10000,
                  "non_whitespace": true,
                  "type": "string"
                },
                "representation": "frame_images là một mảng. Mỗi đối tượng khung hình có type, image_url và frame_type; image_url chứa url. Đặt type thành image_url. Dùng first_frame cùng last_frame tùy chọn. Mỗi vai trò khung hình xuất hiện tối đa một lần. Cung cấp URL ảnh HTTPS công khai cho mỗi khung hình. Chọn độ phân giải và tỷ lệ khung hình được hỗ trợ, hoặc kích thước chính xác được liệt kê.",
                "required": [
                  "model",
                  "prompt",
                  "duration",
                  "frame_images"
                ],
                "required_material": "Câu lệnh dạng văn bản và ảnh khung hình đầu tiên."
              }
            ],
            "operation_modes": [
              "text_to_video",
              "image_to_video_frame_images"
            ],
            "outputs": {
              "content_range_supported": true,
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "condition": "Always present for each completed output.",
                  "description": "Vị trí bắt đầu từ không của video này trong danh sách outputs.",
                  "field_path": "outputs[].index",
                  "json_schema": {
                    "type": "integer"
                  },
                  "name": "index",
                  "nullable": false,
                  "type": "integer"
                },
                {
                  "condition": "Present after the owned result is available and a signed URL is created.",
                  "description": "URL tải xuống HTTPS đã ký cho video đã hoàn tất này.",
                  "field_path": "outputs[].content_url",
                  "json_schema": {
                    "type": "string"
                  },
                  "name": "content_url",
                  "nullable": false,
                  "type": "string"
                },
                {
                  "condition": "A nonempty recorded digest is returned; otherwise null.",
                  "description": "Giá trị băm SHA-256 của các byte video gốc; null nếu không có dữ liệu.",
                  "field_path": "outputs[].sha256",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "sha256",
                  "nullable": true,
                  "type": "string | null"
                },
                {
                  "condition": "Returned when the recorded file size is positive.",
                  "description": "Dung lượng tệp video gốc tính bằng byte; null nếu không có dữ liệu.",
                  "field_path": "outputs[].size_bytes",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "size_bytes",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Returned when the measured duration is positive.",
                  "description": "Thời lượng video đo được tính bằng mili giây; null nếu không có dữ liệu.",
                  "field_path": "outputs[].duration_ms",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "duration_ms",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Width, height and the video codec are returned together when recorded.",
                  "description": "Chiều rộng video tính bằng pixel; null nếu không có dữ liệu.",
                  "field_path": "outputs[].width",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "width",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Width, height and the video codec are returned together when recorded.",
                  "description": "Chiều cao video tính bằng pixel; null nếu không có dữ liệu.",
                  "field_path": "outputs[].height",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "height",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Returned together with positive recorded width and height.",
                  "description": "Mã định danh codec video; null nếu chưa được ghi nhận.",
                  "field_path": "outputs[].video_codec",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "video_codec",
                  "nullable": true,
                  "type": "string | null"
                },
                {
                  "condition": "Returned when width, height and the video codec are recorded; false is a known result.",
                  "description": "Video có chứa bản âm thanh hay không; null nếu chưa được đo.",
                  "field_path": "outputs[].has_audio",
                  "json_schema": {
                    "type": [
                      "boolean",
                      "null"
                    ]
                  },
                  "name": "has_audio",
                  "nullable": true,
                  "type": "boolean | null"
                },
                {
                  "condition": "Returned when video metadata is recorded and the audio codec identifier is nonempty.",
                  "description": "Mã định danh codec âm thanh; null khi chưa ghi nhận mã định danh.",
                  "field_path": "outputs[].audio_codec",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "audio_codec",
                  "nullable": true,
                  "type": "string | null"
                }
              ],
              "format": "original MP4 bytes; no normalization/transcode",
              "max_aggregate_seconds": 2400,
              "max_bytes_per_output": 67108864,
              "max_seconds_per_output": 600,
              "result": "các URL nội dung đã ký thuộc quyền sở hữu",
              "unmeasured_fields_nullable": true
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "bytedance/seedance-1-5-pro"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "schema": {
                  "const": "bytedance/seedance-1-5-pro"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "minLength": 1,
                "name": "prompt",
                "required": true,
                "schema": {
                  "minLength": 1,
                  "type": "string",
                  "x-source-max-utf8-bytes": 10000,
                  "x-source-non-whitespace": true
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  4,
                  5,
                  6,
                  7,
                  8,
                  9,
                  10,
                  11,
                  12
                ],
                "enum_known": true,
                "maximum": 600,
                "minimum": 1,
                "name": "duration",
                "required": true,
                "schema": {
                  "enum": [
                    4,
                    5,
                    6,
                    7,
                    8,
                    9,
                    10,
                    11,
                    12
                  ],
                  "maximum": 600,
                  "minimum": 1,
                  "type": "integer"
                },
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "480p",
                  "720p",
                  "1080p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": false,
                "schema": {
                  "enum": [
                    "480p",
                    "720p",
                    "1080p"
                  ]
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "1:1",
                  "3:4",
                  "9:16",
                  "9:21",
                  "4:3",
                  "16:9",
                  "21:9"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "schema": {
                  "enum": [
                    "1:1",
                    "3:4",
                    "9:16",
                    "9:21",
                    "4:3",
                    "16:9",
                    "21:9"
                  ]
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Bỏ tùy chọn này sẽ chọn giá có âm thanh. Đặt false để chọn giá không có âm thanh. Kiểm tra has_audio trong kết quả để biết có bản âm thanh được trả về hay không.",
                "default": null,
                "default_known": false,
                "enum": [
                  false,
                  true
                ],
                "enum_known": true,
                "name": "generate_audio",
                "required": false,
                "schema": {
                  "enum": [
                    false,
                    true
                  ],
                  "x-omitted-default": "published audio capability when true/false; unknown if null; output audio must be measured"
                },
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "conditions": "Các khóa này mô tả từng đối tượng khung hình; image_url chỉ chứa url. Bỏ frame_images đối với yêu cầu chỉ có văn bản.",
                "content": "Mảng đối tượng khung hình. Mỗi đối tượng có type=image_url, image_url chứa url và frame_type. Dùng URL ảnh HTTPS và đặt frame_type thành first_frame hoặc last_frame. Mỗi vai trò khung hình xuất hiện tối đa một lần.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "exact_keys": [
                  "type",
                  "image_url",
                  "frame_type"
                ],
                "maxItems": 2,
                "max_items": 2,
                "minItems": 1,
                "min_items": 1,
                "name": "frame_images",
                "required": false,
                "schema": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "frame_type": {
                        "enum": [
                          "first_frame",
                          "last_frame"
                        ]
                      },
                      "image_url": {
                        "additionalProperties": false,
                        "properties": {
                          "url": {
                            "format": "uri",
                            "pattern": "^https://",
                            "type": "string",
                            "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url",
                      "frame_type"
                    ],
                    "type": "object"
                  },
                  "maxItems": 2,
                  "minItems": 1,
                  "type": "array",
                  "x-source-unique-role": "frame_type"
                },
                "type": "array"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxItems": 0,
                "name": "input_references",
                "required": false,
                "schema": {
                  "items": false,
                  "maxItems": 0,
                  "type": "array"
                },
                "type": "array"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "480x480",
                  "480x640",
                  "480x854",
                  "480x1120",
                  "640x480",
                  "720x720",
                  "720x960",
                  "720x1280",
                  "720x1680",
                  "854x480",
                  "960x720",
                  "1080x1080",
                  "1080x1440",
                  "1080x1920",
                  "1080x2520",
                  "1120x480",
                  "1280x720",
                  "1440x1080",
                  "1680x720",
                  "1920x1080",
                  "2520x1080"
                ],
                "enum_known": true,
                "name": "size",
                "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                "required": false,
                "schema": {
                  "enum": [
                    "480x480",
                    "480x640",
                    "480x854",
                    "480x1120",
                    "640x480",
                    "720x720",
                    "720x960",
                    "720x1280",
                    "720x1680",
                    "854x480",
                    "960x720",
                    "1080x1080",
                    "1080x1440",
                    "1080x1920",
                    "1080x2520",
                    "1120x480",
                    "1280x720",
                    "1440x1080",
                    "1680x720",
                    "1920x1080",
                    "2520x1080"
                  ],
                  "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                  "type": "string"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum": 9223372036854775807,
                "minimum": -9223372036854775808,
                "name": "seed",
                "required": false,
                "schema": {
                  "maximum": 9223372036854775807,
                  "minimum": -9223372036854775808,
                  "type": "integer"
                },
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "callback_url",
                "pattern": "^https://",
                "required": false,
                "schema": {
                  "format": "uri",
                  "pattern": "^https://",
                  "type": "string",
                  "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 256,
                "name": "session_id",
                "required": false,
                "schema": {
                  "maxLength": 256,
                  "type": "string"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "trace",
                "required": false,
                "schema": {
                  "additionalProperties": true,
                  "properties": {
                    "generation_name": {
                      "type": "string"
                    },
                    "parent_span_id": {
                      "type": "string"
                    },
                    "span_name": {
                      "type": "string"
                    },
                    "trace_id": {
                      "type": "string"
                    },
                    "trace_name": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "type": "object"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 256,
                "name": "user",
                "required": false,
                "schema": {
                  "maxLength": 256,
                  "type": "string"
                },
                "type": "string"
              }
            ],
            "request_schema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "additionalProperties": false,
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "1:1",
                    "3:4",
                    "9:16",
                    "9:21",
                    "4:3",
                    "16:9",
                    "21:9"
                  ]
                },
                "callback_url": {
                  "format": "uri",
                  "pattern": "^https://",
                  "type": "string",
                  "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                },
                "creativity": false,
                "duration": {
                  "enum": [
                    4,
                    5,
                    6,
                    7,
                    8,
                    9,
                    10,
                    11,
                    12
                  ],
                  "maximum": 600,
                  "minimum": 1,
                  "type": "integer"
                },
                "frame_images": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "frame_type": {
                        "enum": [
                          "first_frame",
                          "last_frame"
                        ]
                      },
                      "image_url": {
                        "additionalProperties": false,
                        "properties": {
                          "url": {
                            "format": "uri",
                            "pattern": "^https://",
                            "type": "string",
                            "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url",
                      "frame_type"
                    ],
                    "type": "object"
                  },
                  "maxItems": 2,
                  "minItems": 1,
                  "type": "array",
                  "x-source-unique-role": "frame_type"
                },
                "generate_audio": {
                  "enum": [
                    false,
                    true
                  ],
                  "x-omitted-default": "published audio capability when true/false; unknown if null; output audio must be measured"
                },
                "input_references": {
                  "items": false,
                  "maxItems": 0,
                  "type": "array"
                },
                "model": {
                  "const": "bytedance/seedance-1-5-pro"
                },
                "previous_job_id": false,
                "prompt": {
                  "minLength": 1,
                  "type": "string",
                  "x-source-max-utf8-bytes": 10000,
                  "x-source-non-whitespace": true
                },
                "provider": false,
                "resolution": {
                  "enum": [
                    "480p",
                    "720p",
                    "1080p"
                  ]
                },
                "seed": {
                  "maximum": 9223372036854775807,
                  "minimum": -9223372036854775808,
                  "type": "integer"
                },
                "session_id": {
                  "maxLength": 256,
                  "type": "string"
                },
                "size": {
                  "enum": [
                    "480x480",
                    "480x640",
                    "480x854",
                    "480x1120",
                    "640x480",
                    "720x720",
                    "720x960",
                    "720x1280",
                    "720x1680",
                    "854x480",
                    "960x720",
                    "1080x1080",
                    "1080x1440",
                    "1080x1920",
                    "1080x2520",
                    "1120x480",
                    "1280x720",
                    "1440x1080",
                    "1680x720",
                    "1920x1080",
                    "2520x1080"
                  ],
                  "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                  "type": "string"
                },
                "trace": {
                  "additionalProperties": true,
                  "properties": {
                    "generation_name": {
                      "type": "string"
                    },
                    "parent_span_id": {
                      "type": "string"
                    },
                    "span_name": {
                      "type": "string"
                    },
                    "trace_id": {
                      "type": "string"
                    },
                    "trace_name": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "upscale_factor": false,
                "user": {
                  "maxLength": 256,
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt",
                "duration"
              ],
              "title": "Video generation request",
              "type": "object",
              "x-source-global-rules": [
                "No null values or duplicate keys at any JSON object level",
                "No duration/resolution/aspect default is inserted",
                "Prompt required for all21 despite broader official image-only schema",
                "A request must also pass model membership, exact price card, SKU selection and frozen quote construction",
                "Non-string known trace fields reject; other trace keys retain arbitrary JSON",
                "No n/output-count/client price fields accepted",
                "Provider passthrough disabled for all21; feed allowlist names do not supply provider slug/value contract"
              ],
              "x-source-material-combinations": [
                "Exact model/card, positive published duration, model resolution/aspect membership and valid frozen quote are all required; independent enum arrays are not proven provider Cartesian combinations.",
                "Use exact published size or compatible resolution/aspect. Omitted options stay omitted; no guessed geometry.",
                "first_frame/last_frame roles each occur at most once; frame_images wins mode precedence over input_references.",
                "provider options are unavailable for this model despite any published passthrough-name allowlist.",
                "Request geometry is required for the pre-generation estimate and reserve. Returned geometry and track time describe the generated output; final charge follows the actual billed configuration.",
                "Video references with *_with_video_input quantity are rejected; image/audio references only where model reference types admit them."
              ]
            },
            "unsupported": [
              "provider",
              "previous_job_id",
              "upscale_factor",
              "creativity"
            ]
          },
          "input": {
            "additional_properties": false,
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "optional_controls": [
              "resolution",
              "aspect_ratio",
              "generate_audio",
              "frame_images",
              "input_references",
              "size",
              "seed",
              "callback_url",
              "session_id",
              "trace",
              "user"
            ],
            "required": [
              "model",
              "prompt",
              "duration"
            ]
          },
          "lifecycle": {
            "cancel_endpoint": null,
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{public_id}/content",
                "query": {
                  "index": "actual output index"
                }
              }
            ],
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "mode": "submit_once_poll_original",
            "public_id": "video_<uuid>; owner user/key/group scope",
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{public_id}"
              }
            ],
            "submit_status": 202,
            "terminal_failure_public": "200 failed + charge_pending_check=true; inspect original operation",
            "terminal_provider_states": [
              "failed",
              "cancelled",
              "expired"
            ],
            "unknown": "503 result_pending_check + originalid + X-Should-Retry:false; never replay original"
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_video",
            "image_to_video_frame_images"
          ],
          "output": {
            "content_range_supported": true,
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "condition": "Always present for each completed output.",
                "description": "Zero-based position of this video in the outputs list.",
                "field_path": "outputs[].index",
                "json_schema": {
                  "type": "integer"
                },
                "name": "index",
                "nullable": false,
                "type": "integer"
              },
              {
                "condition": "Present after the owned result is available and a signed URL is created.",
                "description": "Signed HTTPS download URL for this completed video.",
                "field_path": "outputs[].content_url",
                "json_schema": {
                  "type": "string"
                },
                "name": "content_url",
                "nullable": false,
                "type": "string"
              },
              {
                "condition": "A nonempty recorded digest is returned; otherwise null.",
                "description": "SHA-256 digest of the original video bytes; null if unavailable.",
                "field_path": "outputs[].sha256",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "sha256",
                "nullable": true,
                "type": "string | null"
              },
              {
                "condition": "Returned when the recorded file size is positive.",
                "description": "Size of the original video file in bytes; null if unavailable.",
                "field_path": "outputs[].size_bytes",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "size_bytes",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Returned when the measured duration is positive.",
                "description": "Measured video duration in milliseconds; null if unavailable.",
                "field_path": "outputs[].duration_ms",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "duration_ms",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Width, height and the video codec are returned together when recorded.",
                "description": "Video width in pixels; null if unavailable.",
                "field_path": "outputs[].width",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "width",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Width, height and the video codec are returned together when recorded.",
                "description": "Video height in pixels; null if unavailable.",
                "field_path": "outputs[].height",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "height",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Returned together with positive recorded width and height.",
                "description": "Video codec identifier; null if not recorded.",
                "field_path": "outputs[].video_codec",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "video_codec",
                "nullable": true,
                "type": "string | null"
              },
              {
                "condition": "Returned when width, height and the video codec are recorded; false is a known result.",
                "description": "Whether the video contains an audio track; null if not measured.",
                "field_path": "outputs[].has_audio",
                "json_schema": {
                  "type": [
                    "boolean",
                    "null"
                  ]
                },
                "name": "has_audio",
                "nullable": true,
                "type": "boolean | null"
              },
              {
                "condition": "Returned when video metadata is recorded and the audio codec identifier is nonempty.",
                "description": "Audio codec identifier; null when no identifier is recorded.",
                "field_path": "outputs[].audio_codec",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "audio_codec",
                "nullable": true,
                "type": "string | null"
              }
            ],
            "format": "original MP4 bytes; no normalization/transcode",
            "max_aggregate_seconds": 2400,
            "max_bytes_per_output": 67108864,
            "max_seconds_per_output": 600,
            "result": "signed owned content URLs",
            "unmeasured_fields_nullable": true
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "basis": "Đơn giá token video là giá tham khảo chính. Các mức giá ước tính theo giây được nêu nổi bật là giá tham khảo riêng, không phải khoản phí bổ sung.",
            "dimensions": {
              "conditions": "No additional condition is declared in this pricing key.",
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Giá token video",
            "units": [
              {
                "amount": "0.0048000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_tokens",
                "label": "Video-token price",
                "native_amount_usd_per_unit": "0.0000048",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_token"
              }
            ]
          },
          {
            "basis": "The video-token rate is the primary price reference. Per-second headline estimates are separate references, not an extra charge.",
            "dimensions": {
              "conditions": "audio: without_audio",
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Video-token price",
            "units": [
              {
                "amount": "0.0024000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_tokens_without_audio",
                "label": "Video-token price",
                "native_amount_usd_per_unit": "0.0000024",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_token"
              }
            ]
          },
          {
            "basis": "Ước tính này không phải là khoản phí bổ sung hay mức giá cố định cho lượt tạo đã hoàn tất.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Chi phí tạo ước tính",
            "units": [
              {
                "amount": "0.05184",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.05184",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_REQUEST'\nfrom pathlib import Path\nPath('request.json').write_text('{\"aspect_ratio\":\"16:9\",\"duration\":8,\"model\":\"bytedance/seedance-1-5-pro\",\"prompt\":\"A serene mountain landscape at sunset\",\"resolution\":\"720p\"}', encoding='utf-8')\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nr=json.loads(Path('result.json').read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint('Keep the complete JSON and response headers; do not resubmit an unknown creation.')\nPY_RESULT\n",
            "label": "curl · create video",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_STATUS_URL'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote\nr=json.loads(Path('result.json').read_text())\nif not isinstance(r.get('id'),str) or not r['id']:raise SystemExit('Keep the original response and headers for reconciliation; no returned ID')\nPath('status-url.txt').write_text('https://api.ailoot.ai/v1/videos/'+quote(r['id'],safe=''))\nPY_STATUS_URL\ncurl --fail-with-body --silent --show-error \"$(cat status-url.txt)\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -D status-headers.txt -o status.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nr=json.loads(Path('status.json').read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint('Keep the complete JSON and response headers; do not resubmit an unknown creation.')\nPY_RESULT\n",
            "label": "GET original status",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_ASSETS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path('status.json').read_text())\nif r.get('status')!='completed':raise SystemExit('Keep the original ID and read its status; never recreate an unknown job')\nif not isinstance(r.get('data'),list) or not r['data']:raise SystemExit('Keep the complete original status; no completed outputs supplied')\nurls=[]\nfor i,u in enumerate(r.get('data',[])):\n    if not isinstance(u,str):raise SystemExit('Keep the original response; unexpected asset shape')\n    urls.append((str(i),u))\nfor label,path in urls:\n    u=urljoin('https://api.ailoot.ai',path);z=urlsplit(u)\n    if z.scheme!='https' or z.netloc!='api.ailoot.ai' or z.username or z.password:raise SystemExit('Use the actual returned Ailoot owned content URL')\n    target=Path('owned-'+label+'.bin')\n    subprocess.run(['curl','--fail-with-body','--silent','--show-error',u,'-H','Authorization: Bearer '+os.environ['AILOOT_API_KEY'],'-D',str(target)+'.headers','-o',str(target)],check=True)\nprint('All returned owned URLs saved; complete metadata, timing and usage remain in the JSON.')\nPY_ASSETS\n",
            "label": "Save every completed owned output",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Видео",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "video"
        ],
        "path": "/v1/videos",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "basis": "The video-token rate is the primary price reference. Per-second headline estimates are separate references, not an extra charge.",
            "dimensions": {
              "conditions": "No additional condition is declared in this pricing key.",
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Video-token price",
            "units": [
              {
                "amount": "0.0048000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_tokens",
                "label": "Video-token price",
                "native_amount_usd_per_unit": "0.0000048",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_token"
              }
            ]
          },
          {
            "basis": "The video-token rate is the primary price reference. Per-second headline estimates are separate references, not an extra charge.",
            "dimensions": {
              "conditions": "audio: without_audio",
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Video-token price",
            "units": [
              {
                "amount": "0.0024000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_tokens_without_audio",
                "label": "Video-token price",
                "native_amount_usd_per_unit": "0.0000024",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_token"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "0.05184",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.05184",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "bytedance/seedance-1-5-pro",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{public_id}",
          "GET /v1/videos/{public_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.0048000",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "video_tokens",
            "label": "Video-token price",
            "native_amount_usd_per_unit": "0.0000048",
            "native_quantity": 1,
            "public_unit_label": "per 1,000 video tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_token"
          },
          {
            "amount": "0.0024000",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "video_tokens_without_audio",
            "label": "Video-token price",
            "native_amount_usd_per_unit": "0.0000024",
            "native_quantity": 1,
            "public_unit_label": "per 1,000 video tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_token"
          },
          {
            "amount": "0.05184",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.05184",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    }
  ],
  "model_id": "bytedance/seedance-1-5-pro",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "2aa2a2c9b20d06c4e070664b9a57187748bada88dd91b21cfcd02a45099f4275",
    "input_html_sha256": "9d11da6e410bbb9ed331fef1265a2d5a15d529485f356eb424c7c16a3fce8b19",
    "private_audit_sha256": "e4eae5ed572a20397b74e690fb8a79b7bbb80ceabfe9393d9ca987ab2e068374",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/vi/bytedance-seedance-1-5-pro/",
    "description": "ByteDance Seedance 1.5 Pro tạo video cùng hội thoại, hiệu ứng âm thanh và nhạc đồng bộ. Chỉ đạo người nói, cảm xúc, máy quay và không khí âm thanh để phát triển phim ngắn, quảng cáo có lời và cảnh có nhân vật.",
    "locale": "vi",
    "md_url": "https://ailoot.ai/models/vi/bytedance-seedance-1-5-pro/index.md",
    "title": "ByteDance: Seedance 1.5 Pro — Ailoot",
    "url": "https://ailoot.ai/models/vi/bytedance-seedance-1-5-pro/"
  },
  "rawModel": {
    "about": "Seedance 1.5 Pro là mô hình của ByteDance Seed để tạo kết hợp âm thanh–video trực tiếp. Mô hình mô phỏng hành động hình ảnh, lời nói và nhịp cùng nhau, cho phép cảnh gồm diễn xuất nhân vật, hội thoại đồng bộ và không gian âm thanh có thiết kế. Khác biệt trọng tâm so với yêu cầu video chỉ hình ảnh là âm thanh trở thành một phần mô tả cảnh: ai nói, cách thể hiện câu và khán giả nghe gì quanh hành động.\n\n### Tạo kết hợp hình ảnh và âm thanh\n\nPhạm vi âm thanh được mô tả gồm âm thanh môi trường, hiệu ứng hành động, âm thanh tổng hợp, nhạc cụ, nhạc nền và giọng hát. Mô hình được thiết kế để nối âm thanh với điều xảy ra trên màn hình: vật chạm bàn, cửa mở hoặc nhân vật nói. Dùng cho một nhịp kịch ngắn, quảng cáo sản phẩm có lời hoặc cảnh có cảm xúc phụ thuộc cả diễn xuất lẫn âm thanh.\n\nBắt đầu lời nhắc bằng chủ thể và chuyển động, rồi thêm môi trường, máy quay, phong cách hình ảnh và âm thanh. Cảnh ngắn gọn có thể là: “Một đầu bếp nhấc nắp nồi nhỏ, mỉm cười và nói: ‘Xong rồi.’ Một luồng hơi nhẹ thoát ra, tiếp theo là tiếng chạm khẽ khi nắp đặt trên quầy.” Như vậy câu nói và hiệu ứng có nguyên nhân nhìn thấy được.\n\n### Hội thoại và thuyết minh\n\nMô hình hỗ trợ độc thoại và hội thoại nhiều người nói, với chuyển động môi khớp nhân vật. Hướng dẫn mô tả tiếng Quan thoại, các phương ngữ Trung Quốc gồm Quảng Đông, Thiểm Tây và Tứ Xuyên, cùng lời nói tiếng Anh, Nhật, Hàn, Tây Ban Nha và Indonesia. Ngôn ngữ lời nhắc được mô tả là tiếng Trung và Anh; ngôn ngữ lời nhắc và ngôn ngữ yêu cầu cho câu nói là các lựa chọn riêng.\n\nXác định mỗi người nói bằng đặc điểm nhìn thấy nhất quán và viết lời thoại trong dấu ngoặc kép. Thêm chỉ dẫn cách thể hiện như giọng bình tĩnh, trả lời ngập ngừng hoặc nhịp nhanh hơn, và làm rõ thứ tự lượt. Với hai người, mô tả ai nói trước và máy quay cho thấy phản ứng của ai. Đoạn trao đổi ngắn vừa thời lượng đã chọn cho mô hình mục tiêu diễn xuất rõ hơn một đoạn dài không xác định người nói.\n\nCó thể chỉ đạo thuyết minh bằng âm sắc, cảm xúc, ngữ điệu và tốc độ nói. Cách này hữu ích khi giọng cần giải thích sản phẩm trong lúc máy quay vẫn ở sản phẩm, hoặc người kể tạo tâm trạng mà không có người nói trên hình. Hướng dẫn mô tả giữ âm sắc dễ nhận ra trong khi thay cách thể hiện; xem xét câu chữ thực tế, phát âm và diễn xuất cùng hình ảnh.\n\n### Hiệu ứng âm thanh và nhạc nền\n\nMô tả hiệu ứng là sự kiện gắn với hành động: tiếng bước chân khi nhân vật bước vào, mưa mạnh hơn ngoài cửa sổ hoặc vải chuyển động khi mặc áo khoác. Nhạc nền được tạo mặc định để khớp lời nhắc. Chỉ định tâm trạng, phong cách và nhịp khi quan trọng, đồng thời nêu khi nào bắt đầu hoặc nhỏ dần so với cảnh.\n\nVới phần trình diễn yên tĩnh, yêu cầu nhạc tiết chế và nhấn âm thanh thao tác sản phẩm. Với hoạt hình, mô tả nhịp hành động cần trùng tiết tấu âm nhạc. Bản âm thanh được tạo là đơn âm. Điều khiển âm thanh được mô tả còn cho phép video im lặng khi dự án cần bản âm thanh chuẩn bị riêng.\n\n### Chuyển cú máy và chỉ đạo máy quay\n\nMô hình hỗ trợ thay cú với cách thể hiện hình ảnh nhất quán, cú đảo chiều cho hội thoại và chỉ dẫn thời điểm chuyển cảnh. Chuỗi hội thoại hữu ích có thể xác lập hai người trong trung cảnh, cắt sang người trả lời rồi trở lại phản ứng của người đầu tiên. Nêu danh tính từng người khi cú máy thay đổi.\n\nHướng dẫn bao quát góc cao, thấp và ngang mắt; góc qua vai và góc nhìn chủ quan; khung rộng, trung và cận. Mô tả chuyển động máy quay qua bố cục bắt đầu, hướng, biên độ và bố cục kết thúc. Ví dụ, tiến máy chậm có thể kết thúc ở biểu cảm người nói khi câu vừa xong. Gắn chuyển động với câu chuyện thay vì liệt kê nhiều kỹ thuật máy quay không có mục đích.\n\n### Chế độ, đầu ra và xem trước\n\nChế độ đầu vào được mô tả là chuyển văn bản thành video, ảnh khung đầu thành video và ảnh khung đầu–cuối thành video. Ảnh đầu đã chuẩn bị xác lập bố cục bắt đầu; ảnh cuối có thể xác định điểm kết thúc dự kiến. Đặc tả đầu ra liệt kê MP4 ở 24 fps, 480p, 720p hoặc 1080p và thiết lập thời lượng 4–12 giây. Mô hình còn có thể chọn độ dài nguyên giây trong phạm vi hỗ trợ. Các tỷ lệ được mô tả là 21:9, 16:9, 4:3, 1:1, 3:4 và 9:16, có hỗ trợ bố cục thích ứng.\n\nNhà sản xuất mô tả quy trình Draft hai giai đoạn: bản xem trước 480p để kiểm tra cấu trúc cảnh, lựa chọn cú máy, chuyển động và ý định lời nhắc, rồi tạo hoàn thiện bằng cách tái sử dụng đầu vào sáng tạo. Đây là cách đánh giá diễn xuất đã lên kế hoạch trước khi chọn độ phân giải cuối. Bản xem trước giới hạn ở 480p và không hỗ trợ trả khung cuối. ID tác vụ Draft của nhà sản xuất còn hiệu lực bảy ngày sau khi tạo; tạo video hoàn thiện từ nó trong thời gian đó.\n\nVới nội dung dựa trên ảnh, chuẩn bị ảnh nguồn cho bố cục dự kiến: đổi tỷ lệ đầu ra có thể cắt ảnh. Lặp seed tạo khung tương tự thay vì bảo đảm giống hệt và chỉ dẫn máy quay cố định không phải bảo đảm khóa hoàn hảo. Quan trọng nhất, đánh giá đoạn hội thoại là một phần diễn xuất hình và tiếng thống nhất: đúng người nói, câu nghe được, phản ứng khuôn mặt và điểm nhấn máy quay đều cần phục vụ cùng sự kiện.",
    "alias_of": null,
    "aliases": [],
    "author": "ByteDance",
    "available": null,
    "canonical_model": "bytedance/seedance-1-5-pro",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text",
        "image"
      ],
      "manufacturer_output": [
        "video"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.05184",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.05184",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ],
        "summary": "Giá theo cấu hình được trình bày đầy đủ trong phần chi tiết."
      }
    ],
    "ctx": null,
    "declared_tariff_references": [
      {
        "client_selectable": false,
        "key": "09b7f40b8299fa0acb9ef099",
        "label": "Tham chiếu giá theo cấu hình video",
        "profiles": [
          {
            "basis": "Đơn giá token video là giá tham khảo chính. Các mức giá ước tính theo giây được nêu nổi bật là giá tham khảo riêng, không phải khoản phí bổ sung.",
            "dimensions": {
              "conditions": "Không có điều kiện bổ sung nào được khai báo trong khóa định giá này."
            },
            "label": "Giá token video",
            "units": [
              {
                "amount": "0.0048",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "key": "video_token",
                "label": "Video-token price",
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "rate_role": "typed_video_token_primary_reference",
                "side": "out",
                "unit": "video_token"
              }
            ]
          },
          {
            "basis": "Đơn giá token video là giá tham khảo chính. Các mức giá ước tính theo giây được nêu nổi bật là giá tham khảo riêng, không phải khoản phí bổ sung.",
            "dimensions": {
              "conditions": "âm thanh: without_audio"
            },
            "label": "Giá token video",
            "units": [
              {
                "amount": "0.0024",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "key": "video_token",
                "label": "Video-token price",
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "rate_role": "typed_video_token_primary_reference",
                "side": "out",
                "unit": "video_token"
              }
            ]
          }
        ]
      }
    ],
    "entity_type": "model",
    "formats": [
      "videos"
    ],
    "id": "bytedance/seedance-1-5-pro",
    "input": [
      "text",
      "image"
    ],
    "kind": "video",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "Các đơn giá hiển thị dùng để ước tính chi phí trước khi tạo. Khoản phí cuối cùng được tính dựa trên chi phí ghi nhận cho lượt tạo gốc. Thời lượng đầu ra đo được và số lượng dự kiến không phải là số lượng cuối cùng dùng để tính phí.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Giữ lại mọi đầu ra thực tế thuộc quyền sở hữu và siêu dữ liệu đo lường được trả về.",
            "defaults": {
              "aspect_ratio": null,
              "duration": null,
              "generate_audio": "endpoint capability flag when published; omitted unknown stays unknown; never guarantees audio track",
              "resolution": null,
              "seed": null,
              "size": null,
              "wire_omissions_preserved": true
            },
            "errors": [
              {
                "condition": "Không thể truy cập video hoặc không tìm thấy ID video này.",
                "http_status": 404,
                "public_identifier_field": "error.type",
                "recovery": "Kiểm tra quyền truy cập video. Với video hiện có, dùng ID công khai ban đầu và cùng khóa API.",
                "type": "not_found_error"
              },
              {
                "condition": "Khóa API không khớp với tài khoản đã xác thực.",
                "http_status": 401,
                "public_identifier_field": "error.type",
                "recovery": "Kiểm tra khóa API và quyền truy cập tài khoản trước khi gửi.",
                "type": "authentication_error"
              },
              {
                "condition": "Không thể đọc yêu cầu hoặc chỉ số tải xuống không hợp lệ.",
                "http_status": 400,
                "public_identifier_field": "error.type",
                "recovery": "Sửa nội dung yêu cầu. Để tải xuống, chọn một chỉ số đầu ra được tác vụ ban đầu trả về.",
                "type": "invalid_request_error"
              },
              {
                "condition": "Không thể định giá cấu hình video đã chọn.",
                "http_status": 422,
                "public_identifier_field": "error.type",
                "recovery": "Chọn cấu hình video được hỗ trợ và điền đầy đủ các tùy chọn bắt buộc trước khi gửi yêu cầu đã sửa.",
                "type": "price_unavailable"
              },
              {
                "condition": "Đầu vào video hoặc tác vụ tiếp nối ban đầu không hợp lệ.",
                "http_status": 422,
                "public_identifier_field": "error.type",
                "recovery": "Dùng đầu vào HTTPS hợp lệ. Để tiếp nối, dùng ID video công khai ban đầu đã hoàn tất của bạn với cùng khóa API.",
                "type": "invalid_request_error"
              },
              {
                "condition": "Số dư khả dụng hoặc các giới hạn không cho phép giữ trước số tiền.",
                "http_status": 402,
                "public_identifier_field": "error.type",
                "recovery": "Kiểm tra số dư khả dụng và các giới hạn trước khi gửi yêu cầu mới.",
                "type": "billing_error"
              },
              {
                "condition": "Tạm thời không thể xác minh video, lưu trữ hoặc truy cập dịch vụ.",
                "http_status": 503,
                "public_identifier_field": "error.type",
                "recovery": "Đợi dịch vụ khả dụng. Nếu đã có ID video, kiểm tra tác vụ ban đầu đó thay vì tạo thêm video.",
                "type": "server_error"
              },
              {
                "code": "result_pending_check",
                "condition": "Kết quả video và khoản phí ban đầu cần được kiểm tra.",
                "http_status": 503,
                "public_identifier_field": "error.code",
                "recovery": "Giữ lại ID video được trả về và kiểm tra tác vụ đó. Không gửi yêu cầu tạo thay thế trong khi tác vụ đang được kiểm tra.",
                "type": "server_error"
              },
              {
                "code": "owned_result_unavailable",
                "condition": "Tạm thời không thể tải xuống video hiện có.",
                "http_status": 503,
                "public_identifier_field": "error.code",
                "recovery": "Kiểm tra lại cùng tác vụ video sau và tải xuống đầu ra hiện có. Một lần tạo mới sẽ tạo thao tác riêng.",
                "type": "server_error"
              },
              {
                "condition": "Nội dung video chưa được công bố.",
                "http_status": 409,
                "public_identifier_field": "error.type",
                "recovery": "Kiểm tra trạng thái tác vụ ban đầu. Tải xuống sau khi trạng thái là completed; nếu là failed, làm theo thông báo kiểm tra khoản phí.",
                "type": "video_not_ready"
              }
            ],
            "hints": [
              "No null values or duplicate keys at any JSON object level",
              "No duration/resolution/aspect default is inserted",
              "Prompt required for all21 despite broader official image-only schema",
              "A request must also pass model membership, exact price card, SKU selection and frozen quote construction",
              "Non-string known trace fields reject; other trace keys retain arbitrary JSON",
              "No n/output-count/client price fields accepted",
              "Provider passthrough disabled for all21; feed allowlist names do not supply provider slug/value contract"
            ],
            "ignored_fields": [],
            "lifecycle": {
              "cancel_endpoint": null,
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{public_id}/content",
                  "query": {
                    "index": "actual output index"
                  }
                }
              ],
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "mode": "submit_once_poll_original",
              "public_id": "video_<uuid>; owner user/key/group scope",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{public_id}"
                }
              ],
              "submit_status": 202,
              "terminal_failure_public": "200 failed + charge_pending_check=true; inspect original operation",
              "terminal_provider_states": [
                "failed",
                "cancelled",
                "expired"
              ],
              "unknown": "503 result_pending_check + id ban đầu + X-Should-Retry:false; tuyệt đối không gửi lại yêu cầu ban đầu"
            },
            "material_combinations": [
              {
                "mode": "text_to_video",
                "model": {
                  "enum": [
                    "bytedance/seedance-1-5-pro"
                  ],
                  "enum_known": true,
                  "type": "string"
                },
                "prompt": {
                  "max_utf8_bytes": 10000,
                  "non_whitespace": true,
                  "type": "string"
                },
                "representation": "Cung cấp prompt dạng văn bản và duration là số giây nguyên. Chọn độ phân giải và tỷ lệ khung hình được hỗ trợ, hoặc kích thước chính xác được liệt kê.",
                "required": [
                  "model",
                  "prompt",
                  "duration"
                ],
                "required_material": "Câu lệnh dạng văn bản."
              },
              {
                "exact_keys": [
                  "type",
                  "image_url",
                  "frame_type"
                ],
                "mode": "image_to_video",
                "model": {
                  "enum": [
                    "bytedance/seedance-1-5-pro"
                  ],
                  "enum_known": true,
                  "type": "string"
                },
                "prompt": {
                  "max_utf8_bytes": 10000,
                  "non_whitespace": true,
                  "type": "string"
                },
                "representation": "frame_images là một mảng. Mỗi đối tượng khung hình có type, image_url và frame_type; image_url chứa url. Đặt type thành image_url. Dùng first_frame cùng last_frame tùy chọn. Mỗi vai trò khung hình xuất hiện tối đa một lần. Cung cấp URL ảnh HTTPS công khai cho mỗi khung hình. Chọn độ phân giải và tỷ lệ khung hình được hỗ trợ, hoặc kích thước chính xác được liệt kê.",
                "required": [
                  "model",
                  "prompt",
                  "duration",
                  "frame_images"
                ],
                "required_material": "Câu lệnh dạng văn bản và ảnh khung hình đầu tiên."
              }
            ],
            "operation_modes": [
              "text_to_video",
              "image_to_video_frame_images"
            ],
            "outputs": {
              "content_range_supported": true,
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "condition": "Always present for each completed output.",
                  "description": "Vị trí bắt đầu từ không của video này trong danh sách outputs.",
                  "field_path": "outputs[].index",
                  "json_schema": {
                    "type": "integer"
                  },
                  "name": "index",
                  "nullable": false,
                  "type": "integer"
                },
                {
                  "condition": "Present after the owned result is available and a signed URL is created.",
                  "description": "URL tải xuống HTTPS đã ký cho video đã hoàn tất này.",
                  "field_path": "outputs[].content_url",
                  "json_schema": {
                    "type": "string"
                  },
                  "name": "content_url",
                  "nullable": false,
                  "type": "string"
                },
                {
                  "condition": "A nonempty recorded digest is returned; otherwise null.",
                  "description": "Giá trị băm SHA-256 của các byte video gốc; null nếu không có dữ liệu.",
                  "field_path": "outputs[].sha256",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "sha256",
                  "nullable": true,
                  "type": "string | null"
                },
                {
                  "condition": "Returned when the recorded file size is positive.",
                  "description": "Dung lượng tệp video gốc tính bằng byte; null nếu không có dữ liệu.",
                  "field_path": "outputs[].size_bytes",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "size_bytes",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Returned when the measured duration is positive.",
                  "description": "Thời lượng video đo được tính bằng mili giây; null nếu không có dữ liệu.",
                  "field_path": "outputs[].duration_ms",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "duration_ms",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Width, height and the video codec are returned together when recorded.",
                  "description": "Chiều rộng video tính bằng pixel; null nếu không có dữ liệu.",
                  "field_path": "outputs[].width",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "width",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Width, height and the video codec are returned together when recorded.",
                  "description": "Chiều cao video tính bằng pixel; null nếu không có dữ liệu.",
                  "field_path": "outputs[].height",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "height",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Returned together with positive recorded width and height.",
                  "description": "Mã định danh codec video; null nếu chưa được ghi nhận.",
                  "field_path": "outputs[].video_codec",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "video_codec",
                  "nullable": true,
                  "type": "string | null"
                },
                {
                  "condition": "Returned when width, height and the video codec are recorded; false is a known result.",
                  "description": "Video có chứa bản âm thanh hay không; null nếu chưa được đo.",
                  "field_path": "outputs[].has_audio",
                  "json_schema": {
                    "type": [
                      "boolean",
                      "null"
                    ]
                  },
                  "name": "has_audio",
                  "nullable": true,
                  "type": "boolean | null"
                },
                {
                  "condition": "Returned when video metadata is recorded and the audio codec identifier is nonempty.",
                  "description": "Mã định danh codec âm thanh; null khi chưa ghi nhận mã định danh.",
                  "field_path": "outputs[].audio_codec",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "audio_codec",
                  "nullable": true,
                  "type": "string | null"
                }
              ],
              "format": "original MP4 bytes; no normalization/transcode",
              "max_aggregate_seconds": 2400,
              "max_bytes_per_output": 67108864,
              "max_seconds_per_output": 600,
              "result": "các URL nội dung đã ký thuộc quyền sở hữu",
              "unmeasured_fields_nullable": true
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "bytedance/seedance-1-5-pro"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "schema": {
                  "const": "bytedance/seedance-1-5-pro"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "minLength": 1,
                "name": "prompt",
                "required": true,
                "schema": {
                  "minLength": 1,
                  "type": "string",
                  "x-source-max-utf8-bytes": 10000,
                  "x-source-non-whitespace": true
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  4,
                  5,
                  6,
                  7,
                  8,
                  9,
                  10,
                  11,
                  12
                ],
                "enum_known": true,
                "maximum": 600,
                "minimum": 1,
                "name": "duration",
                "required": true,
                "schema": {
                  "enum": [
                    4,
                    5,
                    6,
                    7,
                    8,
                    9,
                    10,
                    11,
                    12
                  ],
                  "maximum": 600,
                  "minimum": 1,
                  "type": "integer"
                },
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "480p",
                  "720p",
                  "1080p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": false,
                "schema": {
                  "enum": [
                    "480p",
                    "720p",
                    "1080p"
                  ]
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "1:1",
                  "3:4",
                  "9:16",
                  "9:21",
                  "4:3",
                  "16:9",
                  "21:9"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "schema": {
                  "enum": [
                    "1:1",
                    "3:4",
                    "9:16",
                    "9:21",
                    "4:3",
                    "16:9",
                    "21:9"
                  ]
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Bỏ tùy chọn này sẽ chọn giá có âm thanh. Đặt false để chọn giá không có âm thanh. Kiểm tra has_audio trong kết quả để biết có bản âm thanh được trả về hay không.",
                "default": null,
                "default_known": false,
                "enum": [
                  false,
                  true
                ],
                "enum_known": true,
                "name": "generate_audio",
                "required": false,
                "schema": {
                  "enum": [
                    false,
                    true
                  ],
                  "x-omitted-default": "published audio capability when true/false; unknown if null; output audio must be measured"
                },
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "conditions": "Các khóa này mô tả từng đối tượng khung hình; image_url chỉ chứa url. Bỏ frame_images đối với yêu cầu chỉ có văn bản.",
                "content": "Mảng đối tượng khung hình. Mỗi đối tượng có type=image_url, image_url chứa url và frame_type. Dùng URL ảnh HTTPS và đặt frame_type thành first_frame hoặc last_frame. Mỗi vai trò khung hình xuất hiện tối đa một lần.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "exact_keys": [
                  "type",
                  "image_url",
                  "frame_type"
                ],
                "maxItems": 2,
                "max_items": 2,
                "minItems": 1,
                "min_items": 1,
                "name": "frame_images",
                "required": false,
                "schema": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "frame_type": {
                        "enum": [
                          "first_frame",
                          "last_frame"
                        ]
                      },
                      "image_url": {
                        "additionalProperties": false,
                        "properties": {
                          "url": {
                            "format": "uri",
                            "pattern": "^https://",
                            "type": "string",
                            "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url",
                      "frame_type"
                    ],
                    "type": "object"
                  },
                  "maxItems": 2,
                  "minItems": 1,
                  "type": "array",
                  "x-source-unique-role": "frame_type"
                },
                "type": "array"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxItems": 0,
                "name": "input_references",
                "required": false,
                "schema": {
                  "items": false,
                  "maxItems": 0,
                  "type": "array"
                },
                "type": "array"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "480x480",
                  "480x640",
                  "480x854",
                  "480x1120",
                  "640x480",
                  "720x720",
                  "720x960",
                  "720x1280",
                  "720x1680",
                  "854x480",
                  "960x720",
                  "1080x1080",
                  "1080x1440",
                  "1080x1920",
                  "1080x2520",
                  "1120x480",
                  "1280x720",
                  "1440x1080",
                  "1680x720",
                  "1920x1080",
                  "2520x1080"
                ],
                "enum_known": true,
                "name": "size",
                "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                "required": false,
                "schema": {
                  "enum": [
                    "480x480",
                    "480x640",
                    "480x854",
                    "480x1120",
                    "640x480",
                    "720x720",
                    "720x960",
                    "720x1280",
                    "720x1680",
                    "854x480",
                    "960x720",
                    "1080x1080",
                    "1080x1440",
                    "1080x1920",
                    "1080x2520",
                    "1120x480",
                    "1280x720",
                    "1440x1080",
                    "1680x720",
                    "1920x1080",
                    "2520x1080"
                  ],
                  "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                  "type": "string"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum": 9223372036854775807,
                "minimum": -9223372036854775808,
                "name": "seed",
                "required": false,
                "schema": {
                  "maximum": 9223372036854775807,
                  "minimum": -9223372036854775808,
                  "type": "integer"
                },
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "callback_url",
                "pattern": "^https://",
                "required": false,
                "schema": {
                  "format": "uri",
                  "pattern": "^https://",
                  "type": "string",
                  "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 256,
                "name": "session_id",
                "required": false,
                "schema": {
                  "maxLength": 256,
                  "type": "string"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "trace",
                "required": false,
                "schema": {
                  "additionalProperties": true,
                  "properties": {
                    "generation_name": {
                      "type": "string"
                    },
                    "parent_span_id": {
                      "type": "string"
                    },
                    "span_name": {
                      "type": "string"
                    },
                    "trace_id": {
                      "type": "string"
                    },
                    "trace_name": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "type": "object"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 256,
                "name": "user",
                "required": false,
                "schema": {
                  "maxLength": 256,
                  "type": "string"
                },
                "type": "string"
              }
            ],
            "request_schema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "additionalProperties": false,
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "1:1",
                    "3:4",
                    "9:16",
                    "9:21",
                    "4:3",
                    "16:9",
                    "21:9"
                  ]
                },
                "callback_url": {
                  "format": "uri",
                  "pattern": "^https://",
                  "type": "string",
                  "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                },
                "creativity": false,
                "duration": {
                  "enum": [
                    4,
                    5,
                    6,
                    7,
                    8,
                    9,
                    10,
                    11,
                    12
                  ],
                  "maximum": 600,
                  "minimum": 1,
                  "type": "integer"
                },
                "frame_images": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "frame_type": {
                        "enum": [
                          "first_frame",
                          "last_frame"
                        ]
                      },
                      "image_url": {
                        "additionalProperties": false,
                        "properties": {
                          "url": {
                            "format": "uri",
                            "pattern": "^https://",
                            "type": "string",
                            "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url",
                      "frame_type"
                    ],
                    "type": "object"
                  },
                  "maxItems": 2,
                  "minItems": 1,
                  "type": "array",
                  "x-source-unique-role": "frame_type"
                },
                "generate_audio": {
                  "enum": [
                    false,
                    true
                  ],
                  "x-omitted-default": "published audio capability when true/false; unknown if null; output audio must be measured"
                },
                "input_references": {
                  "items": false,
                  "maxItems": 0,
                  "type": "array"
                },
                "model": {
                  "const": "bytedance/seedance-1-5-pro"
                },
                "previous_job_id": false,
                "prompt": {
                  "minLength": 1,
                  "type": "string",
                  "x-source-max-utf8-bytes": 10000,
                  "x-source-non-whitespace": true
                },
                "provider": false,
                "resolution": {
                  "enum": [
                    "480p",
                    "720p",
                    "1080p"
                  ]
                },
                "seed": {
                  "maximum": 9223372036854775807,
                  "minimum": -9223372036854775808,
                  "type": "integer"
                },
                "session_id": {
                  "maxLength": 256,
                  "type": "string"
                },
                "size": {
                  "enum": [
                    "480x480",
                    "480x640",
                    "480x854",
                    "480x1120",
                    "640x480",
                    "720x720",
                    "720x960",
                    "720x1280",
                    "720x1680",
                    "854x480",
                    "960x720",
                    "1080x1080",
                    "1080x1440",
                    "1080x1920",
                    "1080x2520",
                    "1120x480",
                    "1280x720",
                    "1440x1080",
                    "1680x720",
                    "1920x1080",
                    "2520x1080"
                  ],
                  "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                  "type": "string"
                },
                "trace": {
                  "additionalProperties": true,
                  "properties": {
                    "generation_name": {
                      "type": "string"
                    },
                    "parent_span_id": {
                      "type": "string"
                    },
                    "span_name": {
                      "type": "string"
                    },
                    "trace_id": {
                      "type": "string"
                    },
                    "trace_name": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "upscale_factor": false,
                "user": {
                  "maxLength": 256,
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt",
                "duration"
              ],
              "title": "Video generation request",
              "type": "object",
              "x-source-global-rules": [
                "No null values or duplicate keys at any JSON object level",
                "No duration/resolution/aspect default is inserted",
                "Prompt required for all21 despite broader official image-only schema",
                "A request must also pass model membership, exact price card, SKU selection and frozen quote construction",
                "Non-string known trace fields reject; other trace keys retain arbitrary JSON",
                "No n/output-count/client price fields accepted",
                "Provider passthrough disabled for all21; feed allowlist names do not supply provider slug/value contract"
              ],
              "x-source-material-combinations": [
                "Exact model/card, positive published duration, model resolution/aspect membership and valid frozen quote are all required; independent enum arrays are not proven provider Cartesian combinations.",
                "Use exact published size or compatible resolution/aspect. Omitted options stay omitted; no guessed geometry.",
                "first_frame/last_frame roles each occur at most once; frame_images wins mode precedence over input_references.",
                "provider options are unavailable for this model despite any published passthrough-name allowlist.",
                "Request geometry is required for the pre-generation estimate and reserve. Returned geometry and track time describe the generated output; final charge follows the actual billed configuration.",
                "Video references with *_with_video_input quantity are rejected; image/audio references only where model reference types admit them."
              ]
            },
            "unsupported": [
              "provider",
              "previous_job_id",
              "upscale_factor",
              "creativity"
            ]
          },
          "input": {
            "additional_properties": false,
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "optional_controls": [
              "resolution",
              "aspect_ratio",
              "generate_audio",
              "frame_images",
              "input_references",
              "size",
              "seed",
              "callback_url",
              "session_id",
              "trace",
              "user"
            ],
            "required": [
              "model",
              "prompt",
              "duration"
            ]
          },
          "lifecycle": {
            "cancel_endpoint": null,
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{public_id}/content",
                "query": {
                  "index": "actual output index"
                }
              }
            ],
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "mode": "submit_once_poll_original",
            "public_id": "video_<uuid>; owner user/key/group scope",
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{public_id}"
              }
            ],
            "submit_status": 202,
            "terminal_failure_public": "200 failed + charge_pending_check=true; inspect original operation",
            "terminal_provider_states": [
              "failed",
              "cancelled",
              "expired"
            ],
            "unknown": "503 result_pending_check + originalid + X-Should-Retry:false; never replay original"
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_video",
            "image_to_video_frame_images"
          ],
          "output": {
            "content_range_supported": true,
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "condition": "Always present for each completed output.",
                "description": "Zero-based position of this video in the outputs list.",
                "field_path": "outputs[].index",
                "json_schema": {
                  "type": "integer"
                },
                "name": "index",
                "nullable": false,
                "type": "integer"
              },
              {
                "condition": "Present after the owned result is available and a signed URL is created.",
                "description": "Signed HTTPS download URL for this completed video.",
                "field_path": "outputs[].content_url",
                "json_schema": {
                  "type": "string"
                },
                "name": "content_url",
                "nullable": false,
                "type": "string"
              },
              {
                "condition": "A nonempty recorded digest is returned; otherwise null.",
                "description": "SHA-256 digest of the original video bytes; null if unavailable.",
                "field_path": "outputs[].sha256",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "sha256",
                "nullable": true,
                "type": "string | null"
              },
              {
                "condition": "Returned when the recorded file size is positive.",
                "description": "Size of the original video file in bytes; null if unavailable.",
                "field_path": "outputs[].size_bytes",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "size_bytes",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Returned when the measured duration is positive.",
                "description": "Measured video duration in milliseconds; null if unavailable.",
                "field_path": "outputs[].duration_ms",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "duration_ms",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Width, height and the video codec are returned together when recorded.",
                "description": "Video width in pixels; null if unavailable.",
                "field_path": "outputs[].width",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "width",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Width, height and the video codec are returned together when recorded.",
                "description": "Video height in pixels; null if unavailable.",
                "field_path": "outputs[].height",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "height",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Returned together with positive recorded width and height.",
                "description": "Video codec identifier; null if not recorded.",
                "field_path": "outputs[].video_codec",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "video_codec",
                "nullable": true,
                "type": "string | null"
              },
              {
                "condition": "Returned when width, height and the video codec are recorded; false is a known result.",
                "description": "Whether the video contains an audio track; null if not measured.",
                "field_path": "outputs[].has_audio",
                "json_schema": {
                  "type": [
                    "boolean",
                    "null"
                  ]
                },
                "name": "has_audio",
                "nullable": true,
                "type": "boolean | null"
              },
              {
                "condition": "Returned when video metadata is recorded and the audio codec identifier is nonempty.",
                "description": "Audio codec identifier; null when no identifier is recorded.",
                "field_path": "outputs[].audio_codec",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "audio_codec",
                "nullable": true,
                "type": "string | null"
              }
            ],
            "format": "original MP4 bytes; no normalization/transcode",
            "max_aggregate_seconds": 2400,
            "max_bytes_per_output": 67108864,
            "max_seconds_per_output": 600,
            "result": "signed owned content URLs",
            "unmeasured_fields_nullable": true
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "basis": "Đơn giá token video là giá tham khảo chính. Các mức giá ước tính theo giây được nêu nổi bật là giá tham khảo riêng, không phải khoản phí bổ sung.",
            "dimensions": {
              "conditions": "No additional condition is declared in this pricing key.",
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Giá token video",
            "units": [
              {
                "amount": "0.0048000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_tokens",
                "label": "Video-token price",
                "native_amount_usd_per_unit": "0.0000048",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_token"
              }
            ]
          },
          {
            "basis": "The video-token rate is the primary price reference. Per-second headline estimates are separate references, not an extra charge.",
            "dimensions": {
              "conditions": "audio: without_audio",
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Video-token price",
            "units": [
              {
                "amount": "0.0024000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_tokens_without_audio",
                "label": "Video-token price",
                "native_amount_usd_per_unit": "0.0000024",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_token"
              }
            ]
          },
          {
            "basis": "Ước tính này không phải là khoản phí bổ sung hay mức giá cố định cho lượt tạo đã hoàn tất.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Chi phí tạo ước tính",
            "units": [
              {
                "amount": "0.05184",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.05184",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_REQUEST'\nfrom pathlib import Path\nPath('request.json').write_text('{\"aspect_ratio\":\"16:9\",\"duration\":8,\"model\":\"bytedance/seedance-1-5-pro\",\"prompt\":\"A serene mountain landscape at sunset\",\"resolution\":\"720p\"}', encoding='utf-8')\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nr=json.loads(Path('result.json').read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint('Keep the complete JSON and response headers; do not resubmit an unknown creation.')\nPY_RESULT\n",
            "label": "curl · create video",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_STATUS_URL'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote\nr=json.loads(Path('result.json').read_text())\nif not isinstance(r.get('id'),str) or not r['id']:raise SystemExit('Keep the original response and headers for reconciliation; no returned ID')\nPath('status-url.txt').write_text('https://api.ailoot.ai/v1/videos/'+quote(r['id'],safe=''))\nPY_STATUS_URL\ncurl --fail-with-body --silent --show-error \"$(cat status-url.txt)\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -D status-headers.txt -o status.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nr=json.loads(Path('status.json').read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint('Keep the complete JSON and response headers; do not resubmit an unknown creation.')\nPY_RESULT\n",
            "label": "GET original status",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_ASSETS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path('status.json').read_text())\nif r.get('status')!='completed':raise SystemExit('Keep the original ID and read its status; never recreate an unknown job')\nif not isinstance(r.get('data'),list) or not r['data']:raise SystemExit('Keep the complete original status; no completed outputs supplied')\nurls=[]\nfor i,u in enumerate(r.get('data',[])):\n    if not isinstance(u,str):raise SystemExit('Keep the original response; unexpected asset shape')\n    urls.append((str(i),u))\nfor label,path in urls:\n    u=urljoin('https://api.ailoot.ai',path);z=urlsplit(u)\n    if z.scheme!='https' or z.netloc!='api.ailoot.ai' or z.username or z.password:raise SystemExit('Use the actual returned Ailoot owned content URL')\n    target=Path('owned-'+label+'.bin')\n    subprocess.run(['curl','--fail-with-body','--silent','--show-error',u,'-H','Authorization: Bearer '+os.environ['AILOOT_API_KEY'],'-D',str(target)+'.headers','-o',str(target)],check=True)\nprint('All returned owned URLs saved; complete metadata, timing and usage remain in the JSON.')\nPY_ASSETS\n",
            "label": "Save every completed owned output",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Видео",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "video"
        ],
        "path": "/v1/videos",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "basis": "The video-token rate is the primary price reference. Per-second headline estimates are separate references, not an extra charge.",
            "dimensions": {
              "conditions": "No additional condition is declared in this pricing key.",
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Video-token price",
            "units": [
              {
                "amount": "0.0048000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_tokens",
                "label": "Video-token price",
                "native_amount_usd_per_unit": "0.0000048",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_token"
              }
            ]
          },
          {
            "basis": "The video-token rate is the primary price reference. Per-second headline estimates are separate references, not an extra charge.",
            "dimensions": {
              "conditions": "audio: without_audio",
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Video-token price",
            "units": [
              {
                "amount": "0.0024000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_tokens_without_audio",
                "label": "Video-token price",
                "native_amount_usd_per_unit": "0.0000024",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_token"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "0.05184",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.05184",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "bytedance/seedance-1-5-pro",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{public_id}",
          "GET /v1/videos/{public_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.0048000",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "video_tokens",
            "label": "Video-token price",
            "native_amount_usd_per_unit": "0.0000048",
            "native_quantity": 1,
            "public_unit_label": "per 1,000 video tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_token"
          },
          {
            "amount": "0.0024000",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "video_tokens_without_audio",
            "label": "Video-token price",
            "native_amount_usd_per_unit": "0.0000024",
            "native_quantity": 1,
            "public_unit_label": "per 1,000 video tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_token"
          },
          {
            "amount": "0.05184",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.05184",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "bytedance/seedance-1-5-pro",
        "request_model_id": "bytedance/seedance-1-5-pro",
        "route_label": "Ultra"
      }
    ],
    "name": "ByteDance: Seedance 1.5 Pro",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 0.05184,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 0.05184,
      "varies": false
    },
    "pricing_profiles": [
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "manufacturer_reference"
        },
        "dimensions": {
          "billable_token_source": "usage.completion_tokens",
          "draft_estimate_conversion_factor": "0.6",
          "draft_quantity_is_estimate_not_actual": true,
          "maker_model_id": "seedance-1-5-pro-251215",
          "output_audio": true,
          "quoted_unit": "1000000_video_tokens"
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.0000048",
            "amount_unit": "usd_per_token",
            "conditions": {
              "billable_token_source": "usage.completion_tokens",
              "draft_estimate_conversion_factor": "0.6",
              "draft_quantity_is_estimate_not_actual": true,
              "maker_model_id": "seedance-1-5-pro-251215",
              "output_audio": true,
              "quoted_unit": "1000000_video_tokens"
            },
            "key": "base",
            "label": "base",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "video_token"
          }
        ]
      },
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "manufacturer_reference"
        },
        "dimensions": {
          "billable_token_source": "usage.completion_tokens",
          "draft_estimate_conversion_factor": "0.7",
          "draft_quantity_is_estimate_not_actual": true,
          "maker_model_id": "seedance-1-5-pro-251215",
          "output_audio": false,
          "quoted_unit": "1000000_video_tokens"
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.0000024",
            "amount_unit": "usd_per_token",
            "conditions": {
              "billable_token_source": "usage.completion_tokens",
              "draft_estimate_conversion_factor": "0.7",
              "draft_quantity_is_estimate_not_actual": true,
              "maker_model_id": "seedance-1-5-pro-251215",
              "output_audio": false,
              "quoted_unit": "1000000_video_tokens"
            },
            "key": "base",
            "label": "base",
            "profile_index": 1,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "video_token"
          }
        ]
      },
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "manufacturer_reference"
        },
        "dimensions": {
          "billable_token_source": "usage.completion_tokens",
          "draft_estimate_conversion_factor": "0.6",
          "draft_quantity_is_estimate_not_actual": true,
          "maker_model_id": "seedance-1-5-pro-251215",
          "output_audio": true,
          "quoted_unit": "1000000_video_tokens"
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.0000024",
            "amount_unit": "usd_per_token",
            "conditions": {
              "billable_token_source": "usage.completion_tokens",
              "draft_estimate_conversion_factor": "0.6",
              "draft_quantity_is_estimate_not_actual": true,
              "maker_model_id": "seedance-1-5-pro-251215",
              "output_audio": true,
              "quoted_unit": "1000000_video_tokens"
            },
            "key": "base",
            "label": "base",
            "profile_index": 2,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "video_token"
          }
        ]
      },
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "manufacturer_reference"
        },
        "dimensions": {
          "billable_token_source": "usage.completion_tokens",
          "draft_estimate_conversion_factor": "0.7",
          "draft_quantity_is_estimate_not_actual": true,
          "maker_model_id": "seedance-1-5-pro-251215",
          "output_audio": false,
          "quoted_unit": "1000000_video_tokens"
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.0000012",
            "amount_unit": "usd_per_token",
            "conditions": {
              "billable_token_source": "usage.completion_tokens",
              "draft_estimate_conversion_factor": "0.7",
              "draft_quantity_is_estimate_not_actual": true,
              "maker_model_id": "seedance-1-5-pro-251215",
              "output_audio": false,
              "quoted_unit": "1000000_video_tokens"
            },
            "key": "base",
            "label": "base",
            "profile_index": 3,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "video_token"
          }
        ]
      },
      {
        "applicability": {
          "client_selectable": false,
          "no_method_admission_claim": true,
          "scope": "supplier_tariff_reference"
        },
        "dimensions": {},
        "label": "Ailoot Ultra · Tariff components",
        "units": [
          {
            "amount": "0.0048000",
            "amount_unit": "usd_per_thousand_tokens",
            "basis": "video token",
            "billing_original_currency": "USD",
            "billing_original_rate": "0.0000048",
            "key": "video_tokens",
            "label": "video token",
            "native_amount_usd_per_unit": "0.0000048",
            "native_quantity": 1,
            "quantity": 1000,
            "side": "out",
            "unit": "video_token"
          },
          {
            "amount": "0.0024000",
            "amount_unit": "usd_per_thousand_tokens",
            "basis": "audio=false",
            "billing_original_currency": "USD",
            "billing_original_rate": "0.0000024",
            "key": "video_tokens_without_audio",
            "label": "video token",
            "native_amount_usd_per_unit": "0.0000024",
            "native_quantity": 1,
            "quantity": 1000,
            "side": "out",
            "unit": "video_token"
          }
        ]
      }
    ],
    "public_id": "bytedance/seedance-1-5-pro",
    "short": "ByteDance Seedance 1.5 Pro tạo video cùng hội thoại, hiệu ứng âm thanh và nhạc đồng bộ. Chỉ đạo người nói, cảm xúc, máy quay và không khí âm thanh để phát triển phim ngắn, quảng cáo có lời và cảnh có nhân vật."
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "ByteDance Seedance 1.5 Pro tạo video cùng hội thoại, hiệu ứng âm thanh và nhạc đồng bộ. Chỉ đạo người nói, cảm xúc, máy quay và không khí âm thanh để phát triển phim ngắn, quảng cáo có lời và cảnh có nhân vật.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_exact_canonical_sha256": "9bcd43fdf6e8ebc10c87d9b900b539980e3ed0ec3e5db3614aaf697b8490f797",
    "raw_model_js_projection_sha256": "61cc98fb5156944dae63f1c1c808b1eb64faa423c88e7604f460a053871866ca",
    "raw_model_json_sha256": "9bcd43fdf6e8ebc10c87d9b900b539980e3ed0ec3e5db3614aaf697b8490f797",
    "renderer_sha256": "64a62299639eb843877e9ec5c95e32bf22bac3acfe230f6f502c5c3aa186f9c1"
  },
  "sourceRevision": "d7f113f00d9d317c45672167d6c26bcbfab0455608202e303d6ba2002e5af7ac"
}
