VisioArtVisioArt 文档

开发者 API

使用 API key 鉴权、创建生成任务、追踪积分消耗,并正确处理错误与退款。

概述

VisioArt 对外提供一套开发者 REST API,直接接入与产品控制台相同的生成流水线。API 请求会使用调用账户自己的余额,扣减同一套 credits,并把生成记录与 usage 事件写入同一套后台数据。

适合的场景包括:

  • 发现当前工作区内已激活的模型目录、可用模式与价格证据
  • 从你自己的应用中发起生成任务
  • 不依赖控制台页面,直接轮询任务状态
  • 通过稳定的 API 路由下载生成资产
  • 在你自己的后端中对账扣费与退款流水

基础地址

将你部署后的 VisioArt 域名作为 API 基础地址:

https://your-domain.com/api/v1

鉴权方式

在 Settings -> API Keys 中创建 API key。每把 key 都继承所属账户的余额与权限范围。

只有付费方案用户才能创建 API key。

你可以使用以下任一请求头:

Authorization: Bearer visioart_your_api_key

或:

x-api-key: visioart_your_api_key

除非两者值完全相同,否则不要在同一个请求里同时发送两种凭证。

积分模型

  • API 生成任务与网页登录后的产品共用同一钱包余额。
  • 生成任务成功入队时即会扣费。
  • 若任务最终失败或被取消,系统会在任务进入可退款终态时自动退回 credits。
  • 如果账户余额低于本次任务预估消耗,创建接口会直接返回 402 insufficient_credits。

幂等语义

POST /api/v1/generations 必须携带 Idempotency-Key 请求头。

规则如下:

  • 同一个 key 配合同一份请求体重放,会返回第一次请求的结果。
  • 同一个 key 如果配不同请求体重用,会返回 409 idempotency_conflict。
  • 该请求头最多 200 个字符,只允许 A-Z a-z 0-9 . _ : -。

示例:

Idempotency-Key: 6d1d0f58-d65b-474a-8d1d-7a91fd8bd8dc

响应结构

成功的 JSON 响应都带有 request_id:

{
  "request_id": "38285b04-43a5-440f-8bb8-5e8c32e86920",
  "data": {}
}

错误响应使用统一 envelope:

{
  "request_id": "1f1f8258-ae62-4c65-8e06-f9633dc518df",
  "error": {
    "code": "insufficient_credits",
    "message": "Insufficient credits"
  }
}

同一个值也会通过 x-request-id 响应头返回。

接口列表

查询模型与能力目录

curl -X GET "https://your-domain.com/api/v1/models" \
  -H "Authorization: Bearer visioart_your_api_key"

响应:

{
  "request_id": "2b4fa4fa-3419-4d92-95ad-d4d08a838bea",
  "data": {
    "object": "list",
    "total": 26,
    "items": [
      {
        "object": "model",
        "model_id": "qwen2",
        "display_name": "Qwen2",
        "availability": "active",
        "modes": [
          {
            "generator_mode": "text-to-image",
            "supported_aspect_ratios": ["16:9", "9:16", "1:1"],
            "supported_duration_seconds": [5],
            "supported_output_formats": ["png", "jpg"],
            "public_model_options": [],
            "pricing": {
              "variants": [
                {
                  "id": "default",
                  "request_model_options": null,
                  "credit_matrix": [
                    {
                      "aspect_ratio": "16:9",
                      "duration_seconds": 5,
                      "credits": 6,
                      "source_type": "legacy_exact_matrix",
                      "source_updated_at": "2026-04-22T11:09:35.262Z"
                    }
                  ]
                }
              ]
            }
          }
        ]
      }
    ]
  }
}

模型目录说明:

  • 该接口只返回当前工作区内已激活、且能够被明确枚举能力边界的模型;未启用或配置不完整的模型不会被猜测性暴露。
  • modes[*].public_model_options 只列出当前公开 POST /generations 请求体允许提交、且业务校验链实际接受的 option 家族。
  • pricing.variants[*].request_model_options 故意保持与 POST /generations 的 modelOptions 请求结构一致,便于直接复用。
  • credit_matrix[*].source_type 会标明每个 credit 值来自 workspace_override、market_catalog、legacy_exact_matrix 还是 built_in_estimate。
  • 当价格来自已审核的市场定价目录或生成后的精确 credit matrix 时,credit_matrix[*].source_updated_at 会返回对应审核日期或矩阵生成时间;其余来源可能为 null。

查询余额

curl -X GET "https://your-domain.com/api/v1/credits/balance" \
  -H "Authorization: Bearer visioart_your_api_key"

响应:

{
  "request_id": "38285b04-43a5-440f-8bb8-5e8c32e86920",
  "data": {
    "balance": 1000,
    "unit": "credits"
  }
}

创建生成任务

curl -X POST "https://your-domain.com/api/v1/generations" \
  -H "Authorization: Bearer visioart_your_api_key" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6d1d0f58-d65b-474a-8d1d-7a91fd8bd8dc" \
  -d '{
    "title": "veo31-fast text-to-video",
    "modelId": "veo31-fast",
    "generatorMode": "text-to-video",
    "prompt": "A clean product reveal with cinematic camera movement",
    "aspectRatio": "16:9",
    "durationSeconds": 8,
    "uploads": []
  }'

响应:

{
  "request_id": "d587724c-df59-4333-9d4a-2ce8d2988466",
  "idempotent_replay": false,
  "data": {
    "id": "9a87675c-1e1a-4b16-873c-19ffd8e79cdc",
    "object": "generation",
    "status": "processing",
    "title": "veo31-fast text-to-video",
    "model_id": "veo31-fast",
    "generator_mode": "text-to-video",
    "prompt": "A clean product reveal with cinematic camera movement",
    "aspect_ratio": "16:9",
    "duration_seconds": 8,
    "output_format": null,
    "estimated_credits": 30,
    "error_message": null,
    "result_url": null,
    "outputs": [],
    "queued_at": "2026-04-05T13:27:59.824Z",
    "completed_at": null,
    "created_at": "2026-04-05T13:27:59.824Z",
    "updated_at": "2026-04-05T13:28:01.903Z"
  }
}

请求体规则:

  • 对外创建任务 schema 是严格模式。未知字段或内部字段会直接返回 400 invalid_request。
  • uploads 只接受 { "kind": "...", "url": "https://..." } 这种对象结构。
  • 每个 upload 的 url 都必须已经指向受信任的远程资产地址,来源只能是工作区存储或受信任的 provider 托管地址。
  • modelOptions 如果传入,只能使用当前 modelId 对应的公开 option 家族;无关 option 或未知嵌套字段都会被拒绝。
  • imageCount 只有在对应 /models 条目的 public_model_options[].path 暴露为 "modelOptions.imageCount" 时才允许传入;提交前可通过 pricing variants 看到对应扣费。
  • 不要传 modelOptions: {} 或 modelOptions: { "kling30": {} } 这种空的 no-op 对象。
  • 不要发送 landingRecordId、landingKind、landingPathname、estimatedCredits、storagePath、fileName、required 这类内部字段。

生成任务响应字段:

字段类型说明
idstring(UUID)VisioArt 生成任务的 ID。
object"generation"常量字面量。
status"queued" | "processing" | "completed" | "failed" | "cancelled"终态:completed、failed、cancelled。
titlestring未传时默认 "{modelId} {generatorMode}"。
model_idstring本次请求选用的模型。
generator_modestringtext-to-video、image-to-video、video-to-video、effect、image-editor、text-to-image 或 video-compression。
promptstring对于不强制 prompt 的模式可为空串。
aspect_ratiostring16:9、9:16、1:1、4:3、3:4、3:2、2:3 之一。
duration_secondsnumber3-15 之间的整数。
output_format"png" | "jpg" | "webp" | null仅在支持输出格式的图像模式下返回。
estimated_creditsnumber入队时扣减的 credits;任务 failed 或安全 cancelled 时退还。
error_messagestring | null仅在 failed 时非空。
result_urlstring | null等价于 outputs[0].url,outputs 为空时为 null。
outputsGenerationOutput[]见下表;任务未产出资产前为空数组。
queued_atstring(ISO-8601)任务入队时间。
completed_atstring | null(ISO-8601)到达终态时写入。
created_atstring(ISO-8601)行创建时间。
updated_atstring(ISO-8601)最近一次状态迁移时间。

生成产出对象(outputs[i]):

字段类型说明
idstring(UUID)资产 ID,可用于 /assets/{assetId}。
kindstring通常为 video 或 image,与 generator mode 对应。
urlstringVisioArt 的资产路由(/api/v1/assets/{id}),不是 provider 的原始地址。
mime_typestring | null在 provider 返回 mime type 后填充。
widthnumber | null像素;元数据未知前为 null。
heightnumber | null像素;元数据未知前为 null。
duration_secondsnumber | null图片产出固定为 null。
created_atstring(ISO-8601)资产行创建时间。

查询任务

curl -X GET "https://your-domain.com/api/v1/generations/9a87675c-1e1a-4b16-873c-19ffd8e79cdc" \
  -H "Authorization: Bearer visioart_your_api_key"

取消任务

curl -X POST "https://your-domain.com/api/v1/generations/9a87675c-1e1a-4b16-873c-19ffd8e79cdc/cancel" \
  -H "Authorization: Bearer visioart_your_api_key"

取消只适用于仍停留在 VisioArt 本地队列、且尚未开始上游提交流程的任务。

实际判断上,这意味着任务必须仍处于 queued,还没有拿到 provider task ID,并且还没有被 worker 领取进入提交流程。

取消成功后,任务会切换为 cancelled,此前已扣除的 credits 会写入对应退款记录。

一旦任务已经开始上游提交流程,接口就会返回 409 generation_not_cancellable。这样可以避免在上游 provider 并不支持真实取消时,对外错误承诺“已经取消”。

查询 usage 事件

curl -X GET "https://your-domain.com/api/v1/usage?limit=20&offset=0" \
  -H "Authorization: Bearer visioart_your_api_key"

查询参数:

名称类型默认范围说明
limitnumber201-100单页数量。
offsetnumber00-10000零基偏移。
apiKeyIdstring—1-255 字符可选,按指定 API key 过滤事件。

响应结构:

{
  "request_id": "…",
  "data": {
    "items": [
      {
        "id": "…",
        "api_request_id": "…",
        "api_key_id": "…",
        "generation_job_id": "…",
        "credit_transaction_id": "…",
        "event_type": "charge",
        "credits_delta": -20,
        "balance_before": 1000,
        "balance_after": 980,
        "pricing_snapshot": "{\"schemaVersion\":1,\"modelId\":\"veo31-fast\",\"generatorMode\":\"text-to-video\",\"aspectRatio\":\"16:9\",\"durationSeconds\":8,\"modelOptions\":null,\"variantKey\":null,\"credits\":20,\"listCredits\":20,\"hasPromotion\":false,\"promotionLabel\":null,\"promotionStartsAt\":null,\"promotionEndsAt\":null,\"sourceType\":\"market_catalog\",\"sourceUpdatedAt\":\"2026-05-15\"}",
        "note": null,
        "created_at": "2026-04-05T13:27:59.824Z"
      }
    ],
    "pagination": { "limit": 20, "offset": 0, "total": 137 }
  }
}

Usage 事件字段:

字段类型说明
idstring(UUID)usage 事件 ID。
api_request_idstring(UUID)关联到原始 API 请求记录。
api_key_idstring触发事件的 API key。
generation_job_idstring | null产生扣费或退款的任务。
credit_transaction_idstring | null积分台账记录 ID。
event_type"charge" | "refund"charge 在任务入队时写入;refund 在 failed 或安全 cancelled 时写入。
credits_deltanumber扣费为负数,退款为正数。
balance_beforenumber | null事件前钱包余额(单位:credits)。
balance_afternumber | null事件后钱包余额(单位:credits)。
pricing_snapshotstring | null扣费时落库的 JSON 字符串定价快照;如需结构化字段,请先自行解析。
notestring | null运维备注,可为 null。
created_atstring(ISO-8601)事件时间。

pagination.total 是当前查询条件下的总记录数,而非当前页条数。

下载生成资产

curl -L "https://your-domain.com/api/v1/assets/510522c3-f7fb-4265-82ae-471f12aea62b" \
  -H "Authorization: Bearer visioart_your_api_key" \
  -o output.mp4

常见错误码

VisioArt 把创建任务的校验拆成两层:

  • Schema 层(400 invalid_request) —— 仅做字段形状、类型与格式检查。未知字段、类型不匹配、超出声明的枚举或长度、以及 landingRecordId、estimatedCredits 等内部字段都会在进入业务逻辑之前就被拒绝。
  • 业务层(422 invalid_generation_request) —— 依赖工作区状态与模型能力的语义检查。合法结构的请求仍可能在这里被拒绝:modelId 在当前工作区未激活、modelId × generatorMode × aspectRatio × durationSeconds 组合不被支持、缺少必填上传、上传 URL 不可信,或定价规则缺失。

工作区中可用的模型及其支持的选项可被管理员覆盖,因此公共 schema 不会硬编码 modelId 枚举。批量提交前可先读取 GET /api/v1/models,或把 422 invalid_generation_request 作为可重试的"请修正输入"信号。

HTTPCode含义
400ambiguous_api_key同一请求中发送了多个不同的 API key 凭证。
400invalid_content_length请求元数据中的 Content-Length 非法。
400invalid_requestJSON 请求体未通过 schema 校验(形状、类型、格式)。
400invalid_json请求体不是合法 JSON。
400missing_idempotency_key创建任务时未提供 Idempotency-Key。
400invalid_idempotency_keyIdempotency-Key 格式不合法。
404feature_disabled当前工作区已禁用 Developer API。
401missing_api_key请求里没有提供 API key。
401invalid_api_keyAPI key 非法、未知或不可恢复。
401api_key_disabledAPI key 已被禁用。
401api_key_expiredAPI key 已过期。
401invalid_authorization_headerAuthorization 请求头未使用 Bearer。
402insufficient_credits账户余额低于当前任务预估消耗。
403insufficient_scopeAPI key 权限范围不足。
409idempotency_conflict同一个幂等 key 被不同请求体复用。
409generation_not_cancellable任务已经离开 VisioArt 本地可取消窗口,无法再被安全取消。
413body_too_large请求体超出当前大小限制。
415unsupported_media_type该接口只接受 JSON。
422invalid_generation_request请求形状合法,但解析后的生成意图不受支持(未激活的模型、不兼容的选项组合、不可信的上传 URL、缺失定价规则等)。
429concurrent_job_limit当前账户活跃中的 API 生成任务数量已达到上限。
429rate_limitedAPI key 请求频率超过限流阈值。
500internal_error路由级处理前发生了未预期的 Developer API 内部错误。
500models_read_failed模型目录加载失败。
500request_state_invalid已存储的幂等请求状态不完整,无法安全重放。
503provider_unavailableprovider 余额或可用性阻止了提交。

各接口专属错误

模型目录

  • 500 models_read_failed

创建任务

  • 400 invalid_request
  • 402 insufficient_credits
  • 409 idempotency_conflict
  • 429 concurrent_job_limit
  • 422 invalid_generation_request
  • 500 request_state_invalid
  • 503 provider_unavailable
  • 500 generation_create_failed

查询任务

  • 400 invalid_generation_id
  • 404 generation_not_found
  • 500 generation_read_failed

取消任务

  • 400 invalid_generation_id
  • 404 generation_not_found
  • 409 generation_not_cancellable
  • 500 generation_cancel_failed

计费边界说明

  • 402 insufficient_credits 会在新任务真正入库前返回。此时不会生成 generation ID,也不会写入扣费记录,更不需要退款记录。
  • 只有此前已经实际扣费、并且任务转入 failed,或者转入“仍处于本地安全可取消窗口内”的 cancelled 时,系统才会写入退款。
  • 任务状态迁移、退款台账、developer API 的 refunded 计数,以及 refund usage 事件,都在同一条数据库事务里落库。只要本地退款持久化有任一步失败,VisioArt 就会整体回滚,避免出现“状态改了但退款没记完”的部分成功状态。

查询余额

  • 500 credits_read_failed

查询 usage

  • 400 invalid_query
  • 500 usage_read_failed

下载资产

  • 400 invalid_asset_id
  • 404 asset_not_found
  • 500 asset_read_failed

权限范围

新创建的 API key 默认带有以下 scope:

{
  "generation": ["create", "read", "cancel"],
  "credits": ["read"],
  "usage": ["read"],
  "assets": ["read"],
  "models": ["read"]
}

如果某把 key 创建于 scoped permissions 引入之前,系统会保留向后兼容逻辑,不会因为缺失 permissions 字段而直接拒绝请求。 如果某把 key 已经携带显式 permissions 载荷,系统会严格按该载荷执行;向后兼容只适用于 scoped permissions 引入之前创建、因此根本没有持久化 permissions 字段的旧 key。

运维与对账说明

  • generation 返回的 result_url 指向的是 VisioArt 自己的资产 API 路由,而不是 provider 原始地址。
  • 退款会同时写入用户 credits 台账与 developer API usage 事件表。
  • credits 扣减、退款、generation 状态迁移以及 developer API 退款 usage 记录已经被收敛到同一条数据库事务中,从而避免出现“余额变了但任务状态没落库”的部分成功问题。

推荐接入流程

  1. 先读取 /models,拿到当前工作区的模型目录、可用 option 家族与价格证据。
  2. 批量提交前再读取 /credits/balance。
  3. 创建任务时始终携带唯一的 Idempotency-Key。
  4. 轮询 /generations/{jobId} 直到任务进入终态。
  5. 用 /usage 对账扣费与退款事件。

目录