API 兼容入口

开放 API 文档(v1)

以 REST 方式调用 Kipin 平台的图片、视频与 3D 生成能力,与站内使用同一套模型、任务流水线与计价。

基础地址https://kipin.soyoco.top/api/v1

鉴权(签名换取 authKey)

为避免密钥在网络上传输,API 采用两段式鉴权:原始 API Key 只在你的服务端本地参与 HMAC 签名运算,用签名换取短时 authKey(有效期 15 分钟),业务接口只接受 authKey。直接在请求头里发送 sk_kipin_ 原始密钥会被拒绝(raw_key_not_allowed)。

  1. 本地计算签名密钥 signingKey = hex(SHA-256(API Key)),再对 keyId.timestamp.nonce 做 HMAC-SHA256 得到 signature。
  2. 调用 POST /api/v1/auth/token 换取 authKey(15 分钟有效,过期随时重新换取)。
  3. 之后所有接口用 Authorization: Bearer authKey 调用。
POST/api/v1/auth/token

签名规范与请求体(keyId 与密钥一同下发;timestamp 为 Unix 秒,允许 ±300 秒时钟偏差;nonce 为 8–128 位随机串,窗口期内不可复用):

message    = `${keyId}.${timestamp}.${nonce}`
signingKey = hex(SHA-256(API Key))          // 服务端只存此哈希,可直接验签
signature  = hex(HMAC-SHA256(signingKey, message))

POST /api/v1/auth/token
{
  "keyId": "apikey-xxxxxxxx",   // 密钥 ID(与密钥一同下发)
  "timestamp": 1782981000,      // Unix 秒,允许 ±300s 时钟偏差
  "nonce": "b3f1c9d0a4e2...",   // 8–128 位随机串,窗口期内不可复用
  "signature": "9f86d081884c..."
}

Node.js 签名与换取示例:

import {createHash, createHmac, randomBytes} from 'node:crypto';

const signingKey = createHash('sha256').update(process.env.KIPIN_API_KEY).digest('hex');
const timestamp = Math.floor(Date.now() / 1000);
const nonce = randomBytes(16).toString('hex');
const signature = createHmac('sha256', signingKey)
  .update(`${process.env.KIPIN_KEY_ID}.${timestamp}.${nonce}`)
  .digest('hex');

const {authKey, expiresIn} = await fetch(`${BASE}/auth/token`, {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({keyId: process.env.KIPIN_KEY_ID, timestamp, nonce, signature}),
}).then((r) => r.json());

响应

{
  "ok": true,
  "tokenType": "Bearer",
  "authKey": "eyJhbGciOiJIUzI1NiJ9...",
  "expiresIn": 900
}

拿到 authKey 后,所有业务接口统一通过请求头传递:

Authorization: Bearer <authKey>

请妥善保管 Key:仅在服务端参与签名,不要写入前端代码或公开仓库。原始 Key 永远不需要(也不应该)通过网络发送。

快速开始

四步完成一次生成:签名换 authKey → 列模型 → 创建任务 → 轮询结果。

# 0) 签名换取 authKey(shell + openssl 示例)
SIGNING_KEY=$(printf %s "$KIPIN_API_KEY" | openssl dgst -sha256 -hex | awk '{print $NF}')
TS=$(date +%s); NONCE=$(openssl rand -hex 16)
SIG=$(printf %s "$KIPIN_KEY_ID.$TS.$NONCE" | openssl dgst -sha256 -hmac "$SIGNING_KEY" -hex | awk '{print $NF}')
AUTH_KEY=$(curl -s -X POST https://kipin.soyoco.top/api/v1/auth/token \
  -H "Content-Type: application/json" \
  -d "{\"keyId\":\"$KIPIN_KEY_ID\",\"timestamp\":$TS,\"nonce\":\"$NONCE\",\"signature\":\"$SIG\"}" \
  | jq -r .authKey)

# 1) 列出可用模型
curl -H "Authorization: Bearer $AUTH_KEY" \
  https://kipin.soyoco.top/api/v1/models

# 2) 创建生成任务
curl -X POST https://kipin.soyoco.top/api/v1/generations \
  -H "Authorization: Bearer $AUTH_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "image",
    "platform": "volcengine",
    "model": "doubao-seedream-5-0-260128",
    "prompt": "A cinematic photo of a red fox in snow"
  }'

# 3) 轮询任务状态
curl -H "Authorization: Bearer $AUTH_KEY" \
  https://kipin.soyoco.top/api/v1/generations/task-xxxxxxxx
GET/api/v1/models

列出当前可调用的模型(平台、模型 ID、能力类型)。创建任务时的 platform / model 参数取自这里。

{
  "ok": true,
  "models": [
    {
      "platform": "volcengine",
      "model": "doubao-seedance-2-0-260128",
      "label": "Seedance 2.0",
      "generationType": "t2v",
      "creditsPerTask": 0,
      "constraints": {
        "inputs": {
          "image": {"maxCount": 8, "maxMB": 100, "formats": ["jpg", "jpeg", "png", "webp"]},
          "video": {"maxCount": 4, "maxMB": 100, "formats": ["mp4", "mov", "webm"]}
        },
        "duration": {"minSec": 4, "maxSec": 15, "defaultSec": 5, "allowedValues": [4, 5, 6, 8, 10, 12, 15]},
        "resolutions": ["480p", "720p", "1080p"]
      }
    }
  ]
}

creditsPerTask 为 0 表示该模型按时长/分辨率/张数动态计价,实际扣分以任务结算为准。

POST/api/v1/generations

创建一次生成任务。任务异步执行,接口立即返回任务 ID,请用查询接口轮询结果。

请求参数(JSON Body)

参数类型必填说明
typestring任务类型:image、video 或 3d
platformstring模型平台标识,取自 GET /models 返回的 platform 字段
modelstring模型 ID,取自 GET /models 返回的 model 字段(也接受 modelId 字段名)
promptstring提示词。prompt 与 inputUrl / inputUrls 至少提供一个
inputUrlstring参考图/视频的公网 URL(单个)
inputUrlsstring[]参考素材公网 URL 数组(多图参考等场景)
generationTypestring细分能力(如 t2i、i2i、t2v、i2v、r2v),缺省按模型默认能力
durationnumber视频时长(秒),各模型有官方档位限制
resolutionstring分辨率,如 480p、720p、1080p
ratiostring画幅比例,如 16:9、9:16、1:1
numImagesnumber图片张数(图片任务)
negativePromptstring负向提示词(不希望出现的内容)
includeAudioboolean视频是否带音频(支持的模型有效)

响应

{
  "ok": true,
  "id": "task-1b2c3d4e",
  "status": "queued",
  "costCredits": 0,
  "pollUrl": "/api/v1/generations/task-1b2c3d4e"
}
GET/api/v1/generations/{id}

查询任务状态与结果。只能查询本 Key 所属账号创建的任务;outputUrl 仅在 succeeded 时返回,error 仅在 failed 时返回。

{
  "ok": true,
  "id": "task-1b2c3d4e",
  "status": "succeeded",
  "type": "video_generation",
  "platform": "volcengine",
  "model": "doubao-seedance-2-0-260128",
  "outputUrl": "https://.../output.mp4",
  "costCredits": 17,
  "createdAt": "2026-07-03T09:00:00.000Z",
  "updatedAt": "2026-07-03T09:02:31.000Z"
}

返回的 status 为小写;createdAt / updatedAt 为 ISO 8601 UTC 时间。

GET/api/v1/generations

分页列出本 Key 所属账号的历史生成记录,支持按状态/类型/来源过滤。查询参数:

参数类型说明
pagenumber页码,从 1 开始(默认 1)
pageSizenumber每页条数,1–100(默认 20)
statusstring按状态过滤:queued / running / succeeded / failed / cancelled
typestring按任务类型过滤,如 image_generation / video_generation / model_3d_generation
sourcestring按来源过滤:api(本 API 创建)或 ui(站内创建);缺省返回全部
GET /api/v1/generations?page=1&pageSize=20&status=succeeded&source=api

{
  "ok": true,
  "page": 1,
  "pageSize": 20,
  "total": 42,
  "tasks": [
    {
      "id": "task-1b2c3d4e",
      "status": "succeeded",
      "type": "video_generation",
      "generationType": "t2v",
      "platform": "volcengine",
      "model": "doubao-seedance-2-0-260128",
      "outputUrl": "https://.../output.mp4",
      "costCredits": 17,
      "source": "api",
      "createdAt": "2026-07-03T09:00:00.000Z",
      "updatedAt": "2026-07-03T09:02:31.000Z"
    }
  ]
}
DELETE/api/v1/generations/{id}

取消排队中或运行中的任务。取消成功后,该任务的预扣积分会自动退还。

{
  "ok": true,
  "id": "task-1b2c3d4e",
  "status": "cancelled"
}

已进入终态(succeeded / failed)的任务不可取消,会返回 cancel_rejected。

GET/api/v1/credits

查询本 Key 所属工作区的积分余额与套餐,便于下发任务前自查余量。

{
  "ok": true,
  "workspaceId": "ws-xxxxxxxx",
  "plan": "Growth",
  "creditBalance": 480
}
GET/api/v1/assets

分页列出本 Key 所属账号的已生成资产(图片/视频等媒体库条目);与「历史记录」不同,这里是产物维度,含尺寸、时长、文件大小、公开状态。查询参数:

参数类型说明
pagenumber页码,从 1 开始(默认 1)
pageSizenumber每页条数,1–100(默认 20)
typestring按资产类型过滤,如 image / video
sourcestring按来源过滤:ai_generated(站内生成)/ api(本 API 生成)/ upload(上传)/ workflow_extract(工作流抽帧);缺省返回全部
GET /api/v1/assets?page=1&pageSize=20&type=video&source=api

{
  "ok": true,
  "page": 1,
  "pageSize": 20,
  "total": 128,
  "assets": [
    {
      "id": "asset-9a8b7c6d",
      "type": "video",
      "name": "output.mp4",
      "url": "https://.../output.mp4",
      "source": "api",
      "isPublic": false,
      "model": "doubao-seedance-2-0-260128",
      "prompt": "a red fox in a snowy pine forest",
      "contentType": "video/mp4",
      "fileSize": 2481520,
      "width": 1280,
      "height": 720,
      "duration": 5,
      "createdAt": "2026-07-03T09:02:31.000Z"
    }
  ]
}

API 生成的资产(source=api)默认保留 24 小时后自动清理,请及时下载 url 转存。

模型参数矩阵

各模型支持的能力与参数范围不同,创建任务时的 duration / resolution / 参考素材数量必须落在下表范围内,否则返回 generation_rejected。数据与站内生成页、后端校验同源,实时反映当前启用的模型。

图像模型(type: image)

模型能力分辨率档参考图
Agnes Image 2.0 Flash
agnes / agnes-image-2.0-flash
i2i2K≤6 个 · ≤100MB · jpg/jpeg/png/webp
Agnes Image 2.0 Flash
agnes / agnes-image-2.0-flash
t2i2K≤6 个 · ≤100MB · jpg/jpeg/png/webp
Agnes Image 2.1 Flash
agnes / agnes-image-2.1-flash
i2i2K≤6 个 · ≤100MB · jpg/jpeg/png/webp
Agnes Image 2.1 Flash
agnes / agnes-image-2.1-flash
t2i2K≤6 个 · ≤100MB · jpg/jpeg/png/webp
Wan2.7 Image Pro
bailian / wan2.7-image-pro
i2i1K / 2K / 4K≤9 个 · ≤100MB · jpg/jpeg/png/webp
Wan2.7 Image Pro
bailian / wan2.7-image-pro
t2i1K / 2K / 4K≤9 个 · ≤100MB · jpg/jpeg/png/webp
Seedream 5.0 Lite
volcengine / doubao-seedream-5-0-260128
i2i2K / 3K≤8 个 · ≤100MB · jpg/jpeg/png/webp
Seedream 5.0 Lite
volcengine / doubao-seedream-5-0-260128
t2i2K / 3K≤8 个 · ≤100MB · jpg/jpeg/png/webp

视频模型(type: video)

模型能力时长(秒)分辨率档参考图参考视频
Agnes Video 2.0
agnes / agnes-video-v2.0
i2v3/5/8/10/15/18 s720p≤4 个 · ≤100MB · jpg/jpeg/png/webp
Agnes Video 2.0
agnes / agnes-video-v2.0
r2v3/5/8/10/15/18 s720p≤4 个 · ≤100MB · jpg/jpeg/png/webp
Agnes Video 2.0
agnes / agnes-video-v2.0
t2v3/5/8/10/15/18 s720p≤4 个 · ≤100MB · jpg/jpeg/png/webp
HappyHorse 1.0 I2V
bailian / happyhorse-1.0-i2v
i2v3–15 s720p / 1080p≤1 个 · ≤20MB · jpg/jpeg/png/webp
HappyHorse 1.0 R2V
bailian / happyhorse-1.0-r2v
r2v3–15 s720p / 1080p≤9 个 · ≤20MB · jpg/jpeg/png/webp
HappyHorse 1.0 T2V
bailian / happyhorse-1.0-t2v
t2v3–15 s720p / 1080p
HappyHorse 1.0 Video Edit
bailian / happyhorse-1.0-video-edit
v2v3–15 s720p / 1080p≤1 个 · ≤100MB · mp4/mov
HappyHorse 1.1 I2V
bailian / happyhorse-1.1-i2v
i2v3–15 s720p / 1080p≤1 个 · ≤20MB · jpg/jpeg/png/webp
HappyHorse 1.1 R2V
bailian / happyhorse-1.1-r2v
r2v3–15 s720p / 1080p≤9 个 · ≤20MB · jpg/jpeg/png/webp
HappyHorse 1.1 T2V
bailian / happyhorse-1.1-t2v
t2v3–15 s720p / 1080p
Wan2.7 I2V
bailian / wan2.7-i2v
i2v2–15 s720p / 1080p≤2 个 · ≤100MB · jpg/jpeg/png/webp
Wan2.7 R2V
bailian / wan2.7-r2v
r2v2–10 s720p / 1080p≤5 个 · ≤100MB · jpg/jpeg/png/webp≤5 个 · ≤100MB · mp4/mov
Wan2.7 T2V
bailian / wan2.7-t2v
t2v2–15 s720p / 1080p
Wan2.7 Video Edit
bailian / wan2.7-videoedit
v2v2–10 s720p / 1080p≤1 个 · ≤100MB · mp4/mov
Seedance 2.0 海外版
seedance-overseas / seedance-2-0-overseas
i2v4/5/6/8/10/12/15 s480p / 720p / 1080p≤9 个 · ≤100MB · jpg/jpeg/png/webp≤3 个 · ≤100MB · mp4/mov/webm
Seedance 2.0 海外版
seedance-overseas / seedance-2-0-overseas
r2v4/5/6/8/10/12/15 s480p / 720p / 1080p≤9 个 · ≤100MB · jpg/jpeg/png/webp≤3 个 · ≤100MB · mp4/mov/webm
Seedance 2.0 海外版
seedance-overseas / seedance-2-0-overseas
t2v4/5/6/8/10/12/15 s480p / 720p / 1080p≤9 个 · ≤100MB · jpg/jpeg/png/webp≤3 个 · ≤100MB · mp4/mov/webm
Seedance 2.0 海外版
seedance-overseas / seedance-2-0-overseas
v2v4/5/6/8/10/12/15 s480p / 720p / 1080p≤9 个 · ≤100MB · jpg/jpeg/png/webp≤3 个 · ≤100MB · mp4/mov/webm
Seedance 2.0
volcengine / doubao-seedance-2-0-260128
i2v4/5/6/8/10/12/15 s480p / 720p / 1080p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
Seedance 2.0
volcengine / doubao-seedance-2-0-260128
r2v4/5/6/8/10/12/15 s480p / 720p / 1080p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
Seedance 2.0
volcengine / doubao-seedance-2-0-260128
t2v4/5/6/8/10/12/15 s480p / 720p / 1080p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
Seedance 2.0
volcengine / doubao-seedance-2-0-260128
v2v4/5/6/8/10/12/15 s480p / 720p / 1080p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
Seedance 2.0 Fast
volcengine / doubao-seedance-2-0-fast-260128
i2v4/5/6/8/10/12/15 s480p / 720p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
Seedance 2.0 Fast
volcengine / doubao-seedance-2-0-fast-260128
r2v4/5/6/8/10/12/15 s480p / 720p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
Seedance 2.0 Fast
volcengine / doubao-seedance-2-0-fast-260128
t2v4/5/6/8/10/12/15 s480p / 720p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
Seedance 2.0 Fast
volcengine / doubao-seedance-2-0-fast-260128
v2v4/5/6/8/10/12/15 s480p / 720p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
Seedance 2.0 mini
volcengine / doubao-seedance-2-0-mini-260615
i2v4/5/6/8/10/12/15 s480p / 720p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
Seedance 2.0 mini
volcengine / doubao-seedance-2-0-mini-260615
r2v4/5/6/8/10/12/15 s480p / 720p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
Seedance 2.0 mini
volcengine / doubao-seedance-2-0-mini-260615
t2v4/5/6/8/10/12/15 s480p / 720p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
Seedance 2.0 mini
volcengine / doubao-seedance-2-0-mini-260615
v2v4/5/6/8/10/12/15 s480p / 720p≤8 个 · ≤100MB · jpg/jpeg/png/webp≤4 个 · ≤100MB · mp4/mov/webm
小云雀 2.0
xiaoyunque / xiaoyunque-2-0
r2v15/30/60 s720p≤9 个 · ≤20MB · jpg/jpeg/png/webp≤3 个 · ≤20MB · mp4/mov/webm
小云雀 2.0
xiaoyunque / xiaoyunque-2-0
t2v15/30/60 s720p≤9 个 · ≤20MB · jpg/jpeg/png/webp≤3 个 · ≤20MB · mp4/mov/webm

3D 模型(type: 3d)

模型能力时长(秒)分辨率档参考图参考视频
Seed3D 2.0
volcengine / doubao-seed3d-2-0-260328
i2model3d≤1 个 · ≤10MB · jpg/jpeg/png/webp/bmp

说明:t2i=文生图,i2i=图生图(需参考图),t2v=文生视频,i2v=图生视频(需 1 张图),v2v=视频生视频(需视频),r2v=参考生视频(图/视频参考均可)。「—」表示该项不适用或由引擎自动决定。参考素材通过 inputUrl / inputUrls 以公网 URL 传入。

任务状态与轮询

任务创建后异步执行,状态流转如下:

queuedrunningsucceeded/failed/cancelled

建议每 3–5 秒轮询一次;图片任务通常几十秒内完成,视频任务可能需要数分钟。

const BASE = 'https://kipin.soyoco.top/api/v1';
// authKey 来自上文 POST /auth/token(有效期 15 分钟,过期重新换取即可)
let authKey = await exchangeAuthKey();

async function waitForTask(id) {
  for (;;) {
    const res = await fetch(`${BASE}/generations/${id}`, {
      headers: {Authorization: `Bearer ${authKey}`},
    });
    if (res.status === 401) {
      // token 端点有 30 次/分钟限流,先退避再重新换取,避免自旋撞 429
      await new Promise((ok) => setTimeout(ok, 2000));
      authKey = await exchangeAuthKey();
      continue;
    }
    const task = await res.json();
    if (task.status === 'succeeded') return task.outputUrl;
    if (task.status === 'failed' || task.status === 'cancelled') {
      throw new Error(task.error?.message || task.status);
    }
    await new Promise((ok) => setTimeout(ok, 5000));
  }
}

计费

API 调用与站内生成同价,按积分计费:任务成功才结算扣分,失败或取消自动退还预扣。每个任务的实际扣分见查询接口的 costCredits。

产物保留

通过 API 生成的图片/视频默认保留 24 小时后自动清理。请在任务成功后及时下载 outputUrl 并转存到自己的存储。

错误码

出错时响应包含 ok=false 与 error 字段(多数场景附带 message),并配合以下 HTTP 状态码:

HTTPerror说明
401invalid_tokenauthKey 缺失、无效或已过期,请通过 POST /auth/token 重新换取
401raw_key_not_allowed检测到直接发送原始 API Key,已拒绝;请改用签名换取 authKey
401invalid_signature签名校验失败(含 keyId 不存在或密钥已吊销的情况,不作区分)
401invalid_timestamptimestamp 超出 ±300 秒窗口,请校准时钟
401nonce_replayednonce 在窗口期内重复使用
400invalid_request换取 authKey 的请求体格式不合法:keyId/nonce/signature/timestamp 缺失或不符合要求(nonce 8–128 位,signature 64 位 hex,timestamp 为整数)
400invalid_typetype 不合法,必须是 image、video 或 3d
400invalid_model缺少 platform 或 model
400missing_inputprompt 与 inputUrl / inputUrls 均未提供
400generation_rejected任务被拒绝:余额不足、参数不符合所选模型要求等(详见 message)
400cancel_rejected取消被拒绝:任务已进入终态或不允许取消(详见 message)
400missing_id路径缺少任务 ID
404not_found任务不存在,或不属于当前 Key 所属账号
429触发限流(如换取 authKey 端点为 30 次/分钟)。该响应为通用错误格式(statusCode/message,非 ok/error 结构),可按 x-ratelimit-reset 响应头退避重试
502upstream_error上游服务异常,请稍后重试
500internal_error服务内部错误