Qwen-ImageAPI リファレンス
Qwen-Imageモデルを使って、コードから画像の生成と編集を行えます:3ステップのクイックスタート、すべてのフィールド、画像ごとのクレジット、Webhookとべき等性。
開発者APIは申請制です。
画像APIはベータ版のため、フィールドは変更される場合があります。スタジオには影響しません。
クイックスタートは3回の 呼び 出しで
キーを設定し、価格上限を付けてジョブを送信し、結果を読み取ります。
- 01
キーを
設定 する 開発者APIは申請制です。スタジオの「APIキー」から申請してください。キーは1回だけ表示されるため、環境変数に保存してください。
export API_KEY="sk_test_…" - 02
ジョブを
送信 する Idempotency-Keyとmax_creditsの上限を付けて画像をPOSTします。編集モデルはimage_urlも受け取ります。202と待機中のジョブが返り、クレジットが保留されます。
curl https://api.pershot.app/v1/images/generations \ -H "Authorization: Bearer $API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "model": "qwen-image-2512", "prompt": "A ceramic mug on a walnut table, soft window light, product photo", "size": "1K", "aspect_ratio": "1:1", "max_credits": 2 }'{ "id": "job_01J9ZK4T8W", "object": "job", "kind": "image", "status": "queued", "money_status": "reserved", "queue_position": 2, "requested_model": "qwen-image-2512", "credits_quoted": 2, "credits_charged": null } - 03
結果を
読み 取る statusがsucceededになるまでジョブをGETします。outputs[].urlは署名付きで24時間後に期限切れになるため、残したいものはダウンロードしてください。
curl https://api.pershot.app/v1/jobs/job_01J9ZK4T8W \ -H "Authorization: Bearer $API_KEY"
パラメーターと制限
APIが検証に使うのと同じスキーマから生成されたOpenAPIドキュメントから読み込んでいます。不明なフィールドは拒否されます。
| フィールド | 型 | 許可される値 | 備考 |
|---|---|---|---|
model必須 | string | qwen-image-2512-lightning · qwen-image-2512 · qwen-image-edit-2511-lightning · qwen-image-edit-2511 | モデルID。 |
prompt必須 | string | 2–2,000文字 | 生成する内容:被写体、カメラ、光。 |
sizeデフォルト:"1K" | string | 1K · 2K | 試作と開始フレームには1K、細部の表現には2K。 |
aspect_ratioデフォルト:"1:1" | string | 16:9 · 9:16 · 1:1 | フレームの形状。 |
image_url任意 | string | httpsのURL | 動画の開始フレーム。編集モデルでは元画像。公開されているhttpsのURL、またはアップロードURL。 |
seed任意 | integer | 0–2,147,483,647 | 同じ入力で結果を再現します。 |
quote_id任意 | string | qt_… | POST /v1/quotesの見積もりで実行します。見積もりの有効期間は10分です。 |
max_credits任意 | number | > 0 | このジョブの費用の上限。上限を超える場合、ジョブは拒否され、課金されることはありません。 |
webhook_url任意 | string | httpsのURL | ジョブのイベントを受信するhttpsのURL。 |
end_user_id任意 | string | 1–128文字 | 承認済みの開発者アカウント向け(申請制):このリクエストに付けるご自身のユーザーID。使用状況に表示されます。 |
project_id任意 | string | prj_… | |
shot_id任意 | string | sht_… | |
routing_preference任意 | string | stability · speed |
quote_idとmax_creditsのどちらか一方だけを送信してください。このエンドポイントはmodel "auto"を受け付けません。動画の場合は、先にPOST /v1/auto/planを呼び出し、選ばれたモデルをmax_creditsとともに送信してください。
- モデル
qwen-image-2512-lightning生成 · Qwen-Image-2512 · Lightning 4-stepqwen-image-edit-2511-lightning編集 · Qwen-Image-Edit-2511 · Lightningqwen-image-2512生成 · Qwen-Image-2512qwen-image-edit-2511編集 · Qwen-Image-Edit-2511- レートと同時実行数
- キーごとに毎分60リクエスト、同時実行はデフォルトでアカウントごとに3ジョブです。キーを増やしても同時実行数は増えません。
- AIエージェント向け
- AIエージェント向けのテキスト:入力、指定できる値、設定ごとの価格、リクエスト例
qwen-image-2512-lightningqwen-image-2512qwen-image-edit-2511-lightningqwen-image-edit-2511
制限
APIが照合するのと同じ表から読み込んでいます。各行に、その制限を誰が確認するのか、超えた場合にどうなるのかを記載しています。
- 当社が確認当社が確認し、見積もりや保留の前に400を返します。
- 提供元が確認仕入れ先が確認します。拒否されたジョブは失敗となり、課金されません。
- 推奨誰も確認しません。範囲内に収めると、より良い結果が得られます。
| 制限 | 値 | 単位 | 確認する側 | 制限を超えた場合 |
|---|---|---|---|---|
| リクエスト | ||||
プロンプトの長さprompt | 2〜2,000 | 文字 | 当社が確認 | 見積もりや保留の前に、promptに対して400 invalid_requestを返します。 |
画像サイズsize | 1K, 2Kデフォルト:1K | – | 当社が確認 | sizeに対して400 invalid_requestを返します。 |
アスペクト比aspect_ratio | 16:9, 9:16, 1:1デフォルト:1:1 | – | 当社が確認 | aspect_ratioに対して400 invalid_requestを返します。 |
| 送信する画像 | ||||
元画像image_url | なし | – | 当社が確認 | 編集モデルにはimage_urlが必要で、生成モデルはimage_urlを受け付けません:image_urlに対して400 invalid_requestを返します。 |
| 出力 | ||||
| 出力ピクセル数 | 1K16:91344×7689:16768×13441:11024×10242K16:92048×11529:161152×20481:12048×2048 | px | 当社が確認 | このサイズちょうどを指定してリクエストします。 |
| 出力の辺 | 256〜2,048 | px(1辺あたり) | 提供元が確認 | 上記のサイズはすべて範囲内です。これより大きいものは仕入れ先が拒否します。 |
| 出力形式 | JPEG | – | 当社が確認 | すべての画像はJPEGです。 |
| リンク | ||||
| 出力リンク | 24 | 時間 | 当社が確認 | 期限を過ぎるとリンクは403を返します。ジョブを再度GETすると新しいリンクを取得できます。ファイル自体は12か月間保持されます(日付はジョブのoutputs_expire_at)。アセットに保存したもの、プロジェクトで使用中のものはそれ以降も保持されます。 |
| 制限 | 値 | 単位 | 確認する側 | 制限を超えた場合 |
|---|---|---|---|---|
| リクエスト | ||||
プロンプトの長さprompt | 2〜2,000 | 文字 | 当社が確認 | 見積もりや保留の前に、promptに対して400 invalid_requestを返します。 |
画像サイズsize | 1K, 2Kデフォルト:1K | – | 当社が確認 | sizeに対して400 invalid_requestを返します。 |
アスペクト比aspect_ratio | 16:9, 9:16, 1:1デフォルト:1:1 | – | 当社が確認 | aspect_ratioに対して400 invalid_requestを返します。 |
| 送信する画像 | ||||
元画像image_url | ちょうど1つ | – | 当社が確認 | 編集モデルにはimage_urlが必要で、生成モデルはimage_urlを受け付けません:image_urlに対して400 invalid_requestを返します。 |
アップロードサイズfile | 最大10 | MB | 当社が確認 | POST /v1/uploadsはfileに対して400 invalid_requestを返します。 |
アップロード形式file | JPEG, PNG, WebP | – | 当社が確認 | ファイル名ではなく、ファイルの中身から判定します。それ以外の形式:fileに対して400 invalid_requestを返します。 |
| 出力 | ||||
| 出力ピクセル数 | 1K16:91344×7689:16768×13441:11024×10242K16:92048×11529:161152×20481:12048×2048 | px | 当社が確認 | このサイズちょうどを指定してリクエストします。 |
| 出力の辺 | 512〜2,048 | px(1辺あたり) | 提供元が確認 | 上記のサイズはすべて範囲内です。これより大きいものは仕入れ先が拒否します。 |
| 出力形式 | JPEG | – | 当社が確認 | すべての画像はJPEGです。 |
| リンク | ||||
| アップロードリンク | 7 | 日 | 当社が確認 | 期限を過ぎるとリンクは403を返します。ファイルを再度アップロードしてください。 |
| 出力リンク | 24 | 時間 | 当社が確認 | 期限を過ぎるとリンクは403を返します。ジョブを再度GETすると新しいリンクを取得できます。ファイル自体は12か月間保持されます(日付はジョブのoutputs_expire_at)。アセットに保存したもの、プロジェクトで使用中のものはそれ以降も保持されます。 |
当社は他のホストから画像を取得しないため、そうしたリンクのサイズは仕入れ先が確認します。仕入れ先が拒否したジョブには課金されません。 同じ制限はJSONでも取得できます:GET /v1/modelsは、すべてのモデルについてlimitsオブジェクトを返します。
料金をオープンに 計算
画像1枚ごとに、モデルとサイズに応じたクレジット建ての価格です(US$1 = 100クレジット)。生成と編集は別々に価格が設定されています。
| モデル | 1K | 2K |
|---|---|---|
qwen-image-2512-lightning生成 | 1 cr≈ $0.01$10で約1,000枚 | 3 cr≈ $0.03$10で約333枚 |
qwen-image-edit-2511-lightning編集 | 2 cr≈ $0.02$10で約500枚 | 4 cr≈ $0.04$10で約250枚 |
qwen-image-2512生成 | 2 cr≈ $0.02$10で約500枚 | 6 cr≈ $0.06$10で約166枚 |
qwen-image-edit-2511編集 | 3 cr≈ $0.03$10で約333枚 | 10 cr≈ $0.10$10で約100枚 |
Webhookとべき 等性
再試行で二重に課金されることはなく、ポーリングも不要です。
- べき等性
- 生成のPOSTにはすべてIdempotency-Key(表示可能なASCII文字で1〜255文字)が必要です。24時間以内に同じキーを送るとHTTP 200で同じジョブが返されるため、タイムアウト後に再試行しても、2つ目のジョブが作成されたり課金されたりすることはありません。
- 拒否されたプロンプト
- 事前チェックで拒否されたプロンプト(422 content_rejected)では何も作成されないため、同じキーを新しいプロンプトで再利用できます。
- イベント
job.queuedjob.processingjob.succeededjob.failedjob.cancelled- 署名
- X-Signatureには、UNIX時刻のtと、tとドットと生のボディをwhsec_シークレットで鍵付けしたHMAC-SHA256であるv1が含まれます。5分より古いタイムスタンプは拒否し、X-Event-Idで重複を排除してください。
- 配信
- 10秒以内に2xxが返れば配信済みとみなします。失敗した配信は、1 min、5 min、30 min、2 h、6 hの後に再試行されます。リダイレクトには従いません。
{
"id": "evt_01J9ZKB1QX",
"type": "job.succeeded",
"created_at": "2026-09-29T14:02:31Z",
"data": {
"job": {
"id": "job_01J9ZK4T8W",
"object": "job",
"kind": "image",
"status": "succeeded",
"money_status": "settled",
"requested_model": "qwen-image-2512",
"credits_charged": 2,
"outputs": [
{
"kind": "image",
"url": "https://…/job_01J9ZK4T8W.png?sig=…"
}
]
}
}
}import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody: the request body exactly as received, before any JSON parsing.
export function verifyWebhook(header, rawBody, secret, toleranceSec = 300) {
let t = null;
const signatures = [];
for (const item of (header ?? "").split(",")) {
const [key, value] = item.split("=", 2);
if (key === "t") t = Number(value);
if (key === "v1") signatures.push(Buffer.from(value, "hex"));
}
if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
return signatures.some((s) => s.length === expected.length && timingSafeEqual(s, expected));
}
// verifyWebhook(req.headers["x-signature"], rawBody, process.env.WEBHOOK_SECRET)
// Answer 2xx quickly, and skip an X-Event-Id you have already handled.エラーと対処法
すべてのエラーは同じ形式です:code、message、param、request_idを含むerrorオブジェクト。よく発生するものは次のとおりです:
| コード | HTTP | 対処法 |
|---|---|---|
invalid_request | 400 | paramに示されたフィールドを修正してください。 |
unauthorized | 401 | キーとBearerヘッダーを確認してください。 |
insufficient_credits | 402 | チャージしてから、同じIdempotency-Keyで再試行してください。 |
forbidden_model | 403 | スタジオでキーの許可リストにモデルまたはツールを追加するか、別のキーを使用してください。高画質化などのツールには、個別の登録が必要です。 |
quote_expired | 409 | 新しい見積もりを取得してください。見積もりの有効期間は10分です。 |
price_changed | 409 | 価格が上限を超えました。再度見積もるか、max_creditsを引き上げてください。 |
content_rejected | 422 | 課金はされていません。プロンプトまたは画像を変更してください。 |
rate_limited | 429 | Retry-Afterの時間だけ待ってから、再試行してください。 |
upstream_unavailable | 503 | モデルを利用できません。後で再試行してください。開始されなかったジョブには課金されません。 |