概览
创建视频或超分任务前,使用同一组请求参数获取预估金额。三个估价路径分别对应三个创建接口。
请求规则
将创建任务时的相同参数提交到下列接口,取得本次请求的预估金额。此操作不创建任务、不占次数、不扣余额。实际创建任务时会重新计算并预扣,报价不锁价。超分估价需等待后台读取视频信息,排队超时返回 429,读取超时返回 504,无法识别视频返回 422。
POST /v1/video-generations/estimate:参数与Seedance 视频生成 API相同。POST /v1/wan/video-generations/estimate:参数与Wan3.0 视频生成 API相同。POST /v1/video-upscales/estimate:参数与视频超分 API相同。
三种估价调用示例
Seedance 视频生成 API估价
Bash / macOS / Linux;Windows 可使用 Git Bash。
# 先按“鉴权与通用约定”设置环境变量
: "${MASS_API_KEY:?请先设置 MASS_API_KEY}"
MASS_BASE_URL="${MASS_BASE_URL:-https://api.vizen.cc}"
curl --silent --show-error --fail-with-body --max-time 120 \
-X POST "${MASS_BASE_URL%/}/v1/video-generations/estimate" \
-H "Authorization: Bearer $MASS_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"model": "doubao-seedance-2-5-260628",
"content": [
{
"type": "text",
"text": "清晨的海边,镜头缓慢推进,海浪轻拍沙滩"
}
],
"resolution": "720p",
"duration": 5,
"ratio": "16:9"
}
JSONPython 3.10+,仅使用标准库。保存为 example.py,运行 python example.py。
import json
import os
import urllib.error
import urllib.parse
import urllib.request
base_url = os.environ.get("MASS_BASE_URL", "https://api.vizen.cc").rstrip("/")
api_key = os.environ["MASS_API_KEY"]
path = "/v1/video-generations/estimate"
headers = {"Authorization": "Bearer " + api_key}
payload = json.loads(r'''{
"model": "doubao-seedance-2-5-260628",
"content": [
{
"type": "text",
"text": "清晨的海边,镜头缓慢推进,海浪轻拍沙滩"
}
],
"resolution": "720p",
"duration": 5,
"ratio": "16:9"
}''')
headers["Content-Type"] = "application/json"
body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
request = urllib.request.Request(
base_url + path, data=body, headers=headers, method="POST"
)
try:
with urllib.request.urlopen(request, timeout=120) as response:
result = json.load(response)
print(json.dumps(result, ensure_ascii=False, indent=2))
except urllib.error.HTTPError as error:
print("HTTP", error.code, error.read().decode("utf-8"))
raise SystemExit(1)
except urllib.error.URLError as error:
# 创建请求出现网络异常时,保留原幂等键;不要生成新键后盲目重试。
print("请求未能确认:", error.reason)
raise SystemExit(1)JDK 17+,仅使用标准库。保存为 UTF-8 的 Example.java;执行 javac -encoding UTF-8 Example.java,再执行 java Example。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
public class Example {
static String requireEnv(String name) {
String value = System.getenv(name);
if (value == null || value.isBlank()) {
throw new IllegalArgumentException("请设置环境变量 " + name);
}
return value;
}
public static void main(String[] args) throws Exception {
String base = System.getenv().getOrDefault("MASS_BASE_URL", "https://api.vizen.cc");
base = base.replaceAll("/+$", "");
String path = "/v1/video-generations/estimate";
String body = """
{
"model": "doubao-seedance-2-5-260628",
"content": [
{
"type": "text",
"text": "清晨的海边,镜头缓慢推进,海浪轻拍沙滩"
}
],
"resolution": "720p",
"duration": 5,
"ratio": "16:9"
}
""";
HttpRequest request = HttpRequest.newBuilder(URI.create(base + path))
.timeout(Duration.ofSeconds(120))
.header("Authorization", "Bearer " + requireEnv("MASS_API_KEY"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8))
.build();
HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(20)).build();
// 网络异常会抛出异常;重试创建请求时保留相同幂等键和参数。
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
System.out.println(response.body());
if (response.statusCode() >= 400) {
throw new IllegalStateException("HTTP " + response.statusCode());
}
}
}Go 1.20+,仅使用标准库。保存为 main.go,运行 go run main.go。
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
"time"
)
func requireEnv(name string) string {
value := os.Getenv(name)
if value == "" { panic("请设置环境变量 " + name) }
return value
}
func main() {
base := os.Getenv("MASS_BASE_URL")
if base == "" { base = "https://api.vizen.cc" }
base = strings.TrimRight(base, "/")
path := "/v1/video-generations/estimate"
body := `{
"model": "doubao-seedance-2-5-260628",
"content": [
{
"type": "text",
"text": "清晨的海边,镜头缓慢推进,海浪轻拍沙滩"
}
],
"resolution": "720p",
"duration": 5,
"ratio": "16:9"
}`
req, err := http.NewRequest("POST", base + path, strings.NewReader(body))
if err != nil { panic(err) }
req.Header.Set("Authorization", "Bearer " + requireEnv("MASS_API_KEY"))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 120 * time.Second}
resp, err := client.Do(req)
// 网络异常不代表创建失败;重试时保留原幂等键和参数。
if err != nil { panic(err) }
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if err != nil { panic(err) }
fmt.Println(string(data))
if resp.StatusCode >= 400 { panic(fmt.Sprintf("HTTP %d", resp.StatusCode)) }
}Wan3.0 视频生成 API估价
Bash / macOS / Linux;Windows 可使用 Git Bash。
# 先按“鉴权与通用约定”设置环境变量
: "${MASS_API_KEY:?请先设置 MASS_API_KEY}"
MASS_BASE_URL="${MASS_BASE_URL:-https://api.vizen.cc}"
curl --silent --show-error --fail-with-body --max-time 120 \
-X POST "${MASS_BASE_URL%/}/v1/wan/video-generations/estimate" \
-H "Authorization: Bearer $MASS_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"model": "wan-3.0-pro",
"prompt": "日落海边,镜头缓缓推进",
"resolution": "2k",
"duration": 5
}
JSONPython 3.10+,仅使用标准库。保存为 example.py,运行 python example.py。
import json
import os
import urllib.error
import urllib.parse
import urllib.request
base_url = os.environ.get("MASS_BASE_URL", "https://api.vizen.cc").rstrip("/")
api_key = os.environ["MASS_API_KEY"]
path = "/v1/wan/video-generations/estimate"
headers = {"Authorization": "Bearer " + api_key}
payload = json.loads(r'''{
"model": "wan-3.0-pro",
"prompt": "日落海边,镜头缓缓推进",
"resolution": "2k",
"duration": 5
}''')
headers["Content-Type"] = "application/json"
body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
request = urllib.request.Request(
base_url + path, data=body, headers=headers, method="POST"
)
try:
with urllib.request.urlopen(request, timeout=120) as response:
result = json.load(response)
print(json.dumps(result, ensure_ascii=False, indent=2))
except urllib.error.HTTPError as error:
print("HTTP", error.code, error.read().decode("utf-8"))
raise SystemExit(1)
except urllib.error.URLError as error:
# 创建请求出现网络异常时,保留原幂等键;不要生成新键后盲目重试。
print("请求未能确认:", error.reason)
raise SystemExit(1)JDK 17+,仅使用标准库。保存为 UTF-8 的 Example.java;执行 javac -encoding UTF-8 Example.java,再执行 java Example。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
public class Example {
static String requireEnv(String name) {
String value = System.getenv(name);
if (value == null || value.isBlank()) {
throw new IllegalArgumentException("请设置环境变量 " + name);
}
return value;
}
public static void main(String[] args) throws Exception {
String base = System.getenv().getOrDefault("MASS_BASE_URL", "https://api.vizen.cc");
base = base.replaceAll("/+$", "");
String path = "/v1/wan/video-generations/estimate";
String body = """
{
"model": "wan-3.0-pro",
"prompt": "日落海边,镜头缓缓推进",
"resolution": "2k",
"duration": 5
}
""";
HttpRequest request = HttpRequest.newBuilder(URI.create(base + path))
.timeout(Duration.ofSeconds(120))
.header("Authorization", "Bearer " + requireEnv("MASS_API_KEY"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8))
.build();
HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(20)).build();
// 网络异常会抛出异常;重试创建请求时保留相同幂等键和参数。
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
System.out.println(response.body());
if (response.statusCode() >= 400) {
throw new IllegalStateException("HTTP " + response.statusCode());
}
}
}Go 1.20+,仅使用标准库。保存为 main.go,运行 go run main.go。
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
"time"
)
func requireEnv(name string) string {
value := os.Getenv(name)
if value == "" { panic("请设置环境变量 " + name) }
return value
}
func main() {
base := os.Getenv("MASS_BASE_URL")
if base == "" { base = "https://api.vizen.cc" }
base = strings.TrimRight(base, "/")
path := "/v1/wan/video-generations/estimate"
body := `{
"model": "wan-3.0-pro",
"prompt": "日落海边,镜头缓缓推进",
"resolution": "2k",
"duration": 5
}`
req, err := http.NewRequest("POST", base + path, strings.NewReader(body))
if err != nil { panic(err) }
req.Header.Set("Authorization", "Bearer " + requireEnv("MASS_API_KEY"))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 120 * time.Second}
resp, err := client.Do(req)
// 网络异常不代表创建失败;重试时保留原幂等键和参数。
if err != nil { panic(err) }
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if err != nil { panic(err) }
fmt.Println(string(data))
if resp.StatusCode >= 400 { panic(fmt.Sprintf("HTTP %d", resp.StatusCode)) }
}视频超分 API估价
Bash / macOS / Linux;Windows 可使用 Git Bash。
# 先按“鉴权与通用约定”设置环境变量
: "${MASS_API_KEY:?请先设置 MASS_API_KEY}"
MASS_BASE_URL="${MASS_BASE_URL:-https://api.vizen.cc}"
curl --silent --show-error --fail-with-body --max-time 120 \
-X POST "${MASS_BASE_URL%/}/v1/video-upscales/estimate" \
-H "Authorization: Bearer $MASS_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"video_url": "https://your-domain.example/input.mp4",
"resolution": "1080p"
}
JSONPython 3.10+,仅使用标准库。保存为 example.py,运行 python example.py。
import json
import os
import urllib.error
import urllib.parse
import urllib.request
base_url = os.environ.get("MASS_BASE_URL", "https://api.vizen.cc").rstrip("/")
api_key = os.environ["MASS_API_KEY"]
path = "/v1/video-upscales/estimate"
headers = {"Authorization": "Bearer " + api_key}
payload = json.loads(r'''{
"video_url": "https://your-domain.example/input.mp4",
"resolution": "1080p"
}''')
headers["Content-Type"] = "application/json"
body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
request = urllib.request.Request(
base_url + path, data=body, headers=headers, method="POST"
)
try:
with urllib.request.urlopen(request, timeout=120) as response:
result = json.load(response)
print(json.dumps(result, ensure_ascii=False, indent=2))
except urllib.error.HTTPError as error:
print("HTTP", error.code, error.read().decode("utf-8"))
raise SystemExit(1)
except urllib.error.URLError as error:
# 创建请求出现网络异常时,保留原幂等键;不要生成新键后盲目重试。
print("请求未能确认:", error.reason)
raise SystemExit(1)JDK 17+,仅使用标准库。保存为 UTF-8 的 Example.java;执行 javac -encoding UTF-8 Example.java,再执行 java Example。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
public class Example {
static String requireEnv(String name) {
String value = System.getenv(name);
if (value == null || value.isBlank()) {
throw new IllegalArgumentException("请设置环境变量 " + name);
}
return value;
}
public static void main(String[] args) throws Exception {
String base = System.getenv().getOrDefault("MASS_BASE_URL", "https://api.vizen.cc");
base = base.replaceAll("/+$", "");
String path = "/v1/video-upscales/estimate";
String body = """
{
"video_url": "https://your-domain.example/input.mp4",
"resolution": "1080p"
}
""";
HttpRequest request = HttpRequest.newBuilder(URI.create(base + path))
.timeout(Duration.ofSeconds(120))
.header("Authorization", "Bearer " + requireEnv("MASS_API_KEY"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8))
.build();
HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(20)).build();
// 网络异常会抛出异常;重试创建请求时保留相同幂等键和参数。
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
System.out.println(response.body());
if (response.statusCode() >= 400) {
throw new IllegalStateException("HTTP " + response.statusCode());
}
}
}Go 1.20+,仅使用标准库。保存为 main.go,运行 go run main.go。
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
"time"
)
func requireEnv(name string) string {
value := os.Getenv(name)
if value == "" { panic("请设置环境变量 " + name) }
return value
}
func main() {
base := os.Getenv("MASS_BASE_URL")
if base == "" { base = "https://api.vizen.cc" }
base = strings.TrimRight(base, "/")
path := "/v1/video-upscales/estimate"
body := `{
"video_url": "https://your-domain.example/input.mp4",
"resolution": "1080p"
}`
req, err := http.NewRequest("POST", base + path, strings.NewReader(body))
if err != nil { panic(err) }
req.Header.Set("Authorization", "Bearer " + requireEnv("MASS_API_KEY"))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 120 * time.Second}
resp, err := client.Do(req)
// 网络异常不代表创建失败;重试时保留原幂等键和参数。
if err != nil { panic(err) }
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if err != nil { panic(err) }
fmt.Println(string(data))
if resp.StatusCode >= 400 { panic(fmt.Sprintf("HTTP %d", resp.StatusCode)) }
}成功返回 HTTP 200。以下金额仅用于展示结构,实际请用自己的请求参数查询。
响应字段
{
"api": "video_generation",
"currency": "CNY",
"estimated_amount": "1.25000000",
"balance_sufficient": true,
"assumptions": [],
"description": "按请求参数预估,最终以实际用量结算"
}apistring估价对应的 API
currencystring金额币种 CNY
estimated_amountstring本次请求的预估金额;字符串十进制,最多 8 位小数
balance_sufficientboolean查询时余额是否足够;不代表任务已经受理
assumptionsarray<string>影响估价的未确认信息与保守估算说明
descriptionstring估价与结算说明
智能时长、编辑、自适应比例或无法确认的视频时长、帧率会采用保守估算,并在 assumptions 中说明。预估不是最终收费,也不是最终费用上限;结果生成后按实际用量退补差额。