API 文档
概览
Base URL:https://aihuanjie.com/api/v1
所有接口都需要通过 用户设置 页面生成一把 API 密钥,随每个请求以 Bearer Token 的形式发送:
Authorization: Bearer {你的密钥}
如果你所在的网络环境/托管平台会过滤掉 Authorization 请求头(部分主机的反向代理会这样做),也可以改用这个等效的自定义请求头,二选一即可:
X-Api-Key: {你的密钥}
必须带的请求头
| Header | 值 | 说明 |
|---|---|---|
Authorization | Bearer {密钥} | 跟 X-Api-Key 二选一,缺失或无效返回 401 |
X-Api-Key | {密钥}(不带 Bearer 前缀) | 跟 Authorization 二选一——某些托管环境会过滤掉 Authorization 头时用这个 |
Content-Type | application/json | 请求体是 JSON 时必需 |
Accept | application/json | 必需——不带这个头,请求参数校验失败时可能不会返回你期望的 JSON 错误格式(框架层面的内容协商行为),务必带上 |
响应格式约定
成功响应统一包在 data 字段里:
{ "data": { ... } }
失败响应统一是:
{ "message": "出错原因", "errors": { "字段名": ["具体错误"] } }
errors 字段只在请求参数校验失败(422)时才有,其它错误只有 message。
限流
按密钥限流,分两档:真正会触发生成的接口(预估生成耗时、提交生成任务)是 600 次/分钟;查询生成任务状态这个接口是 3000 次/分钟(轮询用,成本低所以额度更宽松)。这两个数字都刻意设得很高——正常使用(哪怕你的网站背后有很多用户在同时用同一把密钥)基本不会碰到,只是留一道防线,防止密钥泄露被恶意刷、或者代码出 bug 死循环调用。超过限制返回 429,具体每个接口的限流档位见各自的错误响应表格。
workflow_id: 7 ZImageTurbo图生图
ZImageTurbo生态图生图片的默认工作流。
可用参数
| 参数名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
cfg |
数字(含小数) | 选填 | AI 遵循提示词的强度,越高越听提示词,越低越自由,但过高可能让画面不自然。 |
denoise |
数字(含小数) | 选填 | 从一张已有图出发时,这次生成重画多少。0.1 几乎不动原图,1 完全重画。 |
positive_prompt |
字符串 | 必填 | 控制生成图片的正面提示词。 |
reference_image |
图片(base64,自动上传到 ComfyUI) | 必填 | 一个基准图片,以此图片为基准,根据提示词生成类似结构的图片。 |
seed |
整数 | 选填 | 决定 AI 生图初始随机噪声的数字,其他参数不变时换种子,就会生成不同的图片。如果想生成类似的图片,种子填一样的更容易出相似图片。 |
steps |
整数 | 选填 | AI 去噪生成图片的迭代次数,通常越高细节越充分,但生成越慢,超过一定值后提升很小。 |
workflow_id: 5 ZImageTurbo文生图
ZImageTurbo生态文生图片的默认工作流。
可用参数
| 参数名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
batch_size |
整数 | 必填 | 设定一次行生成的张数,生成张数越多,价格越贵。 |
cfg |
数字(含小数) | 选填 | AI 遵循提示词的强度,越高越听提示词,越低越自由,但过高可能让画面不自然。 |
image_height |
整数 | 必填 | 生成图片的高度(像素)。 |
image_width |
整数 | 必填 | 生成图片的宽度(像素) |
positive_prompt |
字符串 | 必填 | 正面提示词 |
seed |
整数 | 选填 | 决定 AI 生图初始随机噪声的数字,其他参数不变时换种子,就会生成不同的图片。如果想生成类似的图片,种子填一样的更容易出相似图片。 |
steps |
整数 | 选填 | AI 去噪生成图片的迭代次数,通常越高细节越充分,但生成越慢,超过一定值后提升很小。 |
workflow_id: 6 ZImageTurbo文生图+ControlNet
ZImageTurbo生态文生图片的默认工作流有ControlNet的加入。
可用参数
| 参数名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
batch_size |
整数 | 必填 | 设定一次行生成的张数,生成张数越多,价格越贵。 |
cfg |
数字(含小数) | 选填 | AI 遵循提示词的强度,越高越听提示词,越低越自由,但过高可能让画面不自然。 |
controlnet_processor |
字符串 | 必填 | 不同的 |
controlnet_strength |
数字(含小数) | 必填 | 决定生成结果受参考图约束的程度,数值越高越接近参考图的特征,越低则越自由。 |
image_height |
整数 | 必填 | 生成图片的高度(像素)。 |
image_width |
整数 | 必填 | 生成图片的宽度(像素) |
positive_prompt |
字符串 | 必填 | 正面提示词 |
reference_image |
图片(base64,自动上传到 ComfyUI) | 必填 | 用来给controlnet控制生成图片的参考图片。 |
seed |
整数 | 选填 | 决定 AI 生图初始随机噪声的数字,其他参数不变时换种子,就会生成不同的图片。如果想生成类似的图片,种子填一样的更容易出相似图片。 |
steps |
整数 | 选填 | AI 去噪生成图片的迭代次数,通常越高细节越充分,但生成越慢,超过一定值后提升很小。 |
workflow_id: 3 幻界明舟图片修改
本工作流能够任意修改图片中人物的状态,动作,行为等等。也可以添加删除物品。
可用参数
| 参数名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
image |
图片(base64,自动上传到 ComfyUI) | 必填 | — |
negative_prompt |
字符串 | 选填 | 负面图示词 |
positive_prompt |
字符串 | 必填 | 正面提示词 |
POST https://aihuanjie.com/api/v1/estimates 预估生成耗时
传一张图片和一个工作流 id,返回这个工作流在这次输入图片尺寸下大概要跑多久、以及这次生成要花多少幻晶(不会真正提交生成任务,纯预估,不扣任何幻晶)。预估基于该工作流历史上真实完成的生成记录校准出来,第一次使用某个工作流、还没有历史数据时无法给出精确预估。
预估假设走的是常驻服务器这条路径;实际提交生成任务时如果常驻服务器繁忙会自动溢出到 Serverless,届时可能因为冷启动而更慢——这个接口给出的是正常情况下的参考值,不是精确保证。
price 里的币数与「提交生成任务」真正扣的是同一套计价,可以先查价再决定要不要提交。price.priceable 是 false 时,这个工作流暂时无法定价,提交生成任务会返回 422。
API 调用只能用付费币(紫幻晶),免费币在这条路径上不可用——所以 price.currency 恒为 paid。
需要的权限
密钥必须具备 generate(提交生成任务)权限,否则返回 403。
请求体
| 字段 | 类型 | 必需 | 说明 |
|---|---|---|---|
workflow_id |
integer | 是 | 要跑的工作流 id,必须是已发布状态,草稿状态的工作流 id 会返回 404 |
image |
string | 是 | 图片内容,base64 编码。支持纯 base64 字符串,也支持带 data:image/png;base64,... 前缀的 data URI。解码后大小不能超过 20MB。 |
示例请求
curl -X POST "https://aihuanjie.com/api/v1/estimates" \
-H "Authorization: Bearer {你的密钥}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"workflow_id": 12,
"image": "iVBORw0KGgoAAAANSUhEUgAA...(省略,实际请求里放完整 base64)"
}'
示例响应(200)
{
"data": {
"workflow_id": 12,
"image": {
"width": 1024,
"height": 1024,
"megapixels": 1.048599999999999976552089719916693866252899169921875
},
"estimate": {
"precision": "parametric",
"estimated_seconds": 42.2999999999999971578290569595992565155029296875,
"sample_size": 18,
"expected_megapixels": 1.048599999999999976552089719916693866252899169921875,
"megapixels_source": "submitted_image"
},
"price": {
"priceable": true,
"currency": "paid",
"coins": 43,
"by_batch_size": {
"1": 43,
"2": 82,
"4": 155
}
}
}
}
字段说明
| 字段 | 说明 |
|---|---|
estimate.precision | parametric——按历史数据校准出的"秒/百万像素"系数算出来的,相对精确;rough——历史数据不足以拆出这个系数,退化成历史耗时的粗略平均,跟这次图片大小无关;none——这个工作流还没有任何成功完成的历史记录,无法预估 |
estimate.estimated_seconds | 预估耗时(秒)。precision 是 none 时为 null |
estimate.sample_size | 用了多少条历史记录计算出这个预估 |
estimate.megapixels_source | submitted_image——用的是你这次传的图片真实尺寸;historical_average——用的是历史平均尺寸;null——历史数据不够拆出系数,没用上像素信息(此时 precision 已经是 rough) |
price.priceable | 这个工作流现在能不能定价。false 时 coins 为 null,提交生成任务会返回 422 |
price.coins | 出 1 张要花多少幻晶(付费币)。这就是提交生成任务时真正扣的数字 |
price.by_batch_size | 各张数档位对应的币数。批量有固定开销摊薄,所以不是简单的整数倍;档位以这里列出的为准,传别的数字会返回 422(视频类工作流固定只有 1 段) |
错误响应
| 状态码 | 触发条件 | 示例 |
|---|---|---|
| 401 | 未认证——没带 Authorization 头,或者密钥无效/已删除 | {"message":"Unauthenticated."} |
| 403 | 密钥没有 generate 权限 | {"message":"这把密钥没有\"提交生成任务\"权限。"} |
| 404 | workflow_id 不存在,或者对应工作流还是草稿状态 | {"message":"工作流不存在,或者还没发布。"} |
| 422 | workflow_id/image 缺失或类型不对 | {"message":"请求参数有误。","errors":{"image":["The image field is required."]}} |
| 422 | image 不是合法的 base64 编码 | {"message":"image 字段不是合法的 base64 编码。"} |
| 422 | 解码后的图片超过大小上限 | {"message":"图片过大,超过 20MB 限制。"} |
| 422 | 解码后的内容不是合法的图片文件 | {"message":"image 字段不是合法的图片文件。"} |
| 429 | 超过限流(600 次/分钟,正常使用基本不会碰到,只在异常高频调用时触发) | {"message":"Too Many Attempts."} |
POST https://aihuanjie.com/api/v1/generations 提交生成任务
提交一次真正的生成任务。传工作流 id,以及这个工作流开放的具名参数值——每个工作流开放哪些参数、参数类型是什么、是否必填,见下方「可用工作流」列表;没传的选填参数会使用默认值,必填参数缺失会返回 422。
这个接口只负责提交任务,不会等待生成完成——用返回的 job_id 调用下面的「查询生成任务」接口自行轮询。
这个接口会**真正扣费**:按下方「可用工作流」列表里那个工作流的价格扣**付费币(紫幻晶)**,免费币在 API 上不可用。余额不够时返回 402,不会欠费。想先知道要花多少,用上面的「预估生成耗时」接口查 price。
生成失败或超时会**全额退回**,成功才真正结算——扣费在提交那一刻先冻结,任务到终态时才落账。
同一个账号在站内和 API 上共用同一份并发额度(普通用户 1 个、会员 4 个);额度占满时返回 429,等在跑的任务结束再提交。
提示词与图片参数都会先过内容审核,未通过时返回 422 且**不扣任何幻晶**。
出几张由 parameters 里那个张数参数决定(没传就是 1 张),账单严格按这个数字算;传一个不在允许档位里的数字会返回 422。
如果你在设置页给这把密钥设了「消费限额」,超出限额时返回 429(不是 402)——限额是按「最近 N 个整点小时」滑动计算的,统计的是提交时冻结的币数,生成失败退回的部分不回冲。
价钱只看工作流与张数,**不按参数动态计价**;作为对价,参数里的数值会被夹在这个工作流每个参数各自的取值范围内(下方「可用工作流」列表里标着的最小值/最大值),超出范围不报错,按边界值执行,字符串超长会被截断。
这个接口没有单独的 image 字段——图片和文字/数字/开关这些参数走同一个入口:都放在 parameters 对象里,key 用这个工作流给这个参数起的名字(在下方「可用工作流」列表里能查到,类型标"图片"的那一行)。同一个工作流可能有 0 个、1 个、甚至多个图片参数,具体看它开放了哪些。
需要的权限
密钥必须具备 generate(提交生成任务)权限,否则返回 403。
请求体
| 字段 | 类型 | 必需 | 说明 |
|---|---|---|---|
workflow_id |
integer | 是 | 要跑的工作流 id,见下方「可用工作流」列表 |
parameters |
object | 否 | 参数名 => 值,支持字符串/整数/数字/布尔值/图片(不支持数组/对象)。具体每个工作流开放哪些参数、类型是什么、是否必填,见下方「可用工作流」列表;传一个不存在的参数名,或者漏传某个必填参数,都会返回 422。类型是"图片"的参数,值必须是 base64 编码的图片内容(纯 base64 字符串或者带 data:image/...;base64, 前缀的 data URI 都可以),解码后大小上限 20MB。 |
示例请求
curl -X POST "https://aihuanjie.com/api/v1/generations" \
-H "Authorization: Bearer {你的密钥}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"workflow_id": 12,
"parameters": {
"prompt_text": "a cat, masterpiece",
"seed": 12345,
"source_image": "iVBORw0KGgoAAAANSUhEUgAA...(省略,实际请求里放完整 base64,仅当工作流定义了图片类型参数时才需要传)"
}
}'
示例响应(200)
{
"data": {
"job_id": 88,
"status": "pending",
"execution_path": "persistent",
"charged_coins": 43
}
}
字段说明
| 字段 | 说明 |
|---|---|
job_id | 这次生成任务的 id,用来调用「查询生成任务」接口 |
status | 任务刚创建时的状态,通常是 pending(走常驻服务器)或 running(走 Serverless,已经提交出去了) |
execution_path | persistent——走常驻服务器;serverless——常驻服务器繁忙,溢出到了 Serverless |
charged_coins | 这次冻结的幻晶数量(付费币)。任务成功后按这个数字结算,失败或超时全额退回 |
错误响应
| 状态码 | 触发条件 | 示例 |
|---|---|---|
| 401 | 未认证——没带 Authorization 头,或者密钥无效/已删除 | {"message":"Unauthenticated."} |
| 403 | 密钥没有 generate 权限 | {"message":"这把密钥没有\"提交生成任务\"权限。"} |
| 404 | workflow_id 不存在,或者不是「可用工作流」列表里的 id | {"message":"工作流不存在,或者还没发布。"} |
| 422 | workflow_id 缺失或类型不对,或者 parameters 里某个值是数组/对象 | {"message":"请求参数有误。","errors":{"workflow_id":["The workflow id field is required."]}} |
| 422 | 这个工作流暂时不可用(不应该发生在「可用工作流」列表里出现过的 id 上,如果遇到请联系我们) | {"message":"这个工作流暂时不可用,请稍后再试或联系我们。"} |
| 422 | 参数处理失败——传了一个不存在的参数名、缺少某个必填参数、或者某个参数的值类型不对 | {"message":"参数替换失败。","errors":{"parameters":["未知参数:foo(这个工作流没有定义同名的参数映射)","缺少必填参数:prompt_text"]}} |
| 422 | 图片类型参数处理失败——不是合法的 base64/图片文件、或者超过大小上限 | {"message":"图片参数处理失败。","errors":{"parameters":["参数「source_image」:不是合法的图片文件。"]}} |
| 422 | 张数不在允许的档位里 | {"message":"张数只能是 1 / 2 / 4 之一。"} |
| 422 | 提示词或图片没通过内容审核(**不扣任何幻晶**) | {"message":"内容审核未通过:未成年人相关内容。请修改后重试。"} |
| 402 | 付费币(紫幻晶)不足。不允许欠费——先充值或兑换卡密,再重试 | {"message":"紫幻晶不足:本次需要 43 枚,当前可用 12 枚。"} |
| 403 | 账号当前不能提交生成任务(邮箱未验证,或者账号处于封禁 / 禁生成状态) | {"message":"这个账号当前不能提交生成任务(邮箱未验证,或者账号处于封禁 / 禁生成状态)。"} |
| 429 | 并发额度已占满(站内与 API 共用同一份额度),等在跑的任务结束再提交 | {"message":"你还有 1 个任务正在进行,同时最多只能跑 1 个。等它完成后再提交。","errors":{"concurrency":{"allowed":false,"tier":"default","limit":1,"in_flight":1,"remaining":0}}} |
| 429 | 短时间内多次被内容审核拒绝,已进入暂停期 | {"message":"你在 1 小时内被拒绝多次,已暂停生成,请 47 分钟后再试。"} |
| 429 | 这把密钥自己设的用量配额已用满(在设置页给密钥设过「消费限额」时才可能出现)。充值没用,要么等窗口过去,要么在设置页调高/取消这把密钥的配额 | {"message":"这把密钥的用量配额已用满:最近 24 小时内上限 100 枚紫幻晶,已用 100 枚。等窗口过去,或在设置页调整这把密钥的配额。","errors":{"quota":{"enabled":true,"limit":100,"window_hours":24,"used":100,"requested":43,"remaining":0,"allowed":false}}} |
| 500 | 服务端故障(例如图片上传到 ComfyUI 失败)。这类错误不代表请求有问题,隔几秒重试即可;**不会扣任何幻晶** | {"message":"Server Error"} |
| 429 | 超过限流(600 次/分钟,正常使用基本不会碰到,只在异常高频调用时触发) | {"message":"Too Many Attempts."} |
GET https://aihuanjie.com/api/v1/generations/{job_id} 查询生成任务
查询一次生成任务的当前状态和结果图。只能查通过你自己这个账号(不区分具体是哪一把密钥)提交过的任务,查别人的任务 id 会返回 404。
目前只能轮询,没有 webhook 回调机制——建议每隔几秒查一次,直到 status 变成 completed 或 failed。
需要的权限
密钥必须具备 generate(提交生成任务)权限,否则返回 403。
示例请求
curl -X GET "https://aihuanjie.com/api/v1/generations/{job_id}" \
-H "Authorization: Bearer {你的密钥}" \
-H "Accept: application/json"
示例响应(200)
{
"data": {
"job_id": 88,
"status": "completed",
"execution_path": "persistent",
"progress_percent": 100,
"progress_message": null,
"error_message": null,
"charged_coins": 43,
"outputs": [
{
"id": 201,
"url": "https://cdn.example.com/civitai/generations/88/0.png",
"title": null,
"width": 1024,
"height": 1024
}
]
}
}
字段说明
| 字段 | 说明 |
|---|---|
status | pending|claimed|running|completed|failed |
progress_percent | 0-100,粗粒度进度,不是每个节点的精确进度;不确定时为 null |
error_message | status 是 failed 时的具体错误信息,其它状态下为 null |
charged_coins | 这次任务当初冻结/扣掉的幻晶数量(付费币)。任务失败或超时时这笔钱会全额退回,这个字段仍然显示当初按什么价扣的 |
outputs | 结果图片列表,生成完成前是空数组 |
错误响应
| 状态码 | 触发条件 | 示例 |
|---|---|---|
| 401 | 未认证——没带 Authorization 头,或者密钥无效/已删除 | {"message":"Unauthenticated."} |
| 403 | 密钥没有 generate 权限 | {"message":"这把密钥没有\"提交生成任务\"权限。"} |
| 404 | job_id 不存在,或者不是你自己账号提交的任务 | {"message":"生成任务不存在。"} |
| 429 | 超过限流(3000 次/分钟,比提交生成任务宽松得多,专门为轮询设计,正常使用基本不会碰到) | {"message":"Too Many Attempts."} |