# GPT Image 2.5 Sunburst — /images/generations

GPT Image 2.5 Sunburst 이미지 생성 API입니다. OpenAI 차세대 이미지 모델 중 입자감과 붓 터치가 더 강한 스타일 계열로, 질감과 실물감이 필요한 그림에 맞습니다. 기능은 Flare와 같으며 비동기 작업으로 처리됩니다. 1K / 2K / 4K 세 등급과 원하는 비율을 지원하며, 장당 과금되고 실패하면 과금되지 않습니다.

**엔드포인트:** `POST https://nezhagate.com/v1/images/generations`

## 빠른 시작

세 단계면 됩니다: 작업 제출 → 결과 조회 → 이미지 링크 받기. 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.5-sunburst", "prompt": "해 질 녘 항구를 그린 유화, 뚜렷한 붓 자국, 따뜻한 색감", "size": "16:9", "resolution": "2K"}'
```

응답(HTTP 202)

```
{
  "id": "img_7f3c9a1e2b4d6f8a0c1e3b5d",
  "object": "image.generation.job",
  "status": "queued",
  "created": 1791281400,
  "model": "gpt-image-2.5-sunburst"
}
```

**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.5-sunburst",
  "data": [
    {"url": "https://img.nezhagate.com/i/2be8cd16d37f3a4b9c0e1f2a3b4c5d6e.png"}
  ],
  "usage": {"images": 1, "resolution": "2K", "model": "gpt-image-2.5-sunburst"}
}
```

**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.5-sunburst",
    "prompt": "해 질 녘 항구를 그린 유화, 뚜렷한 붓 자국, 따뜻한 색감",
    "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.5-sunburst.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
```

## 요청 파라미터

`POST /v1/images/generations`의 요청 본문(JSON):

| 파라미터 | 타입 | 필수 | 설명 |
| --- | --- | --- | --- |
| model | string | 예 | 모델 ID: `gpt-image-2.5-sunburst`. |
| 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 | 아니오 | 참조 이미지. 넣으면 이미지-투-이미지가 됩니다. 한 장은 `image`, 여러 장은 `images`(최대 8장)에 넣으며, 각각 공개 이미지 URL, data: URI, base64 중 하나로 보낼 수 있습니다. |
| n | integer | 아니오 | 이미지 장수. 넣지 않는 것을 권장합니다. 여러 장이 필요하면 작업 여러 개를 동시에 제출하세요. `n`을 넣으면 n장 분의 크레딧을 미리 예약하고, 실제로 전달된 장수만큼 과금합니다. |
| callback_url | string | 아니오 | 작업이 끝나면 결과를 보낼 주소. 아래 웹훅 부분을 보세요. |

그 밖의 OpenAI 파라미터(`background`, `output_format`, `response_format`, `style` 등)는 가격에 영향을 주지 않으며 적용된다는 보장도 없습니다. 결과는 항상 PNG이며 `url`로 돌려줍니다.

## 가격

장당 과금이며 가격은 등급으로만 정해집니다. 비율이나 텍스트-투-이미지 / 이미지-투-이미지 여부와는 관계없습니다. 제출할 때 등급 가격만큼 예약되고, 작업이 실패하면 전액 환불됩니다. 1크레딧 = $0.005.

| 등급 | 장당 크레딧 | 장당 가격(USD) |
| --- | --- | --- |
| 1K | 1 | $0.005 |
| 2K | 6 | $0.03 |
| 4K | 10 | $0.05 |

## 비율, 해상도와 출력 크기

비율은 `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에서 멀수록 가장자리가 더 많이 잘립니다. 게이트웨이는 피사체가 잘리지 않고 가운데에 오도록 프롬프트 뒤에 비율을 설명하는 문장(영어)을 덧붙입니다. 꼭 남아야 하는 내용은 가장자리에서 떨어진 곳에 두세요.

- 네이티브로 생성하는 등급(아래 「화질과 네이티브 해상도」 참고)은 요청한 비율로 바로 그리므로 가장자리가 잘리지 않습니다.

- `size`에는 픽셀 크기(예: `1536x1024`)도 쓸 수 있으며, 이미지는 그 크기 그대로 전달됩니다(긴 변이 4096을 넘으면 비율을 유지한 채 줄입니다). 이때 등급은 `resolution`으로 정해지고, `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**는 요청한 비율로 네이티브 생성합니다. 한 변 최대 3840px, 총 약 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`(한 장) 또는 `images`(여러 장, 최대 8장이며 8장을 넘는 것은 쓰지 않음)를 보내면 이미지-투-이미지로 실행됩니다. 무엇을 어떻게 바꿀지는 프롬프트에 적으세요. `POST /v1/images/edits`도 같은 파라미터를 받습니다.

- 두 엔드포인트 모두 JSON 본문만 받고 multipart 파일 업로드는 받지 않습니다. 그래서 OpenAI SDK의 `images.edit()`은 그대로 쓸 수 없으니, 아래 예시처럼 링크나 base64를 보내세요.

- 참조 이미지는 각각 공개 이미지 URL(http 또는 https), data: URI, 순수 base64 중 하나로 보낼 수 있습니다. 한 장당 16MB 이하이며, JPEG, PNG, WebP 같은 일반적인 형식이면 됩니다.

- 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.5-sunburst", "prompt": "인물은 그대로 두고 배경을 따뜻한 줄조명이 걸린 밤 해변으로 바꾸기", "images": ["https://example.com/people.jpg", "https://example.com/beach.jpg"], "size": "3:4", "resolution": "2K"}'
```

## 작업 상태와 응답 필드

`GET /v1/images/jobs/{id}`는 아래 상태를 돌려줍니다. 각 필드의 설명은 [비동기 작업](https://nezhagate.com/ko/docs/guide/async-jobs#fields)에 있습니다. 2~3초마다 조회하거나 웹훅을 쓰세요.

| 상태 | 의미 |
| --- | --- |
| queued | 대기 중. `queue_position`(앞에 있는 작업 수)과 `eta_seconds`(예상 대기 시간)가 함께 옵니다. |
| processing | 생성 중. |
| succeeded | 완료. 결과는 `data[0].url`, 과금 내역은 `usage`에 있습니다. |
| failed | 실패. 사유는 `error`에 있고, 예약된 크레딧은 전액 환불됩니다. |

한 계정은 최대 50개 작업을 동시에 생성하며, 그보다 많은 작업은 제출 순서대로 대기합니다. 15분이 지나도 시작되지 않은 작업은 자동으로 실패 처리되고 전액 환불됩니다. 작업 기록은 3일, 이미지 링크는 15일 동안 보관됩니다.

## 생성 시간

제출부터 결과까지 1K는 보통 20~60초, 네이티브로 생성하는 2K와 4K는 보통 30~120초 걸립니다. 이미지-투-이미지, 참조 이미지가 여러 장인 경우는 더 오래 걸리며, 게이트웨이가 다른 회선으로 재시도하는 작업은 몇 분이 걸릴 수 있습니다.

최근 7일간 실제 호출 기준: 중앙값 26 초, 90%가 44 초 안에 완료.

## 오류와 환불

제출 단계의 오류는 HTTP 4xx / 5xx로 바로 돌아오며, 작업은 만들어지지 않고 과금되지 않습니다. 작업이 접수된 뒤의 실패는 작업 조회 결과로 알려 주며, 예약된 크레딧은 전액 환불됩니다. 전체 코드는 [오류 코드](https://nezhagate.com/ko/docs/guide/errors)에 있습니다.

### 제출할 때 돌아오는 오류

| 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 레퍼런스](https://nezhagate.com/ko/docs/api)에 있는 모델 ID를 쓰세요. |
| 401 | invalid_api_key | 키가 없거나, 삭제되었거나, 비활성화되었습니다. 계정이 비활성화된 경우에도 나옵니다. | 콘솔의 「API Keys」 페이지에서 이 키를 확인하세요. |
| 402 | insufficient_quota | 이 요청의 크레딧을 예약하기에 잔액이 부족합니다. 게이트웨이는 요청에 들 수 있는 최대 비용을 먼저 예약하므로, 동시 호출이 몰릴 때도 이 오류가 날 수 있습니다. | 동시 호출이 몰린 경우라면 몇 초 기다린 뒤 다시 시도하고, 그렇지 않으면 충전하세요. |
| 429 | rate_limit_exceeded | 이 키에 설정한 분당 요청 수를 넘었습니다(최근 60초 기준). `Retry-After` 헤더는 붙지 않습니다. | 몇 초 기다린 뒤 다시 시도하거나, 콘솔에서 이 키의 한도를 올리세요. |
| 503 | model_maintenance | 모델이 점검 중이라 요청을 받지 않습니다. 점검 중에는 다른 모델이 대신 답변하지도 않습니다. | 점검이 끝나면 다시 시도하세요. 진행 상황은 [서비스 상태](https://nezhagate.com/ko/status)에서 볼 수 있습니다. |
| 503 | service_unavailable | 참조 소재 저장 실패처럼 당사 측에서 일시적인 오류가 났습니다. `/v1/responses`는 잠시 쓸 수 있는 회선이 없을 때도 `Retry-After`와 함께 503을 돌려줍니다. | 잠시 후 다시 시도하세요. |

### 작업 실패(`status`가 `failed`)

| code | 언제 나오나요 | 조치 |
| --- | --- | --- |
| moderation_blocked | 이미지: 모델 제공사의 안전 시스템이 프롬프트나 참조 이미지를 거부했습니다(코드가 `content_policy_violation`일 수도 있습니다). | 프롬프트를 고쳐 쓰거나 참조 이미지를 바꾸세요. 그대로 다시 제출하면 대개 다시 거부됩니다. |
| upstream_error | 그 밖의 실패: 모든 회선을 시도했지만 실패했거나, 15분 동안 기다려도 시작되지 않았거나, 업스트림이 이유 없이 거부한 경우 등입니다. 구체적인 내용은 `message`에 있습니다. | 다시 제출하면 대개 성공합니다. |

## 조회 대신 웹훅으로 받기

제출할 때 `callback_url`을 넣으면 작업이 끝나는 즉시(성공이든 실패든) 게이트웨이가 조회 엔드포인트와 똑같은 결과를 그 URL로 보냅니다. 서명이 포함되며, 전송에 실패하면 자동으로 재시도합니다. 콘솔의 「설정 → 웹훅」에서 계정 전체에 쓸 주소를 지정할 수도 있습니다. [웹훅 문서 →](https://nezhagate.com/ko/docs/webhooks)

```
curl https://nezhagate.com/v1/images/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "gpt-image-2.5-sunburst", "prompt": "해 질 녘 항구를 그린 유화, 뚜렷한 붓 자국, 따뜻한 색감", "size": "1:1", "callback_url": "https://your-domain.com/webhook"}'
```
