Makernice
← 全部文章
影棚长桌上一排商品盒,每个盒子由小灯照亮,前方架着一条摄影滑轨指南

用一个 API Key 把商品图批量生成 15 秒视频

Makernice 团队 · ·

价格截至 2026 年 11 月 2 日(价表 v12)。

用一个 Makernice API Key 把一批商品图做成 15 秒视频:每条先报价,再带 Idempotency-Key 创建,然后轮询或接收 Webhook。图生视频模式、720p 下,wan-3.0 每条 15 秒视频 $1.18,10 条共 $11.84(价表 v12,2026 年 11 月 2 日),报价会在冻结任何金额之前给出准确金额。

批量生成商品视频前要准备什么?

  • 在控制台为这批任务建一个 API Key,设好花费上限和有效期。会超出上限的创建请求在冻结任何金额之前就返回 402 key_spend_limit_reached。
  • 每张商品图一个公开的 https 地址:不超过 10 MB 的静态 JPEG、PNG 或 WebP,直接在该地址返回,不跟随跳转。
  • 每个商品一句描述动作的提示词,例如在桌面上缓慢转动、镜头推近标签。wan-3.0 的提示词最长 4,000 字符。
  • 够付整批的余额。每次充值 $15 到 $1,000,余额不过期。

一批 15 秒商品视频要花多少钱?

视频费用 = 单价 × 请求秒数,所以一条 15 秒视频是每秒单价的 15 倍,10 条共 150 秒。下表按价表 v12(2026 年 11 月 2 日)计算;在成本计算器里选 15 秒、10 条、重新生成比例 0%,得到的是同样的数。在计算器里打开这一批 →

`model`分辨率每秒15 秒一条10 条
wan-3.0480p$0.0394$0.59$5.92
wan-3.0720p$0.0789$1.18$11.84
seedance-2.5720p$0.2592$3.89$38.88

需要指定画幅(例如竖屏信息流的 9:16)时用 seedance-2.5:图生视频模式下只有 Seedance 系列接受 aspect_ratio,其它模型会以 400 invalid_request 拒绝这个字段。只有发布新价表时价格才会变,实际扣费永远是报价金额。

第 1 步:怎么给一条商品视频报价?

curl https://api.makernice.com/v1/generations/quote \
  -H "Authorization: Bearer $MAKERNICE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "wan-3.0",
    "mode": "i2v",
    "prompt": "The ceramic mug turns slowly on a white tabletop, soft studio light, steam rising, slow push-in",
    "image_url": "https://example.com/products/sku-1042.jpg",
    "duration": 15,
    "resolution": "720p"
  }'

返回里的 amount 以 micro-USD(百万分之一美元)计,等于单价 × facts.quantity,这里是 15。报价有效 12 分钟、只能用于一次生成;报价本身不冻结也不扣费。

第 2 步:怎么创建视频而不被重复扣费?

curl https://api.makernice.com/v1/generations \
  -H "Authorization: Bearer $MAKERNICE_API_KEY" \
  -H "Idempotency-Key: product-video-sku-1042-v1" \
  -H "Content-Type: application/json" \
  -d '{
    "quote_id": "qt_...",
    "input": {
      "model": "wan-3.0",
      "mode": "i2v",
      "prompt": "The ceramic mug turns slowly on a white tabletop, soft studio light, steam rising, slow push-in",
      "image_url": "https://example.com/products/sku-1042.jpg",
      "duration": 15,
      "resolution": "720p"
    }
  }'

带上 quote_id 和同样的输入。每个商品用一个由 SKU 拼成的 Idempotency-Key:脚本超时重试时,同一个幂等键、同一份报价和输入会以 200 返回原来那个生成,不会再扣一次。幂等键为 1 到 200 个可打印 ASCII 字符,不含空格。

第 3 步:怎么跑完整批?

import csv
import os
import time
from decimal import Decimal

import requests

API = "https://api.makernice.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['MAKERNICE_API_KEY']}"}
FINAL = {"succeeded", "failed", "canceled"}


def call(method, path, headers=None, **kwargs):
    # Waits out 429 (rate_limited, concurrency_limit_reached) using Retry-After; raises on anything else
    for _ in range(20):
        r = requests.request(method, API + path, headers={**HEADERS, **(headers or {})}, timeout=30, **kwargs)
        if r.status_code == 429:
            time.sleep(int(r.headers.get("Retry-After", "5")))
            continue
        if not r.ok:
            raise RuntimeError(f"{method} {path} -> {r.status_code}: {r.text}")
        return r.json()
    raise RuntimeError(f"{method} {path}: still rate limited")


# products.csv columns: sku,image_url,prompt
with open("products.csv", newline="") as f:
    products = list(csv.DictReader(f))

for p in products:
    job = {
        "model": "wan-3.0",
        "mode": "i2v",
        "prompt": p["prompt"],
        "image_url": p["image_url"],
        "duration": 15,
        "resolution": "720p",
    }
    # Quote right before creating: a quote is valid for 12 minutes and one generation
    quote = call("POST", "/generations/quote", json=job)
    print(p["sku"], "quoted", Decimal(quote["amount"]).scaleb(-6), "USD")
    gen = call(
        "POST",
        "/generations",
        json={"quote_id": quote["id"], "input": job},
        headers={"Idempotency-Key": f"product-video-{p['sku']}-v1"},
    )
    while gen["status"] not in FINAL:
        time.sleep(5)
        gen = call("GET", f"/generations/{gen['id']}")
    print(p["sku"], gen["status"], gen["billing"], gen.get("error"))

脚本在创建每条之前一刻报价,遇到 429 就按 Retry-After 的秒数等待。它一次只跑一条;账户默认最多同时进行 2 个生成,所以在客服提高上限之前,最多再加一个并行进程就够了。不想轮询的话,创建时传 callback_url,生成结束后我们会把结果 POST 到你的服务器。

传送带上的小商品盒逐个经过摄像机图标,出来变成一段短胶片,每段胶片都挂着价签
一张图进,一条 15 秒视频出,每条都有自己的报价。

批量做商品视频常见哪些错误?

看到什么原因怎么办
failed,invalid_request,error.input: image_url图片跳转、超过 10 MB、是 GIF 或动态 WebP修好图片地址后重新创建;冻结已释放
报价时 400 invalid_request传了该模式不收的字段,如 aspect_ratio去掉该字段,或改用 Seedance 模型
410 quote_expired报价到创建超过 12 分钟创建前一刻重新报价
429 concurrency_limit_reached已有 2 个生成在进行等 Retry-After 的秒数后重试
402 daily_spend_limit_reached账户当日消费到上限UTC 零点后继续,或联系客服提额
422 idempotency_conflict同一个幂等键(Idempotency-Key)用于不同输入新输入换一个新的幂等键

商品视频生成失败,钱怎么算?

创建时冻结报价金额。生成失败或超时,冻结金额全额释放;释放不是退款,钱从未离开你的余额。注:如果成品因内容违规被输出审核拦截,这次生成仍会扣费。可联系客服申请人工复核。各种情形见生成失败会扣费吗?

下一步可以看API 集成最佳实践了解重试与轮询,或看图生视频字段说明了解各模型接受哪些字段。

常见问题

能通过 Makernice API 用一张商品图生成 9:16 竖屏视频吗?
可以,用 Seedance 系列:Seedance 2.5、2.0 和 2.0 Fast 在图生视频模式下接受包括 9:16 在内的 aspect_ratio。其它模型在该模式下会以 400 invalid_request 拒绝这个字段。
在 Makernice 生成一条 15 秒图生视频要多少钱?
模型单价 × 15。价表 v12 下,wan-3.0 720p 是 $1.18,seedance-2.5 720p 是 $3.89;每条创建前拿到的报价就是实际扣费金额。
生成失败的商品视频要付费吗?
不用。生成失败或超时,冻结金额全额释放。注:如果成品因内容违规被输出审核拦截,这次生成仍会扣费。可联系客服申请人工复核。

本文涉及的模型