API 参考

CyberBara 对外 API v1 使用说明

概览

CyberBara 对外 API 统一在 /api/v1 下,支持:

  • 提交生图任务
  • 提交生视频任务
  • 上传参考图并获取可复用 URL
  • 查询任务状态与输出
  • 查询积分余额
  • 查询积分消耗明细
  • 发起任务前积分预估
  • 获取公开模型列表

对外接口不会暴露底层 provider 信息。

基础地址

请使用你自己的部署域名:

https://<your-domain>

示例:

https://cyberbara-preview.iamzerolu.workers.dev

鉴权方式

二选一传 API Key:

Authorization: Bearer <API_KEY>

x-api-key: <API_KEY>

缺失或无效会返回 401

返回格式

成功:

{
  "data": {}
}

失败:

{
  "error": {
    "code": "error_code",
    "message": "错误说明",
    "details": {}
  }
}

模型接口

GET /api/v1/models

可选参数:

  • media_type=image|video

示例:

curl -X GET 'https://<your-domain>/api/v1/models?media_type=video' \
  -H 'Authorization: Bearer <API_KEY>'

返回示例:

{
  "data": {
    "models": [
      {
        "model": "sora-2",
        "media_type": "video",
        "supported_scenes": ["text-to-video", "image-to-video"]
      },
      {
        "model": "kling-2.6",
        "media_type": "video",
        "supported_scenes": ["text-to-video", "image-to-video"]
      }
    ],
    "total": 2
  }
}

错误示例(invalid_media_type):

{
  "error": {
    "code": "invalid_media_type",
    "message": "media_type must be \"image\" or \"video\"."
  }
}

上传接口

POST /api/v1/uploads/images

上传一张或多张参考图,返回可直接用于 options.image_input 的 URL。

请求要求:

  • Content-Type: multipart/form-data
  • 字段名:files(单文件也可用 file
  • 单次最多 10
  • 单张最大 10MB
  • 支持 mime:image/jpegimage/jpgimage/pngimage/webpimage/gifimage/svg+xmlimage/avifimage/heicimage/heif

示例:

curl -X POST 'https://<your-domain>/api/v1/uploads/images' \
  -H 'Authorization: Bearer <API_KEY>' \
  -F 'files=@./reference.png'

返回示例:

{
  "data": {
    "files": [
      {
        "url": "https://cdn.example.com/uploads/api/v1/uploads/3e7e48e6/7f2f25f8d6c26f11b2a5bb6b3f7f4a28.png",
        "key": "api/v1/uploads/3e7e48e6/7f2f25f8d6c26f11b2a5bb6b3f7f4a28.png",
        "filename": "reference.png",
        "content_type": "image/png",
        "size": 245123,
        "deduped": false
      }
    ],
    "urls": [
      "https://cdn.example.com/uploads/api/v1/uploads/3e7e48e6/7f2f25f8d6c26f11b2a5bb6b3f7f4a28.png"
    ],
    "count": 1
  }
}

POST /api/v1/uploads/videos

上传参考视频,然后在 options.video_input(或 seedance-2-watermark-remover 使用 options.video_url)中使用返回的 URL。

请求说明:

  • Content-Type: multipart/form-data
  • 字段名:files(单文件也可用 file
  • 单次最多:1 个文件
  • 单文件大小上限:50MB
  • 支持的 mime 类型:video/mp4video/quicktime

示例:

curl -X POST 'https://<your-domain>/api/v1/uploads/videos' \
  -H 'Authorization: Bearer <API_KEY>' \
  -F 'files=@./reference.mp4'

返回示例:

{
  "data": {
    "files": [
      {
        "url": "https://cdn.example.com/uploads/api/v1/uploads/3e7e48e6/2d9b18f0b5a0a9b4c65b7f6c3b2f7c32.mp4",
        "key": "api/v1/uploads/3e7e48e6/2d9b18f0b5a0a9b4c65b7f6c3b2f7c32.mp4",
        "filename": "reference.mp4",
        "content_type": "video/mp4",
        "size": 1245123,
        "deduped": false
      }
    ],
    "urls": [
      "https://cdn.example.com/uploads/api/v1/uploads/3e7e48e6/2d9b18f0b5a0a9b4c65b7f6c3b2f7c32.mp4"
    ],
    "count": 1
  }
}

错误示例(invalid_file_type):

{
  "error": {
    "code": "invalid_file_type",
    "message": "Unsupported image type for file \"sample.pdf\".",
    "details": {
      "index": 0,
      "filename": "sample.pdf"
    }
  }
}

图生图调用示例:

{
  "model": "nano-banana-pro",
  "scene": "image-to-image",
  "prompt": "Keep composition, make it cinematic at night",
  "options": {
    "image_input": ["https://cdn.example.com/uploads/api/v1/uploads/...png"]
  }
}

积分接口

GET /api/v1/credits/balance

获取当前可用积分。

curl -X GET 'https://<your-domain>/api/v1/credits/balance' \
  -H 'Authorization: Bearer <API_KEY>'

返回示例:

{
  "data": {
    "user_id": "3e7e48e6-f2fa-4f66-abf8-db7a40eaf517",
    "remaining_credits": 44,
    "updated_at": "2026-03-03T04:08:19.320Z"
  }
}

错误示例(invalid_api_key):

{
  "error": {
    "code": "invalid_api_key",
    "message": "Invalid API key."
  }
}

POST /api/v1/credits/quote

发起任务前做积分预估。

请求参数:

  • model 必填
  • media_type 可选(若模型无法自动推断则必填)
  • scene 可选但建议传
  • options 可选
curl -X POST 'https://<your-domain>/api/v1/credits/quote' \
  -H 'Authorization: Bearer <API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "nano-banana-pro",
    "media_type": "image",
    "scene": "text-to-image",
    "options": { "resolution": "1k" }
  }'

返回示例:

{
  "data": {
    "model": "nano-banana-pro",
    "media_type": "image",
    "scene": "text-to-image",
    "estimated_credits": 8,
    "remaining_credits": 44,
    "can_afford": true,
    "pricing_rule": "nano-banana-pro",
    "fallback_pricing": false
  }
}

错误示例(unsupported_model):

{
  "error": {
    "code": "unsupported_model",
    "message": "Model is not supported."
  }
}

GET /api/v1/credits/usage

查询参数:

  • page 默认 1
  • limit 默认 20,最大 100
  • from 可选,支持 ISO 时间或 YYYY-MM-DD
  • to 可选,支持 ISO 时间或 YYYY-MM-DD
  • 仅日期值按 UTC 解析(from -> 00:00:00.000Zto -> 23:59:59.999Z
curl -X GET 'https://<your-domain>/api/v1/credits/usage?page=1&limit=20&from=2026-03-01&to=2026-03-03' \
  -H 'Authorization: Bearer <API_KEY>'

返回示例:

{
  "data": {
    "summary": {
      "page": 1,
      "limit": 20,
      "total": 2,
      "total_pages": 1,
      "total_credits_consumed": 28,
      "from": "2026-03-03T00:00:00.000Z",
      "to": "2026-03-03T23:59:59.999Z"
    },
    "items": [
      {
        "id": "0a961844-e042-4a17-bf23-2a5f2680d375",
        "transaction_no": "79739092304928500",
        "credits_consumed": 20,
        "scene": "text-to-video",
        "description": "generate video",
        "media_type": "video",
        "task_id": "2fa99a50-fb96-407b-a562-82de8265f48e",
        "created_at": "2026-03-03T04:31:55.116Z"
      }
    ]
  }
}

错误示例(invalid_date):

{
  "error": {
    "code": "invalid_date",
    "message": "Invalid date format. Use ISO datetime or YYYY-MM-DD."
  }
}

错误示例(invalid_date_range):

{
  "error": {
    "code": "invalid_date_range",
    "message": "The \"from\" date must be earlier than the \"to\" date."
  }
}

生成接口

POST /api/v1/images/generations

请求参数:

  • model 必填
  • prompt 多数模型必填
  • scene 可选(text-to-image / image-to-image
  • options 可选
curl -X POST 'https://<your-domain>/api/v1/images/generations' \
  -H 'Authorization: Bearer <API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "nano-banana-pro",
    "prompt": "A cinematic portrait under neon rain",
    "scene": "text-to-image",
    "options": { "resolution": "1k" }
  }'

返回示例:

{
  "data": {
    "task_id": "uuid",
    "status": "pending",
    "media_type": "image",
    "model": "nano-banana-pro",
    "scene": "text-to-image",
    "credits": {
      "cost": 8,
      "remaining": 36
    },
    "created_at": "2026-03-03T04:29:12.612Z"
  }
}

错误示例(insufficient_credits):

{
  "error": {
    "code": "insufficient_credits",
    "message": "Insufficient credits."
  }
}

POST /api/v1/videos/generations

请求参数:

  • model 必填
  • prompt 对大多数视频模型必填(包含 seedance-*kling-2.6veo-*
  • sora-2-pro 在 API 校验层可不传 prompt,但仍建议传入
  • scene 可选(text-to-video / image-to-video / video-to-video
  • options 可选
curl -X POST 'https://<your-domain>/api/v1/videos/generations' \
  -H 'Authorization: Bearer <API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "sora-2",
    "prompt": "A calm drone shot over snowy mountains at sunrise",
    "scene": "text-to-video",
    "options": { "duration": "10", "resolution": "standard" }
  }'

返回示例:

{
  "data": {
    "task_id": "2fa99a50-fb96-407b-a562-82de8265f48e",
    "status": "pending",
    "media_type": "video",
    "model": "sora-2",
    "scene": "text-to-video",
    "credits": {
      "cost": 20,
      "remaining": 16
    },
    "created_at": "2026-03-03T04:31:55.116Z"
  }
}

错误示例(insufficient_credits):

{
  "error": {
    "code": "insufficient_credits",
    "message": "Insufficient credits."
  }
}

模型专属 Options(完整矩阵)

本节列出当前公开 API 下,各模型可用的全部请求参数规则。

通用请求字段:

  • model 必填
  • prompt 是否必填取决于模型(见下文每个模型)
  • scene 选填,但强烈建议显式传入
  • options 选填对象

当未传 scene 时的自动推断:

  • 图片接口:
    • options.image_input 至少有一个 URL -> image-to-image
    • 否则 -> text-to-image
  • 视频接口:
    • options.video_input 至少有一个 URL -> video-to-video
    • 否则若 options.image_input 至少有一个 URL -> image-to-video
    • 否则 -> text-to-video

公共 options 字段:

字段类型含义
options.image_inputstring[]输入/参考图片 URL 列表
options.video_inputstring[]输入/参考视频 URL 列表

说明:

  • 对外 API 只接受 options.* 字段。不要传 provider 内部字段,例如 image_urlimage_urlsinput_imagesimageUrls(仅 seedance-2-watermark-remover 支持 options.video_url)。
  • promptoptions 都为空,会返回 invalid_request
  • 部分模型做严格参数校验;部分模型是透传模式(几乎不校验)。
  • 严格校验模型里,未知字段会被忽略;透传模型里,未知字段会原样转发。

生图模型

nano-banana-2

支持场景:text-to-imageimage-to-image。 校验级别:固定字段校验 + 轻量归一化。

字段类型必填取值 / 默认说明
promptstring非空字符串两个场景都必填
options.image_inputstring[]image-to-image 必填URL 数组非空时可用于自动推断 image-to-image
options.aspect_ratiostring任意非空字符串原样透传
options.resolutionstring归一化后为 1K / 2K / 4K输入如 1k/2k/4k 会归一化;其他字符串原样透传
options.output_formatstring归一化后为 jpg / pngjpeg 会变为 jpg;其他字符串原样透传
options.google_searchboolean默认不传仅此模型支持

nano-banana-pro

支持场景:text-to-imageimage-to-image。 校验级别:固定字段校验 + 轻量归一化。

字段类型必填取值 / 默认说明
promptstring非空字符串两个场景都必填
options.image_inputstring[]image-to-image 必填URL 数组非空时可用于自动推断 image-to-image
options.aspect_ratiostring任意非空字符串原样透传
options.resolutionstring归一化后为 1K / 2K / 4K输入如 1k/2k/4k 会归一化;其他字符串原样透传
options.output_formatstring归一化后为 jpg / pngjpeg 会变为 jpg;其他字符串原样透传

生视频模型

kling-video-o1seedance-2seedance-2-fastseedance-2-previewseedance-2-fast-previewseedance-2-watermark-remover 外,以下模型都不支持 video-to-video,因此不应传 options.video_input

sora-2

支持场景:text-to-videoimage-to-video。 校验级别:严格校验。

字段类型必填取值 / 默认说明
promptstring非空字符串两个场景都必填
options.image_inputstring[]image-to-video 必填URL 数组用于图生视频输入
options.aspect_ratiostringlandscape / portrait(默认 landscape严格校验
options.duration / options.n_framesstringnumber10 / 15(默认 10严格校验
options.remove_watermarkboolean默认 true严格校验
options.upload_methodstrings3 / oss(默认 s3严格校验

sora-2-pro

支持场景:text-to-videoimage-to-video。 校验级别:严格校验。

字段类型必填取值 / 默认说明
promptstringAPI 层非必填选填建议传入
options.image_inputstring[]image-to-video 必填URL 数组用于图生视频输入
options.aspect_ratiostringlandscape / portrait(默认 landscape严格校验
options.duration / options.n_framesstringnumber10 / 15(默认 10严格校验
options.resolution / options.sizestringstandard / high(默认 standard严格校验

seedance-2

支持场景:text-to-videoimage-to-videovideo-to-video。 校验级别:严格校验。

说明:

  • 这是官方正式版 Seedance 2 接口,和 preview 模型分开。
  • video-to-video 的计费会同时计算输入视频时长与输出时长。
  • 你可以直接传 options.mode,但在 CyberBara 内通常会根据场景和引用自动推断。
字段类型必填取值 / 默认说明
promptstring非空字符串所有场景都必填
options.image_inputstring[]image-to-video 必填URL 数组,所有引用总数最多 12可作为首尾帧输入,或作为 omni reference 的图片引用
options.video_inputstring[]video-to-video 必填单个 URL,输入视频总时长上限 15.4s走官方 omni-reference 模式
options.audio_inputstring[]URL 数组,所有引用总数最多 12仅 omni reference 有效;纯音频请求会被拒绝
options.durationstringnumber415 的整数(默认 5video-to-video 中表示输出时长
options.aspect_ratiostring21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16(默认 16:9在首尾帧模式下,如果源图像决定构图,该值可能被忽略
options.modestringtext_to_video / first_last_frames / omni_reference可选显式覆盖

seedance-2-fast

支持场景:text-to-videoimage-to-videovideo-to-video。 校验级别:严格校验。

字段与 seedance-2 一致。

seedance-2-preview

支持场景:text-to-videoimage-to-videovideo-to-video。 校验级别:严格校验。

说明:

  • 这是旧版 preview 接口。
  • preview 的定价和参数行为与正式版 seedance-2 / seedance-2-fast 不同。
字段类型必填取值 / 默认说明
promptstring非空字符串所有场景都必填
options.image_inputstring[]image-to-video 必填URL 数组(最多 9 张)可在 prompt 中使用 @image1@image2 引用
options.video_inputstring[]video-to-video 必填单个 URLSeedance 2.0 视频编辑模式,必须只传 1 个视频 URL
options.durationstringnumber否(video-to-video 时忽略)5 / 10 / 15(默认 5视频编辑模式下时长由输入视频决定
options.aspect_ratiostring16:9 / 9:16 / 4:3 / 3:4(默认 16:9仅尽力生效;参考图像长宽比可能覆盖该值
options.parent_task_idstring任务 ID基于历史 Seedance 2.0 任务扩展;缺省字段可从 parent 继承

seedance-2-fast-preview

支持场景:text-to-videoimage-to-videovideo-to-video。 校验级别:严格校验。

字段与 seedance-2-preview 一致。

seedance-2-watermark-remover

支持场景:video-to-video。 校验级别:严格校验。

字段类型必填取值 / 默认说明
promptstring选填去水印不需要 prompt
options.video_inputstring[]单个 URL需要处理的视频 URL
options.video_urlstring单个 URL也可用 options.video_url(二选一)
options.durationstringnumber自动识别可选;不传时服务会自动识别视频时长

seedance-1-pro

支持场景:text-to-videoimage-to-video。 校验级别:严格 + 部分字符串透传。

字段类型必填取值 / 默认说明
promptstring非空字符串两个场景都必填
options.image_inputstring[]image-to-video 必填取第一张 URLimage-to-video 至少要一张图
options.resolutionstring默认 720p推荐:480p720p1080p
options.durationstringnumber默认 5推荐:510
options.aspect_ratiostring默认 16:9text-to-video 使用;image-to-video 会忽略该字段
options.camera_fixedboolean默认不传支持
options.seed / options.seedsinteger-12147483647严格范围校验
options.enable_safety_checkerboolean默认不传支持

seedance-1-lite

支持场景:text-to-videoimage-to-video。 校验级别:严格 + 部分字符串透传。

字段类型必填取值 / 默认说明
promptstring非空字符串两个场景都必填
options.image_inputstring[]image-to-video 必填取第一张 URL若有第二张,会自动作为 end_image_url
options.resolutionstring默认 720p推荐:480p720p1080p
options.durationstringnumber默认 5推荐:510
options.aspect_ratiostring默认 16:9text-to-video 使用;image-to-video 会忽略该字段
options.camera_fixedboolean默认不传支持
options.seed / options.seedsinteger-12147483647严格范围校验
options.enable_safety_checkerboolean默认不传text-to-video 支持
options.end_image_urlstringURLimage-to-video 支持

seedance-1-pro-fast

支持场景:image-to-video。 校验级别:严格 + 部分字符串透传。

字段类型必填取值 / 默认说明
promptstring非空字符串必填
options.image_inputstring[]取第一张 URL必填
options.resolutionstring默认 720p推荐:720p1080p
options.durationstringnumber默认 5推荐:510

kling-2.6

支持场景:text-to-videoimage-to-video。 校验级别:严格校验。

字段类型必填取值 / 默认说明
promptstring非空字符串两个场景都必填
options.image_inputstring[]image-to-video 必填URL 数组image-to-video 至少一张图
options.durationstringnumber5 / 10(默认 5严格校验
options.soundboolean默认 false严格校验
options.aspect_ratiostring1:1 / 16:9 / 9:16(默认 16:9text-to-video 使用;归一化后严格校验

veo-3.1-fast

支持场景:text-to-videoimage-to-video。 校验级别:严格校验。

字段类型必填取值 / 默认说明
promptstring非空字符串必填
options.image_inputstring[]条件必填URL 数组是否必填由 generationType 决定
options.generationTypestringTEXT_2_VIDEO / FIRST_AND_LAST_FRAMES_2_VIDEO / REFERENCE_2_VIDEO不传时按 image_input 数量自动推断
options.aspect_ratiostring16:9 / 9:16 / Auto(默认 16:9landscape -> 16:9portrait -> 9:16REFERENCE_2_VIDEO 只允许 16:9
options.seed / options.seedsinteger1000099999严格范围校验
options.enableTranslationboolean默认不传可选
options.watermarkstring任意非空字符串可选

规则:

  • TEXT_2_VIDEOimage_input 必须为空
  • FIRST_AND_LAST_FRAMES_2_VIDEOimage_input 必须是 1-2 张
  • REFERENCE_2_VIDEOimage_input 必须是 1-3 张

veo-3.1-quality

支持场景:text-to-videoimage-to-video。 校验级别:严格校验。

字段与 veo-3.1-fast 相同,但有一点区别:

  • options.generationType=REFERENCE_2_VIDEO 不支持

kling-video-o1

支持场景:video-to-video。 校验级别:透传。

字段类型必填取值 / 默认说明
promptstring非空字符串必填
options.video_inputstring[]实际调用建议必填仅取第一条视频 URL不传 scene 时,video_input 非空有助于自动推断到 video-to-video
options.image_inputstring[]URL 数组可选参考图
options.*any由模型侧定义额外字段全部透传

kling-video-o1 为透传模型。除 options.video_input 外,可能还需要按 provider 要求传入 options.* 字段。

场景与参数快速对照

生图:

  • text-to-image:通常只需要 prompt
  • image-to-image:需传 options.image_input

生视频:

  • text-to-video:应传 prompt
  • image-to-video:需传 options.image_input;多数模型还需传 prompt
  • video-to-video:需传 options.video_input;若模型要求也需传 prompt

如需稳定可控的路由结果,请始终显式传 scene

任务查询

GET /api/v1/tasks/{taskId}

轮询该接口直到任务进入终态。

curl -X GET 'https://<your-domain>/api/v1/tasks/<TASK_ID>' \
  -H 'Authorization: Bearer <API_KEY>'

返回示例(pending):

{
  "data": {
    "task": {
      "id": "2fa99a50-fb96-407b-a562-82de8265f48e",
      "status": "pending",
      "media_type": "video",
      "model": "sora-2",
      "scene": "text-to-video",
      "prompt": "A cinematic wide shot of waves hitting black volcanic beach at sunrise",
      "credits": { "cost": 20 },
      "output": { "images": [], "videos": [] },
      "created_at": "2026-03-03T04:31:55.116Z",
      "updated_at": "2026-03-03T04:32:08.511Z"
    }
  }
}

错误示例(task_not_found):

{
  "error": {
    "code": "task_not_found",
    "message": "Task not found."
  }
}

状态值:

  • pending
  • processing
  • success
  • failed
  • canceled

成功后可从以下字段拿输出:

  • data.task.output.images
  • data.task.output.videos

任务输出示例

生图任务成功:

{
  "data": {
    "task": {
      "id": "20b061f3-d051-4795-b355-856325d08f7c",
      "status": "success",
      "media_type": "image",
      "model": "nano-banana-pro",
      "scene": "text-to-image",
      "prompt": "A cinematic portrait under neon rain",
      "credits": { "cost": 8 },
      "output": {
        "images": [
          "https://static.nanobananaproprompts.com/cyberbara_uploads/kie/image/21075dc0-7968-46fd-93fe-e366f558325b.png"
        ],
        "videos": []
      },
      "created_at": "2026-03-03T04:29:12.612Z",
      "updated_at": "2026-03-03T04:29:31.475Z"
    }
  }
}

生视频任务成功:

{
  "data": {
    "task": {
      "id": "2fa99a50-fb96-407b-a562-82de8265f48e",
      "status": "success",
      "media_type": "video",
      "model": "sora-2",
      "scene": "text-to-video",
      "prompt": "A cinematic wide shot of waves hitting black volcanic beach at sunrise",
      "credits": { "cost": 20 },
      "output": {
        "images": [],
        "videos": [
          "https://static.nanobananaproprompts.com/cyberbara_uploads/kie/video/b55bf86d-e3a3-4b81-ae28-a1cff40a71db.mp4"
        ]
      },
      "created_at": "2026-03-03T04:31:55.116Z",
      "updated_at": "2026-03-03T04:34:22.836Z"
    }
  }
}

任务失败:

{
  "data": {
    "task": {
      "id": "341ab8cd-1296-4a5d-968a-cccf60c9caab",
      "status": "failed",
      "media_type": "video",
      "model": "sora-2",
      "scene": "text-to-video",
      "prompt": "A calm drone shot over snowy mountains at sunrise",
      "credits": { "cost": 20 },
      "output": {
        "images": [],
        "videos": []
      },
      "created_at": "2026-03-03T04:30:18.041Z",
      "updated_at": "2026-03-03T04:31:01.420Z"
    }
  }
}

推荐接入流程

  1. 调用 GET /api/v1/models
  2. 如需参考图,先调用 POST /api/v1/uploads/images 获取 URL
  3. 调用 POST /api/v1/credits/quote
  4. 调用生图或生视频接口创建任务
  5. 轮询 GET /api/v1/tasks/{taskId} 直到终态
  6. GET /api/v1/credits/usage 核对扣费

常见错误码(非完整列表)

  • api_key_required
  • invalid_api_key
  • too_many_requests
  • invalid_json
  • invalid_multipart
  • invalid_date
  • invalid_date_range
  • files_required
  • too_many_files
  • invalid_file_type
  • invalid_file_size
  • file_too_large
  • invalid_model
  • unsupported_model
  • invalid_model_for_media_type
  • invalid_scene
  • scene_not_supported
  • invalid_media_type
  • invalid_request
  • service_unavailable
  • insufficient_credits
  • upload_failed
  • generation_failed
  • invalid_task_id
  • task_not_found
  • task_not_ready
  • query_failed
  • internal_error