GPT Image 2 の画像生成 API です。非同期タスクとして動き、送信するとすぐにタスク ID が返り(HTTP 202)、その後ポーリングで結果を取得するか、Webhook で受け取ります。テキストから画像なら prompt だけで足り、参照画像を付ければ画像から画像になります。1K / 2K / 4K の 3 グレードと任意の比率に対応し、1 枚ごとの課金で、失敗した場合は課金されません。
クイックスタート
3 ステップで動きます:タスクを送信 → 結果を照会 → 画像のリンクを受け取る。YOUR_API_KEY をご自身のキーに置き換えれば、下のコマンドはそのまま実行できます。
ステップ 1 · タスクを送信(すぐにタスク ID が返ります。HTTP 202)
curl https://nezhagate.com/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "gpt-image-2", "prompt": "カフェのメニューポスター、タイトルは「秋の限定メニュー」、ドリンク 3 品と価格を載せた、すっきりしたレイアウト", "size": "16:9", "resolution": "2K"}'レスポンス(HTTP 202)
{
"id": "img_7f3c9a1e2b4d6f8a0c1e3b5d",
"object": "image.generation.job",
"status": "queued",
"created": 1791281400,
"model": "gpt-image-2"
}ステップ 2 · status が succeeded か failed になるまで、2〜3 秒ごとに照会
curl https://nezhagate.com/v1/images/jobs/img_7f3c9a1e2b4d6f8a0c1e3b5d \ -H "Authorization: Bearer YOUR_API_KEY"
成功時のレスポンス
{
"id": "img_7f3c9a1e2b4d6f8a0c1e3b5d",
"object": "image.generation.job",
"status": "succeeded",
"created": 1791281400,
"model": "gpt-image-2",
"data": [
{"url": "https://img.nezhagate.com/i/2be8cd16d37f3a4b9c0e1f2a3b4c5d6e.png"}
],
"usage": {"images": 1, "resolution": "2K", "model": "gpt-image-2"}
}ステップ 3 · data[0].url が画像(PNG)のリンクです。保存期間は 15 日間なので、長く使う場合はご自身のストレージにダウンロードしてください。
完全なサンプル(Python:送信 → 待機 → ローカルに保存)
import time
import requests
BASE = "https://nezhagate.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
# 1. タスクを送信
job = requests.post(f"{BASE}/images/generations", headers=HEADERS, json={
"model": "gpt-image-2",
"prompt": "カフェのメニューポスター、タイトルは「秋の限定メニュー」、ドリンク 3 品と価格を載せた、すっきりしたレイアウト",
"size": "16:9",
"resolution": "2K",
}).json()
if "error" in job:
raise SystemExit(job["error"]["message"])
# 2. 終わるまで 3 秒ごとに照会
while job["status"] not in ("succeeded", "failed"):
time.sleep(3)
job = requests.get(f"{BASE}/images/jobs/{job['id']}", headers=HEADERS).json()
# 3. 画像をダウンロード
if job["status"] == "succeeded":
url = job["data"][0]["url"]
with open("gpt-image-2.png", "wb") as f:
f.write(requests.get(url).content)
print("saved", url)
else:
print("failed:", job["error"]["code"], job["error"]["message"])認証
Authorization: Bearer YOUR_API_KEY Content-Type: application/json
コンソールで API Key を作成すると利用を開始できます。
リクエストパラメータ
POST /v1/images/generations のリクエスト本文(JSON):
| パラメータ | 種別 | 必須 | 説明 |
|---|---|---|---|
| model | string | はい | モデル ID:gpt-image-2。 |
| prompt | string | はい | 描きたい内容。画像から画像の場合は、どう変えるかを書きます。 |
| size | string | いいえ | 16:9 のような比率(推奨)、または 1536x1024 のようなピクセルサイズ。省略すると 1:1 の正方形になります。 |
| resolution | string | いいえ | グレード:1K(既定)、2K、4K。 |
| quality | string | いいえ | 描き込みの度合い(1K のみ):low、medium(既定)、high。2K と 4K は常に medium で生成し、それ以外の値も medium として扱います。料金は変わりません。詳しくは下の「画質とネイティブ解像度」を参照してください。 |
| image / images | string / array | いいえ | 参照画像。指定すると画像から画像になります。1 枚なら image、複数なら images(最大 8 枚)で渡します。それぞれ公開されている画像の URL、data: URI、base64 のいずれかです。 |
| n | integer | いいえ | 枚数。指定しないことをおすすめします。複数枚ほしいときは、複数のタスクを同時に送信してください。n を指定すると n 枚分を先に確保し、実際に納品した枚数で精算します。 |
| callback_url | string | いいえ | タスク終了時に結果を送る先。下の Webhook の項目をご覧ください。 |
そのほかの OpenAI のパラメータ(background、output_format、response_format、style など)は料金に影響せず、反映される保証もありません。結果は常に PNG で、url として返ります。
料金
1 枚ごとの課金で、料金はグレードだけで決まります。比率や、テキストから画像か画像から画像かは関係ありません。送信時にそのグレードの料金を確保し、タスクが失敗した場合は全額返金します。1 クレジット = $0.005 です。
| グレード | 1 枚あたりのクレジット | 1 枚あたりの料金(USD) |
|---|---|---|
| 1K | 1 | $0.005 |
| 2K | 5 | $0.025 |
| 4K | 8 | $0.04 |
比率・解像度・出力サイズ
比率は size、グレードは resolution で指定します。画像は表のサイズどおりに納品されます。長辺がグレードで決まり、もう一方の辺は比率に合わせて計算されます。表にない比率も同じ規則で使えます。
| 比率 | 1K | 2K | 4K |
|---|---|---|---|
| 1:1 | 1024x1024 | 2048x2048 | 4096x4096 |
| 3:4 | 768x1024 | 1536x2048 | 3072x4096 |
| 2:3 | 683x1024 | 1365x2048 | 2731x4096 |
| 9:16 | 576x1024 | 1152x2048 | 2304x4096 |
| 4:3 | 1024x768 | 2048x1536 | 4096x3072 |
| 3:2 | 1024x683 | 2048x1365 | 4096x2731 |
| 16:9 | 1024x576 | 2048x1152 | 4096x2304 |
- 1K では、モデルは最も近い横長・縦長・正方形の構図で描き、ゲートウェイがそれを中央で切り抜いて、表のサイズに拡大・縮小します。比率が 3:2、2:3、1:1 から離れるほど、端が多く切り取られます。被写体が欠けずに中央に収まるよう、ゲートウェイはプロンプトの末尾に比率を説明する英文を 1 文加えます。切れては困るものは、画面の端から離して配置させてください。
- ネイティブに生成するティア(下の「画質とネイティブ解像度」を参照)は指定の比率でそのまま描くため、端は切り取られません。
sizeにはピクセルサイズ(例:1536x1024)も指定でき、画像はそのサイズどおりに納品されます(長辺が 4096 を超える場合は縮小)。このときグレードはresolutionで決まり、指定がなければ長辺で決まります:1536 以下は 1K、2048 以下は 2K、それより大きければ 4K です。resolutionはグレードを上げることはできても下げることはできず、納品サイズも変えないので、小さいサイズと高いグレードを組み合わせないでください。
画質とネイティブ解像度
qualityを送らない場合は、OpenAI の medium の描き込みで生成します。1K ではlow、medium、highを選べ、テキストから画像でも画像から画像でも反映されます。2K と 4K は常に medium で生成します。auto、xhigh、maxなどそれ以外の値は medium として扱い、エラーにはなりません。料金は解像度ティアだけで決まり、qualityには左右されません。qualityに1K、2K、4Kが入っていてresolutionがない場合は、解像度ティアとして扱います(サイズも料金もそのティアになります)。- 1K はモデル本来の画角(約 157 万画素、正方形なら 1254×1254)で生成し、ゲートウェイが上の表のサイズに合わせて拡大・縮小します。
- 2K と 4K は、指定の比率でネイティブに生成します。上限は 1 辺 3840 px、総画素数約 830 万です。2K の 1:1 はそのまま 2048×2048、4K の 16:9 は 3840×2160、4K の 1:1 は 2880×2880 になります。表の 4K サイズがこれより大きい場合は、ゲートウェイがその分を拡大します(16:9 で各辺約 7%、正方形に近いほど拡大率が大きくなります)。ネイティブの画素をそのまま受け取りたい場合は、
sizeに上限内のピクセルサイズ(例:3840x2160)を指定してください。 - ネイティブに生成するティアは、ネイティブ回線だけで実行します。回線が混んでいるときはキューで待ち、それでも生成できなければ失敗として全額返金します。1K の画像を拡大して代わりに渡すことはありません。
- 1K のタスクはまれに予備の回線で仕上げることがあり、その場合
qualityが反映されないことがあります。
画像から画像と参照画像
image(1 枚)またはimages(複数枚、最大 8 枚。9 枚目以降は使われません)を渡すと画像から画像になります。どう変えるかはプロンプトに書いてください。POST /v1/images/editsも同じパラメータで使えます。- どちらのエンドポイントも JSON の本文だけを受け付け、multipart でのファイルアップロードには対応していません。そのため OpenAI SDK の
images.edit()はそのままでは使えません。下の例のように、リンクまたは base64 で渡してください。 - 参照画像はそれぞれ、公開されている画像の URL(http または https)、data: URI、またはそのままの base64 で渡せます。1 枚 16MB までで、JPEG、PNG、WebP などの一般的な形式に対応しています。
- URL は画像そのものを直接ダウンロードできるものにしてください。ウェブページや、ログインが必要な URL、直リンク禁止の URL は使えません。読み込めない参照画像は送信時に 400 で拒否され、どの画像がなぜ読めないかが示されます。タスクは作成されず、課金もされません。
- 出力の比率は参照画像ではなく
sizeで決まります。元の画像の比率を保ちたい場合は、sizeをその比率にしてください。 - 参照画像は当サイトで代わりにホストし、7 日間保存します。
参照画像 2 枚で画像から画像
curl https://nezhagate.com/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "gpt-image-2", "prompt": "人物はそのままに、背景を夜の海辺に変えて、暖かい色のストリングライトを添える", "images": ["https://example.com/people.jpg", "https://example.com/beach.jpg"], "size": "3:4", "resolution": "2K"}'タスクの状態と返却フィールド
GET /v1/images/jobs/{id} は次のステータスを返します。各フィールドの説明は 非同期タスク をご覧ください。2〜3 秒ごとに照会するか、Webhook を使ってください。
| ステータス | 意味 |
|---|---|
| queued | 順番待ち。queue_position(前にあるタスク数)と eta_seconds(予想待ち時間)が付きます。 |
| processing | 生成中。 |
| succeeded | 完了。結果は data[0].url、課金の内訳は usage にあります。 |
| failed | 失敗。理由は error にあり、予約したクレジットは全額返金されます。 |
1 つのアカウントで同時に生成できるタスクは 50 件までで、それ以上は送信順に順番待ちになります。15 分たっても始まらないタスクは失敗となり、全額返金されます。タスクの記録は 3 日間、画像のリンクは 15 日間保存されます。
生成にかかる時間
送信から結果までは、1K がふつう 20〜60 秒、ネイティブに生成する 2K と 4K がふつう 30〜120 秒です。画像から画像、複数の参照画像があると長くなり、ゲートウェイが別の回線で再試行したタスクは数分かかることがあります。
直近 7 日間の実際の呼び出し:中央値 25 秒、90% が 43 秒 以内に完了。
エラーと返金
送信時のエラーはすぐに HTTP 4xx / 5xx で返り、タスクは作成されず、課金もされません。受け付け後の失敗は照会エンドポイントで報告され、確保額は全額返金されます。すべてのコードは エラーコード に載っています。
送信時に返るエラー
| HTTP | code | 原因 | 対処 |
|---|---|---|---|
| 400 | missing_prompt | /v1/images/generations に prompt がありません。 | prompt を追加してください。 |
| 400 | invalid_request | 参照画像を読み込めない(リンク切れ、画像ではない、16MB 超など。どれがなぜ読めないかは message に記載)、/v1/images/edits に参照画像がない、本文が JSON オブジェクトでない、または n が整数ではありません。 | message の内容に沿って直してから、もう一度送信してください。 |
| 400 | model_not_found | モデル ID のつづりが違う・model がない・そのモデルをこのエンドポイントでは使えない(たとえば対話モデルで画像のエンドポイントを呼び出した)のいずれかです。 | GET /v1/models または API リファレンス にあるモデル ID を使ってください。 |
| 401 | invalid_api_key | キーが存在しない・削除された・無効化されているか、アカウントが停止されています。 | コンソールの「API Keys」ページでキーを確認してください。 |
| 402 | insufficient_quota | このリクエストの分を確保するだけの残高がありません。ゲートウェイはまずリクエストにかかりうる最大の費用を確保するため、同時に多くの呼び出しを送ったときにも起こることがあります。 | 一度に多くの呼び出しを送った直後なら、数秒待って再試行してください。そうでなければチャージしてください。 |
| 429 | rate_limit_exceeded | このキーに設定した 1 分あたりのリクエスト数の上限を超えました(直近 60 秒で数えます)。Retry-After ヘッダーは付きません。 | 数秒待ってから再試行するか、コンソールでこのキーの上限を引き上げてください。 |
| 503 | model_maintenance | モデルのメンテナンス中で、リクエストを受け付けていません。その間、別のモデルが代わりに回答することもありません。 | メンテナンスが終わってから再試行してください。状況は サービス状態 で確認できます。 |
| 503 | service_unavailable | 当サイト側の一時的なエラーです(参照素材の保存に失敗した場合など)。/v1/responses で一時的に使える回線がないときも、Retry-After 付きで 503 を返します。 | しばらくしてから再試行してください。 |
失敗したタスク(status が failed)
| code | 発生する場面 | 対処 |
|---|---|---|
| moderation_blocked | 画像:モデル提供元の安全審査がプロンプトまたは参照画像を拒否しました(コードが content_policy_violation の場合もあります)。 | プロンプトを書き直すか、参照画像を差し替えてください。そのまま再送信しても、たいてい再び拒否されます。 |
| upstream_error | その他の失敗:すべての回線を試しても失敗した、順番待ちが 15 分を過ぎても始まらなかった、上流が理由を示さずに拒否した、などです。具体的な状況は message に書かれています。 | たいていは再送信すれば成功します。 |
ポーリングの代わりに Webhook を使う
送信時に callback_url を付けると、タスクが終わった時点で(成功・失敗とも)、照会エンドポイントが返すものとまったく同じ内容をゲートウェイがその URL へ送ります。署名付きで、届かなかった場合は自動で再試行します。コンソールの「設定 → Webhook」で、アカウント全体の送信先を設定することもできます。 Webhook のドキュメント →
curl https://nezhagate.com/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "gpt-image-2", "prompt": "カフェのメニューポスター、タイトルは「秋の限定メニュー」、ドリンク 3 品と価格を載せた、すっきりしたレイアウト", "size": "1:1", "callback_url": "https://your-domain.com/webhook"}'