接口说明
Midjourney 异步任务协议、参数与计费总览
接口地址
POST /v1/midjourney/generations
POST /v1/midjourney/generations/{action}
GET /v1/midjourney/{task_id}Midjourney 是一套围绕"生成 → 查询 → 对结果做二次操作"的异步任务协议:提交请求立即返回 202 和任务对象(此时处于 SUBMITTED 状态),用返回的 task_id 轮询查询接口,直到任务进入终态(SUCCESS 或 FAILURE);部分操作会先进入中间态 MODAL,需要再提交一次才能继续。
鉴权方式与其他接口一致,见鉴权。
工作流总览
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 个操作端点的字段、父任务要求与示例见操作详解。
提交 imagine
POST /v1/midjourney/generations
POST /v1/midjourney/generations/imagine两个路径等价。请求体为 JSON:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
prompt | string | 是 | 生成提示词;传统 Midjourney -- 参数(如 --ar 16:9)可以直接写在 prompt 文本里,已通过真实调用验证 |
speed | string | 否 | relax / fast / turbo,默认 relax;决定排队优先级与计费档位,见下文"计费" |
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 | 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 而不给版本。
{"prompt": "anime girl in a moonlit garden", "niji": true, "version": "7", "size": "9:16"}版本会影响哪些操作可用:pan 只在 v6/v6.1/v7/v8.1/v8.2/niji6 上有效,remix_strong/remix_subtle 只在 v8.1/v8.2 上有效。详见操作详解。
版本不影响价格——各版本同档同价。
提交成功返回 202,响应体:
{"code": 200, "data": [{"task_id": "mj_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "status": "submitted"}]}查询任务
GET /v1/midjourney/{task_id}task_id 为提交响应中的值(mj_ 前缀 + UUID)。任务不存在、或不属于当前 API Key 所在账户 → 404 task_not_found。
状态机
| 状态 | 含义 |
|---|---|
SUBMITTED | 已提交,排队中 |
IN_PROGRESS | 生成中 |
MODAL | 需要客户端补充信息才能继续(目前仅 inpaint 会进入此态),调用 modal 提交后转回 IN_PROGRESS |
SUCCESS | 已完成 |
FAILURE | 失败 |
响应字段
所有状态都包含:
| 字段 | 类型 | 说明 |
|---|---|---|
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 | 失败原因文案 |
容易搞错的几件事
upscale 不是放大。 它是从四宫格里把第 N 张切出来,本地合成、毫秒返回、几乎不会失败——真正烧算力的是上一步 imagine。要真正的 2 倍高清图,得走 HD upscale,那才是 60-120 秒的真实放大。两者同价。
variation 和 high_variation 不是"弱一点/强一点"的同一个操作。 variation 作用在四宫格上(等价 V1-V4),high_variation/low_variation 作用在 upscale 之后的单图上。父任务给错,上游会拒。
inpaint 免费不等于局部重绘免费。 inpaint 那一步确实是 0,但上游对 inpaint 和 modal 是分别计费两次的,这两步的钱一起算在 modal 档里(1.43104,正好是单步的两倍)。走完一轮局部重绘的成本,和做两次普通操作一样。
MODAL 不是失败。 它是 inpaint 之后等你补参数的正常中间态,轮询到它就该去调 modal,不是去重试 inpaint。30 分钟内不补参,任务会被自动取消并退款。
video 的 batch_size 是实打实的乘数。 传 4 就扣 4 份。720p 批量 4 段一次 20.8 积分,是 480p 单段 2.6 的 8 倍。出片只要一段就传 1,比稿才用 4。
speed 对 video 无效。 video 固定走 FAST 通道,传 relax 或 turbo 既不改价也不改排队。它只对生图类操作生效。
--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 自身的限制。
计费
| 操作 | 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 |
单位为积分(credits)。说明:
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)自动全额退款,退款与终态判定同步完成,无需额外操作。 - 以上为当前生效价格,如有调整以实际扣费为准。
图片/视频有效期与 OSS 托管
生成结果会被平台转存到自有对象存储并签发可直接访问的 URL(grid_image_url/image_urls/video_urls),不依赖上游链接的时效:
- 图片:任务完成后 90 天内可访问。
- 视频:任务完成后 72 小时内可访问。
响应中不返回单独的过期时间字段,请在拿到 SUCCESS 结果后尽快下载并自行转存,不要长期依赖返回的链接。
错误
| 状态码 | code | 触发场景 |
|---|---|---|
| 400 | invalid_request_error | 请求体不合法(缺少必填字段、speed/batch_size 不在允许枚举、pan 缺少合法 direction、需要父任务的操作缺少 task_id、父任务状态不满足要求等) |
| 402 | insufficient_credits | 账户余额不足以覆盖预扣费用 |
| 404 | task_not_found | 提交时引用的父任务不存在或不属于当前账户;或查询时 task_id 不存在/不属于当前账户 |
| 409 | invalid_request_error | 对同一 task_id 重复提交 modal(重复计费冲突) |
| 422 | invalid_request_error | 内容审核拒绝 |
| 502 | upstream_error | 上游提交失败且重试耗尽 |
| 503 | no_available_channel | 该模型当前没有可用渠道 |