接口说明
midjourney:异步任务协议,提交 imagine 与 16 种二次操作,用 GET /v1/midjourney/{task_id} 轮询,状态 SUCCESS / FAILURE
Midjourney 是围绕"生成 → 查询 → 对结果做二次操作"的异步任务协议。鉴权方式与其他接口一致,见鉴权。本页是协议总览,各操作的字段与父任务要求见操作详解。
| 项 | 值 |
|---|---|
| 模型 | midjourney |
| 模式 | 异步:提交返回 202 和 task_id → 轮询 GET /v1/midjourney/{task_id} → 终态 SUCCESS 或 FAILURE |
| 中间态 | 部分操作先进入 MODAL,需再提交一次才能继续 |
| 计费 | 按操作与 speed 档位,失败全额退款(见计费),价格以定价页为准 |
| 媒体保留 | 图片 90 天、视频 72 小时(见结果有效期) |
模式选择
按目标选择操作:
imagine(生成)
└─ SUCCESS → 四宫格 grid_image_url + buttons
├─ upscale / variation / high_variation / low_variation(引用 index 或 buttons 中的 custom_id)
├─ reroll / pan / zoom(引用 buttons 中的 custom_id)
├─ remix_strong / remix_subtle
├─ inpaint → MODAL → modal(局部重绘,两步流程)
└─ video(把某一张结果做成视频)只有**原始 imagine(或 blend/zoom/reroll 等同样产出新一组四宫格候选图的任务)**的查询响应才带 buttons 数组;upscale/variation 等选中单张图的结果不带 buttons。用 custom_id 引用二次操作时,必须从产出该四宫格的那个任务的响应里取,不能从 upscale 之类的下游结果里取。
全部 16 个操作端点的字段、父任务要求与示例见操作详解。
快速开始
两个路径等价。
curl https://api.vibelab.me/v1/midjourney/generations \
-H "Authorization: Bearer $LOOPTOKEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "a cat in a spacesuit --ar 16:9"}'提交成功返回 202,data[0].task_id 即后续轮询用的任务 ID:
{"code": 200, "data": [{"task_id": "mj_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "status": "submitted"}]}轮询:
curl https://api.vibelab.me/v1/midjourney/mj_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
-H "Authorization: Bearer $LOOPTOKEN_API_KEY"字段见响应。
请求参数
imagine 基础参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
prompt | string | 是 | - | 生成提示词;传统 Midjourney -- 参数(如 --ar 16:9)可以直接写在 prompt 文本里,已通过真实调用验证 |
speed | string | 否 | relax | relax / fast / turbo;决定排队优先级与计费档位,见"计费" |
image_urls | array<string> | 否 | - | 参考图 URL(图生图/风格参考等),数量与效果取决于具体用法;单图 ≤ 12 MiB |
nsfw_check | boolean | 否 | false | true 时在提交生成前先对提示词与输入图做内容审核,拦截更早,但增加一次审核开销与延迟 |
metadata | object | 否 | - | 自定义元数据,随任务保存并原样返回,便于业务侧串联自己的订单/会话 ID |
结构化参数
作为 -- 前缀写法的等价 JSON 字段透传给上游。平台本身不校验取值范围,非法值由上游处理。仅在 prompt 文本内联写 --ar 经过真实调用验证;以下结构化字段建议优先用于替代对应的 -- 写法,与 prompt 内联写法冲突时以上游实际行为为准。
| 参数 | 类型 | 说明 |
|---|---|---|
size | string | 画面比例(宽:高),如 "1:1"、"16:9"、"9:16"、"4:3"、"3:4" |
version | string | 模型版本,如 "6.1"、"7",见下方"版本与 Niji" |
niji | boolean | true 时使用 Niji(动漫风格)模型而非标准模型 |
quality | string | 渲染质量/细节程度档位 |
stylize | integer | 风格化强度,范围 0-1000,默认 100 |
chaos | integer | 结果多样性/随机程度,范围 0-100,默认 0 |
weird | integer | 怪异度,范围 0-3000,默认 0 |
tile | boolean | true 时生成可无缝平铺的图案 |
seed | integer | 随机种子,用于复现同一结果 |
negative_prompt | string | 反向提示词,描述需要避免出现的内容 |
style | string | 风格档位,如 "raw";与 raw 布尔字段是两个不同的 flag(--style raw 与 --raw) |
iw | number | 参考图权重(image weight),范围 0-3,影响 image_urls 相对文本提示词的影响力 |
cref | string | 角色参考图 URL,用于保持角色形象一致 |
cw | integer | 角色参考权重,范围 0-100 |
sref | string | 风格参考图 URL |
sw | integer | 风格参考权重,范围 0-1000 |
dref | string | 深度参考图 URL |
dw | integer | 深度参考权重,范围 0-100 |
repeat | integer | 重复生成次数,范围 2-40;每一次重复都单独计费 |
raw | boolean | 原始风格(--raw),减少 Midjourney 的后期加工;v5.1 起支持 |
draft | boolean | 草图模式(--draft),更快、清晰度更低;v7 起支持 |
hd | boolean | 高清模式(--hd),仅 v8.1/v8.2;未同时传 version 时上游会自动补 --v 8.1 |
stop | integer | 在指定进度提前停止,范围 10-100,仅 v5-v6.1 与 niji 5-6 |
extra | string | 逃生口:原样追加到 prompt 末尾,用于本表尚未覆盖的新 -- flag |
版本与 Niji
version传主版本号字符串。当前上游可用:"8.2"、"8.1"、"7"、"6.1"、"5.2"、"5.1"。- 用 Niji(动漫模型):传
niji: true加version: "7"或"6",上游会归一化为 Niji 7 / Niji 6。不要只传niji: true而不给版本。 - 版本会影响哪些操作可用:
pan只在 v6/v6.1/v7/v8.1/v8.2/niji6 上有效,remix_strong/remix_subtle只在 v8.1/v8.2 上有效。详见操作详解。 - 版本不影响价格,各版本同档同价。
请求示例
Niji 竖图
{"prompt": "anime girl in a moonlit garden", "niji": true, "version": "7", "size": "9:16"}响应
task_id 为提交响应中的值(mj_ 前缀 + UUID)。任务不存在、或不属于当前 API Key 所在账户 → 404 task_not_found。查询响应直接是任务对象,不套 {"code", "data"} 外壳。
状态机
| 状态 | 含义 |
|---|---|
SUBMITTED | 已提交,排队中 |
IN_PROGRESS | 生成中 |
MODAL | 需要客户端补充信息才能继续(目前仅 inpaint 会进入此态),调用 modal 提交后转回 IN_PROGRESS |
SUCCESS | 已完成 |
FAILURE | 失败 |
响应示例(SUCCESS,四宫格):
{
"id": "mj_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"action": "IMAGINE",
"status": "SUCCESS",
"progress": "100%",
"prompt": "a cat in a spacesuit --ar 16:9",
"created_at": 1789041600,
"completed_at": 1789041660,
"credits_charged": 0.58552,
"grid_image_url": "https://...",
"image_urls": ["https://...", "https://...", "https://...", "https://..."],
"buttons": [{"customId": "MJ::JOB::upsample::1::..."}]
}任务对象字段
所有状态都包含:
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | mj_ 前缀 + UUID |
action | string | 大写下划线形式的操作名,如 IMAGINE、HIGH_VARIATION |
status | string | 见状态机 |
progress | string | 形如 "56%" 的进度 |
prompt | string | 提交时使用的提示词 |
created_at | integer | 任务创建时间,Unix 秒 |
进入终态后追加:
| 字段 | 类型 | 说明 |
|---|---|---|
completed_at | integer | 任务结束时间,Unix 秒 |
credits_charged | number | 本次实际扣费(积分) |
buttons | array | 可用于后续二次操作的按钮列表(customId 为 Midjourney 原生字符串,直接透传);仅原始 imagine 类(产出新一组四宫格候选图的)任务才有此字段 |
SUCCESS 时,按操作类型追加以下之一:
| 操作 | 追加字段 |
|---|---|
describe | 仅 description(反推的提示词文本),不返回任何媒体字段 |
产出新一组四宫格的操作:imagine/blend/zoom/reroll/pan/variation 系列/remix 系列/inpaint→modal 的最终结果 | grid_image_url(四宫格预览图)+ image_urls(数组,四张单图) |
产出单张图的操作(如 upscale) | 仅 image_urls(数组,一张) |
video | 仅 video_urls(数组) |
FAILURE 时追加:
| 字段 | 类型 | 说明 |
|---|---|---|
fail_reason | string | 失败原因文案 |
结果有效期
生成结果会被平台转存到自有对象存储并签发可直接访问的 URL(grid_image_url/image_urls/video_urls),不依赖上游链接的时效:
| 类型 | 有效期 |
|---|---|
| 图片 | 任务完成后 90 天内可访问 |
| 视频 | 任务完成后 72 小时内可访问 |
响应中不返回单独的过期时间字段,请在拿到 SUCCESS 结果后尽快下载并自行转存,不要长期依赖返回的链接。
计费
单位为积分(credits)。
| 操作 | relax | fast | turbo |
|---|---|---|---|
imagine | 0.58552 | 0.71552 | 1.3 |
其余全部操作(blend/describe/edits/upscale/variation/high_variation/low_variation/reroll/pan/zoom/remix_strong/remix_subtle) | 0.71552 | 0.71552 | 1.3 |
inpaint | 0(免费提交) | 0 | 0 |
modal | 1.43104 | 1.43104 | 2.6 |
video(480p 档) | 2.6(与 speed 无关) | 2.6 | 2.6 |
video(720p 档) | 5.2(与 speed 无关) | 5.2 | 5.2 |
inpaint单独提交不计费,真正的局部重绘发生在随后的modal步骤,modal档位已包含inpaint+modal两步的合计成本。video的最终扣费 = 表中单价 ×batch_size(可选1/2/4)。batch_size: 4就是实扣 4 份:720p 批量 4 段一次要 20.8 积分,比 480p 单段的 2.6 贵 8 倍。只要一段就传1。video_type含720时走 720p 档,其余走 480p 档。repeat(2-40)同样按次数倍增扣费,与batch_size是两个独立的乘数。- 任务失败(
FAILURE)自动全额退款,退款与终态判定同步完成,无需额外操作。 - 以上价格以定价页和任务终态中的
credits_charged为准。
注意事项
upscale 不是放大。 它是从四宫格里把第 N 张切出来,本地合成、毫秒返回、几乎不会失败,真正烧算力的是上一步 imagine。要真正的 2 倍高清图,走 HD upscale(60-120 秒的真实放大)。两者同价。
MODAL 不是失败。 它是 inpaint 之后等你补参数的正常中间态,轮询到它就去调 modal,不要重试 inpaint。约 30 分钟内不补参,任务会被自动取消并退款(平台本地兜底上限为任务创建后 35 分钟)。
variation和high_variation不是"弱一点/强一点"的同一个操作 →variation作用在四宫格上(等价 V1-V4),high_variation/low_variation作用在 upscale 之后的单图上;父任务给错,上游会拒。inpaint免费不等于局部重绘免费 →inpaint那步是 0,但上游对 inpaint 和 modal 分别计费两次,两步的钱一起算在modal档里(1.43104,正好是单步的两倍)。走完一轮局部重绘的成本和做两次普通操作一样。video的batch_size是实打实的乘数 → 传4就扣 4 份;出片只要一段就传1,比稿才用 4。speed对video无效 →video固定走 FAST 通道,传relax或turbo既不改价也不改排队;speed只对生图类操作生效。--raw和style: "raw"是两个不同的 flag → 前者对应raw: true,后者对应style: "raw",想要哪个效果就传哪个,不要互相替代。pan挑版本 → 只在 v6/v6.1/v7/v8.1/v8.2/niji6 上有效,v5.2 及更早直接FAILURE;它只吃 upscale 后的单图,连 HD upscale 的高清单图也被拒,这是 Midjourney 自身的限制。
错误
错误体与错误码相同:{"error": {"message", "type", "code", "request_id"}}(type 与 code 相同)。本接口常见错误:
| HTTP | code | 触发场景 | 处理 |
|---|---|---|---|
400 | invalid_request_error | 请求体不合法(缺少必填字段、speed/batch_size 不在允许枚举、pan 缺少合法 direction、需要父任务的操作缺少或传错 task_id、父任务状态不满足要求) | 按 message 修正;父任务要求见操作详解 |
402 | insufficient_credits | 账户余额不足以覆盖预扣费用 | 充值后重试 |
404 | not_found_error | 操作端点后缀不存在 | 核对操作详解的端点 |
404 | task_not_found | 提交时引用的父任务不存在或不属于当前账户;或查询时 task_id 不存在/不属于当前账户 | 核对 task_id(mj_ 前缀 + UUID) |
404 | model_not_found | midjourney 没有可售价格 | 联系支持 |
409 | invalid_request_error | 对同一 task_id 重复提交 modal(重复计费冲突),或父任务状态在校验后发生变化 | 不要重复提交,改为轮询 |
422 | invalid_request_error | 内容审核拒绝(message 为 content moderation rejected) | 修改提示词或图片 |
429 | media_concurrency_exceeded | 用户或 API Key 的媒体并发超限(带 Retry-After) | 稍后重试 |
502 | upstream_error | 上游提交失败且重试耗尽 | 指数退避重试,预扣费用会退回 |
503 | no_available_channel | 该模型当前没有可用渠道 | 指数退避重试 |
上游返回的其它 4xx 会按原状态码返回,code 为 invalid_request_error、message 为 upstream request failed。